From MCP 2025-11-25, an embedded Tool schema is judged by its JSON Schema dialect, but the MCP Tool type still restricts some schema syntax: a literal type object at the inputSchema root, and for MCP 2025-11-25 at the outputSchema root and an object for each top-level properties value. A schema that misses a restriction stays valid and receives a warning naming the protocol versions concerned, because its native projection for them fails. Use {} instead of true, {“not”: {}} instead of false, add type object beside $ref or allOf, or narrow the Tool’s protocolVersions.
Requirement
Section titled “Requirement”A Tool schema that is valid under its dialect but misses a schema-syntax restriction of the MCP Tool type for an applicable protocol version is accepted with a warning.
Details
Section titled “Details”Rule ID: mcp.tool.schema.native-shape
Owner: mcp
Surface: Tool · Path: inputSchema, outputSchema
Kind: structural
Requirement level: should
Status: arbitrated · Enforcement: internal
Protocol version applicability
Section titled “Protocol version applicability”2024-11-05 |
2025-03-26 |
2025-06-18 |
2025-11-25 |
2026-07-28 |
|---|---|---|---|---|
| not-applicable | not-applicable | not-applicable | applies | applies |
Required by
Section titled “Required by”- MCP Description 0.9.0, Section 9.2
- 9. Tools: req-tool-schema-native-shape
- Proposal 0032, Dialect-governed Tool schemas
Based on
Section titled “Based on”- Tier 1 — MCP schema.ts and normative specification text: MCP 2025-11-25 schema.ts, interface Tool: inputSchema and outputSchema have type: “object” and properties?: { [key: string]: object }
- Tier 1 — MCP schema.ts and normative specification text: MCP 2026-07-28 schema.ts, interface Tool: inputSchema has type: “object” and an open index signature; outputSchema has no root type
- Tier 1 — MCP schema.ts and normative specification text: MCP 2025-11-25 and 2026-07-28 specification, Basic, JSON Schema usage (schemas are validated under their declared or default dialect)
- https://github.com/modelcontextprotocol/modelcontextprotocol/blob/dae694f61a31f7a3ec2af3aff709e11f70f61e48/docs/specification/2025-11-25/basic/index.mdx#L140-L186
- https://github.com/modelcontextprotocol/modelcontextprotocol/blob/dae694f61a31f7a3ec2af3aff709e11f70f61e48/docs/specification/2026-07-28/basic/index.mdx#L251-L297
- Tier 5 — Official SDKs and reference implementations: Official TypeScript SDK, Tool schema: any JSON value under properties, type: z.literal(‘object’) at the inputSchema root
Gaps and arbitrations
Section titled “Gaps and arbitrations”Only a declared root type is examined; composition is not analyzed to prove that a root admits objects. Nested schemas and keywords other than top-level properties are not restricted by any MCP Tool type.
Examples
Section titled “Examples”Valid example
Section titled “Valid example”Source: expected-valid/tool-schema-mcp-type-shapes.json · Selected: /tools/0/inputSchema
{ "type": "object", "properties": { "enabled": {}, "debug": { "not": {} } }}Valid example
Section titled “Valid example”Source: expected-valid/tool-schema-mcp-type-shapes.json · Selected: /tools/1/inputSchema
{ "type": "object", "$ref": "#/$defs/Arguments", "$defs": { "Arguments": { "type": "object", "properties": { "query": { "type": "string" } }, "required": [ "query" ] } }}Valid example
Section titled “Valid example”Source: expected-valid/tool-schema-mcp-type-shapes.json · Selected: /tools/2/inputSchema
{ "type": "object", "properties": { "options": { "type": "object", "properties": { "strict": true } }, "tags": { "type": "array", "items": true } }, "additionalProperties": false}Valid example
Section titled “Valid example”Source: expected-valid/tool-schema-mcp-type-shapes.json · Selected: /tools/3/inputSchema
{ "type": "object", "properties": { "enabled": true }}Accepted with a warning
Section titled “Accepted with a warning”Source: expected-warning/tool-schema-mcp-type-mismatch.json · Selected: /tools/0/inputSchema/properties/enabled
trueAccepted with a warning
Section titled “Accepted with a warning”Source: expected-warning/tool-schema-mcp-type-mismatch.json · Selected: /tools/0/inputSchema/properties/debug
falseAccepted with a warning
Section titled “Accepted with a warning”Source: expected-warning/tool-schema-mcp-type-mismatch.json · Selected: /tools/1/outputSchema/properties/result
trueAccepted with a warning
Section titled “Accepted with a warning”Source: expected-warning/tool-schema-mcp-type-mismatch.json · Selected: /tools/2/inputSchema
{ "$ref": "#/$defs/Arguments", "$defs": { "Arguments": { "type": "object", "properties": { "query": { "type": "string" } }, "required": [ "query" ] } }}Accepted with a warning
Section titled “Accepted with a warning”Source: expected-warning/tool-schema-mcp-type-mismatch.json · Selected: /tools/3/outputSchema
{ "allOf": [ { "type": "object", "properties": { "summary": { "type": "string" } } } ]}Rule Source Code
Section titled “Rule Source Code”tool.yaml at immutable tag v0.9.0-rc.3.