Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions src/server/mcp.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3879,6 +3879,51 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
expect(result.resources[0].description).toBe('Overridden description');
expect(result.resources[0].mimeType).toBe('text/markdown');
});

test('should support optional prompt arguments', async () => {
const mcpServer = new McpServer({
name: 'test server',
version: '1.0'
});

const client = new Client({
name: 'test client',
version: '1.0'
});

mcpServer.registerPrompt(
'test-prompt',
{
argsSchema: {
name: z.string().optional()
}
},
() => ({
messages: []
})
);

const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();

await Promise.all([client.connect(clientTransport), mcpServer.server.connect(serverTransport)]);

const result = await client.request(
{
method: 'prompts/list'
},
ListPromptsResultSchema
);

expect(result.prompts).toHaveLength(1);
expect(result.prompts[0].name).toBe('test-prompt');
expect(result.prompts[0].arguments).toEqual([
{
name: 'name',
description: undefined,
required: false
}
]);
});
});

describe('Tool title precedence', () => {
Expand Down
6 changes: 3 additions & 3 deletions src/server/zod-compat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export interface ZodV3Internal {
export interface ZodV4Internal {
_zod?: {
def?: {
typeName?: string;
type?: string;
value?: unknown;
values?: unknown[];
shape?: Record<string, AnySchema> | (() => Record<string, AnySchema>);
Expand Down Expand Up @@ -175,7 +175,7 @@ export function normalizeObjectSchema(schema: AnySchema | ZodRawShapeCompat | un
// Check if it's a v4 object
const v4Schema = schema as unknown as ZodV4Internal;
const def = v4Schema._zod?.def;
if (def && (def.typeName === 'object' || def.shape !== undefined)) {
if (def && (def.type === 'object' || def.shape !== undefined)) {
return schema as AnyObjectSchema;
}
} else {
Expand Down Expand Up @@ -238,7 +238,7 @@ export function getSchemaDescription(schema: AnySchema): string | undefined {
export function isSchemaOptional(schema: AnySchema): boolean {
if (isZ4Schema(schema)) {
const v4Schema = schema as unknown as ZodV4Internal;
return v4Schema._zod?.def?.typeName === 'ZodOptional';
return v4Schema._zod?.def?.type === 'optional';
}
const v3Schema = schema as unknown as ZodV3Internal;
// v3 has isOptional() method
Expand Down
Loading