Implement BYO zod v3 or v4

Following recommendations from https://zod.dev/library-authors
This commit is contained in:
Frédéric Barthelet 2025-11-28 14:37:41 +01:00
commit e99517d75c
18 changed files with 57 additions and 59 deletions

View file

@ -102,7 +102,7 @@ import cors from "cors";
import express from "express"; import express from "express";
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import path from "node:path"; import path from "node:path";
import { z } from "zod"; import * as z from "zod";
const server = new McpServer({ const server = new McpServer({
name: "My MCP App Server", name: "My MCP App Server",

View file

@ -15,7 +15,7 @@
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^5.0.0", "@types/express": "^5.0.0",

View file

@ -15,7 +15,7 @@
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

View file

@ -13,7 +13,7 @@
"dependencies": { "dependencies": {
"@modelcontextprotocol/ext-apps": "../..", "@modelcontextprotocol/ext-apps": "../..",
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

View file

@ -17,7 +17,7 @@
"@modelcontextprotocol/ext-apps": "../..", "@modelcontextprotocol/ext-apps": "../..",
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

View file

@ -18,7 +18,7 @@
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

View file

@ -17,7 +17,7 @@
"@modelcontextprotocol/ext-apps": "../..", "@modelcontextprotocol/ext-apps": "../..",
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

View file

@ -19,7 +19,7 @@
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

View file

@ -18,7 +18,7 @@
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"systeminformation": "^5.27.11", "systeminformation": "^5.27.11",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

View file

@ -19,7 +19,7 @@
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"three": "^0.181.0", "three": "^0.181.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

View file

@ -17,7 +17,7 @@
"@modelcontextprotocol/ext-apps": "../..", "@modelcontextprotocol/ext-apps": "../..",
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"cheerio": "^1.0.0", "cheerio": "^1.0.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",

43
package-lock.json generated
View file

@ -14,8 +14,7 @@
"dependencies": { "dependencies": {
"@modelcontextprotocol/sdk": "^1.24.3", "@modelcontextprotocol/sdk": "^1.24.3",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0"
"zod": "^3.25"
}, },
"devDependencies": { "devDependencies": {
"@types/bun": "^1.3.2", "@types/bun": "^1.3.2",
@ -32,7 +31,8 @@
"ts-to-zod": "^5.1.0", "ts-to-zod": "^5.1.0",
"tsx": "^4.21.0", "tsx": "^4.21.0",
"typedoc": "^0.28.14", "typedoc": "^0.28.14",
"typescript": "^5.9.3" "typescript": "^5.9.3",
"zod": "^4.1.13"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rollup/rollup-darwin-arm64": "^4.53.3", "@rollup/rollup-darwin-arm64": "^4.53.3",
@ -40,6 +40,9 @@
"@rollup/rollup-linux-arm64-gnu": "^4.53.3", "@rollup/rollup-linux-arm64-gnu": "^4.53.3",
"@rollup/rollup-linux-x64-gnu": "^4.53.3", "@rollup/rollup-linux-x64-gnu": "^4.53.3",
"@rollup/rollup-win32-x64-msvc": "^4.53.3" "@rollup/rollup-win32-x64-msvc": "^4.53.3"
},
"peerDependencies": {
"zod": "^3.25.0 || ^4.0.0"
} }
}, },
"examples/basic-host": { "examples/basic-host": {
@ -50,7 +53,7 @@
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/express": "^5.0.0", "@types/express": "^5.0.0",
@ -84,7 +87,7 @@
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -115,7 +118,7 @@
"dependencies": { "dependencies": {
"@modelcontextprotocol/ext-apps": "../..", "@modelcontextprotocol/ext-apps": "../..",
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -144,7 +147,7 @@
"@modelcontextprotocol/ext-apps": "../..", "@modelcontextprotocol/ext-apps": "../..",
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -174,7 +177,7 @@
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -206,7 +209,7 @@
"@modelcontextprotocol/ext-apps": "../..", "@modelcontextprotocol/ext-apps": "../..",
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -237,7 +240,7 @@
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -270,7 +273,7 @@
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"chart.js": "^4.4.0", "chart.js": "^4.4.0",
"systeminformation": "^5.27.11", "systeminformation": "^5.27.11",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -301,7 +304,7 @@
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0",
"three": "^0.181.0", "three": "^0.181.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -334,7 +337,7 @@
"@modelcontextprotocol/ext-apps": "../..", "@modelcontextprotocol/ext-apps": "../..",
"@modelcontextprotocol/sdk": "^1.22.0", "@modelcontextprotocol/sdk": "^1.22.0",
"cheerio": "^1.0.0", "cheerio": "^1.0.0",
"zod": "^3.25.0" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/cors": "^2.8.19", "@types/cors": "^2.8.19",
@ -5696,16 +5699,6 @@
"url": "https://paulmillr.com/funding/" "url": "https://paulmillr.com/funding/"
} }
}, },
"node_modules/ts-to-zod/node_modules/zod": {
"version": "4.1.13",
"resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz",
"integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
},
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.8.1", "version": "2.8.1",
"dev": true, "dev": true,
@ -6329,7 +6322,9 @@
} }
}, },
"node_modules/zod": { "node_modules/zod": {
"version": "3.25.76", "version": "4.1.13",
"resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz",
"integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"url": "https://github.com/sponsors/colinhacks" "url": "https://github.com/sponsors/colinhacks"

View file

@ -64,13 +64,16 @@
"ts-to-zod": "^5.1.0", "ts-to-zod": "^5.1.0",
"tsx": "^4.21.0", "tsx": "^4.21.0",
"typedoc": "^0.28.14", "typedoc": "^0.28.14",
"typescript": "^5.9.3" "typescript": "^5.9.3",
"zod": "^4.1.13"
},
"peerDependencies": {
"zod": "^3.25.0 || ^4.0.0"
}, },
"dependencies": { "dependencies": {
"@modelcontextprotocol/sdk": "^1.24.3", "@modelcontextprotocol/sdk": "^1.24.3",
"react": "^19.2.0", "react": "^19.2.0",
"react-dom": "^19.2.0", "react-dom": "^19.2.0"
"zod": "^3.25"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rollup/rollup-darwin-arm64": "^4.53.3", "@rollup/rollup-darwin-arm64": "^4.53.3",

View file

@ -181,14 +181,14 @@ function postProcess(content: string): string {
// 1. Update import to use zod/v4 // 1. Update import to use zod/v4
content = content.replace( content = content.replace(
'import { z } from "zod";', 'import { z } from "zod";',
'import { z } from "zod/v4";', 'import * as z from "zod/v4";',
); );
// 2. Add MCP SDK schema imports // 2. Add MCP SDK schema imports
const mcpImports = EXTERNAL_TYPE_SCHEMAS.join(",\n "); const mcpImports = EXTERNAL_TYPE_SCHEMAS.join(",\n ");
content = content.replace( content = content.replace(
'import { z } from "zod/v4";', 'import * as z from "zod/v4";',
`import { z } from "zod/v4"; `import * as z from "zod/v4";
import { import {
${mcpImports}, ${mcpImports},
} from "@modelcontextprotocol/sdk/types.js";`, } from "@modelcontextprotocol/sdk/types.js";`,
@ -262,7 +262,7 @@ function replaceRecordAndWithLooseObject(content: string): string {
function postProcessTests(content: string): string { function postProcessTests(content: string): string {
content = content.replace( content = content.replace(
'import { z } from "zod";', 'import { z } from "zod";',
'import { z } from "zod/v4";', 'import * as z from "zod/v4";',
); );
content = content.replace( content = content.replace(

View file

@ -1,5 +1,5 @@
import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { ZodLiteral, ZodObject } from "zod/v4"; import * as z from "zod/v4/core";
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js"; import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
import { import {
@ -838,10 +838,10 @@ export class AppBridge extends Protocol<Request, Notification, Result> {
} }
private forwardRequest< private forwardRequest<
Req extends ZodObject<{ Req extends z.$ZodObject<{
method: ZodLiteral<string>; method: z.$ZodLiteral<string>;
}>, }>,
Res extends ZodObject<{}>, Res extends z.$ZodObject<{}>,
>(requestSchema: Req, resultSchema: Res) { >(requestSchema: Req, resultSchema: Res) {
this.setRequestHandler(requestSchema, async (request, extra) => { this.setRequestHandler(requestSchema, async (request, extra) => {
console.log(`Forwarding request ${request.method} from MCP UI client`); console.log(`Forwarding request ${request.method} from MCP UI client`);
@ -851,7 +851,7 @@ export class AppBridge extends Protocol<Request, Notification, Result> {
}); });
} }
private forwardNotification< private forwardNotification<
N extends ZodObject<{ method: ZodLiteral<string> }>, N extends z.$ZodObject<{ method: z.$ZodLiteral<string> }>,
>(notificationSchema: N) { >(notificationSchema: N) {
this.setNotificationHandler(notificationSchema, async (notification) => { this.setNotificationHandler(notificationSchema, async (notification) => {
console.log( console.log(

View file

@ -1212,7 +1212,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -1259,7 +1259,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -1306,7 +1306,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -1380,7 +1380,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -1473,7 +1473,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -1871,7 +1871,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -1918,7 +1918,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -1965,7 +1965,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -2039,7 +2039,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false
@ -2132,7 +2132,7 @@
"lastModified": { "lastModified": {
"type": "string", "type": "string",
"format": "date-time", "format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$" "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
} }
}, },
"additionalProperties": false "additionalProperties": false

View file

@ -1,7 +1,7 @@
// Generated by ts-to-zod // Generated by ts-to-zod
// Integration tests verifying schemas match TypeScript types // Integration tests verifying schemas match TypeScript types
// Run: npm run generate:schemas // Run: npm run generate:schemas
import { z } from "zod/v4"; import * as z from "zod/v4";
import * as spec from "../spec.types.js"; import * as spec from "../spec.types.js";
import * as generated from "./schema.js"; import * as generated from "./schema.js";

View file

@ -1,7 +1,7 @@
// Generated by ts-to-zod // Generated by ts-to-zod
// Post-processed for Zod v4 and MCP SDK compatibility // Post-processed for Zod v4 and MCP SDK compatibility
// Run: npm run generate:schemas // Run: npm run generate:schemas
import { z } from "zod/v4"; import * as z from "zod/v4";
import { import {
ContentBlockSchema, ContentBlockSchema,
CallToolResultSchema, CallToolResultSchema,