đź’ˇ TL;DR / Summary - MCP Transports Key Summary (BLUF)
- Local vs. Remote Transports: Model Context Protocol (MCP) establishes
stdioas the primary standard for local, single-client processes andStreamable HTTPfor remote, horizontally-scalable networks.- SSE Deprecation Countdown: The legacy two-connection
HTTP+SSEtransport is officially deprecated and faces hard removal deadlines from enterprise clients (e.g., Atlassian Rovo by June 30, 2026).- Optimal Architectural Path: Deploy remote services exclusively via the stateless-friendly Streamable HTTP (
/mcpendpoint) and fallback to stdio for secure, local client sandboxes.
“The Model Context Protocol establishes a standard for connecting AI clients to local or remote data sources and tools using standardized JSON-RPC transports.” — Model Context Protocol Specification, 2026
MCP servers talk to clients like Claude Desktop, Cursor, and VS Code over one of three transports: stdio, HTTP+SSE, and Streamable HTTP. Two are current: stdio for local use, Streamable HTTP for remote. The third, HTTP+SSE, is deprecated and on a removal clock, so the real choice in 2026 is narrower than the three-way framing suggests.
This guide is built from the MCP specification and SDK documentation, not a single vendor’s tutorial. Most existing transport guides explain what each one is; the harder question is where each one breaks, which is what trips people up in production. The transports below are a different layer from browser-side WebMCP; for that, see WebMCP and the citation paradox. Spec versions and deprecation deadlines reflect May 2026 and move, so confirm current status before relying on them.
MCP separates into two layers. The data layer defines what the server can do: tools, resources, and prompts. The transport layer defines how JSON-RPC messages move between client and server. Transports are the second layer, and choosing one is mostly a deployment question: is the server on the same machine as the client, or across a network?
stdio: Local, and Where It Breaks
In stdio transport, the client launches the MCP server as a child process and talks to it through standard input and output, the same mechanism Unix pipes use. It is the simplest option and the right one for local development, where client and server share a machine and a single user.
Where it breaks: stdio is local-only and single-client. It collapses under concurrent load. One analysis found the large majority of requests failing at only 20 simultaneous connections. It cannot serve a remote client at all. The other common stumble is environment, not protocol: a spawn npx ENOENT error usually means the command or its runtime is not on the path the client launched with, not that MCP is misconfigured.
Streamable HTTP: The Current Remote Transport
Streamable HTTP, introduced in spec 2025-03-26 and retained in the November 2025 revision, is the current transport for any server that operates over a network. It exposes one endpoint, typically /mcp, that accepts both POST and GET. The client POSTs JSON-RPC messages; the server replies with either a single JSON body or upgrades the response to a Server-Sent Events stream for long-running calls. One endpoint, both interaction patterns, no separate events URL.
Where it breaks: the design is stateless-friendly and resumable, but stateful sessions still fight horizontal scaling. Put a stateful server behind a load balancer without session affinity and a client can land on a node that does not know its session. The 2026 MCP roadmap names transport scalability as a priority: sessions versus load balancers, horizontal scaling, and server discovery. Expect this area to keep moving.
HTTP+SSE: Deprecated, With Deadlines
HTTP+SSE was MCP’s original remote transport, defined in spec 2024-11-05. It uses two endpoints: the client holds a persistent GET connection to receive a server-sent event stream and POSTs messages separately. It works, but the two-connection design has no native resumability and is hostile to load balancers, serverless platforms, and firewalls. Proxy buffering alone can silently kill the event stream.
It was officially deprecated in spec 2025-03-26 when Streamable HTTP replaced it. Servers may keep it running for backward compatibility, but client support will only degrade, and platforms are setting hard removal dates: Keboola dropped it on 2026-04-01, Atlassian Rovo’s deadline is 2026-06-30, and more are following through 2026. Treat those dates as announced and verify with each platform.
If you have an SSE server, it still works today. When you next touch the code, migrate. If you are building something new, skip SSE entirely.
Comparison Matrix
| Transport | Local / Remote | Status | Endpoints | Resumable | Main failure mode |
|---|---|---|---|---|---|
| stdio | Local | Current | n/a (pipes) | n/a | Concurrency collapse; PATH/spawn errors |
| Streamable HTTP | Remote | Current | One (/mcp) | Yes | Sticky sessions behind load balancers |
| HTTP+SSE | Remote | Deprecated | Two (GET + POST) | No | Proxy buffering; no resumability |
Which Transport to Use
| Situation | Use |
|---|---|
| Local dev, same machine, single user | stdio |
| New remote server | Streamable HTTP |
| Existing HTTP+SSE server | Migrate to Streamable HTTP |
| Many concurrent clients | Streamable HTTP (not stdio) |
| Maximum client compatibility today | Support both stdio and Streamable HTTP |
Most SDKs let one server bind to multiple transports. A common pattern is stdio for local development and Streamable HTTP for production, switched by an environment variable. The tool logic stays the same; only transport initialization differs.
Configuring It
For a local stdio server, the client config names a command, its arguments, and any environment variables. In Claude Desktop that lives in claude_desktop_config.json; Cursor uses an mcp.json. The shape is the same: a command plus args plus env.
For a remote server, point the client at the URL. Clients that do not yet speak Streamable HTTP natively can bridge through the mcp-remote helper, which wraps a remote endpoint as a local stdio server. Exact keys differ by client and change across versions, so check your client’s current docs rather than copying an old snippet.
Migration and What’s Next
Migrating off SSE is not a rewrite. The tool logic does not change; the transport initialization does. Run both transports in parallel during the transition, then cut over before the platform deadlines force it under pressure.
Further out, scaling is the open problem. Beyond the official roadmap, an IETF Internet-Draft explores MCP over QUIC, proposed by Cisco and Google engineers, aimed at high-performance multi-agent fan-out without head-of-line blocking. For now, stdio and Streamable HTTP cover local development and remote production respectively, and that is the whole practical map.
The split shows up in real servers. Among finance MCP servers, the official Financial Datasets server uses Streamable HTTP, while community Finnhub wrappers offer SSE and stdio. See the finance and trading MCP server comparison for that landscape. When a server lists “SSE” as its only remote option, read that as a migration task waiting to happen.
FAQ
Q. How many MCP transports are there?
Three are defined, but only two are current: stdio for local and Streamable HTTP for remote. HTTP+SSE is deprecated as of spec 2025-03-26.
Q. Is SSE the same as Streamable HTTP?
No. HTTP+SSE is the old two-endpoint transport. Streamable HTTP is the single-endpoint replacement that can still upgrade to an SSE stream for long calls, but it is a different transport.
Q. Do I need to migrate my SSE server right now?
It still works, but platforms are setting removal dates through 2026 (for example, Keboola on 2026-04-01 and Atlassian Rovo on 2026-06-30). Migrate before your platform’s deadline.
Q. Why does my stdio server fail with spawn npx ENOENT?
The command or its runtime is not on the path the client used to launch it. That is an environment problem, not an MCP one. Point the config at a full path or fix the launch environment.
Q. Can one server support more than one transport?
Yes. Most SDKs let a server bind stdio and Streamable HTTP at once, switched by a flag or environment variable. Tool logic is shared.
Q. Which transport should a new project use?
Local-only: stdio. Anything over a network: Streamable HTTP. Do not start a new project on HTTP+SSE.
Sources
- MCP specification (transports, current version 2025-11-25): https://modelcontextprotocol.io/
- MCP spec 2025-03-26 changelog (Streamable HTTP introduced, HTTP+SSE deprecated): https://modelcontextprotocol.io/specification/
- Atlassian Rovo HTTP+SSE deprecation notice (deadline example): https://community.atlassian.com/forums/Atlassian-Remote-MCP-Server/HTTP-SSE-Deprecation-Notice/ba-p/3205484
Updates & Changelog
- 2026-05-22 — Initial publication. Transport definitions, spec versions, and deprecation timeline compiled from the MCP specification, SDK documentation, and platform deprecation notices. Removal deadlines are as announced and may change; verify per platform. Failure-mode notes are editorial, drawn from documented community reports.
Technical reference as of May 2026. The MCP transport spec is evolving; verify current status and your client’s configuration format before implementing.
📊Key Empirical Statistics & Metrics
📚Authoritative References & Primary Sources
- Anthropic MCP — Official Transports Protocol Specification [External Source]
- Model Context Protocol SDK Official Repository [External Source]
