Stdio gegen HTTP für MCP
Die Transport-Wahl ändert alles. Latenz, Security-Modell, Deployment. Ein praktischer Entscheidungsbaum.
MCP unterstützt zwei Transporte. Stdio (stdin/stdout-Pipes zwischen Prozessen) und HTTP+SSE (Server-Sent Events über HTTP). In der Spec sehen sie austauschbar aus. Sind sie nicht.
Stdio: der MCP-Server ist ein Subprozess des Agents (Claude Desktop, Claude Code, Cursor). Der Agent spawnt ihn, pipet JSON-RPC über stdin/stdout, killt ihn beim Exit. Latenz ist Sub-Millisekunde. Auth ist implizit (der User hat schon Prozess-Zugriff). Deployment ist "ship ein Binary oder npm-Paket, User ruft npx auf".
HTTP+SSE: der MCP-Server ist ein langlaufender Web-Dienst. Der Agent verbindet sich per HTTPS, öffnet einen SSE-Stream, sendet JSON-RPC-Requests per POST. Latenz ist deine Netzwerk-Latenz plus TLS-Handshake. Auth ist OAuth 2.1 PKCE oder Bearer-Token. Deployment ist "host den Server, manage das Cert, manage die Auth".
Stdio wählen wenn: der User den Agent lokal laufen lässt, die Daten lokal sind, du keine Multi-Tenancy brauchst, du Zero-Config-UX willst. HTTP wählen wenn: du Multi-Tenant-Daten auf einem Server hast, du OAuth brauchst, du den gleichen MCP-Server vielen Usern exponieren willst, du den Server ohne npm-Update der User aktualisieren musst.
Echtes Beispiel: local-memory-mcp ist stdio: SQLite-Datei liegt auf der User-Disk, kein Server nötig, npx und du läufst. studiomeyer-memory ist die HTTP-Version desselben Dings: Multi-Tenant, OAuth, gehostet auf memory.studiomeyer.io. Das Interface ist ähnlich, das Deployment komplett anders.
Die Falle in die ich getappt bin: HTTP-only bauen obwohl stdio in einem Tag fertig gewesen wäre. mcp-personal-suite hat als HTTP angefangen weil ich "SaaS" gedacht habe. Falsch. Das Ding wrappt deine lokale Email und deinen Kalender. Es muss lokal sein. Ich habe es als stdio neu geschrieben, das SaaS-Scaffolding weggeworfen, zwei Wochen früher ausgeliefert.
Entscheidungsbaum: sind die Daten beim User lokal? Stdio. Läuft der Agent lokal? Wahrscheinlich stdio. Musst du den Server ohne User-Aktion updaten? HTTP. Hast du Multi-Tenant-Daten auf deinen Servern? HTTP. Brauchst du beides? Bau erst stdio, dann HTTP, teile die Core-Logik.