Skip to content

[v2][Web][Streamable HTTP] Remote proxy drops the negotiated Mcp-Protocol-Version header #1935

Closed

Description

@dreamsxin

Which version line?

v2 — current (@modelcontextprotocol/inspector@latest)

Which client?

Web

Inspector version

2.1.0

Node version

v24.15.0

Operating system (and browser, for the web client)

Windows 11 10.0.26200, Chrome

Transport

Streamable HTTP

MCP server under inspection

Server: A stateful local Streamable HTTP MCP server
URL: http://localhost:65535/sdk/v1/mcp
Protocol era: legacy / MCP 2025-11-25
OAuth: no

The server returns both Mcp-Session-Id and Mcp-Protocol-Version from
initialize. Both headers are also exposed through CORS.

Steps to reproduce

  1. Run npx @modelcontextprotocol/inspector@2.1.0.
  2. Add http://localhost:65535/sdk/v1/mcp as a Streamable HTTP server.
  3. Use the legacy protocol era and connect.
  4. Observe that initialize requests protocol version 2025-11-25.
  5. Observe that the initialize response returns:
    • Mcp-Session-Id
    • Mcp-Protocol-Version: 2025-11-25
    • result.protocolVersion: 2025-11-25
  6. Inspect the immediately following notifications/initialized request.

The request contains Mcp-Session-Id, but does not contain
Mcp-Protocol-Version.

Expected behavior

After initialization, every Streamable HTTP request must include the negotiated
protocol version:

Mcp-Protocol-Version: 2025-11-25

This includes notifications/initialized, subsequent JSON-RPC requests, SSE
GET requests, and session DELETE requests.

Actual behavior

The Inspector Web client sends Mcp-Session-Id but drops
Mcp-Protocol-Version in the remote proxy layer.

The MCP server therefore rejects notifications/initialized with HTTP 400:

{
  "jsonrpc": "2.0",
  "id": null,
  "error": {
    "code": -32001,
    "message": "Mcp-Protocol-Version is required for a session",
    "data": {}
  }
}

Logs, errors, or screenshots

The same endpoint works when used directly through
@modelcontextprotocol/client@2.0.0-beta.5; the direct SDK client correctly
sends both headers.
This resembles #679, but reproduces in the new v2.1.0 remote transport
architecture.

Already prototyped a fix?

No response

Before you submit

  • I searched existing issues and this is not a duplicate.
  • This is not a security vulnerability report (those go through the private advisory process).

Activity

  1. symdeb commented on Aug 6, 2026

    @symdeb

    I believe protocol version was always in the arguments but not in the header in v1 ?
    In v2 its double up. in the header and in the args.

  2. added this to the v2.3.0 milestone on Aug 10, 2026
  3. modified the milestones: v2.3.0, v2.2.0 on Aug 11, 2026
  4. self-assigned this
    on Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingv2Issues and PRs for v2

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions