refactor(completions): improve completion handling and error states

- Move completion logic from App.tsx to useConnection hook
- Replace useCompletion with simpler useCompletionState hook
- Add graceful fallback for servers without completion support
- Improve error handling and state management
- Update PromptsTab and ResourcesTab to use new completion API
- Add type safety improvements across completion interfaces
This commit is contained in:
Gavin Aboulhosn
2025-02-12 19:05:51 -05:00
parent c66feff37d
commit 7f713fe40e
6 changed files with 166 additions and 180 deletions

View File

@@ -15,9 +15,6 @@ import {
Root,
ServerNotification,
Tool,
PromptReference,
ResourceReference,
CompleteResultSchema,
} from "@modelcontextprotocol/sdk/types.js";
import React, { Suspense, useEffect, useRef, useState } from "react";
import { useConnection } from "./lib/hooks/useConnection";
@@ -154,6 +151,8 @@ const App = () => {
requestHistory,
makeRequest: makeConnectionRequest,
sendNotification,
handleCompletion,
completionsSupported,
connect: connectMcpServer,
} = useConnection({
transportType,
@@ -267,38 +266,6 @@ const App = () => {
}
};
const handleCompletion = async (
ref: ResourceReference | PromptReference,
argName: string,
value: string,
signal?: AbortSignal,
) => {
if (!mcpClient) {
throw new Error("MCP client not connected");
}
const request: ClientRequest = {
method: "completion/complete",
params: {
argument: {
name: argName,
value,
},
ref,
},
};
try {
const result = await makeRequest(request, CompleteResultSchema);
return result.completion.values;
} catch (e: unknown) {
const errorMessage = e instanceof Error ? e.message : String(e);
toast.error(errorMessage);
throw e;
}
};
const listResources = async () => {
const response = await makeRequest(
{
@@ -518,7 +485,8 @@ const App = () => {
clearError("resources");
setSelectedResource(resource);
}}
onComplete={handleCompletion}
handleCompletion={handleCompletion}
completionsSupported={completionsSupported}
resourceContent={resourceContent}
nextCursor={nextResourceCursor}
nextTemplateCursor={nextResourceTemplateCursor}
@@ -543,7 +511,8 @@ const App = () => {
clearError("prompts");
setSelectedPrompt(prompt);
}}
onComplete={handleCompletion}
handleCompletion={handleCompletion}
completionsSupported={completionsSupported}
promptContent={promptContent}
nextCursor={nextPromptCursor}
error={errors.prompts}