Skip to content
{mcpdesc}

Preserve MCP values when projecting declarations

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.

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.

Rule ID: mcpdesc.projection.native-schema
Owner: mcpdesc
Surface: Tool, Resource, ResourceTemplate, Prompt
Kind: mcpdesc-semantic
Requirement level: must
Status: delegated · Enforcement: external

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

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.

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

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

Source: projection-fixtures/prompt-arguments-2024-11-05.json · Selected: /expected/arguments

[
{
"name": "text",
"description": "Text to summarize.",
"required": true
},
{
"name": "style"
}
]

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

Source: projection-fixtures/tool-boolean-property-schema-2026-07-28.json · Selected: /expected/inputSchema/properties

{
"enabled": true
}

Source: projection-fixtures/tool-postcondition-failed-2025-11-25.json · Selected: /expectedError

"projection-postcondition-failed"

Source: projection-fixtures/tools-list-postcondition-failed-2025-11-25.json · Selected: /expectedError

"projection-postcondition-failed"

Source: projection-fixtures/tool-ref-root-postcondition-failed-2025-11-25.json · Selected: /expectedError

"projection-postcondition-failed"

Source: projection-fixtures/tool-ref-root-postcondition-failed-2026-07-28.json · Selected: /expectedError

"projection-postcondition-failed"

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