AI & MCP
Un server MCP in Node: SDK ufficiale o dispatcher scritto a mano
In Node un server MCP deve gestire handshake, elenco e chiamate degli strumenti. L'SDK toglie il codice di trasporto; un catalogo in sola lettura ne fa a meno.
In sintesi
- L'SDK fornisce server, trasporti stdio e Streamable HTTP, validazione degli argomenti e forma degli errori.
- Autenticazione, rate limit e contenuto delle descrizioni restano a carico di chi scrive il server.
- EneUI usa un dispatcher a mano: 9 strumenti, 8 dipendenze in package.json e nessun SDK MCP.
Un server MCP in Node deve gestire l'handshake, l'elenco degli strumenti e le chiamate su un trasporto. L'SDK ufficiale evita il codice di trasporto, ma un catalogo in sola lettura funziona con un dispatcher scritto a mano.
Cosa fa l'SDK al posto tuo
Il pacchetto @modelcontextprotocol/sdk fornisce il server, i trasporti stdio e Streamable HTTP, la registrazione degli strumenti, la validazione dello schema di input e la serializzazione degli errori. Tu scrivi la funzione e il contenuto che restituisce.
Cosa resta tuo in ogni caso
- Autenticazione: leggere il token, risolverlo in un account e rispondere 401 con
WWW-Authenticate. - Rate limit: contare le chiamate per token o per IP e restituire 429 con
Retry-After. - Contenuto: descrizioni, schemi e dati vengono dal catalogo, non dall'SDK.
Il filo è più semplice dell'SDK
curl -s https://ui.eneawork.it/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize"}'
La risposta contiene protocolVersion, capabilities, serverInfo e le istruzioni per l'agente. Chi risponde a questi campi e a quattro metodi ha già un server usabile da Cursor e da Claude Code.
| Metodo | Con l'SDK | EneUI, a mano |
|---|---|---|
| initialize | gestito | gestito |
| tools/list | dalla lista registrata | dall'array TOOLS |
| tools/call | validazione automatica | dispatch con try/catch |
| resources/read | dalla mappa registrata | controllo con espressione regolare |
| prompts/get | gestito | -32601 |
| sampling/createMessage | gestito | -32601 |
Perché un catalogo resta senza SDK
Gli strumenti sono 9 e leggono un indice in memoria: un dispatcher mostra esattamente cosa risponde, senza dipendenze da aggiornare. Il costo è la validazione manuale degli argomenti.
Il comando di installazione che gli strumenti restituiscono è già pronto: npx shadcn@latest add "https://ui.eneawork.it/api/registry/<libreria>/<nome>.json?token=YOUR_TOKEN". Il server non copia file: passa il comando all'agente.
Il catalogo EneUI
Le azioni e i blocchi di prezzo escono come record, non come codice generato; un esempio è la data table di 21st-shadcn, licenza MIT e 114 stelle dichiarate a monte, letta il 1 novembre 2026.
La limitazione
Un dispatcher a mano non valida lo schema: un argomento sbagliato fa cadere la funzione e la risposta diventa Tool failed: … con isError, non un -32602. EneUI accetta questo compromesso perché gli strumenti sono pochi e i tipi sono semplici.
Dove continuare
I metodi e il trasporto sono in come costruire un server MCP; nome e schema di uno strumento sono in progettare un tool MCP; il quadro generale è in che cos'è MCP. Il confronto con le API REST è in MCP vs REST.
Domande frequenti
Serve l'SDK per scrivere un server MCP?
No. L'SDK evita il codice di trasporto e di validazione, ma il protocollo è JSON-RPC su un trasporto: un dispatcher manuale è sufficiente per pochi strumenti.
Quale trasporto scegliere in Node?
stdio se il client avvia il processo sulla stessa macchina; Streamable HTTP se il server è remoto e condiviso da più client.
L'SDK gestisce l'autenticazione?
No. Token, sessione OAuth e intestazioni WWW-Authenticate restano a carico del server, che deve risolverli prima di eseguire lo strumento.
Quante dipendenze ha il server EneUI?
Otto in package.json, nessuna delle quali è un SDK MCP. Il server usa Express per il corpo JSON e un array di strumenti per il resto.
Un errore negli argomenti che risposta produce?
Nel server EneUI un contenuto con isError e il testo «Tool failed», non un errore JSON-RPC: la validazione è manuale e il catch è largo.