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.

MetodoCon l'SDKEneUI, a mano
initializegestitogestito
tools/listdalla lista registratadall'array TOOLS
tools/callvalidazione automaticadispatch con try/catch
resources/readdalla mappa registratacontrollo con espressione regolare
prompts/getgestito-32601
sampling/createMessagegestito-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.