AI & MCP

Testare un server MCP in locale: sei chiamate che tolgono il dubbio

Un server MCP si prova con sei chiamate: handshake, elenco, chiamata, notifica, metodo inesistente e token sbagliato. Se tornano come dice la specifica, è pronto.

In sintesi

  • L'handshake va letto su tre campi: protocolVersion, capabilities e serverInfo.name.
  • Notifica, metodo inesistente e token sbagliato hanno risposte diverse e vanno provate tutte.
  • L'endpoint EneUI risponde 200 anche quando il corpo contiene un errore JSON-RPC.

Un server MCP si prova con sei chiamate: initialize, tools/list, tools/call, una notifica, un metodo inesistente e un token sbagliato. Se le risposte tornano come dice la specifica, il server è pronto per un client.

Prima l'handshake

curl -s https://ui.eneawork.it/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize"}'

Controlla tre campi: protocolVersion 2025-06-18, l'oggetto capabilities e serverInfo.name. Se il server dichiara solo tools, non aspettarti prompt né sampling: la lista vuota è coerente, non un guasto.

Poi l'elenco e una chiamata

curl -s https://ui.eneawork.it/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

curl -s https://ui.eneawork.it/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"search_components","arguments":{"query":"data table","limit":2}}}'

L'elenco deve contenere 9 strumenti con il proprio schema di input; la chiamata restituisce contenuto testuale con URL e comando di installazione. Una query senza risultati produce un messaggio con isError: true, non un errore JSON-RPC.

Le risposte che nessuno prova

ProvaAttesoNel server EneUI
Notifica senza id202, corpo vuoto202, corpo vuoto
Metodo inesistente-32601-32601
Token non valido401 e WWW-Authenticate401 con resource_metadata
JSON malformatoerrore JSON-RPC400 con corpo HTML

L'ultima riga è il difetto più comune: il parser di Express risponde prima del dispatcher, quindi l'errore arriva in HTML e un client che legge solo JSON lo interpreta come guasto di rete.

Il rate limit si prova contando

Il traffico anonimo passa da un limite per IP, RATE_MCP_PER_MIN, 120 al minuto se la variabile non è impostata; il traffico autenticato ha una quota per piano. Al superamento arriva 429 con Retry-After: 60 e codice -32002.

for i in $(seq 1 3); do
  curl -s -o /dev/null -w "%{http_code}\n" https://ui.eneawork.it/mcp \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","id":1,"method":"ping"}'
done

Una prova in locale, senza scrivere il client

Avvia il server con npm start, esporta RATE_MCP_PER_MIN=5 e ripeti il ciclo: il 429 deve arrivare alla sesta chiamata. Se non arriva, il contatore è per account oppure non è montato sul percorso giusto.

Il catalogo EneUI

Le prove usano record reali: modali, hero e la modale animata di Aceternity, licenza MIT e 290 stelle dichiarate a monte, letta il 1 novembre 2026.

La limitazione

Il server risponde 200 anche quando il corpo contiene un errore JSON-RPC: chi controlla solo lo stato HTTP considera riuscita una chiamata fallita. Il test deve leggere error e isError, non il codice di stato.

Dove continuare

Il flusso OAuth e il 401 sono in OAuth per server MCP; i metodi sono in come costruire un server MCP; lo schema degli strumenti è in progettare un tool MCP. Resource e tool a confronto sono in resources e tools in MCP.

Domande frequenti

Basta curl per testare un server MCP?

Per la maggior parte sì. Sei chiamate coprono handshake, elenco, chiamata, notifica, errore di metodo e autenticazione, senza installare un client.

Perché la notifica non restituisce nulla?

Perché una notifica non ha id e il protocollo vieta di risponderle. Il server chiude con 202 e corpo vuoto: un corpo qui sarebbe un errore.

Come si prova il rate limit in locale?

Imposta RATE_MCP_PER_MIN a un valore basso, per esempio 5, riavvia il server e ripeti la stessa chiamata: il 429 con Retry-After deve arrivare alla sesta.

Cosa significa -32601?

Metodo non trovato: il server ha ricevuto un metodo che non implementa. Su EneUI accade con prompts/get e sampling/createMessage.

Il 200 garantisce che la chiamata sia riuscita?

No. Un errore JSON-RPC viaggia dentro una risposta 200; bisogna leggere il campo error oppure isError nel risultato dello strumento.