Ignore pre-2026 protocol_version pins at the StreamableHTTP transport (#2923)
This commit is contained in:
parent
fda4c54362
commit
5a3412ddc1
2 changed files with 37 additions and 9 deletions
|
|
@ -97,7 +97,9 @@ class Client:
|
|||
|
||||
Pinning to ``2026-07-28`` or later selects the stateless transport era: no initialize
|
||||
handshake is sent on the wire (the session synthesizes its `InitializeResult` locally),
|
||||
and for HTTP the ``MCP-Protocol-Version`` header is set from the first request.
|
||||
and for HTTP the ``MCP-Protocol-Version`` header is set from the first request. A modern
|
||||
pin currently requires a URL or `Transport`; the in-memory `Server`/`MCPServer` path
|
||||
does not yet have a modern entry point.
|
||||
Leave as ``None`` to negotiate the version via the initialize handshake.
|
||||
"""
|
||||
|
||||
|
|
|
|||
|
|
@ -93,13 +93,14 @@ class StreamableHTTPTransport:
|
|||
|
||||
Args:
|
||||
url: The endpoint URL.
|
||||
protocol_version: Pin the MCP-Protocol-Version header from the first request
|
||||
instead of waiting to snoop it from an InitializeResult. Required for
|
||||
stateless 2026-07-28 sessions that never send initialize.
|
||||
protocol_version: Pin the MCP-Protocol-Version header from the first request.
|
||||
Only honoured for stateless 2026-07-28+ sessions that never send
|
||||
initialize; for earlier (stateful) versions the header is populated
|
||||
from the negotiated InitializeResult, so a pre-2026 value is ignored.
|
||||
"""
|
||||
self.url = url
|
||||
self.session_id: str | None = None
|
||||
self.protocol_version: str | None = protocol_version
|
||||
self.protocol_version: str | None = protocol_version if protocol_version in MODERN_PROTOCOL_VERSIONS else None
|
||||
|
||||
def _per_message_headers(self, message: JSONRPCMessage) -> dict[str, str]:
|
||||
"""Per-POST routing headers (Mcp-Method, Mcp-Name) for 2026-07-28+ pinned transports.
|
||||
|
|
@ -158,7 +159,8 @@ class StreamableHTTPTransport:
|
|||
def _maybe_extract_protocol_version_from_message(self, message: JSONRPCMessage) -> None:
|
||||
"""Extract protocol version from initialization response message."""
|
||||
if self.protocol_version is not None:
|
||||
# Constructor pin wins over snooping the InitializeResult.
|
||||
# Only a modern constructor pin reaches here (pre-2026 values are dropped
|
||||
# in __init__), and a modern pin never sends initialize.
|
||||
return
|
||||
if isinstance(message, JSONRPCResponse) and message.result: # pragma: no branch
|
||||
try:
|
||||
|
|
|
|||
Loading…
Reference in a new issue