Skip to content

Commit cdd98da

Browse files
chughtapanclaude
andcommitted
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 <noreply@anthropic.com>
1 parent 5a2c8a6 commit cdd98da

2 files changed

Lines changed: 103 additions & 2 deletions

File tree

packages/server/src/server/mcp.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,8 @@ export class McpServer {
538538
name,
539539
title: prompt.title,
540540
description: prompt.description,
541-
arguments: prompt.argsSchema ? promptArgumentsFromSchema(prompt.argsSchema) : undefined
541+
arguments: prompt.argsSchema ? promptArgumentsFromSchema(prompt.argsSchema) : undefined,
542+
_meta: prompt._meta
542543
};
543544
})
544545
})
@@ -707,6 +708,7 @@ export class McpServer {
707708
title: string | undefined,
708709
description: string | undefined,
709710
argsSchema: AnySchema | undefined,
711+
_meta: Record<string, unknown> | undefined,
710712
callback: PromptCallback<AnySchema | undefined>
711713
): RegisteredPrompt {
712714
// Track current schema and callback for handler regeneration
@@ -717,6 +719,7 @@ export class McpServer {
717719
title,
718720
description,
719721
argsSchema,
722+
_meta,
720723
handler: createPromptHandler(name, argsSchema, callback),
721724
enabled: true,
722725
disable: () => registeredPrompt.update({ enabled: false }),
@@ -729,6 +732,7 @@ export class McpServer {
729732
}
730733
if (updates.title !== undefined) registeredPrompt.title = updates.title;
731734
if (updates.description !== undefined) registeredPrompt.description = updates.description;
735+
if (updates._meta !== undefined) registeredPrompt._meta = updates._meta;
732736

733737
// Track if we need to regenerate the handler
734738
let needsHandlerRegen = false;
@@ -929,20 +933,22 @@ export class McpServer {
929933
title?: string;
930934
description?: string;
931935
argsSchema?: Args;
936+
_meta?: Record<string, unknown>;
932937
},
933938
cb: PromptCallback<Args>
934939
): RegisteredPrompt {
935940
if (this._registeredPrompts[name]) {
936941
throw new Error(`Prompt ${name} is already registered`);
937942
}
938943

939-
const { title, description, argsSchema } = config;
944+
const { title, description, argsSchema, _meta } = config;
940945

941946
const registeredPrompt = this._createRegisteredPrompt(
942947
name,
943948
title,
944949
description,
945950
argsSchema,
951+
_meta,
946952
cb as PromptCallback<AnySchema | undefined>
947953
);
948954

@@ -1231,6 +1237,7 @@ export type RegisteredPrompt = {
12311237
title?: string;
12321238
description?: string;
12331239
argsSchema?: AnySchema;
1240+
_meta?: Record<string, unknown>;
12341241
/** @hidden */
12351242
handler: PromptHandler;
12361243
enabled: boolean;
@@ -1241,6 +1248,7 @@ export type RegisteredPrompt = {
12411248
title?: string;
12421249
description?: string;
12431250
argsSchema?: Args;
1251+
_meta?: Record<string, unknown>;
12441252
callback?: PromptCallback<Args>;
12451253
enabled?: boolean;
12461254
}): void;

test/integration/test/server/mcp.test.ts

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4113,6 +4113,99 @@ describe('Zod v4', () => {
41134113
}
41144114
]);
41154115
});
4116+
4117+
/***
4118+
* Test: Prompt Registration with _meta field
4119+
*/
4120+
test('should register prompt with _meta field and include it in list response', async () => {
4121+
const mcpServer = new McpServer({
4122+
name: 'test server',
4123+
version: '1.0'
4124+
});
4125+
const client = new Client({
4126+
name: 'test client',
4127+
version: '1.0'
4128+
});
4129+
4130+
const metaData = {
4131+
author: 'test-author',
4132+
version: '1.2.3',
4133+
category: 'utility',
4134+
tags: ['test', 'example']
4135+
};
4136+
4137+
mcpServer.registerPrompt(
4138+
'test-with-meta',
4139+
{
4140+
description: 'A prompt with _meta field',
4141+
_meta: metaData
4142+
},
4143+
async () => ({
4144+
messages: [
4145+
{
4146+
role: 'assistant',
4147+
content: {
4148+
type: 'text',
4149+
text: 'Test response'
4150+
}
4151+
}
4152+
]
4153+
})
4154+
);
4155+
4156+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
4157+
4158+
await Promise.all([client.connect(clientTransport), mcpServer.server.connect(serverTransport)]);
4159+
4160+
const result = await client.request({ method: 'prompts/list' });
4161+
4162+
expect(result.prompts).toHaveLength(1);
4163+
expect(result.prompts[0]!.name).toBe('test-with-meta');
4164+
expect(result.prompts[0]!.description).toBe('A prompt with _meta field');
4165+
expect(result.prompts[0]!._meta).toEqual(metaData);
4166+
});
4167+
4168+
/***
4169+
* Test: Prompt Registration without _meta field should have undefined _meta
4170+
*/
4171+
test('should register prompt without _meta field and have undefined _meta in response', async () => {
4172+
const mcpServer = new McpServer({
4173+
name: 'test server',
4174+
version: '1.0'
4175+
});
4176+
const client = new Client({
4177+
name: 'test client',
4178+
version: '1.0'
4179+
});
4180+
4181+
mcpServer.registerPrompt(
4182+
'test-without-meta',
4183+
{
4184+
description: 'A prompt without _meta field'
4185+
},
4186+
async () => ({
4187+
messages: [
4188+
{
4189+
role: 'assistant',
4190+
content: {
4191+
type: 'text',
4192+
text: 'Test response'
4193+
}
4194+
}
4195+
]
4196+
})
4197+
);
4198+
4199+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
4200+
4201+
await Promise.all([client.connect(clientTransport), mcpServer.server.connect(serverTransport)]);
4202+
4203+
const result = await client.request({ method: 'prompts/list' });
4204+
4205+
expect(result.prompts).toHaveLength(1);
4206+
expect(result.prompts[0]!.name).toBe('test-without-meta');
4207+
expect(result.prompts[0]!._meta).toBeUndefined();
4208+
});
41164209
});
41174210

41184211
describe('Tool title precedence', () => {

0 commit comments

Comments
 (0)