Skip to content

Version negotiation failed: the server did not offer pinned protocol version

Spec
2025-11-25 → 2026-07-28
Evidence
E2Reproducedarm64
TypeScript SDK (client)
@modelcontextprotocol/client@2.4.0
MCP Inspector
@modelcontextprotocol/inspector@2.12.0
Java SDK
io.modelcontextprotocol.sdk:mcp@2.1.0
Verified

A 2026-07-28 client asks the server which versions it supports, using server/discover. When the client is pinned to one version and the server does not list it, the client stops. We connected to the Java SDK 2.1.0 example, which only supports up to 2025-11-25:

Client Message
TypeScript SDK v2 2.4.0, versionNegotiation: { mode: { pin: '2026-07-28' } } Version negotiation failed: the server did not offer pinned protocol version 2026-07-28 via server/discover (no fallback in pin mode) (code ERA_NEGOTIATION_FAILED)
MCP Inspector 2.12.0, --cli --protocol-era modern {"error":{"code":"error","message":"Version negotiation failed: …"}}, exit code 1

The same server worked with the default setting and with auto, which both ended at 2025-11-25.

The same code ERA_NEGOTIATION_FAILED also appears as Version negotiation probe failed: fetch failed when the server cannot be reached at all; that is a connection problem.

Check which versions the server’s SDK supports. In our tests the TypeScript (2.4.0), Python (2.3.0) and Go (v1.8.0) SDKs served 2026-07-28; the Java SDK 2.1.0 did not. Upgrade the server’s SDK when a version with 2026-07-28 support is available, or keep the client able to fall back.

Pinning is useful in tests that must prove a server speaks the new protocol. For everyday use, let the client fall back:

  • TypeScript SDK v2: versionNegotiation: { mode: 'auto' } tries 2026-07-28 and falls back to the initialize handshake.
  • MCP Inspector: --protocol-era auto instead of modern.

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