Skip to content

Commit 34e7438

Browse files
committed
fix: preserve elicit string pattern constraints
1 parent 4fbcfcd commit 34e7438

4 files changed

Lines changed: 24 additions & 1 deletion

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@modelcontextprotocol/core': patch
3+
---
4+
5+
Preserve `pattern` constraints on elicitation string property schemas during request validation.

packages/core/src/types/schemas.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,6 +1733,7 @@ export const StringSchemaSchema = z.object({
17331733
description: z.string().optional(),
17341734
minLength: z.number().optional(),
17351735
maxLength: z.number().optional(),
1736+
pattern: z.string().optional(),
17361737
format: z.enum(['email', 'uri', 'date', 'date-time']).optional(),
17371738
default: z.string().optional()
17381739
});

packages/core/test/spec.types.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,7 @@ type _K_EmbeddedResource = Assert<AssertExactKeys<SDKTypes.EmbeddedResource, Spe
868868
type _K_ResourceLink = Assert<AssertExactKeys<SDKTypes.ResourceLink, SpecTypes.ResourceLink>>;
869869
type _K_PromptMessage = Assert<AssertExactKeys<SDKTypes.PromptMessage, SpecTypes.PromptMessage>>;
870870
type _K_BooleanSchema = Assert<AssertExactKeys<SDKTypes.BooleanSchema, SpecTypes.BooleanSchema>>;
871+
// @ts-expect-error The written 2025-11-25 elicitation spec includes StringSchema.pattern, but generated spec types lag it.
871872
type _K_StringSchema = Assert<AssertExactKeys<SDKTypes.StringSchema, SpecTypes.StringSchema>>;
872873
type _K_NumberSchema = Assert<AssertExactKeys<SDKTypes.NumberSchema, SpecTypes.NumberSchema>>;
873874
type _K_UntitledSingleSelectEnumSchema = Assert<

packages/core/test/types.test.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
PromptMessageSchema,
1212
ResourceLinkSchema,
1313
SamplingMessageSchema,
14+
StringSchemaSchema,
1415
SUPPORTED_PROTOCOL_VERSIONS,
1516
ToolChoiceSchema,
1617
ToolResultContentSchema,
@@ -986,6 +987,18 @@ describe('Types', () => {
986987
});
987988

988989
describe('ElicitRequestFormParamsSchema', () => {
990+
test('preserves string pattern constraints in property schemas', () => {
991+
const stringResult = StringSchemaSchema.safeParse({
992+
type: 'string',
993+
pattern: '^[A-Za-z]+$'
994+
});
995+
996+
expect(stringResult.success).toBe(true);
997+
if (stringResult.success) {
998+
expect(stringResult.data.pattern).toBe('^[A-Za-z]+$');
999+
}
1000+
});
1001+
9891002
test('accepts requestedSchema with extra JSON Schema metadata keys', () => {
9901003
// Mirrors what z.toJSONSchema() emits — includes $schema, additionalProperties, etc.
9911004
// See https://github.com/modelcontextprotocol/typescript-sdk/issues/1362
@@ -995,7 +1008,7 @@ describe('Types', () => {
9951008
$schema: 'https://json-schema.org/draft/2020-12/schema',
9961009
type: 'object',
9971010
properties: {
998-
name: { type: 'string' }
1011+
name: { type: 'string', pattern: '^[A-Za-z]+$' }
9991012
},
10001013
required: ['name'],
10011014
additionalProperties: false
@@ -1008,6 +1021,9 @@ describe('Types', () => {
10081021
expect(result.data.requestedSchema.type).toBe('object');
10091022
expect(result.data.requestedSchema.$schema).toBe('https://json-schema.org/draft/2020-12/schema');
10101023
expect(result.data.requestedSchema.additionalProperties).toBe(false);
1024+
expect(result.data.requestedSchema.properties.name).toEqual(
1025+
expect.objectContaining({ type: 'string', pattern: '^[A-Za-z]+$' })
1026+
);
10111027
}
10121028
});
10131029
});

0 commit comments

Comments
 (0)