Native projection resolves Tool schema components, removes description-only fields, and checks the value against the selected MCP schema. It does not repair values or invent defaults. A postcondition failure returns no projected value. It is an implementation or specification defect, unless validation warned about the Tool schema under mcp.tool.schema.native-shape for that protocol version.
Requirement
Section titled “Requirement”A native projection keeps exactly the declaration fields that the MCP type defines in the protocol version, unchanged after reference resolution, and the value validates against the pinned MCP schema for that protocol version.
Details
Section titled “Details”Rule ID: mcpdesc.projection.native-schema
Owner: mcpdesc
Surface: Tool, Resource, ResourceTemplate, Prompt
Kind: mcpdesc-semantic
Requirement level: must
Status: delegated · Enforcement: external
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 4.14, steps 4 to 6, no synthesis, and lists
- 4. Versioning: req-native-projection-references-resolved
-
- Versioning: req-native-projection-fields
-
- Versioning: req-native-projection-postcondition
-
- Versioning: req-native-projection-no-synthesis
-
- Versioning: req-native-projection-lists
-
- Versioning: req-native-projection-steps
-
- Versioning: req-native-projection-no-repair
-
- Resources and Resource Templates: req-resource-example-projection-omitted
-
- Resources and Resource Templates: req-template-completion-projection-omitted
The postcondition cases come from Tool schemas that are valid under their JSON Schema dialect but miss a schema-syntax restriction of the MCP Tool type (Proposal 0032), not from an injected fault: the source is valid with a warning, yet the native value fails the pinned MCP schema. A list fails as a whole. scripts/test-projection-fixtures.mjs checks that each failure case’s value really fails that schema and that every expected value passes it.
Examples
Section titled “Examples”Projection succeeds
Section titled “Projection succeeds”Source: projection-fixtures/tool-icons-execution-component-2025-11-25.json · Selected: /expected
{ "name": "report", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "period": { "type": "string", "x-ui-order": 1 } } }, "title": "Usage report", "outputSchema": { "type": "object", "properties": { "total": { "type": "number" } }, "required": [ "total" ] }, "icons": [ { "src": "https://example.com/report.png", "mimeType": "image/png" } ], "execution": { "taskSupport": "optional" }}Projection succeeds
Section titled “Projection succeeds”Source: projection-fixtures/tool-component-input-array-output-2026-07-28.json · Selected: /expected
{ "name": "report", "inputSchema": { "type": "object", "properties": { "region": { "type": "string", "x-mcp-header": "Region" } } }, "title": "Usage report", "outputSchema": { "type": "array", "items": { "type": "number" } }, "_meta": { "example.com/team": "reports" }, "icons": [ { "src": "https://example.com/report.png", "mimeType": "image/png", "theme": "light" } ]}Projection succeeds
Section titled “Projection succeeds”Source: projection-fixtures/prompt-arguments-2024-11-05.json · Selected: /expected/arguments
[ { "name": "text", "description": "Text to summarize.", "required": true }, { "name": "style" }]Projection succeeds
Section titled “Projection succeeds”Source: projection-fixtures/tools-list-2025-11-25.json · Selected: /expected
[ { "name": "search", "description": "Search the catalog.", "inputSchema": { "type": "object", "properties": { "query": { "type": "string" } }, "required": [ "query" ] } }, { "name": "report", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "period": { "type": "string", "x-ui-order": 1 } } }, "title": "Usage report", "outputSchema": { "type": "object", "properties": { "total": { "type": "number" } }, "required": [ "total" ] }, "icons": [ { "src": "https://example.com/report.png", "mimeType": "image/png" } ], "execution": { "taskSupport": "optional" } }]Projection succeeds
Section titled “Projection succeeds”Source: projection-fixtures/tool-boolean-property-schema-2026-07-28.json · Selected: /expected/inputSchema/properties
{ "enabled": true}Projection fails
Section titled “Projection fails”Source: projection-fixtures/tool-postcondition-failed-2025-11-25.json · Selected: /expectedError
"projection-postcondition-failed"Projection fails
Section titled “Projection fails”Source: projection-fixtures/tools-list-postcondition-failed-2025-11-25.json · Selected: /expectedError
"projection-postcondition-failed"Projection fails
Section titled “Projection fails”Source: projection-fixtures/tool-ref-root-postcondition-failed-2025-11-25.json · Selected: /expectedError
"projection-postcondition-failed"Projection fails
Section titled “Projection fails”Source: projection-fixtures/tool-ref-root-postcondition-failed-2026-07-28.json · Selected: /expectedError
"projection-postcondition-failed"Rule Source Code
Section titled “Rule Source Code”projection.yaml at immutable tag v0.9.0-rc.3.