Cos'è un server MCP? Tool, risorse e prompt spiegati | We.Inc
Un server MCP è un programma che offre tool, risorse e prompt alle applicazioni AI tramite il Model Context Protocol. Guarda i veri messaggi JSON, passo dopo passo.
Cos'è un server MCP?
Un server MCP è un programma che dà alle applicazioni AI qualcosa con cui lavorare tramite il Model Context Protocol: tool che possono chiamare, risorse che possono leggere e prompt che gli utenti possono scegliere. L'applicazione si connette tramite un client MCP, e le due parti si scambiano messaggi JSON-RPC 2.0 via stdio in locale o via Streamable HTTP da remoto.
Le tre cose che un server può offrire
Primitiva
Cos'è
Chi decide di usarla
Metodi principali
Tool
Funzioni che eseguono un'azione, con un JSON Schema per il loro input
Il modello
tools/list, tools/call
Risorse
Dati di sola lettura identificati da un URI, come un file o uno schema
L'applicazione
resources/list, resources/read
Prompt
Template di istruzioni riutilizzabili con argomenti
L'utente
prompts/list, prompts/get
Segui passo per passo uno scambio reale qui sotto. Ogni passaggio mostra il JSON che un client invia e cosa risponde il server, usando le forme dei messaggi della specifica attuale (versione 2026-07-28). Leggere i messaggi grezzi è il modo più rapido per smettere di pensare a un server come a una magia.
Scegli un passaggio: discovery, elenco dei tool, chiamata di un tool o ricezione di una notifica di modifica.
Leggi la richiesta a sinistra e la risposta a destra.
Controlla la nota sotto la coppia per il campo che conta di più in quel passaggio.
Copia qualsiasi messaggio per confrontarlo con quello che invia il tuo server o client.
Dai ai tool nomi con un prefisso chiaro, come weather_current invece di get. Un host può caricare tool da molti server contemporaneamente, e i nomi vaghi entrano in conflitto.
Scrivi la descrizione di ogni tool per il modello, non per una persona che scorre un elenco. Di' cosa fa il tool e quando va scelto.
Esponi il contesto di sola lettura come risorse invece che come tool. Le risorse lasciano decidere all'applicazione cosa includere, così il modello non recupera dati che non gli servono.
Considera rischioso ogni tool che modifica qualcosa. Il protocollo lascia l'approvazione all'host, quindi progetta tool che si possano confermare in sicurezza una chiamata alla volta.
Domande frequenti
Un server MCP è la stessa cosa di un'API?
Di solito ne avvolge una. Un server tipico chiama un'API o un database esistente e descrive quelle operazioni in modo standard, così qualsiasi applicazione compatibile con MCP può scoprirle e chiamarle senza codice di integrazione personalizzato.
Un server MCP gira sul mio computer o nel cloud?
Entrambe le cose. Un server locale viene avviato dall'applicazione e comunica tramite standard input e output. Un server remoto gira altrove e si raggiunge via Streamable HTTP, dove può servire molti client.
Un server MCP contiene un modello linguistico?
No. Il server offre solo tool, risorse e prompt. È l'applicazione host a possedere il modello e a decidere cosa inviargli. La specifica segna come deprecato il sampling richiesto dal server a partire dalla versione 2026-07-28.
Cosa è cambiato nella versione 2026-07-28 del protocollo?
Il protocollo è diventato stateless: ogni richiesta porta la versione del protocollo e le capability nel suo campo _meta, e i server rispondono a una richiesta server/discover obbligatoria. Le notifiche di modifica ora sono su adesione, tramite uno stream subscriptions/listen.
Chi approva una chiamata a un tool?
L'host. La documentazione del protocollo suggerisce finestre di approvazione, impostazioni dei permessi e log delle attività, ma applicarli è compito dell'applicazione, quindi un server non dovrebbe mai dare per scontato che una persona abbia verificato una chiamata.
Host, client e server
In ogni configurazione compaiono tre ruoli. L'host è l'applicazione AI che la persona usa. Per ogni server a cui si connette, l'host crea un client, e ogni client mantiene una connessione dedicata con esattamente un server.
Quindi un host collegato a un file server e a un server di database ha due client. Il server è semplicemente il programma che risponde, ovunque giri.
Due livelli: dati e trasporto
Il livello dati definisce i messaggi: richieste, risposte e notifiche JSON-RPC 2.0 per discovery, tool, risorse e prompt. Il livello di trasporto sposta quei messaggi e gestisce l'apertura della connessione e l'autorizzazione.
Esistono due trasporti standard. Stdio fa passare i messaggi attraverso standard input e output tra processi sulla stessa macchina. Streamable HTTP usa HTTP POST dal client al server, con Server-Sent Events opzionali per lo streaming, e supporta bearer token, chiavi API e OAuth.
Cosa può offrire il client in cambio
Anche i server possono chiedere qualcosa al client. L'elicitation permette a un server di chiedere all'utente altre informazioni o una conferma tramite il metodo elicitation/create.
Il sampling, in cui un server chiede all'host un completamento del modello, e il logging a livello di protocollo sono deprecati a partire dalla versione 2026-07-28. I nuovi server dovrebbero scrivere i log su stderr con stdio oppure usare OpenTelemetry.
stderr (stdout trasporta i messaggi del protocollo)
I normali log del tuo server
Com'è fatto un resource template
Un resource template con un parametro nell'URI
I client trovano i template con resources/templates/list, compilano le parentesi graffe e leggono il risultato con resources/read.
1. Discovery
server/discover è opzionale per il client ma ogni server deve rispondere. L'oggetto capabilities indica quali primitive esistono; listChanged significa che il server può notificare le modifiche ai tool.
2. Elenco dei tool
Ogni tool ha un name, una description e un inputSchema scritto in JSON Schema. L'host li passa al modello così sa cosa può chiamare.
3. Chiamata di un tool
Il nome deve corrispondere esattamente al tool elencato e gli argomenti devono rispettare il suo inputSchema. I risultati tornano come array content, qui un singolo elemento di testo.
4. Notifica di modifica
Le notifiche non hanno id, quindi nessuno risponde. Il client riceve questa solo perché ha aperto uno stream subscriptions/listen chiedendo toolsListChanged.