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
| Prova | Atteso | Nel server EneUI |
|---|---|---|
| Notifica senza id | 202, corpo vuoto | 202, corpo vuoto |
| Metodo inesistente | -32601 | -32601 |
| Token non valido | 401 e WWW-Authenticate | 401 con resource_metadata |
| JSON malformato | errore JSON-RPC | 400 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.