Skip to content

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.

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.

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.

With the Python SDK, the change is one argument:

# before
mcp.run("sse", host="127.0.0.1", port=8000)
# after
mcp.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.

With our Python example running as streamable-http on port 8931:

TerminalAsk the server what it supports
Terminal window
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.

TerminalList tools in one request

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.

The Inspector picks the transport from the URL: /mcp means Streamable HTTP and /sse means HTTP+SSE.

Terminal window
npx -y @modelcontextprotocol/inspector@2.12.0 --cli \
http://127.0.0.1:8931/mcp --protocol-era auto --method tools/list

Run it once with --protocol-era legacy and once with --protocol-era modern to confirm both kinds of clients still work after the move.

Sources

MCPDev is community documentation. It is not affiliated with the Model Context Protocol project or with the vendors of the clients it covers.