AI & MCP
Sampling in MCP: quando è il server a chiedere una generazione
Il sampling è la primitiva con cui un server MCP chiede al client di generare con il modello dell'utente. Ecco il flusso e perché un catalogo lo rifiuta.
In sintesi
- Sampling è una richiesta server→client: il server propone i messaggi, il client genera con il modello dell'utente.
- Serve la capacità sampling dichiarata dal client; senza di essa la richiesta non ha una risposta utile.
- Il server EneUI non implementa sampling: sampling/createMessage restituisce -32601 method not found.
In MCP il sampling è la primitiva con cui un server chiede al client di eseguire una generazione con il modello dell'utente. Il server invia sampling/createMessage con i messaggi; il client decide se generare, con quale modello e cosa mostrare.
Chi decide cosa
Il server non vede il modello: propone una lista di messaggi e un numero massimo di token. Il client verifica la capacità dichiarata nella sessione, applica il consenso dell'utente e restituisce il testo oppure un errore.
- Capacità: il client annuncia
samplingininitialize; senza annuncio il server non dovrebbe chiedere nulla. - Preferenze:
modelPreferencessono suggerimenti su costo, velocità e intelligenza, non un vincolo. - Consenso: il client può mostrare i messaggi, modificarli o rifiutare la generazione.
Perché la direzione conta
Un tool viaggia dal client al server; il sampling viaggia nella direzione opposta, sulla stessa sessione. Il server deve poter inviare una richiesta mentre il client resta in ascolto: su stdio è naturale, su Streamable HTTP serve un canale aperto.
curl -s https://ui.eneawork.it/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"sampling/createMessage","params":{"messages":[]}}'
La risposta è {"code":-32601,"message":"method not found: sampling/createMessage"}. Non è un guasto di rete: il metodo non è nel dispatcher e la capacità non è dichiarata, quindi un client corretto non deve nemmeno provarci.
Il costo lo paga il client
Ogni generazione consuma il credito dell'utente, non quello del server. Per un catalogo di componenti la cosa non porta valore: gli strumenti restituiscono record, URL e comandi già pronti, senza bisogno di un modello.
Il rischio che il sampling introduce
Il server scrive i messaggi che finiscono nel modello dell'utente. Un server ostile può usare quella strada per iniettare istruzioni o far spendere token; per questo la specifica lascia al client il consenso e la scelta del modello.
Il catalogo EneUI
Il server espone in sola lettura tabelle e dashboard; un record di esempio è data table di 21st-shadcn, licenza MIT e 114 stelle dichiarate a monte, letto il 1 novembre 2026. La configurazione del client è su /agents.
La limitazione
EneUI non implementa sampling e non lo dichiara: la risposta initialize elenca solo tools. Un client che chiama il metodo ottiene -32601, e il protocollo non richiede sampling per essere conforme.
Dove continuare
Il quadro del protocollo è in che cos'è MCP; lo schema di uno strumento è in progettare un tool MCP; il dispatcher scritto a mano è in come costruire un server MCP. Il confronto con le API REST è in MCP vs REST.
Domande frequenti
Il sampling è obbligatorio in MCP?
No. È una capacità opzionale: un server può non dichiararla e un client può non supportarla. Il server EneUI non la dichiara e non implementa il metodo.
Chi paga i token del sampling?
L'utente del client. Il server non usa una chiave propria: la generazione avviene con il modello e il credito del client, che può rifiutare la richiesta.
Un server legge la conversazione grazie al sampling?
No, non l'intera conversazione. Riceve solo i messaggi che ha inviato e la risposta che il client restituisce, mai il resto del dialogo.
Sampling e tool sono la stessa cosa?
No. Un tool è una funzione del server che il modello chiama; il sampling è una generazione chiesta dal server al modello del client.
Cosa risponde EneUI a sampling/createMessage?
-32601, metodo non trovato. L'endpoint dichiara solo la capacità tools, quindi il metodo non esiste nel dispatcher.