1515from inline_snapshot import snapshot
1616
1717from mcp .client import ClientSession
18- from mcp .client .streamable_http import StreamableHTTPTransport , _encode_header_value , streamable_http_client
18+ from mcp .client .streamable_http import (
19+ MCP_PROTOCOL_VERSION ,
20+ StreamableHTTPTransport ,
21+ _encode_header_value ,
22+ streamable_http_client ,
23+ )
1924from mcp .types import JSONRPCMessage , JSONRPCNotification , JSONRPCRequest , JSONRPCResponse
2025
2126
@@ -135,8 +140,8 @@ def handler(request: httpx.Request) -> httpx.Response:
135140 assert all ("mcp-session-id" not in r .headers for r in recorded )
136141
137142
138- def test_constructor_pin_is_not_overwritten_by_an_initialize_result () -> None :
139- """A protocol_version passed at construction wins over the InitializeResult snoop."""
143+ def test_modern_constructor_pin_is_not_overwritten_by_an_initialize_result () -> None :
144+ """A 2026-07-28+ pin wins over the InitializeResult snoop (no initialize is ever sent) ."""
140145 transport = StreamableHTTPTransport ("http://test/mcp" , protocol_version = "2026-07-28" )
141146 init = JSONRPCResponse (
142147 jsonrpc = "2.0" ,
@@ -149,3 +154,22 @@ def test_constructor_pin_is_not_overwritten_by_an_initialize_result() -> None:
149154 )
150155 transport ._maybe_extract_protocol_version_from_message (init ) # pyright: ignore[reportPrivateUsage]
151156 assert transport .protocol_version == "2026-07-28"
157+
158+
159+ def test_stateful_constructor_pin_is_ignored_and_the_negotiated_version_wins () -> None :
160+ """A pre-2026 pin is a session-layer concern; the transport must not stamp it on the
161+ initialize request and must adopt the server's negotiated version for later headers."""
162+ transport = StreamableHTTPTransport ("http://test/mcp" , protocol_version = "2025-06-18" )
163+ assert MCP_PROTOCOL_VERSION not in transport ._prepare_headers () # pyright: ignore[reportPrivateUsage]
164+ init = JSONRPCResponse (
165+ jsonrpc = "2.0" ,
166+ id = 1 ,
167+ result = {
168+ "protocolVersion" : "2025-03-26" ,
169+ "capabilities" : {},
170+ "serverInfo" : {"name" : "s" , "version" : "0" },
171+ },
172+ )
173+ transport ._maybe_extract_protocol_version_from_message (init ) # pyright: ignore[reportPrivateUsage]
174+ assert transport .protocol_version == "2025-03-26"
175+ assert transport ._prepare_headers ()[MCP_PROTOCOL_VERSION ] == "2025-03-26" # pyright: ignore[reportPrivateUsage]
0 commit comments