fix: resolve TypeScript errors in server implementation

- Fix tool response type compatibility with MCP SDK
- Add toolResponseToServerResult helper function
- Update server to properly convert tool responses
- Improve type safety in request handling
- Clean up error handling
This commit is contained in:
cyanheads
2025-01-25 19:21:37 -08:00
parent 0cbcdc5d01
commit 30b6f625a7
2 changed files with 27 additions and 10 deletions

View File

@@ -18,6 +18,7 @@ import {
isDesignCritiqueArgs, isDesignCritiqueArgs,
isWritingFeedbackArgs, isWritingFeedbackArgs,
isBrainstormEnhancementsArgs, isBrainstormEnhancementsArgs,
toolResponseToServerResult,
} from "./types/index.js"; } from "./types/index.js";
/** /**
@@ -75,6 +76,7 @@ class MentorServer {
const { name, arguments: args } = request.params; const { name, arguments: args } = request.params;
try { try {
let response;
switch (name) { switch (name) {
case "second_opinion": { case "second_opinion": {
if (!args || !('user_request' in args) || typeof args.user_request !== 'string') { if (!args || !('user_request' in args) || typeof args.user_request !== 'string') {
@@ -83,7 +85,8 @@ class MentorServer {
"Missing required parameter: user_request" "Missing required parameter: user_request"
); );
} }
return await secondOpinion.handler({ user_request: args.user_request }); response = await secondOpinion.handler({ user_request: args.user_request });
break;
} }
case "code_review": { case "code_review": {
@@ -93,7 +96,8 @@ class MentorServer {
"Invalid parameters for code review" "Invalid parameters for code review"
); );
} }
return await codeReview.handler(args); response = await codeReview.handler(args);
break;
} }
case "design_critique": { case "design_critique": {
@@ -103,7 +107,8 @@ class MentorServer {
"Invalid parameters for design critique" "Invalid parameters for design critique"
); );
} }
return await designCritique.handler(args); response = await designCritique.handler(args);
break;
} }
case "writing_feedback": { case "writing_feedback": {
@@ -113,7 +118,8 @@ class MentorServer {
"Invalid parameters for writing feedback" "Invalid parameters for writing feedback"
); );
} }
return await writingFeedback.handler(args); response = await writingFeedback.handler(args);
break;
} }
case "brainstorm_enhancements": { case "brainstorm_enhancements": {
@@ -123,7 +129,8 @@ class MentorServer {
"Invalid parameters for brainstorm enhancements" "Invalid parameters for brainstorm enhancements"
); );
} }
return await brainstormEnhancements.handler(args); response = await brainstormEnhancements.handler(args);
break;
} }
default: default:
@@ -132,6 +139,9 @@ class MentorServer {
`Tool not found: ${name}` `Tool not found: ${name}`
); );
} }
// Convert tool response to server result format
return toolResponseToServerResult(response);
} catch (error) { } catch (error) {
// Handle errors that aren't already McpErrors // Handle errors that aren't already McpErrors
if (!(error instanceof McpError)) { if (!(error instanceof McpError)) {

View File

@@ -16,15 +16,16 @@ export interface ToolContent {
text: string; text: string;
} }
// Response format for our internal tool handlers
export interface ToolResponse { export interface ToolResponse {
content: ToolContent[]; content: ToolContent[];
reasoning?: ToolContent[]; // Added to expose reasoning content reasoning?: ToolContent[];
isError?: boolean; isError?: boolean;
} }
export interface LLMResponse { export interface LLMResponse {
text: string; text: string;
reasoning?: string; // Added for Chain of Thought content reasoning?: string;
isError: boolean; isError: boolean;
errorMessage?: string; errorMessage?: string;
} }
@@ -34,9 +35,6 @@ export interface FileValidationResult {
error?: string; error?: string;
} }
/**
* Configuration for the Deepseek API
*/
export interface APIConfig { export interface APIConfig {
apiKey: string; apiKey: string;
baseUrl: string; baseUrl: string;
@@ -128,3 +126,12 @@ export interface ChatMessage {
export interface ChatHistory { export interface ChatHistory {
messages: ChatMessage[]; messages: ChatMessage[];
} }
// Helper function to convert ToolResponse to ServerResult format
export function toolResponseToServerResult(response: ToolResponse): Record<string, unknown> {
return {
content: response.content,
...(response.reasoning ? { reasoning: response.reasoning } : {}),
...(response.isError ? { isError: response.isError } : {})
};
}