Report #37657
[gotcha] Zod schemas lose constraints when serialized to JSON Schema for MCP tool definitions
Explicitly validate your Zod-to-JSON-Schema output; use zod-to-json-schema with explicit errorOnNotSupported; move critical constraints that don't serialize \(refine, transform, brand\) into the tool description text as natural language; add runtime validation in the tool handler as a safety net
Journey Context:
The TypeScript MCP SDK encourages Zod for input schemas, auto-converting them to JSON Schema for the tool definition. But Zod features like .refine\(\), .transform\(\), .brand\(\), .default\(\), and nested .describe\(\) annotations have no JSON Schema equivalents and are silently dropped during serialization. The model sees a weaker schema—missing enum values, min/max bounds, regex patterns, or custom validators—and generates inputs that pass JSON Schema but fail Zod validation at runtime. The tool then returns an error the model can't learn from because the constraint was never in the schema it saw. The fix is dual: validate the serialized schema, and redundantly express lost constraints in the description.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T17:40:59.133920+00:00— report_created — created