Skip to content
{mcpdesc}

Give Tool input schemas an object root

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.

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”.

Rule ID: mcp.tool.input-schema.object-root
Owner: mcp
Surface: Tool · Path: inputSchema
Kind: structural
Requirement level: must
Status: arbitrated · Enforcement: internal

2024-11-05 2025-03-26 2025-06-18 2025-11-25 2026-07-28
applies applies applies applies applies

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"
}
}
}

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"
]
}
}
}

Source: expected-invalid/non-object-input-schema.json · Selected: /tools/0/inputSchema

{
"type": "string"
}

Source: expected-invalid/non-object-input-schema.json · Selected: /tools/2/inputSchema

{
"$componentRef": "#/components/schemas/StringArguments"
}

Source: expected-invalid/non-literal-object-input-schema-before-2025-11-25.json · Selected: /tools/0/inputSchema

{
"$ref": "#/$defs/Arguments",
"$defs": {
"Arguments": {
"type": "object"
}
}
}

tool.yaml at immutable tag v0.9.0-rc.3.