In depth
The MCP transport layer defines how JSON-RPC messages move between client and server. The protocol is transport-agnostic — the same messages work regardless of channel — but three transports are specified.
**stdio** is the local transport. The client spawns the server as a subprocess and communicates via its stdin/stdout streams. This is the default for locally installed MCP servers (filesystem, GitHub CLI-based servers).
**SSE (Server-Sent Events)** was the original remote transport: client opens a GET to the server, which streams events back. The client POSTs separately for outgoing messages. SSE is now deprecated in favor of streamable HTTP.
**Streamable HTTP** is the modern remote transport (spec v2025-03-26 and later). It uses a single HTTP endpoint supporting both POST (for client→server) and optionally SSE-style streaming (for server→client notifications). It's more firewall-friendly and easier to deploy behind standard reverse proxies.
Custom transports are allowed — anyone can implement MCP over WebSocket, named pipes, or any bidirectional channel.