In depth
Stdio transport is the workhorse of the MCP ecosystem. When you configure an MCP server in Claude Desktop or Claude Code, the host launches it as a subprocess using the given command and args. The host writes JSON-RPC requests to the subprocess's stdin, newline-delimited, and reads responses from stdout.
This transport has zero network overhead, no ports, no TLS, and inherits the subprocess's permissions (usually the user's). Server crashes are detected immediately when the subprocess exits. There's no authentication layer needed — the only actor on stdio is the parent process.
All official MCP SDKs ship a stdio transport implementation. A stdio server is typically an npm package (run with `npx`), a Python module (run with `uv` or `python`), or a compiled binary. Most MCP servers in the ecosystem are stdio-based.
Stderr is reserved for logs — the server writes human-readable debug output to stderr, leaving stdout clean for JSON-RPC. Mixing writes to stdout breaks the protocol.