MCP-Clients und -Server kommunizieren durch den Austausch von JSON-Nachrichten, aber wie werden diese Nachrichten tatsächlich übertragen? Der verwendete Kommunikationskanal wird als Transport bezeichnet, und es gibt mehrere Möglichkeiten, diesen zu implementieren – von HTTP-Anfragen über WebSockets bis hin zum Schreiben von JSON auf eine Postkarte (wobei Letzteres für den Produktionseinsatz nicht empfohlen wird).
Der Stdio-Transport
Wenn du zum ersten Mal einen MCP-Server oder -Client entwickelst, ist der am häufigsten verwendete Transport der Stdio-Transport. Dieser Ansatz ist unkompliziert: Der Client startet den MCP-Server als Subprozess und kommuniziert über die Standard-Eingabe- und -Ausgabeströme.

So funktioniert es:
- Der Client sendet Nachrichten an den Server über die
stdindes Servers - Der Server antwortet, indem er in
stdoutschreibt - Sowohl der Server als auch der Client können jederzeit eine Nachricht senden
- Funktioniert nur, wenn Client und Server auf derselben Maschine laufen
Stdio in Aktion sehen
Du kannst einen MCP-Server tatsächlich direkt von deinem Terminal aus testen, ohne einen separaten Client zu schreiben. Wenn du einen Server mit uv run server.py ausführst, lauscht er auf stdin und schreibt Antworten auf stdout. Das bedeutet, du kannst JSON-Nachrichten direkt in dein Terminal einfügen und die Antworten des Servers sofort sehen.
Die Terminal-Ausgabe zeigt den vollständigen Nachrichtenaustausch, einschließlich Beispielnachrichten für die Initialisierung und Tool-Aufrufe.
MCP-Verbindungssequenz
Jede MCP-Verbindung muss mit einem bestimmten dreiteiligen Handshake beginnen:

- Initialize Request – Der Client sendet diese zuerst
- Initialize Result – Der Server antwortet mit seinen Fähigkeiten
- Initialized Notification – Der Client bestätigt (keine Antwort erwartet)
Erst nach diesem Handshake kannst du andere Anfragen wie Tool-Aufrufe oder Prompt-Auflistungen senden.
Nachrichtentypen und Ablauf
MCP unterstützt verschiedene Nachrichtentypen, die in beide Richtungen fließen:

Die zentrale Erkenntnis ist, dass manche Nachrichten Antworten erfordern (Requests → Results), während andere dies nicht tun (Notifications). Sowohl Client als auch Server können die Kommunikation jederzeit initiieren.
Vier Kommunikationsszenarien
Bei jedem Transport musst du vier verschiedene Kommunikationsmuster handhaben:

- Client → Server Request: Der Client schreibt in stdin
- Server → Client Response: Der Server schreibt in stdout
- Server → Client Request: Der Server schreibt in stdout
- Client → Server Response: Der Client schreibt in stdin
Die Schönheit des Stdio-Transports liegt in seiner Einfachheit – jede Partei kann die Kommunikation jederzeit über diese beiden Kanäle initiieren.
Warum das wichtig ist
Das Verständnis des Stdio-Transports ist entscheidend, da er den „idealen" Fall darstellt, in dem bidirektionale Kommunikation nahtlos funktioniert. Wenn wir zu anderen Transporten wie HTTP wechseln, werden wir auf Einschränkungen stoßen, bei denen der Server nicht immer Anfragen an den Client initiieren kann. Der Stdio-Transport dient als unsere Basis, um zu verstehen, wie vollständige MCP-Kommunikation aussieht, bevor wir uns mit den Einschränkungen anderer Transportmethoden befassen.
Für Entwicklung und Tests ist der Stdio-Transport perfekt. Für Produktionsbereitstellungen, bei denen Client und Server auf unterschiedlichen Maschinen laufen müssen, musst du andere Transportoptionen mit ihren eigenen Kompromissen in Betracht ziehen.