From cdd98dab9d7a41d57707de509ca96ce0a6cdfd0d Mon Sep 17 00:00:00 2001 From: Tapan Chugh Date: Wed, 4 Mar 2026 22:31:03 -0800 Subject: [PATCH 1/6] Add _meta support to registerPrompt Prompts were the only primitive missing _meta passthrough. This adds _meta to RegisteredPrompt, _createRegisteredPrompt, registerPrompt, and the prompts/list handler, mirroring the existing tool pattern. Co-Authored-By: Claude Opus 4.6 --- packages/server/src/server/mcp.ts | 12 ++- test/integration/test/server/mcp.test.ts | 93 ++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/packages/server/src/server/mcp.ts b/packages/server/src/server/mcp.ts index 316074e2d..4f9fd6d35 100644 --- a/packages/server/src/server/mcp.ts +++ b/packages/server/src/server/mcp.ts @@ -538,7 +538,8 @@ export class McpServer { name, title: prompt.title, description: prompt.description, - arguments: prompt.argsSchema ? promptArgumentsFromSchema(prompt.argsSchema) : undefined + arguments: prompt.argsSchema ? promptArgumentsFromSchema(prompt.argsSchema) : undefined, + _meta: prompt._meta }; }) }) @@ -707,6 +708,7 @@ export class McpServer { title: string | undefined, description: string | undefined, argsSchema: AnySchema | undefined, + _meta: Record | undefined, callback: PromptCallback ): RegisteredPrompt { // Track current schema and callback for handler regeneration @@ -717,6 +719,7 @@ export class McpServer { title, description, argsSchema, + _meta, handler: createPromptHandler(name, argsSchema, callback), enabled: true, disable: () => registeredPrompt.update({ enabled: false }), @@ -729,6 +732,7 @@ export class McpServer { } if (updates.title !== undefined) registeredPrompt.title = updates.title; if (updates.description !== undefined) registeredPrompt.description = updates.description; + if (updates._meta !== undefined) registeredPrompt._meta = updates._meta; // Track if we need to regenerate the handler let needsHandlerRegen = false; @@ -929,6 +933,7 @@ export class McpServer { title?: string; description?: string; argsSchema?: Args; + _meta?: Record; }, cb: PromptCallback ): RegisteredPrompt { @@ -936,13 +941,14 @@ export class McpServer { throw new Error(`Prompt ${name} is already registered`); } - const { title, description, argsSchema } = config; + const { title, description, argsSchema, _meta } = config; const registeredPrompt = this._createRegisteredPrompt( name, title, description, argsSchema, + _meta, cb as PromptCallback ); @@ -1231,6 +1237,7 @@ export type RegisteredPrompt = { title?: string; description?: string; argsSchema?: AnySchema; + _meta?: Record; /** @hidden */ handler: PromptHandler; enabled: boolean; @@ -1241,6 +1248,7 @@ export type RegisteredPrompt = { title?: string; description?: string; argsSchema?: Args; + _meta?: Record; callback?: PromptCallback; enabled?: boolean; }): void; diff --git a/test/integration/test/server/mcp.test.ts b/test/integration/test/server/mcp.test.ts index 4ea04beae..68b572108 100644 --- a/test/integration/test/server/mcp.test.ts +++ b/test/integration/test/server/mcp.test.ts @@ -4113,6 +4113,99 @@ describe('Zod v4', () => { } ]); }); + + /*** + * Test: Prompt Registration with _meta field + */ + test('should register prompt with _meta field and include it in list response', async () => { + const mcpServer = new McpServer({ + name: 'test server', + version: '1.0' + }); + const client = new Client({ + name: 'test client', + version: '1.0' + }); + + const metaData = { + author: 'test-author', + version: '1.2.3', + category: 'utility', + tags: ['test', 'example'] + }; + + mcpServer.registerPrompt( + 'test-with-meta', + { + description: 'A prompt with _meta field', + _meta: metaData + }, + async () => ({ + messages: [ + { + role: 'assistant', + content: { + type: 'text', + text: 'Test response' + } + } + ] + }) + ); + + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + + await Promise.all([client.connect(clientTransport), mcpServer.server.connect(serverTransport)]); + + const result = await client.request({ method: 'prompts/list' }); + + expect(result.prompts).toHaveLength(1); + expect(result.prompts[0]!.name).toBe('test-with-meta'); + expect(result.prompts[0]!.description).toBe('A prompt with _meta field'); + expect(result.prompts[0]!._meta).toEqual(metaData); + }); + + /*** + * Test: Prompt Registration without _meta field should have undefined _meta + */ + test('should register prompt without _meta field and have undefined _meta in response', async () => { + const mcpServer = new McpServer({ + name: 'test server', + version: '1.0' + }); + const client = new Client({ + name: 'test client', + version: '1.0' + }); + + mcpServer.registerPrompt( + 'test-without-meta', + { + description: 'A prompt without _meta field' + }, + async () => ({ + messages: [ + { + role: 'assistant', + content: { + type: 'text', + text: 'Test response' + } + } + ] + }) + ); + + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + + await Promise.all([client.connect(clientTransport), mcpServer.server.connect(serverTransport)]); + + const result = await client.request({ method: 'prompts/list' }); + + expect(result.prompts).toHaveLength(1); + expect(result.prompts[0]!.name).toBe('test-without-meta'); + expect(result.prompts[0]!._meta).toBeUndefined(); + }); }); describe('Tool title precedence', () => { From 17dd7f62b57d602391cd501480fe5286ce0b49c8 Mon Sep 17 00:00:00 2001 From: Tapan Chugh Date: Wed, 4 Mar 2026 22:41:17 -0800 Subject: [PATCH 2/6] Add _meta to prompt config fields in migration docs Co-Authored-By: Claude Opus 4.6 --- docs/migration-SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/migration-SKILL.md b/docs/migration-SKILL.md index 9dffe4418..fdcda41c1 100644 --- a/docs/migration-SKILL.md +++ b/docs/migration-SKILL.md @@ -259,7 +259,7 @@ server.registerPrompt( ); ``` -Config object fields: `title?`, `description?`, `argsSchema?` +Config object fields: `title?`, `description?`, `argsSchema?`, `_meta?` ### Resources From 8108f3852db4df72ab599aa181c42de6625bcbe4 Mon Sep 17 00:00:00 2001 From: Tapan Chugh Date: Wed, 4 Mar 2026 22:47:25 -0800 Subject: [PATCH 3/6] Revert _meta addition to prompt config fields in migration docs Co-Authored-By: Claude Opus 4.6 --- docs/migration-SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/migration-SKILL.md b/docs/migration-SKILL.md index fdcda41c1..9dffe4418 100644 --- a/docs/migration-SKILL.md +++ b/docs/migration-SKILL.md @@ -259,7 +259,7 @@ server.registerPrompt( ); ``` -Config object fields: `title?`, `description?`, `argsSchema?`, `_meta?` +Config object fields: `title?`, `description?`, `argsSchema?` ### Resources From b44e9f85fba4187ebb8ef3c16d14a2d3c2a83b60 Mon Sep 17 00:00:00 2001 From: Tapan Chugh Date: Mon, 23 Mar 2026 19:40:57 -0700 Subject: [PATCH 4/6] Fix missing comma in prompt listing causing build/test failure Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/server/src/server/mcp.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/server/mcp.ts b/packages/server/src/server/mcp.ts index 7d5a4f212..8ec86ca41 100644 --- a/packages/server/src/server/mcp.ts +++ b/packages/server/src/server/mcp.ts @@ -530,7 +530,7 @@ export class McpServer { name, title: prompt.title, description: prompt.description, - arguments: prompt.argsSchema ? promptArgumentsFromStandardSchema(prompt.argsSchema) : undefined + arguments: prompt.argsSchema ? promptArgumentsFromStandardSchema(prompt.argsSchema) : undefined, _meta: prompt._meta }; }) From 89a89147abcfbed1167cd82b85403b2e49f82dbd Mon Sep 17 00:00:00 2001 From: Tapan Chugh Date: Mon, 23 Mar 2026 19:44:17 -0700 Subject: [PATCH 5/6] Fix swapped callback and _meta args in prompt registration The _meta and callback parameters were passed in wrong order to _createRegisteredPrompt, causing a type error. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/server/src/server/mcp.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/server/mcp.ts b/packages/server/src/server/mcp.ts index 8ec86ca41..a669dd1b1 100644 --- a/packages/server/src/server/mcp.ts +++ b/packages/server/src/server/mcp.ts @@ -940,8 +940,8 @@ export class McpServer { title, description, argsSchema, + cb as PromptCallback, _meta, - cb as PromptCallback ); this.setPromptRequestHandlers(); From cf1f7c18e2ab9040ca201f73db47f99e61e1495a Mon Sep 17 00:00:00 2001 From: Tapan Chugh Date: Mon, 23 Mar 2026 19:47:06 -0700 Subject: [PATCH 6/6] Fix Prettier formatting in mcp.ts Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/server/src/server/mcp.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/server/mcp.ts b/packages/server/src/server/mcp.ts index a669dd1b1..6c2699997 100644 --- a/packages/server/src/server/mcp.ts +++ b/packages/server/src/server/mcp.ts @@ -701,7 +701,7 @@ export class McpServer { description: string | undefined, argsSchema: StandardSchemaWithJSON | undefined, callback: PromptCallback, - _meta: Record | undefined, + _meta: Record | undefined ): RegisteredPrompt { // Track current schema and callback for handler regeneration let currentArgsSchema = argsSchema; @@ -941,7 +941,7 @@ export class McpServer { description, argsSchema, cb as PromptCallback, - _meta, + _meta ); this.setPromptRequestHandlers();