Is MCP Stateless Now? What to Change in Your Own MCP Server
Yes. MCP is stateless at the protocol layer as of specification version 2026-07-28. The initialize handshake and Mcp-Session-Id are gone. Each request now carries the protocol version, client identity and capabilities it needs. A remote request can reach any healthy server instance without sticky routing.
That answer needs one qualification: stateless MCP does not mean stateless software. Your shopping basket, browser job, approval flow or paid order may still need durable state. The difference is that this state must be explicit, addressable and secured by your application instead of hiding inside an MCP transport session.
This guide owns the transport and migration question. For permissions and tenant isolation, use our separate enterprise MCP authorization architecture. For the deeper question of where protection must be enforced, read why MCP is not the complete security boundary.
Need to migrate a remote MCP server without breaking existing clients?
Plan an MCP architecture reviewWhat is the direct answer?
MCP 2026-07-28 is a stateless, self-contained request protocol. Protocol state is gone. Application state is still allowed and often necessary.
The official specification now lists “stateless, self-contained requests” and “per-request capability negotiation” as base protocol properties. On Streamable HTTP, every message is a new POST. The response is either one JSON object or a request-scoped SSE stream. The old standalone GET stream, protocol session, Mcp-Session-Id and resumable SSE mechanism are not part of this revision.
What changed in MCP 2026-07-28?
| Concern | 2025-11-25 and earlier | 2026-07-28 |
|---|---|---|
| Startup | initialize, then notifications/initialized | No initialization handshake; optional server/discover |
| Protocol session | Server may mint Mcp-Session-Id | No protocol session or session ID |
| Request context | Version and capabilities negotiated once | Version, client info and capabilities travel in request _meta |
| HTTP routing | Session affinity or shared session storage may be needed | Any instance can process a self-contained request |
| HTTP metadata | Gateway often needs to inspect the JSON body | MCP-Protocol-Version, Mcp-Method and sometimes Mcp-Name are required |
| Server-to-client input | Server could issue a request over SSE | Return input_required; client retries with inputResponses and optional requestState |
| Long-running work | Experimental task behavior in core | Official opt-in Tasks extension with durable task handles |
| Lists | Change notifications and polling | Deterministic order plus required ttlMs and cacheScope |
The official 2026-07-28 changelog is the best source for the complete breaking-change list. It also records the new resultType field, the end of stream resumability, JSON Schema 2020-12 support, new error codes and the deprecation of Roots, Sampling, Logging and the old HTTP+SSE transport.
Does stateless MCP mean the server cannot remember anything?
No. It means a later request cannot depend on invisible protocol-session memory.
Suppose a tool opens a browser and a later tool continues the same automation. The first response can return a random, opaque browser_id. The client passes that handle to the next call. The server resolves it in a Durable Object, database or another appropriate store after checking the caller and expiry. The workflow is stateful, but the MCP request is self-contained.
Choose the state mechanism by lifecycle:
- One request: keep state in local variables and return the final result.
- Several immediate round trips: return integrity-protected
requestStatewithinput_required. Bind it to the authenticated subject, original operation and expiry. - Long-running work: use the MCP Tasks extension and a durable
taskId. - Business entities: return an application handle such as
order_id,basket_idordocument_id, then authorize every later use. - Live change notifications: use
subscriptions/listen. The open SSE response is request-scoped, not a revived protocol session.
Do not put secrets or writable business state into a readable bearer handle. Prefer an opaque identifier or an authenticated, encrypted state token with strict size, audience and expiry limits.
Do all MCP servers need a migration?
Every implementation should be audited, but the work differs.
| Your current server | Likely work | Priority |
|---|---|---|
| Local stdio, no session-dependent features | Upgrade the SDK, schemas, per-request metadata and discovery behavior | Medium |
| Remote Streamable HTTP with no stored sessions | Add the modern wire contract, headers, validation, result types, cache metadata and compatibility tests | High |
Remote server with Mcp-Session-Id, sticky routing or a session map | Externalize business state, add a dual-era path, then retire session infrastructure after client adoption | Highest |
| Legacy HTTP+SSE server | Move to Streamable HTTP and plan the stateless cutover | Highest |
| Server using sampling, roots or protocol logging | Plan replacements because these features are deprecated | High |
A server can be operationally stateless and still speak a legacy protocol. Conversely, a server can speak the new stateless protocol while storing durable application state. Audit the wire behavior and the data lifecycle separately.
What should you change in your own MCP server?
- Inventory hidden connection state. Search for session maps, sticky cookies,
Mcp-Session-Id, transport objects reused across requests, per-connection tool lists and resumable SSE event stores. Classify each item as protocol state, transient request state or durable business state. - Implement modern version discovery. Servers must support
server/discover. Return supported versions, capabilities, server info, instructions,ttlMsandcacheScope. Do not use self-reported server info as a security decision. - Validate per-request metadata. Require the protocol version and client metadata in
_meta. On HTTP, requireMCP-Protocol-VersionandMcp-Method, plusMcp-Namefor named calls. Reject header and body mismatches withHeaderMismatchinstead of trusting whichever layer is more convenient. - Make results modern and cacheable. Add
resultType: "complete"to ordinary results. Keeptools/listordering deterministic. Set truthfulttlMsandcacheScope, especially when authorization changes the visible tool set. - Replace implicit state with explicit handles. Make handles unguessable, subject-bound, scoped and revocable. Make mutations idempotent. A retry after a broken stream must not charge, send or delete twice.
- Support both eras deliberately. A dual-era server can serve modern requests statelessly and still answer legacy
initializetraffic. Keep the compatibility path isolated, measured and covered by an expiry plan. - Test the architecture, not only the handler. Send consecutive calls to different instances behind real round-robin routing. Test missing and mismatched headers, unsupported versions, expired handles, replayed mutations, cancelled streams, retries and cross-tenant access.
The Streamable HTTP specification defines the required request headers and mismatch behavior. The versioning and compatibility matrix is essential before choosing a hard cutover or dual-era rollout.
What did we change in Wavect's own MCP Worker?
We applied the same checklist to our Cloudflare Pages Function on 31 July 2026, then completed a direct cutover because we did not need to preserve legacy clients.
- Stateless in process and protocol: the handler keeps no in-memory session map and now accepts only self-contained
2026-07-28requests. - Durable business state is already explicit: commerce tools use quote IDs, order IDs, access tokens and idempotency keys instead of transport-session memory.
- Modern discovery is live:
server/discoverreports the supported version, capabilities, server info, instructions and cache metadata. - The HTTP contract is enforced: requests require
MCP-Protocol-Version,Mcp-Method, andMcp-Namefor tool calls, with header-body parity checks and explicit origin validation. - Results use the 2026 shape: discovery, list and call results include
resultType; deterministic list results also include truthful cache metadata. - The legacy lifecycle is gone:
initialize,pingandnotifications/initializedreturn method-not-found responses instead of silently keeping an old contract alive.
This is why “we do not store MCP sessions” is not a sufficient migration check. Runtime topology, protocol version and response schema can be at different maturity levels. For our server, the business-state redesign was small. The wire contract, security checks and conformance suite were the real work.

"Stateless MCP removes hidden transport memory. It does not remove durable workflows. Make state explicit, authenticated and safe to retry."
How should a production rollout work?
- Record current client versions, transports, session features and error rates.
- Add conformance tests for the modern request and result shapes before changing production traffic.
- Deploy a dual-era endpoint or a separate modern endpoint, depending on how tightly you control clients.
- Route internal and canary clients to the modern path. Exercise different server instances on consecutive calls.
- Observe unsupported-version errors, header mismatches, retries, latency, duplicate side effects and authorization failures.
- Publish a client migration date and a rollback window. Do not delete legacy storage because one SDK test passed.
- Remove sticky routing and session stores only after telemetry shows that legacy traffic and session-dependent features are gone.
Cloudflare now documents a stateless handler path and a staged migration for sessionful features in its MCP SDK v2 migration guide. Even if you use another runtime, the separation between protocol state and application state is a useful design model.
What should you ask an MCP development partner?
- Which protocol versions and client eras will the deployed server support?
- Which state is request-local, which is durable and which is still tied to a transport session?
- How are state handles bound to identity, tenant, operation and expiry?
- How are retries made idempotent for payments, writes and external side effects?
- Can the team prove two consecutive calls work on different server instances?
- How are required HTTP headers validated against the JSON body at the origin and gateway?
- What is cached, for how long, and can private tool lists reach a shared cache?
- Which deprecated features remain, and what is the replacement plan?
- What evidence closes the legacy path: telemetry, client inventory, rollback test and removal date?
If a proposal says only “upgrade the SDK,” it is incomplete. The commercial deliverable should include a state inventory, compatibility decision, threat model, migration tests, canary evidence and rollback plan.
Frequently asked questions
Is MCP fully stateless now?
The 2026-07-28 protocol core is stateless. Applications can still keep durable state through explicit handles, storage, Tasks and request state.
Is Streamable HTTP still used?
Yes. It remains the standard remote transport, but each message is now its own POST and the old GET stream and protocol-session behavior were removed.
Do I still send initialize?
Not for a modern 2026-07-28 request. Use per-request metadata, and optionally call server/discover. A dual-era server may still answer initialize for legacy clients.
Do I still need Redis or Durable Objects?
Not for MCP protocol sessions. You may still need durable storage for jobs, orders, browser instances, rate limits, locks or other application state.
Can I remove sticky sessions immediately?
Only after modern traffic works across different instances and telemetry confirms no supported client or feature still depends on the legacy session path.
Final thoughts
MCP is now stateless where it matters for protocol scalability: no initialize lifecycle, no Mcp-Session-Id and no hidden connection state required to understand a request. Your product may remain stateful. Move that state behind explicit, authorized handles; adopt discovery, required headers, modern result shapes and cache semantics; keep a measured compatibility path; then prove the migration behind round-robin routing before deleting legacy infrastructure.
Primary sources
- Model Context Protocol specification, 2026-07-28
- MCP 2026-07-28 key changes and deprecations
- MCP Streamable HTTP transport
- MCP server discovery specification
- MCP tools, caching and multi-round-trip results
- MCP Tasks extension
- GitHub MCP Server support for the stateless specification
- Cloudflare migration guide for stateless MCP handlers