Skip to content

Unsupported protocol version (-32022)

Spec
2025-11-25 → 2026-07-28
Evidence
E2Reproducedarm64
TypeScript SDK (server)
@modelcontextprotocol/server@2.4.0
TypeScript SDK v2 (Node HTTP)
@modelcontextprotocol/node@2.1.2
Python SDK
mcp@2.3.0
Verified

The specification says a server that does not implement the requested version must answer 400 Bad Request with an UnsupportedProtocolVersionError that lists the versions it does support. 2026-07-28 numbers this error -32022. We saw two forms:

Situation Response
2026-07-28 request to a TypeScript v2 server wired as new NodeStreamableHTTPServerTransport({ sessionIdGenerator: undefined }) per request 400 Bad Request: Unsupported protocol version: 2026-07-28 (supported versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07)
Request for 2099-01-01 to a TypeScript server built with createMcpHandler 400 {"code":-32022,"message":"Unsupported protocol version: 2099-01-01","data":{"supported":["2026-07-28"],"requested":"2099-01-01"}}
The same request to Python SDK 2.3.0 400 {"code":-32022,"message":"Unsupported protocol version","data":{"supported":["2026-07-28"],…}}

Read the supported list in the message: it tells you which side to change.

A TypeScript server uses the old transport wiring

Section titled “A TypeScript server uses the old transport wiring”

If the list stops at 2025-11-25, the server is built the 2025 way. The pattern still shown in many examples, a NodeStreamableHTTPServerTransport with sessionIdGenerator: undefined created per request, only serves 2025-era requests. Current clients that try 2026-07-28 first then fall back: in our test the TypeScript v2 client with versionNegotiation: 'auto' connected at 2025-11-25, and only a client pinned to 2026-07-28 failed.

To serve both generations, build the endpoint with createMcpHandler from @modelcontextprotocol/server and adapt it to Node.js with toNodeHandler from @modelcontextprotocol/node. It answers 2026-07-28 requests and serves 2025 clients statelessly from the same server factory. See Build a Streamable HTTP server in TypeScript.

The client asks for a version the server does not know

Section titled “The client asks for a version the server does not know”

If the list contains 2026-07-28 and the request named something else, the client is newer than the server or sends a wrong value. A client must send the same version in the MCP-Protocol-Version header and in _meta. Use a version from the supported list, or let the client negotiate with server/discover.

Sources

MCPDev is community documentation. It is not affiliated with the Model Context Protocol project or with the vendors of the clients it covers.