subscriptions/listen (notificări de schimbare) în Model Context Protocol (MCP)

Protocol și Arhitectură Specificația MCP 2026-07-28

Stream-ul de lungă durată prin care clientul MCP primește notificările de schimbare alese, în locul fostelor resources/subscribe și GET.

Specificație & cod MCP
subscriptions/listen {"notifications": {"toolsListChanged"?, "promptsListChanged"?, "resourcesListChanged"?, "resourceSubscriptions"?}}

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.

Comenzi înrudite