diff --git a/.changeset/fix-omitted-prompt-arguments.md b/.changeset/fix-omitted-prompt-arguments.md new file mode 100644 index 0000000000..5e73e22090 --- /dev/null +++ b/.changeset/fix-omitted-prompt-arguments.md @@ -0,0 +1,5 @@ +--- +'@modelcontextprotocol/server': patch +--- + +Fix prompts/get rejecting omitted arguments when all prompt schema fields are optional. diff --git a/packages/server/src/server/mcp.ts b/packages/server/src/server/mcp.ts index fb45fd5db6..d25cfd0952 100644 --- a/packages/server/src/server/mcp.ts +++ b/packages/server/src/server/mcp.ts @@ -1339,7 +1339,7 @@ function createPromptHandler( const typedCallback = callback as (args: unknown, ctx: ServerContext) => GetPromptResult | Promise; return async (args, ctx) => { - const parseResult = await validateStandardSchema(argsSchema, args); + const parseResult = await validateStandardSchema(argsSchema, args ?? {}); if (!parseResult.success) { throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid arguments for prompt ${name}: ${parseResult.error}`); } diff --git a/test/integration/test/server/mcp.test.ts b/test/integration/test/server/mcp.test.ts index 92af09744c..7d62dbd6b6 100644 --- a/test/integration/test/server/mcp.test.ts +++ b/test/integration/test/server/mcp.test.ts @@ -4254,6 +4254,59 @@ describe('Zod v4', () => { ]); }); + test('should accept omitted prompt arguments when all schema fields are optional', async () => { + const mcpServer = new McpServer({ + name: 'test server', + version: '1.0' + }); + + const client = new Client({ + name: 'test client', + version: '1.0' + }); + + mcpServer.registerPrompt( + 'echo', + { + argsSchema: z.object({ + context: z.string().optional() + }) + }, + ({ context }) => ({ + messages: [ + { + role: 'user', + content: { + type: 'text', + text: `context: ${context ?? 'none'}` + } + } + ] + }) + ); + + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + + await Promise.all([client.connect(clientTransport), mcpServer.server.connect(serverTransport)]); + + const result = await client.request({ + method: 'prompts/get', + params: { + name: 'echo' + } + }); + + expect(result.messages).toEqual([ + { + role: 'user', + content: { + type: 'text', + text: 'context: none' + } + } + ]); + }); + /*** * Test: Prompt Registration with _meta field */