Questa guida esplora il meccanismo di comunicazione nel Model Context Protocol (MCP) e il suo metodo di scoperta degli strumenti disponibili. Comprendere questo aspetto è fondamentale per facilitare interazioni fluide e funzionali tra diversi componenti del sistema.

Comunicazione nel MCP tramite JSON-RPC

Il JSON-RPC è il protocollo chiave che permette la comunicazione all’interno del MCP. Si tratta di un sistema leggero progettato per eseguire chiamate remote usando messaggi in formato JSON. Questa semplicità rende il protocollo facilmente comprensibile, consentendo implementazioni efficaci anche in scenari complessi. Utilizzando JSON-RPC, il Client MCP può inviare richieste strutturate ai Server e ricevere risposte chiare.

Ogni interazione attraverso questo protocollo segue uno schema ben definito, che include elementi come l’identificativo della richiesta, il nome del metodo da invocare e i parametri necessari. Questo garantisce una coerenza che consente l’interoperabilità tra sistemi realizzati con tecnologie diverse, semplificando il debugging e la registrazione delle operazioni.

Analisi di richieste e risposte

Per capire come funziona il protocollo, esaminiamo la struttura delle richieste e delle risposte riguardanti JSON-RPC attraverso esempi pratici. Ogni richiesta include dettagli cruciali per il corretto funzionamento del Server, come l’identificativo univoco, il nome del metodo da attivare e una serie di parametri necessari.

Immaginiamo che il Client desideri ottenere le previsioni del tempo per una città. La richiesta potrebbe apparire in questo modo:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getWeather",
  "params": {
    "city": "Roma"
  }
}

All’interno di questa struttura osserviamo vari elementi: la versione del protocollo, l’identificativo univoco, il metodo specifico e i parametri, come il nome della città.

Dopo aver ricevuto la richiesta, il Server la elabora e restituisce una risposta, che può contenere dati utili o un codice di errore. Per una richiesta andata a buon fine, la risposta potrebbe apparire così:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "temperature": 22,
    "condition": "soleggiato"
  }
}

In questo caso, l’identificativo della risposta corrisponde a quello della richiesta, mentre il campo “result” presenta i dati ottenuti dal Server, pronti per essere utilizzati dal modello.

Se insorge un problema, come un parametro mancante, la risposta dell’errore sarà simile a questa:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32602,
    "message": "Parametri non validi"
  }
}

Tale struttura permette un’assegnazione chiara degli errori, consentendo al sistema di adattarsi ad eventuali problematiche, come correggere la richiesta o avvisare l’utente.

Discovery degli strumenti disponibili

Una delle innovazioni del MCP è la “tool discovery”, cioè la capacità del modello di identificare dinamicamente gli strumenti a disposizione. A differenza delle integrazioni fisse dei sistemi tradizionali, il MCP consente al modello di richiedere al Server la lista degli strumenti disponibili.

Questo avviene attraverso chiamate specifiche in cui il Client richiede una descrizione delle funzionalità. In questo modo, il modello può scegliere gli strumenti in base al contesto della richiesta. La tool discovery rappresenta un enorme passo avanti verso sistemi più flessibili, dove le capacità possono variare a seconda delle esigenze.

Affinché questa scoperta sia utile, gli strumenti devono essere ben descritti. Ogni tool deve fornire informazioni sul suo scopo, sui parametri richiesti e sul tipo di output che restituisce. Questa descrizione, infatti, è fondamentale per quando e come un modello decide di utilizzare uno strumento.

Per conoscere gli strumenti disponibili, il Client invia una richiesta JSON-RPC al Server, tipicamente con un metodo come tools/list:

{
  "jsonrpc": "2.0",
  "id": 100,
  "method": "tools/list"
}

Questa richiesta è semplice e diretta, mirata solo a ottenere un elenco degli strumenti pronti all’uso. Il Server risponderà con una lista strutturata contenente ciascun strumento e la sua descrizione:

{
  "jsonrpc": "2.0",
  "id": 100,
  "result": {
    "tools": [
      {
        "name": "getWeather",
        "description": "Recupera il meteo attuale per una città",
        "inputSchema": {
          "type": "object",
          "properties": {
            "city": {
              "type": "string"
            }
          },
          "required": ["city"]
        }
      },
      {
        "name": "calculateSum",
        "description": "Calcola la somma di due numeri",
        "inputSchema": {
          "type": "object",
          "properties": {
            "a": {"type": "number"},
            "b": {"type": "number"}
          },
          "required": ["a", "b"]
        }
      }
    ]
  }
}

Nella risposta osserviamo:

  • Il nome del tool, fondamentale per identificarlo.
  • La descrizione, utile per comprendere il contesto di utilizzo.
  • Lo schema di input, che specifica i parametri richiesti e il loro formato.

Una volta ricevuta questa risposta, il modello può analizzare le informazioni. Se un utente chiede “che tempo fa a Napoli?”, il modello può facilmente associare questa richiesta al tool getWeather, grazie ai dettagli forniti nella descrizione.

In sintesi

Abbiamo esaminato come il Model Context Protocol faciliti la comunicazione attraverso JSON-RPC e come il meccanismo di tool discovery consenta una interazione fluida e dinamica con gli strumenti disponibili. Questi due aspetti sono cruciali per rendere i sistemi sempre più funzionali ed adattivi. Nella prossima guida, approfondiremo la questione della sicurezza, esaminando come gestire e limitare l’accesso a strumenti e dati.