# 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.

> Pagina: https://ui.eneawork.it/blog/mcp-testing-locale
> Markdown: https://ui.eneawork.it/blog/mcp-testing-locale.md

*2026-11-01*

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.

Il catalogo EneUI conta 111.985 componenti, 1.556 blocchi e 12.808 icone da 1.472 librerie, letti da /api/stats il 1 novembre 2026. La prova sull'endpoint /mcp, verificata il 1 novembre 2026, ha dato: 200 su initialize, tools/list, tools/call, resources/list e resources/read; 202 con corpo vuoto su una notifica; -32601 su sampling/createMessage; 401 con WWW-Authenticate su un token errato; 400 con corpo HTML su JSON malformato. La query «data table» ha restituito 367 corrispondenze.

## 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

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.

## FAQ

### 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.
