From HTTP+SSE to Streamable HTTP
- Spec
2024-11-05 → 2026-07-28- Evidence
- E2Reproducedarm64
- Python SDK
mcp@2.3.0- MCP Inspector
@modelcontextprotocol/inspector@2.12.0- Verified
Many tutorials still deploy MCP servers with SSE, and some hosting platforms only accept SSE endpoints. SSE is deprecated. This page explains what replaced it, in two steps, and how to move.
Three generations
Section titled “Three generations”| HTTP+SSE | Streamable HTTP (2025) | Streamable HTTP (2026-07-28) | |
|---|---|---|---|
| Spec versions | 2024-11-05 | 2025-03-26 to 2025-11-25 | 2026-07-28 |
| Endpoints | Two: a GET event stream (often /sse) and a POST endpoint for messages |
One, usually /mcp; POST for requests, optional GET stream |
One, usually /mcp; POST only |
| Start of a connection | initialize handshake |
initialize handshake |
None. Each request carries the version in _meta |
| Sessions | The SSE connection | Mcp-Session-Id header |
None at the protocol level |
| Status | Deprecated | Current for 2025 clients | Current |
The second column is why the name stayed while the behavior changed: a server that “supports Streamable HTTP” may only support the 2025 form.
Is SSE gone?
Section titled “Is SSE gone?”Not yet, but it can go soon. HTTP+SSE has been described as deprecated since 2025-03-26. The 2026-07-28 specification reclassified it as Deprecated under the new feature lifecycle policy, with a transition rule: the registry of deprecated features lists its earliest removal as three months after SEP-2596, the policy itself, reached Final. SEP-2596 was merged as Final on 2026-05-18, so a future revision may drop HTTP+SSE. Features deprecated in 2026-07-28 itself, such as Sampling, get at least twelve months instead.
Removing it from the specification does not force SDKs to drop it at the same time. SDKs still ship it: the Python SDK 2.3.0 started an SSE server for us with mcp.run("sse"), and the MCP Inspector connected to it.
New servers should not use it, and existing ones should plan to move.
Move a server
Section titled “Move a server”With the Python SDK, the change is one argument:
# beforemcp.run("sse", host="127.0.0.1", port=8000)
# aftermcp.run("streamable-http", host="127.0.0.1", port=8000)The endpoint moves from /sse (plus a separate message path) to a single /mcp. Update every client configuration that points at the old URL.
Other SDKs follow the same idea: replace the SSE transport with the Streamable HTTP one. In the TypeScript SDK v2, serve with createMcpHandler(() => createServer()) and wrap it with toNodeHandler() from @modelcontextprotocol/node for a Node HTTP server. We tested that combination with both protocol generations. The NodeStreamableHTTPServerTransport class also exists, but the official upgrade guide notes it serves 2025-era clients only.
Check the result with curl
Section titled “Check the result with curl”With our Python example running as streamable-http on port 8931:
curl -s -X POST http://127.0.0.1:8931/mcp \ -H 'content-type: application/json' \ -H 'accept: application/json, text/event-stream' \ -H 'MCP-Protocol-Version: 2026-07-28' \ -H 'Mcp-Method: server/discover' \ -d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{ "io.modelcontextprotocol/protocolVersion":"2026-07-28", "io.modelcontextprotocol/clientCapabilities":{}}}}'ExpectedsupportedVersions lists 2026-07-28.
The response contained "supportedVersions":["2026-07-28"] and the server’s capabilities. The same server also accepted 2025-11-25 clients through the old handshake; server/discover only lists the versions that use the new mechanism.
Send the same request with "method":"tools/list" and Mcp-Method: tools/list.
ExpectedA tools list with resultType, ttlMs and cacheScope, and no session header needed.
A GET to /mcp returned 400 from the same server: the 2026-07-28 transport has no GET stream. Clients that want change notifications use subscriptions/listen instead.
Test with the Inspector
Section titled “Test with the Inspector”The Inspector picks the transport from the URL: /mcp means Streamable HTTP and /sse means HTTP+SSE.
npx -y @modelcontextprotocol/inspector@2.12.0 --cli \ http://127.0.0.1:8931/mcp --protocol-era auto --method tools/listRun it once with --protocol-era legacy and once with --protocol-era modern to confirm both kinds of clients still work after the move.
Related
Section titled “Related”Sources
MCPDev is community documentation. It is not affiliated with the Model Context Protocol project or with the vendors of the clients it covers.