MCP 2025-06-18 and 2025-11-25 require structured output to be an object. For MCP 2025-06-18 the outputSchema root declares type object. For MCP 2025-11-25 a declared root type must include object; a root without a literal type object stays valid and mcp.tool.schema.native-shape warns. MCP 2026-07-28 permits other roots, so an array schema needs a scope that excludes the object-only versions; projection must not wrap it in an object as a repair.
Requirement
Section titled “Requirement”Before MCP 2026-07-28, a Tool outputSchema describes an object: a literal type “object” for MCP 2025-06-18, and a declared root type that includes “object” for MCP 2025-11-25.
Details
Section titled “Details”Rule ID: mcp.tool.output-schema.object-root
Owner: mcp
Surface: Tool · Path: outputSchema
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 |
|---|---|---|---|---|
| not-applicable | not-applicable | applies | applies | not-applicable |
Required by
Section titled “Required by”- MCP Description 0.9.0, Section 9.2
- 9. Tools: req-tool-output-schema-object-root
Based on
Section titled “Based on”- Tier 1 — MCP schema.ts and normative specification text: MCP 2025-06-18 and 2025-11-25 schema.ts, interface Tool, outputSchema (type “object”)
- Tier 1 — MCP schema.ts and normative specification text: MCP 2026-07-28 schema.ts, interface Tool, outputSchema (no root type)
- Tier 1 — MCP schema.ts and normative specification text: MCP 2025-11-25 specification, Basic, JSON Schema usage (schemas are validated under their declared or default dialect)
Gaps and arbitrations
Section titled “Gaps and arbitrations”Examples
Section titled “Examples”Valid example
Section titled “Valid example”Source: expected-warning/tool-schema-mcp-type-mismatch.json · Selected: /tools/3/outputSchema
{ "allOf": [ { "type": "object", "properties": { "summary": { "type": "string" } } } ]}Invalid example
Section titled “Invalid example”Source: expected-invalid/non-object-output-schema-before-2026.json · Selected: /tools/0/outputSchema
{ "type": "array", "items": { "type": "string" }}Rule not applicable
Section titled “Rule not applicable”The rule does not run on this fragment for any MCP protocol version it applies to.
Source: expected-valid/protocol-coverage-and-tool-schemas.json · Selected: /tools/3/outputSchema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "oneOf": [ { "type": "object", "properties": { "result": { "type": "string" } }, "required": [ "result" ], "additionalProperties": false }, { "type": "array", "items": { "type": "string" } } ]}Rule Source Code
Section titled “Rule Source Code”tool.yaml at immutable tag v0.9.0-rc.3.