Is MCP SSE Deprecated? Yes. Here Is What Replaced It
Is MCP SSE deprecated? Yes: HTTP+SSE was deprecated in spec 2025-03-26 and replaced by Streamable HTTP. What changed, client support and how to migrate.
Yes. The HTTP+SSE transport from the original 2024-11-05 MCP spec was deprecated in spec revision 2025-03-26 and replaced by Streamable HTTP. The current 2026-07-28 spec formally lists it as Deprecated under the new feature lifecycle policy. It can be removed three months after that policy is finalized. New servers should use Streamable HTTP, while existing SSE servers keep working with most clients during the transition.
One distinction matters: SSE as a format is not going away. Streamable HTTP still uses Server-Sent Events to stream a response when a server needs to. What's deprecated is the old transport design built around a long-lived SSE connection and a second POST endpoint.
Old vs new at a glance
| HTTP+SSE (2024-11-05, deprecated) | Streamable HTTP (2025-03-26 onward) | |
|---|---|---|
| Endpoints | Two: GET /sse stream + POST /messages?sessionId=... | One, e.g. /mcp, for everything |
| Connection | Always-open SSE stream per client | Each message is its own POST; the stream lives only for that response |
| Response format | Always arrives on the SSE stream | Plain JSON or an SSE stream, chosen per request |
| Sessions | Required, held in server memory | Optional in 2025 revisions, removed in 2026-07-28 |
| Serverless / edge friendly | Poor: needs long-lived connections and sticky routing | Good: stateless requests behind any load balancer |
| Spec status | Deprecated since 2025-03-26 | Current |
Why it was replaced
The SSE design was hard to run in production. Each client kept a connection open for as long as it was connected. Replies to a POST came back on a different connection, so a load balancer had to send both to the same instance. Serverless platforms with short request timeouts couldn't host it reliably. Streamable HTTP fixed this with one endpoint and ordinary request/response semantics. The server upgrades to SSE only when it needs to stream progress or notifications before the final result.
What changed since 2025-03-26
Streamable HTTP itself has changed since it was introduced:
- 2025-03-26: Streamable HTTP introduced. It had optional sessions (
Mcp-Session-Id), an optional standaloneGETstream for server-initiated messages, and resumable streams viaLast-Event-ID. - 2025-06-18 and 2025-11-25: added the
MCP-Protocol-Versionheader and tightened the authorization rules. The transport shape stayed the same. - 2026-07-28 (changelog): MCP became stateless. The
initializehandshake and protocol-level sessions were removed. TheGETstream was replaced by asubscriptions/listenrequest. Resumability was removed. POSTs must carryMcp-MethodandMcp-Nameheaders so gateways can route without parsing bodies. The same release reclassified HTTP+SSE as formally Deprecated (SEP-2596).
In practice, a "Streamable HTTP" server written in mid-2025 and one written today look a little different on the wire. The current SDKs handle both.
Backwards compatibility: how old and new talk to each other
The spec defines a fallback, so clients and servers from different eras can still talk:
- Clients that support both POST to the URL first. If that fails with
400,404or405, they try aGET. If the server answers with an SSEendpointevent, they continue on the old transport. - Servers that want to keep serving old clients host the old
/sseand/messagesendpoints next to the new/mcpendpoint. - 2026-07-28 servers that receive 2025-era Streamable HTTP traffic answer
GET/DELETEwith405and ignoreMcp-Session-IdandLast-Event-ID. A client that gets a400without a recognized modern error falls back toinitialize.
The official SDKs v2 put this into code:
- TypeScript (
@modelcontextprotocol/server2.x): the server no longer serves HTTP+SSE at all.createMcpHandlerserves Streamable HTTP and answers 2025-era clients statelessly by default. For a deployment that can't move yet, a frozen copy ships in@modelcontextprotocol/server-legacy/sse. It's deprecated and planned for removal in v3. The client still includesSSEClientTransport. - Python (
mcp2.x):mcp.run(transport="sse")still works for old clients, but the docs say not to build anything new on it. The client can still connect withsse_client(...).
Do clients still support SSE servers?
Mostly yes, for now. As of October 2026:
| Client | Streamable HTTP | Legacy SSE |
|---|---|---|
| Claude Code | --transport http | --transport sse still works (marked deprecated) |
| VS Code | "type": "http" | Tries HTTP first, falls back to SSE; "type": "sse" also accepted |
| Cursor | url entry | Supported |
| ChatGPT | Yes | Yes (remote servers only) |
| MCP Inspector v2 | URL ending in /mcp | URL ending in /sse; other paths need --transport |
The "deprecated" label tells you where things are going. New clients and gateways may support only Streamable HTTP. Once the spec removes the transport, the SDKs will drop it too.
What this means for you
It depends on which side of the connection you are on:
- You use MCP servers. Nothing breaks today. If a server's docs offer both a
/sseand a/mcpURL, pick/mcpand set the client's transport to HTTP. Keep the/sseURL only for servers that offer nothing else, and expect those to move or disappear. - You maintain an SSE server. Plan the migration now, while clients still support both transports. You can run the old and new endpoints side by side, so there is no flag day for your users.
- You build a client or gateway. Implement Streamable HTTP first. Keep the SSE fallback only as long as your users still connect to legacy servers, and log when it gets used so you know when you can remove it.
How to tell which one a server uses
- URLs ending in
/sseare almost always the legacy transport./mcpusually means Streamable HTTP. - Quick probe: POST an MCP request with
Accept: application/json, text/event-stream. A Streamable HTTP server returns JSON or an SSEmessageevent. A legacy-only server typically returns404/405on POST and only opens a stream onGET. - Or let the MCP Inspector connect with
--transport httpand see if it succeeds.
Migration steps for server authors
- Upgrade the SDK. TypeScript: move from
@modelcontextprotocol/sdk1.x to@modelcontextprotocol/server2.x (the upgrade guide includes a codemod). Python:mcp2.x, whereFastMCPbecameMCPServer. - Replace the transport wiring. TypeScript: drop
SSEServerTransportand the/sseand/messagesroutes, and servecreateMcpHandler(factory)on one route such as/mcp. Python: changetransport="sse"totransport="streamable-http". - Move state out of the connection. Anything you kept per SSE session (a logged-in user, a cursor, a cache) belongs in your own storage, keyed by the authenticated user or by IDs passed as tool arguments.
- Keep the old endpoints for a while. Serve the frozen SSE transport next to
/mcpso existing configs keep working, and log how much traffic still hits/sse. - Update the published URL. Change the README, your registry
server.json("type": "streamable-http"inremotes) and your MCP.so listing to point to/mcp. - Test both eras. Use the Inspector with
--transport httpagainst the new endpoint and--transport sseagainst the old one. Then remove/sseonce traffic reaches zero, or before the spec removes it. - Recheck your proxy settings. Streamable HTTP still streams some responses, so turn off response buffering for
text/event-streamon nginx and other proxies, and allow reasonable timeouts.
For hosting the migrated server, see how to deploy an MCP server. For a refresher on the protocol, see how MCP works.
Next steps
Browse servers that already offer Streamable HTTP endpoints in the MCP server directory. Official remote servers such as Sentry, Notion and GitHub are good references for the current setup.
Frequently asked questions
Is MCP SSE deprecated?
- Yes. The HTTP+SSE transport was deprecated in MCP spec revision 2025-03-26 and replaced by Streamable HTTP. The 2026-07-28 spec formally lists it as Deprecated, so new servers should not adopt it.
What is the difference between SSE and Streamable HTTP in MCP?
- The old SSE transport needed two endpoints and an always-open stream per client with server-side sessions. Streamable HTTP uses one endpoint where every message is a POST, and the server answers with plain JSON or a short-lived SSE stream only when it needs to stream.
Does Streamable HTTP still use SSE?
- Yes, as a response format. A Streamable HTTP server can stream progress or notifications as Server-Sent Events within a single response, but there is no long-lived SSE connection or separate messages endpoint anymore.
Will my existing MCP SSE server stop working?
- Not yet. Most clients, including Claude Code, VS Code, Cursor and ChatGPT, still connect to SSE servers, but the transport is eligible for removal from the spec, so plan a migration to Streamable HTTP and keep the old endpoints running side by side until traffic drops off.