@@ -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."
@@ -3573,7 +3573,7 @@ def __post_init__(self) -> None:
35733573 note = "removed in 2026-07-28 (SEP-2567); session DELETE removed with Mcp-Session-Id, no replacement." ,
35743574 ),
35753575 "client-transport:http:body-derived-headers" : Requirement (
3576- source = f"{ SPEC_2026_BASE_URL } /basic/transports#stateless -request-headers" ,
3576+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#standard -request-headers" ,
35773577 behavior = (
35783578 "An envelope-bearing request body yields MCP-Protocol-Version, Mcp-Method, and (for tools/call) "
35793579 "Mcp-Name headers on the outgoing HTTP request; a body without the envelope yields none."
@@ -3609,7 +3609,7 @@ def __post_init__(self) -> None:
36093609 ),
36103610 ),
36113611 "client-transport:http:stateless-ignores-session-id" : Requirement (
3612- source = f"{ SPEC_2026_BASE_URL } /basic/transports#stateless -request-headers" ,
3612+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#standard -request-headers" ,
36133613 behavior = (
36143614 "A pinned client never echoes a server-issued Mcp-Session-Id and never opens the standalone "
36153615 "GET stream or the closing DELETE: the recorded wire is POST-only."
@@ -3753,7 +3753,7 @@ def __post_init__(self) -> None:
37533753 note = "OAuth is HTTP-only." ,
37543754 ),
37553755 "client-auth:as-binding" : Requirement (
3756- source = f"{ SPEC_BASE_URL } /basic/authorization#authorization-server-binding" ,
3756+ source = f"{ SPEC_2026_BASE_URL } /basic/authorization/client-registration #authorization-server-binding" ,
37573757 behavior = (
37583758 "Stored client credentials are bound to the issuer that registered them; when the authorization "
37593759 "server changes, the client discards them and re-registers rather than reusing them (SEP-2352)."
@@ -3897,12 +3897,13 @@ def __post_init__(self) -> None:
38973897 note = "OAuth is HTTP-only." ,
38983898 ),
38993899 "client-auth:authorization-response:iss-verify" : Requirement (
3900- source = f"{ SPEC_BASE_URL } /basic/authorization#authorization-server-metadata-discovery " ,
3900+ source = f"{ SPEC_2026_BASE_URL } /basic/authorization#authorization-response-validation " ,
39013901 behavior = (
39023902 "The client validates the RFC 9207 iss authorization-response parameter against the "
39033903 "authorization server issuer (simple string comparison) and rejects a mismatch, or a "
39043904 "missing iss when the server advertises support (SEP-2468)."
39053905 ),
3906+ added_in = "2026-07-28" ,
39063907 transports = ("streamable-http" ,),
39073908 note = "OAuth is HTTP-only." ,
39083909 ),
0 commit comments