What changed upstream
MCP revision 2026-07-28 removed the construct the v0.3 MCP profile was going to bind to. From the changelog, major changes 1 and 2:
Remove protocol-level sessions and the Mcp-Session-Id header from the Streamable HTTP transport. List endpoints (tools/list, resources/list, prompts/list) no longer vary per-connection. Servers that need cross-call state use explicit, server-minted handles passed as ordinary tool arguments (SEP-2567).
Make MCP stateless: remove the initialize/notifications/initialized handshake. Every request now carries its protocol version and client capabilities in _meta (SEP-2575).
There is no MCP session any more, and no handshake in which one could be established.
Why it lands here
ROADMAP.md scopes the v0.3 item as the normative MCP profile, "claim shape and binding rules for MCP tool-call transcripts... for upstream contribution to MCP spec governance."
Our own description of that evidence is written in session terms:
- §3.3 names the row "Session evidence": the Trust Record, policy hash, runtime measurement and
tool_transcript.hash "bind the governed session".
- §3.3.3 requires a receipt to bind "back to the TRACE session, transcript entry, or call".
session_id is a signed field with a MUST: a verifier rejects a disclosure whose session_id does not match the receipt stream under verification.
Nothing in v0.2 is invalidated by this. TRACE's session_id names a receipt stream we mint, not an MCP session, and the same is true of cMCP's audit-chain session_id. The exposure is confined to the profile: writing binding rules that map a transcript onto an MCP session, and then proposing them upstream to the body that has just removed sessions, is a bad opening and an easy one to walk into given how §3.3 currently reads.
What the profile should anchor on instead
Two candidates, both named by the revision itself.
- OpenTelemetry trace context. Minor change 2 documents
traceparent, tracestate and baggage as _meta conventions (SEP-414). For a stateless protocol this is the standards-aligned correlation hook, and it is already what an operator is likely to have.
- Server-minted handles as tool arguments, which is what SEP-2567 names as the replacement for cross-call state. This puts correlation inside the transcript we already hash rather than beside it.
Either way the profile should say explicitly that the correlation identifier is TRACE's or the server's, and is not an MCP protocol construct.
A second-order consequence for transcripts
Major change 9 removes SSE stream resumability:
A broken response stream loses the in-flight request; clients MUST re-issue it as a new request with a new request ID.
So a transcript cannot assume request ids are stable across a retry, and must tolerate abandoned attempts sitting beside the completed one. Any per-call ordering or completeness claim in the profile needs to survive that, and tool_transcript already carries the caveat that the record does not expose every call without the transcript bytes.
Adapter surface to check
Roots, Sampling and Logging are deprecated (SEP-2577), under a twelve-month window. Any producer adapter that reads them keeps working for now but should not gain new dependencies on them.
Status of the reference implementation
cMCP has already migrated and is ahead of this document. src/cmcp_runtime/mcp/server.py speaks 2026-07-28 outbound and keeps the handshake revisions for legacy clients only, with a comment explaining that 2026-07-28 "must never be the answer to a handshake: it names a protocol in which this request does not exist".
So this is a specification-language gap rather than an implementation gap, which is the cheap kind to fix, and cheapest before the profile is drafted rather than after.
Ask
Decide the correlation anchor before the v0.3 MCP profile is written, and reword §3.3's session framing so the profile does not inherit a construct that upstream has removed.
What changed upstream
MCP revision 2026-07-28 removed the construct the v0.3 MCP profile was going to bind to. From the changelog, major changes 1 and 2:
There is no MCP session any more, and no handshake in which one could be established.
Why it lands here
ROADMAP.mdscopes the v0.3 item as the normative MCP profile, "claim shape and binding rules for MCP tool-call transcripts... for upstream contribution to MCP spec governance."Our own description of that evidence is written in session terms:
tool_transcript.hash"bind the governed session".session_idis a signed field with a MUST: a verifier rejects a disclosure whosesession_iddoes not match the receipt stream under verification.Nothing in v0.2 is invalidated by this. TRACE's
session_idnames a receipt stream we mint, not an MCP session, and the same is true of cMCP's audit-chainsession_id. The exposure is confined to the profile: writing binding rules that map a transcript onto an MCP session, and then proposing them upstream to the body that has just removed sessions, is a bad opening and an easy one to walk into given how §3.3 currently reads.What the profile should anchor on instead
Two candidates, both named by the revision itself.
traceparent,tracestateandbaggageas_metaconventions (SEP-414). For a stateless protocol this is the standards-aligned correlation hook, and it is already what an operator is likely to have.Either way the profile should say explicitly that the correlation identifier is TRACE's or the server's, and is not an MCP protocol construct.
A second-order consequence for transcripts
Major change 9 removes SSE stream resumability:
So a transcript cannot assume request ids are stable across a retry, and must tolerate abandoned attempts sitting beside the completed one. Any per-call ordering or completeness claim in the profile needs to survive that, and
tool_transcriptalready carries the caveat that the record does not expose every call without the transcript bytes.Adapter surface to check
Roots, Sampling and Logging are deprecated (SEP-2577), under a twelve-month window. Any producer adapter that reads them keeps working for now but should not gain new dependencies on them.
Status of the reference implementation
cMCP has already migrated and is ahead of this document.
src/cmcp_runtime/mcp/server.pyspeaks 2026-07-28 outbound and keeps the handshake revisions for legacy clients only, with a comment explaining that 2026-07-28 "must never be the answer to a handshake: it names a protocol in which this request does not exist".So this is a specification-language gap rather than an implementation gap, which is the cheap kind to fix, and cheapest before the profile is drafted rather than after.
Ask
Decide the correlation anchor before the v0.3 MCP profile is written, and reword §3.3's session framing so the profile does not inherit a construct that upstream has removed.