From eba64615676bdbdf008105e8fb37ebc9df2a7cbc Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Wed, 22 Jan 2025 11:38:39 +0000 Subject: [PATCH 1/3] Failing test case for double completion handlers --- src/server/mcp.test.ts | 63 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/server/mcp.test.ts b/src/server/mcp.test.ts index 4154e7dd..8f9bfa77 100644 --- a/src/server/mcp.test.ts +++ b/src/server/mcp.test.ts @@ -1283,6 +1283,69 @@ describe("prompt()", () => { })); }); + test("should allow registering prompts with arguments", () => { + const mcpServer = new McpServer({ + name: "test server", + version: "1.0", + }); + + // This should succeed + mcpServer.prompt( + "echo", + { message: z.string() }, + ({ message }) => ({ + messages: [{ + role: "user", + content: { + type: "text", + text: `Please process this message: ${message}` + } + }] + }) + ); + }); + + test("should allow registering both resources and prompts with completion handlers", () => { + const mcpServer = new McpServer({ + name: "test server", + version: "1.0", + }); + + // Register a resource with completion + mcpServer.resource( + "test", + new ResourceTemplate("test://resource/{category}", { + list: undefined, + complete: { + category: () => ["books", "movies", "music"], + }, + }), + async () => ({ + contents: [ + { + uri: "test://resource/test", + text: "Test content", + }, + ], + }), + ); + + // Register a prompt with completion + mcpServer.prompt( + "echo", + { message: completable(z.string(), () => ["hello", "world"]) }, + ({ message }) => ({ + messages: [{ + role: "user", + content: { + type: "text", + text: `Please process this message: ${message}` + } + }] + }) + ); + }); + test("should throw McpError for invalid prompt name", async () => { const mcpServer = new McpServer({ name: "test server", From dbf560f24ae9778ecd8fafd299f5824b53dd3e7b Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Wed, 22 Jan 2025 11:40:26 +0000 Subject: [PATCH 2/3] Don't double-add completion handler --- src/server/mcp.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/server/mcp.ts b/src/server/mcp.ts index 36d9341d..d71eecb5 100644 --- a/src/server/mcp.ts +++ b/src/server/mcp.ts @@ -175,7 +175,13 @@ export class McpServer { this._toolHandlersInitialized = true; } + private _completionHandlerInitialized = false; + private setCompletionRequestHandler() { + if (this._completionHandlerInitialized) { + return; + } + this.server.assertCanSetRequestHandler( CompleteRequestSchema.shape.method.value, ); @@ -198,6 +204,8 @@ export class McpServer { } }, ); + + this._completionHandlerInitialized = true; } private async handlePromptCompletion( From 01574e1f27689885c01e37f4d9740c9b0cb17291 Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Wed, 22 Jan 2025 11:41:38 +0000 Subject: [PATCH 3/3] Preemptively bump package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e051f1a3..6f06fac0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@modelcontextprotocol/sdk", - "version": "1.3.1", + "version": "1.3.2", "description": "Model Context Protocol implementation for TypeScript", "license": "MIT", "author": "Anthropic, PBC (https://anthropic.com)",