@@ -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."
@@ -3382,7 +3382,7 @@ def __post_init__(self) -> None:
33823382 note = "removed in 2026-07-28 (SEP-2567); session DELETE removed with Mcp-Session-Id, no replacement." ,
33833383 ),
33843384 "client-transport:http:body-derived-headers" : Requirement (
3385- source = f"{ SPEC_2026_BASE_URL } /basic/transports#stateless -request-headers" ,
3385+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#standard -request-headers" ,
33863386 behavior = (
33873387 "An envelope-bearing request body yields MCP-Protocol-Version, Mcp-Method, and (for tools/call) "
33883388 "Mcp-Name headers on the outgoing HTTP request; a body without the envelope yields none."
@@ -3418,7 +3418,7 @@ def __post_init__(self) -> None:
34183418 ),
34193419 ),
34203420 "client-transport:http:stateless-ignores-session-id" : Requirement (
3421- source = f"{ SPEC_2026_BASE_URL } /basic/transports#stateless -request-headers" ,
3421+ source = f"{ SPEC_2026_BASE_URL } /basic/transports/streamable-http#standard -request-headers" ,
34223422 behavior = (
34233423 "A pinned client never echoes a server-issued Mcp-Session-Id and never opens the standalone "
34243424 "GET stream or the closing DELETE: the recorded wire is POST-only."
@@ -3549,7 +3549,7 @@ def __post_init__(self) -> None:
35493549 note = "OAuth is HTTP-only." ,
35503550 ),
35513551 "client-auth:as-binding" : Requirement (
3552- source = f"{ SPEC_BASE_URL } /basic/authorization#authorization-server-binding" ,
3552+ source = f"{ SPEC_2026_BASE_URL } /basic/authorization/client-registration #authorization-server-binding" ,
35533553 behavior = (
35543554 "Stored client credentials are bound to the issuer that registered them; when the authorization "
35553555 "server changes, the client discards them and re-registers rather than reusing them (SEP-2352)."
@@ -3693,12 +3693,13 @@ def __post_init__(self) -> None:
36933693 note = "OAuth is HTTP-only." ,
36943694 ),
36953695 "client-auth:authorization-response:iss-verify" : Requirement (
3696- source = f"{ SPEC_BASE_URL } /basic/authorization#authorization-server-metadata-discovery " ,
3696+ source = f"{ SPEC_2026_BASE_URL } /basic/authorization#authorization-response-validation " ,
36973697 behavior = (
36983698 "The client validates the RFC 9207 iss authorization-response parameter against the "
36993699 "authorization server issuer (simple string comparison) and rejects a mismatch, or a "
37003700 "missing iss when the server advertises support (SEP-2468)."
37013701 ),
3702+ added_in = "2026-07-28" ,
37023703 transports = ("streamable-http" ,),
37033704 note = "OAuth is HTTP-only." ,
37043705 ),
0 commit comments