Software

MCP goes stateless: what the 2026-07-28 spec changes for builders and security

The new Model Context Protocol drops the handshake and sessions, routes on HTTP headers and hardens OAuth. What breaks, what gets safer, and a migration checklist.

Illustration of a client sending independent requests through a load balancer to three identical server instances
Illustration: Solo Tech Pros

The 2026-07-28 version of the Model Context Protocol turns MCP from a stateful, session-based protocol into a stateless request-and-response one. There’s no more initialize handshake and no Mcp-Session-Id, and every request carries what the server needs to know. For people running MCP servers, that means plain load balancing and routing on HTTP headers. For people securing them, it means gateways can authorize per tool, OAuth gets harder to confuse, and some features are on a twelve-month path out. It’s also a breaking change, so here’s what moves, what breaks and what to check.

What “stateless” means here

In earlier versions, a client opened a session with a handshake and the server kept per-session state. The official release post says the new version retires “the initialize / initialized exchange along with the Mcp-Session-Id header.” Each request now travels on its own, carrying its protocol version, client identity and client capabilities in a _meta field. A new server/discover call lets a client ask for a server’s capabilities up front, but it’s optional.

The practical effect, in the maintainers’ words: “any request can land on any instance behind a plain round-robin load balancer,” with no shared session storage. That’s why cloud providers and hosting platforms lined up behind this release.

Stateless doesn’t mean your tools can’t remember anything. The maintainers suggest that if a server needs state across calls, it should “mint an explicit handle from a tool and have the model pass it back as an argument.” They say this works better than hidden session state, because the model can see the handle and pass it between tools.

The changes that matter most

Change What it does Who should care
No handshake or sessions Every request is self-describing; optional server/discover Anyone who stored state against a session ID
Mcp-Method and Mcp-Name headers Required on Streamable HTTP requests, so gateways see the method and tool name without parsing the body Gateway, WAF and rate-limiter operators
Multi Round-Trip Requests (MRTR) A server asks for user input mid-call by returning input_required; the client retries with the answers Servers that use elicitation, such as confirmations
Cacheable lists List responses carry ttlMs and cacheScope and a deterministic order Clients that re-fetch tool catalogs
Authorization hardening RFC 9207 issuer validation; credentials bound to their issuer; Dynamic Client Registration deprecated Anyone implementing OAuth for MCP
Extensions framework Tasks move out of the core into an extension, alongside MCP Apps and Enterprise-Managed Authorization Long-running and enterprise workflows
Deprecations Roots, Sampling and Logging deprecated; legacy HTTP+SSE transport deprecated Older servers and clients
Side-by-side comparison of MCP before and after the 2026-07-28 spec: from handshake, session IDs and sticky routing to self-describing requests, round-robin instances, MRTR and Mcp-Method and Mcp-Name headers
Diagram: Solo Tech Pros, based on the MCP 2026-07-28 release post and specification

What gets safer

Gateways can authorize per tool

Because the method and tool name now travel in headers, a gateway, rate limiter or web application firewall can “route and meter on those headers instead of parsing JSON bodies.” For security, that means you can allow, block or rate-limit specific tools at the edge, rather than all-or-nothing on an MCP endpoint. When LiteLLM’s MCP authentication bypass was under active exploitation, its official workaround was to block /mcp/ routes entirely, as we covered in our LiteLLM analysis. Header-level routing gives operators finer options than that.

OAuth mix-ups are closed off

The release post says authorization is “where implementers spend most of their integration time,” and it tightens three things:

  • Authorization servers should return an iss parameter per RFC 9207, and clients must validate it before redeeming a code. That “closes an authorization-server mix-up hole,” where a client could be tricked into sending a code to the wrong server.
  • Client credentials are bound to the issuer that minted them, with no reuse across authorization servers.
  • Dynamic Client Registration is formally deprecated in favor of Client ID Metadata Documents (CIMD). It keeps working for now, but will be removed in a future version.

Fewer long-lived connections

MRTR removes the need to keep a bidirectional stream open so a server can ask the user something mid-call. Supabase, quoted in the release, says this lets its stateless server confirm with the user before an action, “like the cost of a new project before it’s created, or a query that would delete data.”

What needs care

  • State handles are model-controlled input. If your tools now pass explicit handles through the model, treat every handle that comes back as untrusted: check that it exists, belongs to the calling user, and hasn’t expired. This is our reading, not a spec requirement. It’s the same rule as in the Semantic Kernel vulnerabilities: any argument the model fills in can be shaped by injected content.
  • Header routing only helps if headers and body agree. The spec covers this: under SEP-2243, servers “MUST reject requests where the values specified in the headers do not match the values in the request body,” so a gateway can’t approve one tool while the server runs another. Make sure your server or SDK actually enforces it, and put header-based policies on a gateway you control.
  • Breaking changes are real. The maintainers warn of “some migration cost, especially for developers that did depend on session identifiers.”

Migration checklist

  1. Update your SDK. The TypeScript, Python, Go and C# SDKs support 2026-07-28; the Rust SDK has beta support.
  2. Find anything keyed on session IDs and move it to explicit handles or your own storage.
  3. Replace server-initiated requests (elicitation, sampling, roots) with the MRTR pattern.
  4. Move OAuth clients to CIMD, and make sure clients validate the iss parameter.
  5. Update gateway rules to use Mcp-Method and Mcp-Name, ideally with per-tool policies.
  6. Plan for deprecations. Roots, Sampling, Logging and HTTP+SSE keep working for at least twelve months under the new deprecation policy, but new code shouldn’t adopt them.

If you’re still deciding whether MCP is the right integration layer at all, start with our comparison of MCP, APIs and computer use. This release doesn’t change that decision, but it makes MCP much easier to run like any other HTTP service.

MCP release post and specification checked on October 16, 2026.

Join the conversation

Your email address will not be published.