Tool arguments are always a JSON object, so after component resolution the inputSchema root must describe an object. Before MCP 2025-11-25 the root declares the literal type object. From MCP 2025-11-25 a declared root type must include object; a root in $ref or allOf stays valid, and mcp.tool.schema.native-shape warns that the MCP Tool type expects a literal type object.
Requirement
Section titled “Requirement”Tool inputSchema describes an object: a literal type “object” before MCP 2025-11-25, and from MCP 2025-11-25 a declared root type that includes “object”.
Details
Section titled “Details”Rule ID: mcp.tool.input-schema.object-root
Owner: mcp
Surface: Tool · Path: inputSchema
Kind: structural
Requirement level: must
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 |
|---|---|---|---|---|
| applies | applies | applies | applies | applies |
Required by
Section titled “Required by”- MCP Description 0.9.0, Section 9.2
- 9. Tools: req-tool-input-schema-object-root
Based on
Section titled “Based on”- Tier 1 — MCP schema.ts and normative specification text: MCP 2024-11-05 to 2026-07-28 schema.ts, interface Tool, inputSchema type: “object”
- Tier 1 — MCP schema.ts and normative specification text: MCP 2026-07-28 specification, Server Features, Tools, Data Types, Tool (inputSchema MUST be a valid JSON Schema object, not null)
- 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 4 — Official MCP clarifications and final SEPs: MCP SEP-2106 (Final), which keeps type “object” deliberately
Gaps and arbitrations
Section titled “Gaps and arbitrations”Examples
Section titled “Examples”Valid example
Section titled “Valid example”Source: expected-valid/custom-tool-schema-keywords.json · Selected: /tools/0/inputSchema
{ "type": "object", "properties": { "account": { "type": "string", "x-acme-account-id": true, "database-field-id": 123 }, "region": { "type": "string", "x-mcp-header": "Region" } }}Valid example
Section titled “Valid example”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" ] } }}Invalid example
Section titled “Invalid example”Source: expected-invalid/non-object-input-schema.json · Selected: /tools/0/inputSchema
{ "type": "string"}Invalid example
Section titled “Invalid example”Source: expected-invalid/non-object-input-schema.json · Selected: /tools/2/inputSchema
{ "$componentRef": "#/components/schemas/StringArguments"}Invalid example
Section titled “Invalid example”Source: expected-invalid/non-literal-object-input-schema-before-2025-11-25.json · Selected: /tools/0/inputSchema
{ "$ref": "#/$defs/Arguments", "$defs": { "Arguments": { "type": "object" } }}Rule Source Code
Section titled “Rule Source Code”tool.yaml at immutable tag v0.9.0-rc.3.