createmcps.com

MCP-SCH-005

x-mcp-header property is statically reachable via properties only

“The chain MUST NOT pass through items (or any other array keyword), composition keywords (oneOf, anyOf, allOf, not), conditional keywords (if/then/else), or $ref.” — spec anchor

How to fix this

Consequence, not a separate rule: a violation makes the WHOLE tool definition invalid, and conforming clients MUST exclude it from tools/list — the tool silently disappears from every compliant client.

Example: failing and passing

The annotated property is only reachable through anyOf, so no client can resolve the header path statically.
Violates MCP-SCH-005 · JSON
{
  "name": "execute_sql",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": { "type": "string", "description": "The SQL query to execute" }
    },
    "anyOf": [
      {
        "properties": { "region": { "type": "string", "x-mcp-header": "Region" } }
      }
    ]
  }
}
The annotated property sits directly under properties, so it is statically reachable.
Complies with MCP-SCH-005 · JSON
{
  "name": "execute_sql",
  "inputSchema": {
    "type": "object",
    "properties": {
      "region": { "type": "string", "x-mcp-header": "Region" },
      "query": { "type": "string", "description": "The SQL query to execute" }
    }
  }
}

How the validator checks this

Probe P2.1, against a streamable-http server on the modern protocol. What it reports:

pass
Every x-mcp-header property is statically reachable via properties
fail
x-mcp-header must not be reached through

Quoted from the probe that runs this check, so it cannot drift from what the validator actually reports.

This rule is checked deterministically: a fail here is a certain violation, not an inference.

Checked in the same request as MCP-HDR-008, MCP-HDR-009, MCP-RES-003, MCP-RES-006, MCP-RES-007, MCP-ERR-003, MCP-ERR-004, MCP-ERR-005, MCP-ERR-008, MCP-CAC-001, MCP-CAC-002, MCP-CAC-003, MCP-CAC-004, MCP-CAC-005, MCP-SCH-001, MCP-SCH-002, MCP-SCH-003, MCP-SCH-004, MCP-SCH-006, MCP-SCH-007, MCP-SEC-004, MCP-SEC-005, MCP-SEC-006, MCP-DEP-005.

Check your own server against MCP-SCH-005

Probe P2.1 checks MCP-SCH-005 in the same request as 24 other rules, so one run shows your server's result for this rule next to the rest. Validate a server or read how the validator works.

Background on this topic: the Mcp-Method header and x-mcp-header explained.

Other Tool/prompt schema and x-mcp-header rules

  • MCP-SCH-001x-mcp-header is non-empty and matches RFC 9110 token syntax
  • MCP-SCH-002x-mcp-header contains no control characters, CR, or LF
  • MCP-SCH-003x-mcp-header values are case-insensitively unique per inputSchema
  • MCP-SCH-004x-mcp-header only on string/integer/boolean — never number
  • MCP-SCH-006inputSchema/outputSchema validate against the declared or default 2020-12 dialect
  • MCP-SCH-007Tool, prompt, and resource names are header-safe ASCII