createmcps.com

MCP-HDR-004

Missing MCP-Protocol-Version rejected (modern-only servers)

“Every POST request to the MCP endpoint MUST include an MCP-Protocol-Version header.” — spec anchor

How to fix this

Note: a dual-era server MAY treat a missing header as 2025-03-26 — demote to info if era classification (P9.1) found dual support.

Example: failing and passing

The POST carries no MCP-Protocol-Version header, and a modern-only server processes it anyway.
Violates MCP-HDR-004 · HTTP
POST /mcp HTTP/1.1
Host: mcp.example.com
Content-Type: application/json
Mcp-Method: tools/list

{"jsonrpc": "2.0", "id": 1, "method": "tools/list",
  "params": {
    "_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
              "io.modelcontextprotocol/clientCapabilities": {}}}}

HTTP/1.1 200 OK
Content-Type: application/json

{"jsonrpc": "2.0", "id": 1, "result": {"resultType": "complete", "tools": [], "ttlMs": 300000, "cacheScope": "public"}}
A modern-only server rejects the POST that lacks MCP-Protocol-Version with 400 Bad Request and -32020.
Complies with MCP-HDR-004 · HTTP
POST /mcp HTTP/1.1
Host: mcp.example.com
Content-Type: application/json
Mcp-Method: tools/list

{"jsonrpc": "2.0", "id": 1, "method": "tools/list",
  "params": {
    "_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
              "io.modelcontextprotocol/clientCapabilities": {}}}}

HTTP/1.1 400 Bad Request
Content-Type: application/json

{"jsonrpc": "2.0", "id": 1, "error": {"code": -32020, "message": "Header mismatch: required header MCP-Protocol-Version is missing"}}

Check your own server against MCP-HDR-004

Probe P3.4 checks MCP-HDR-004 in a request of its own, 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 explained.

Other Request metadata headers rules

  • MCP-HDR-001Missing Mcp-Method rejected with 400 + HeaderMismatch
  • MCP-HDR-002Missing Mcp-Name on tools/call rejected with 400 + HeaderMismatch
  • MCP-HDR-003Mcp-Name header must match the request body
  • MCP-HDR-005MCP-Protocol-Version header must match _meta.protocolVersion
  • MCP-HDR-006Header names compared case-insensitively
  • MCP-HDR-007Base64 sentinel-encoded header values decoded before comparison
  • MCP-HDR-008Mcp-Param-{Name} validated against body when x-mcp-header is declared
  • MCP-HDR-009Mcp-Param-{Name} containing invalid characters is rejected
  • MCP-HDR-010Header validation runs before method dispatch