What changed
The Model Context Protocol is shipping its 2026-07-28 revision, the next stable after 2025-11-25. The release candidate was published on the official MCP blog on 21 May 2026 and tagged on GitHub as the MCP 2026-07-28 RC pre-release; the final specification is scheduled for 28 July 2026. The headline change makes the protocol stateless: the initialize/notifications/initialized handshake and the Mcp-Session-Id header are removed from the Streamable HTTP transport (SEP-2575, SEP-2567). Protocol version, client identity, and client capabilities now travel in _meta on every request. Roots, Sampling, and Logging are formally deprecated (SEP-2577) under a new feature-lifecycle policy with a minimum twelve-month deprecation window (SEP-2596).
The schema
Per-connection handshake state is gone. Every request now carries the context that was previously exchanged once at connect time, using reserved _meta keys (SEP-2575):
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": { "query": "invoices Q3" },
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": { "name": "acme-agent", "version": "1.4.0" },
"io.modelcontextprotocol/clientCapabilities": {},
"io.modelcontextprotocol/logLevel": "info"
}
}
}
The round-trip
Server-initiated calls (roots/list, sampling/createMessage, elicitation/create) become Multi Round-Trip Requests: instead of pushing a separate request, the server answers the client’s call with input_required, and the client re-sends carrying the answer. Statelessly, one logical tool call becomes a sequence of self-contained round-trips, each message carrying its own _meta (SEP-2322). All results now declare a required resultType of "complete" or "input_required".
In practice
The new required headers and the version-mismatch behaviour change every POST. Send Mcp-Method and Mcp-Name on Streamable HTTP requests (SEP-2243):
curl -X POST https://mcp.example.com/rpc \
-H "Content-Type: application/json" \
-H "Mcp-Method: tools/call" \
-H "Mcp-Name: search" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"search","arguments":{"query":"x"},
"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28"}}}'
# version mismatch -> UnsupportedProtocolVersionError
Servers must implement the new server/discover RPC to advertise supported versions and capabilities; clients may call it for up-front version selection.
Impact on your team
If you maintain an MCP server or client, you have roughly a ten-week window from the RC to validate before the 28 July 2026 final. The stateless model is good news for horizontally scaled HTTP servers: with Mcp-Session-Id gone, any replica can serve any request and tools/list no longer varies per connection, so list results become cacheable via the new CacheableResult interface (ttlMs, cacheScope, SEP-2549).