Ce face subscriptions/listen (notificări de schimbare)
subscriptions/listen deschide un stream de notificări de la server la client care rămâne deschis până când clientul îl anulează. A apărut în 2026-07-28 și înlocuiește resources/subscribe, resources/unsubscribe și endpoint-ul HTTP GET. Clientul alege în notifications ce tipuri vrea; serverul nu are voie să trimită tipuri necerute. Notificările legate de o cerere anume, ca notifications/progress și notifications/message, nu circulă pe acest stream, ci pe răspunsul cererii respective.
Primul mesaj al serverului este notifications/subscriptions/acknowledged, cu subsetul de tipuri pe care serverul le onorează; tipurile nesuportate lipsesc. Toate notificările de pe stream poartă în _meta cheia io.modelcontextprotocol/subscriptionId, egală cu id-ul JSON-RPC al cererii subscriptions/listen. Un client poate avea mai multe abonări simultan; pe stdio, unde toate mesajele împart un canal, corelarea prin subscriptionId este obligatorie.
Abonarea se încheie când clientul închide stream-ul SSE (HTTP) sau trimite notifications/cancelled cu id-ul cererii (stdio), când serverul o închide sau când transportul cade. La o închidere ordonată, serverul trimite un răspuns cu resultType: "complete" și subscriptionId; o întrerupere fără răspuns indică o deconectare neașteptată, după care clientul se poate reconecta. Pe stdio, după reconectare clientul retrimite cererea, pentru că serverul nu păstrează starea abonărilor. Pe HTTP, serverele sunt încurajate să trimită periodic un comentariu SSE ca keep-alive.
Sintaxă și opțiuni
| Opțiune / Parametru | Descriere |
|---|---|
toolsListChanged |
true: primește notifications/tools/list_changed. |
promptsListChanged |
true: primește notifications/prompts/list_changed. |
resourcesListChanged |
true: primește notifications/resources/list_changed. |
resourceSubscriptions |
Listă de URI-uri: primește notifications/resources/updated pentru ele. |
notifications/subscriptions/acknowledged |
Confirmarea, primul mesaj al abonării, cu filtrul acceptat. |
io.modelcontextprotocol/subscriptionId |
În _meta-ul fiecărei notificări: id-ul cererii subscriptions/listen. |
Exemple practice
Exemplul 1: Abonare la lista de unelte și la un fișier
{
"jsonrpc": "2.0",
"id": 1,
"method": "subscriptions/listen",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "ExampleClient",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
},
"notifications": {
"toolsListChanged": true,
"resourceSubscriptions": ["file:///project/config.json"]
}
}
}
Rezultat
{
"jsonrpc": "2.0",
"method": "notifications/subscriptions/acknowledged",
"params": {
"_meta": {
"io.modelcontextprotocol/subscriptionId": 1
},
"notifications": {
"toolsListChanged": true,
"resourceSubscriptions": ["file:///project/config.json"]
}
}
}
Exemplul 2: Notificare la modificarea fișierului
Clientul citește apoi resursa din nou cu resources/read.
{
"jsonrpc": "2.0",
"method": "notifications/resources/updated",
"params": {
"_meta": {
"io.modelcontextprotocol/subscriptionId": 1
},
"uri": "file:///project/config.json"
}
}
Exemplul 3: Închiderea ordonată de către server
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resultType": "complete",
"_meta": {
"io.modelcontextprotocol/subscriptionId": 1
}
}
}
Greșeli frecvente și bune practici
- Aștepți notificări de progres sau loguri pe stream-ul de abonare. Ele vin doar pe răspunsul cererii la care se referă.
- Nu compari filtrul confirmat cu cel cerut. Serverul omite tipurile pe care nu le suportă, iar clientul trebuie să trateze asta.
- După repornirea unui server stdio, te aștepți ca abonările să continue. Serverul nu păstrează starea; retrimite
subscriptions/listen.