Ce face Transport MCP: stdio și Streamable HTTP
Transportul definește doar încadrarea și livrarea mesajelor; semantica este aceeași peste tot. stdio: clientul lansează serverul ca subproces. Serverul citește mesaje JSON-RPC din stdin și scrie pe stdout, câte un mesaj pe linie, fără newline-uri în interior. Pe stdout nu are voie să apară nimic altceva decât mesaje MCP valide; logurile merg pe stderr, iar clientul nu tratează stderr ca semn de eroare. Anularea se face cu notifications/cancelled. Oprirea: clientul închide stdin, așteaptă ieșirea și, la nevoie, termină procesul forțat (pe POSIX de la SIGTERM la SIGKILL). Dacă serverul cade, clientul îl repornește și reîncearcă cererile.
Streamable HTTP: serverul expune un singur endpoint MCP (de exemplu https://example.com/mcp) care acceptă POST. Fiecare mesaj al clientului este un POST separat, cu Accept pentru application/json și text/event-stream. La o notificare acceptată serverul răspunde 202 Accepted fără corp; la o cerere, cu un obiect JSON sau cu un stream SSE care conține notificări legate de cerere și apoi răspunsul final. Serverul nu trimite cereri proprii pe stream. Notificările de schimbare vin pe stream-ul unei cereri subscriptions/listen. Anularea înseamnă închiderea stream-ului răspunsului. Serverele ar trebui să adauge X-Accel-Buffering: no la stream-urile SSE.
Fiecare POST conține MCP-Protocol-Version (egal cu versiunea din _meta), Mcp-Method și, pentru tools/call, resources/read și prompts/get, Mcp-Name; valorile care nu sunt ASCII sigur se codifică =?base64?...?=. O metodă necunoscută primește 404 cu eroarea -32601. Față de 2025-11-25 au dispărut endpoint-ul GET, sesiunile cu Mcp-Session-Id (și închiderea lor cu DELETE) și reluarea stream-urilor cu Last-Event-ID; un server doar modern răspunde la GET sau DELETE cu 405. Transportul HTTP+SSE din 2024-11-05 este depreciat.
Sintaxă și opțiuni
| Opțiune / Parametru | Descriere |
|---|---|
stdin / stdout |
Canalul mesajelor JSON-RPC pe stdio, câte unul pe linie. |
stderr |
Loguri ale serverului stdio; clientul le poate captura, redirecționa sau ignora. |
POST pe endpoint-ul MCP |
Singura metodă HTTP a transportului; un mesaj JSON-RPC per cerere. |
Content-Type: application/json sau text/event-stream |
Răspunsul la o cerere: un obiect JSON sau un stream SSE; clientul trebuie să le suporte pe ambele. |
202 Accepted |
Răspunsul la o notificare acceptată. |
MCP-Protocol-Version |
Obligatoriu; trebuie să corespundă _meta, altfel 400 + -32020. |
Mcp-Method / Mcp-Name |
Antete obligatorii care oglindesc method și params.name sau params.uri. |
Mcp-Param-{nume} |
Antete pentru parametrii de unealtă marcați cu x-mcp-header. |
405 Method Not Allowed |
Răspunsul recomandat la GET sau DELETE pe endpoint, pentru clienți vechi. |
Exemple practice
Exemplul 1: Citirea unei resurse prin Streamable HTTP
POST /mcp HTTP/1.1
Content-Type: application/json
MCP-Protocol-Version: 2026-07-28
Mcp-Method: resources/read
Mcp-Name: file:///projects/myapp/config.json
{
"jsonrpc": "2.0",
"id": 2,
"method": "resources/read",
"params": {
"uri": "file:///projects/myapp/config.json",
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "ExampleClient",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}
Exemplul 2: Antet cu valoare codificată în base64
Valorile cu caractere non-ASCII, caractere de control sau spații la capete se trimit codificate.
Mcp-Param-Greeting: =?base64?SGVsbG8sIOS4lueVjA==?=
Greșeli frecvente și bune practici
- Afișezi mesaje de depanare pe
stdoutîntr-un server stdio. Orice text care nu e mesaj MCP strică fluxul; scrie pestderr. - Păstrezi stare în
Mcp-Session-Idsau deschizi un GET pentru notificări. Ambele au dispărut în 2026-07-28; folosește identificatori expliciți șisubscriptions/listen. - Te bazezi pe reluarea unui stream SSE întrerupt. Nu mai este suportată; retrimite cererea cu un
idnou.