Skip to content

Commit d2db241

Browse files
committed
Register remaining 2026-07-28 stateless requirements
Adds client-transport:http:stateless-ignores-session-id, hosting:http:modern:legacy-fallthrough and hosting:http:modern:handler-exception-internal-error. Claude-Session: https://claude.ai/code/session_017S3aJaxEHeMvftp6whnHWK
1 parent cced4aa commit d2db241

1 file changed

Lines changed: 28 additions & 6 deletions

File tree

tests/interaction/_requirements.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2940,6 +2940,30 @@ def __post_init__(self) -> None:
29402940
transports=("streamable-http",),
29412941
note=("Only observable over streamable HTTP: the modern entry's method registry omits initialize."),
29422942
),
2943+
"hosting:http:modern:legacy-fallthrough": Requirement(
2944+
source=f"{SPEC_2026_BASE_URL}/basic/versioning",
2945+
behavior=(
2946+
"Non-2026-07-28 traffic on the same /mcp endpoint reaches the legacy transport "
2947+
"byte-unchanged: a 2025-era initialize handshake still completes, and an unrecognised "
2948+
"MCP-Protocol-Version header still produces the legacy 400 'Unsupported protocol version' literal."
2949+
),
2950+
added_in="2026-07-28",
2951+
transports=("streamable-http",),
2952+
note=(
2953+
"Only observable over streamable HTTP: routing branches on the MCP-Protocol-Version "
2954+
"header at the same /mcp endpoint."
2955+
),
2956+
),
2957+
"hosting:http:modern:handler-exception-internal-error": Requirement(
2958+
source="sdk",
2959+
behavior=(
2960+
"An unhandled handler exception on the 2026-07-28 entry is returned as JSON-RPC error "
2961+
"-32603 with a generic message that does not echo str(exc)."
2962+
),
2963+
added_in="2026-07-28",
2964+
transports=("streamable-http",),
2965+
note="Only observable over streamable HTTP: the modern entry's exception-to-JSONRPCError boundary.",
2966+
),
29432967
# ═══════════════════════════════════════════════════════════════════════════
29442968
# Client transport: streamable HTTP
29452969
# ═══════════════════════════════════════════════════════════════════════════
@@ -3123,17 +3147,15 @@ def __post_init__(self) -> None:
31233147
transports=("streamable-http",),
31243148
note="Only observable over streamable HTTP: headers are derived from the body envelope at the transport seam.",
31253149
),
3126-
"client-transport:http:mcp-name-encoding": Requirement(
3150+
"client-transport:http:stateless-ignores-session-id": Requirement(
31273151
source=f"{SPEC_2026_BASE_URL}/basic/transports#stateless-request-headers",
31283152
behavior=(
3129-
"Mcp-Name header values that are not safe for an HTTP field are wrapped in the =?base64?...?= "
3130-
"sentinel; printable-ASCII values pass verbatim."
3153+
"A pinned client never echoes a server-issued Mcp-Session-Id and never opens the standalone "
3154+
"GET stream or the closing DELETE: the recorded wire is POST-only."
31313155
),
31323156
added_in="2026-07-28",
31333157
transports=("streamable-http",),
3134-
note=(
3135-
"Only observable over streamable HTTP: the Base64-sentinel encoding is the spec's HTTP header-safety rule."
3136-
),
3158+
note="Only observable over streamable HTTP: session-id, GET stream and DELETE are streamable-HTTP mechanics.",
31373159
),
31383160
# ═══════════════════════════════════════════════════════════════════════════
31393161
# Client auth

0 commit comments

Comments
 (0)