Transport MCP: stdio vs Streamable HTTP / SSE în Model Context Protocol (MCP)

Diferența dintre rularea locală a serverelor MCP ca subprocese prin intrarea/ieșirea standard (stdio) și găzduirea lor la distanță prin Streamable HTTP și Server-Sent Events.

Specificație & cod MCP
# 1. Transport Local (stdio) - lansat automat de Host pe mașina ta:
npx -y @modelcontextprotocol/server-postgres postgresql://localhost/mydb

# 2. Transport Remote (Streamable HTTP / SSE) - server partajat în rețea/cloud:
POST / GET https://mcp.companie.ro/mcp (cu Header Authorization: Bearer <token>)

Descriere & Utilizare

Protocolul MCP separă complet logica mesajelor JSON-RPC de canalul fizic prin care circulă acestea (numit Transport Layer). Există două moduri oficiale de transport, alese în funcție de locul unde rulează serverul.

Transportul stdio (Standard Input/Output) este destinat serverelor locale: aplicația Host (Claude Desktop, Cursor) pornește serverul MCP ca subproces pe propriul tău calculator (prin npx, uvx, python sau docker) și comunică cu el prin fluxurile stdin și stdout. Are latență zero și acces direct la fișierele locale.

Transportul Streamable HTTP (care a evoluat din HTTP + SSE) este destinat serverelor partajate în cloud sau în rețeaua companiei: serverul rulează independent pe un URL HTTPS (ex: /mcp), acceptând cereri POST și fluxuri de evenimente SSE de la mai mulți clienți autentificați.

Cum să o reții ușor

💡 Transportul stdio este ca un cablu scurt conectat direct la perifericul de pe biroul tău, în timp ce Streamable HTTP este conexiunea Wi-Fi securizată către un server central folosit de toată echipa.

Opțiuni și parametri tehnici

  • stdio (stdin / stdout / stderr): mesajele JSON-RPC circulă exclusiv pe stdout (câte un JSON pe linie); orice log de depanare trebuie scris obligatoriu pe stderr!
  • Streamable HTTP (/mcp): un singur endpoint HTTP care suportă atât răspunsuri JSON directe, cât și upgrade la fluxuri SSE (Server-Sent Events) pentru notificări și streaming.
  • Mcp-Session-Id: antet HTTP standardizat pentru menținerea sesiunii cu stare între client și serverul remote.

Exemple practice și cazuri de utilizare

  • Regulă de aur în stdio: în Python nu folosi niciodată print("Mesaj debug") simplu (care scrie în stdout și corupe JSON-RPC!), ci print("Debug", file=sys.stderr) sau modulul logging.
  • Pornirea unui server FastMCP în modul stdio (implicit): mcp.run(transport="stdio").
  • Pornirea aceluiași server FastMCP în modul HTTP pentru rețea: mcp.run(transport="streamable-http", host="0.0.0.0", port=8000).

Sfaturi de configurare & capcane

Dacă un server MCP local îți dă eroarea „Unexpected token in JSON at position 0” în Claude Desktop sau Cursor, cauza este aproape întotdeauna o bibliotecă ce a afișat un text sau un banner în stdout la pornire.

Comenzi și ghiduri înrudite