@@ -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 "/clientInfo, and /clientCapabilities in params._meta; 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,22 +398,22 @@ 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 protocolVersion, capabilities, serverInfo and the cache hint fields."
412412 ),
413413 added_in = "2026-07-28" ,
414414 ),
415415 "lifecycle:discover:retry-on-32022" : Requirement (
416- source = f"{ SPEC_2026_BASE_URL } /basic/lifecycle# version-errors " ,
416+ source = f"{ SPEC_2026_BASE_URL } /basic/versioning#protocol- version-negotiation " ,
417417 behavior = (
418418 "When server/discover returns -32022 UnsupportedProtocolVersion, the client retries once with "
419419 "the intersection of error.data.supported and its own modern versions; an empty intersection raises."
@@ -3319,7 +3319,7 @@ def __post_init__(self) -> None:
33193319 note = "removed in 2026-07-28 (SEP-2567); session DELETE removed with Mcp-Session-Id, no replacement." ,
33203320 ),
33213321 "client-transport:http:body-derived-headers" : Requirement (
3322- source = f"{ SPEC_2026_BASE_URL } /basic/transports#stateless -request-headers" ,
3322+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#standard -request-headers" ,
33233323 behavior = (
33243324 "An envelope-bearing request body yields MCP-Protocol-Version, Mcp-Method, and (for tools/call) "
33253325 "Mcp-Name headers on the outgoing HTTP request; a body without the envelope yields none."
@@ -3342,7 +3342,7 @@ def __post_init__(self) -> None:
33423342 note = "Only observable over streamable HTTP: headers are derived from the cached tool schema at the seam." ,
33433343 ),
33443344 "client-transport:http:stateless-ignores-session-id" : Requirement (
3345- source = f"{ SPEC_2026_BASE_URL } /basic/transports#stateless -request-headers" ,
3345+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#standard -request-headers" ,
33463346 behavior = (
33473347 "A pinned client never echoes a server-issued Mcp-Session-Id and never opens the standalone "
33483348 "GET stream or the closing DELETE: the recorded wire is POST-only."
@@ -3473,7 +3473,7 @@ def __post_init__(self) -> None:
34733473 note = "OAuth is HTTP-only." ,
34743474 ),
34753475 "client-auth:as-binding" : Requirement (
3476- source = f"{ SPEC_BASE_URL } /basic/authorization#authorization-server-binding" ,
3476+ source = f"{ SPEC_2026_BASE_URL } /basic/authorization/client-registration #authorization-server-binding" ,
34773477 behavior = (
34783478 "Stored client credentials are bound to the issuer that registered them; when the authorization "
34793479 "server changes, the client discards them and re-registers rather than reusing them (SEP-2352)."
@@ -3617,12 +3617,13 @@ def __post_init__(self) -> None:
36173617 note = "OAuth is HTTP-only." ,
36183618 ),
36193619 "client-auth:authorization-response:iss-verify" : Requirement (
3620- source = f"{ SPEC_BASE_URL } /basic/authorization#authorization-server-metadata-discovery " ,
3620+ source = f"{ SPEC_2026_BASE_URL } /basic/authorization#authorization-response-validation " ,
36213621 behavior = (
36223622 "The client validates the RFC 9207 iss authorization-response parameter against the "
36233623 "authorization server issuer (simple string comparison) and rejects a mismatch, or a "
36243624 "missing iss when the server advertises support (SEP-2468)."
36253625 ),
3626+ added_in = "2026-07-28" ,
36263627 transports = ("streamable-http" ,),
36273628 note = "OAuth is HTTP-only." ,
36283629 ),
0 commit comments