@@ -352,7 +352,7 @@ def __post_init__(self) -> None:
352352 note = "initialize-time version negotiation removed at 2026-07-28; version carried per-request in _meta." ,
353353 ),
354354 "lifecycle:stateless:request-envelope" : Requirement (
355- source = f"{ SPEC_2026_BASE_URL } /basic/lifecycle#stateless-operation " ,
355+ source = f"{ SPEC_2026_BASE_URL } /basic#_meta " ,
356356 behavior = (
357357 "At protocol_version 2026-07-28, every request carries io.modelcontextprotocol/protocolVersion "
358358 "and /clientCapabilities in params._meta (/clientInfo is optional); no initialize handshake occurs."
@@ -369,7 +369,7 @@ def __post_init__(self) -> None:
369369 deferred = "covered by a tests/client/ unit test; not observable as an interaction" ,
370370 ),
371371 "lifecycle:stateless:caller-meta-preserved" : Requirement (
372- source = f"{ SPEC_2026_BASE_URL } /basic/lifecycle#stateless-operation " ,
372+ source = f"{ SPEC_2026_BASE_URL } /basic#_meta " ,
373373 behavior = (
374374 "Caller-supplied _meta keys on a request survive the per-request envelope merge: the "
375375 "three io.modelcontextprotocol/* envelope keys overwrite any caller-supplied values for "
@@ -398,14 +398,14 @@ def __post_init__(self) -> None:
398398 supersedes = ("lifecycle:initialize:client-info" , "lifecycle:initialize:client-capabilities" ),
399399 ),
400400 "lifecycle:envelope:header-matches-meta" : Requirement (
401- source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#headers " ,
401+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#protocol-version-header " ,
402402 behavior = "On HTTP, the MCP-Protocol-Version header on every POST matches _meta.protocolVersion in the body." ,
403403 transports = ("streamable-http" , "streamable-http-stateless" ),
404404 added_in = "2026-07-28" ,
405405 note = "HTTP-only: the header is a streamable-http transport concern; stdio and in-memory carry no headers." ,
406406 ),
407407 "lifecycle:discover:basic" : Requirement (
408- source = f"{ SPEC_2026_BASE_URL } /basic/lifecycle# discover" ,
408+ source = f"{ SPEC_2026_BASE_URL } /server/ discover" ,
409409 behavior = (
410410 "Calling discover() sends server/discover with no params and returns a typed DiscoverResult "
411411 "carrying supportedVersions, capabilities and the cache hint fields; the server's identity "
@@ -414,7 +414,7 @@ def __post_init__(self) -> None:
414414 added_in = "2026-07-28" ,
415415 ),
416416 "lifecycle:discover:retry-on-32022" : Requirement (
417- source = f"{ SPEC_2026_BASE_URL } /basic/lifecycle# version-errors " ,
417+ source = f"{ SPEC_2026_BASE_URL } /basic/versioning#protocol- version-negotiation " ,
418418 behavior = (
419419 "When server/discover returns -32022 UnsupportedProtocolVersion, the client retries once with "
420420 "the intersection of error.data.supported and its own modern versions; an empty intersection raises."
@@ -3532,7 +3532,7 @@ def __post_init__(self) -> None:
35323532 note = "removed in 2026-07-28 (SEP-2567); session DELETE removed with Mcp-Session-Id, no replacement." ,
35333533 ),
35343534 "client-transport:http:body-derived-headers" : Requirement (
3535- source = f"{ SPEC_2026_BASE_URL } /basic/transports#stateless -request-headers" ,
3535+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#standard -request-headers" ,
35363536 behavior = (
35373537 "An envelope-bearing request body yields MCP-Protocol-Version, Mcp-Method, and (for tools/call) "
35383538 "Mcp-Name headers on the outgoing HTTP request; a body without the envelope yields none."
@@ -3568,7 +3568,7 @@ def __post_init__(self) -> None:
35683568 ),
35693569 ),
35703570 "client-transport:http:stateless-ignores-session-id" : Requirement (
3571- source = f"{ SPEC_2026_BASE_URL } /basic/transports#stateless -request-headers" ,
3571+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#standard -request-headers" ,
35723572 behavior = (
35733573 "A pinned client never echoes a server-issued Mcp-Session-Id and never opens the standalone "
35743574 "GET stream or the closing DELETE: the recorded wire is POST-only."
@@ -3712,7 +3712,7 @@ def __post_init__(self) -> None:
37123712 note = "OAuth is HTTP-only." ,
37133713 ),
37143714 "client-auth:as-binding" : Requirement (
3715- source = f"{ SPEC_BASE_URL } /basic/authorization#authorization-server-binding" ,
3715+ source = f"{ SPEC_2026_BASE_URL } /basic/authorization/client-registration #authorization-server-binding" ,
37163716 behavior = (
37173717 "Stored client credentials are bound to the issuer that registered them; when the authorization "
37183718 "server changes, the client discards them and re-registers rather than reusing them (SEP-2352)."
@@ -3856,12 +3856,13 @@ def __post_init__(self) -> None:
38563856 note = "OAuth is HTTP-only." ,
38573857 ),
38583858 "client-auth:authorization-response:iss-verify" : Requirement (
3859- source = f"{ SPEC_BASE_URL } /basic/authorization#authorization-server-metadata-discovery " ,
3859+ source = f"{ SPEC_2026_BASE_URL } /basic/authorization#authorization-response-validation " ,
38603860 behavior = (
38613861 "The client validates the RFC 9207 iss authorization-response parameter against the "
38623862 "authorization server issuer (simple string comparison) and rejects a mismatch, or a "
38633863 "missing iss when the server advertises support (SEP-2468)."
38643864 ),
3865+ added_in = "2026-07-28" ,
38653866 transports = ("streamable-http" ,),
38663867 note = "OAuth is HTTP-only." ,
38673868 ),
0 commit comments