AI & MCP

Resources e tools in MCP: due primitive, due contratti

Un tool è una funzione chiamata con argomenti; una resource è un documento letto per URI. In MCP la differenza sta nel contratto, non nel contenuto.

In sintesi

  • Un tool riceve argomenti e restituisce contenuto; una resource ha un URI stabile e un tipo MIME.
  • Il tool lo sceglie il modello, la resource la legge il client o l'utente: cambia il punto di decisione.
  • Il server EneUI espone 9 tool e 4 resource: i design system sono documenti, i componenti vanno cercati.

In MCP un tool è una funzione che il modello chiama con argomenti JSON, mentre una resource è un documento identificato da un URI che il client legge e può tenere in cache. Cambia il contratto, non il contenuto.

Il contratto del tool

Un tool dichiara inputSchema, riceve argomenti e restituisce blocchi di contenuto. La decisione è del modello, ogni chiamata può portare argomenti diversi, e la risposta non è riutilizzabile: POST /mcp risponde con Cache-Control: no-store.

Il contratto della resource

Una resource ha un URI stabile, un nome, una descrizione e un tipo MIME. Il client può elencarla e mostrarla all'utente senza passare dal modello, e può conservarla perché lo stesso URI promette lo stesso documento.

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

La risposta elenca 4 resource con uri, name, description e mimeType text/markdown. Non c'è nessun parametro di ricerca: si legge per URI, non si interroga.

curl -s https://ui.eneawork.it/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"resources/read","params":{"uri":"eneui://design/minimal-dark"}}'

Questa seconda chiamata restituisce il design system in Markdown: variabili CSS, token, regole Tailwind e istruzioni per l'agente. Lo stesso URI, letture diverse, contenuto identico.

AspettoToolResource
Indirizzonome e argomentiURI
Chi decideil modelloil client o l'utente
Cachenessuna, no-storeper URI
Errorecontenuto con isError-32602 unknown resource
Conteggio EneUI94

Perché il catalogo espone quattro resource

I design system sono documenti stabili: gli stessi token per chiunque li chieda, senza argomenti da indovinare. I componenti no, perché dipendono da query, categoria e libreria, quindi restano tool.

Cosa non può fare una resource

Una resource non cerca. Non esiste un metodo per filtrare le resource per testo: il client riceve l'elenco e legge per URI. Quando serve una ricerca, la primitiva giusta è il tool.

Il catalogo EneUI

Un blocco reale è Dashboard with Revenue and Customers, 5 file e 14 dipendenze di registry; le modali e la modale animata di Aceternity, licenza MIT e 290 stelle dichiarate a monte, restano tool perché vanno cercate. Conteggi letti il 1 novembre 2026.

La limitazione

Lo schema eneui:// vale solo dentro questo server: un client non può risolvere lo stesso URI altrove, e non esiste un elenco di resource per categoria. Il protocollo non impone né URI globali né ricerca.

Dove continuare

Le tre primitive sono descritte in che cos'è MCP; lo schema dei tool è in progettare un tool MCP; il confronto con le API REST è in MCP vs REST. Il caso dei template di messaggio è in prompt template in MCP.

Domande frequenti

Qual è la differenza pratica tra tool e resource?

Il tool riceve argomenti e il modello decide quando chiamarlo; la resource ha un URI e la legge il client su richiesta o all'avvio. Il primo è un'azione, la seconda un documento.

Le resource si possono cercare?

No. Il protocollo prevede elenco e lettura per URI, non una query. Per una ricerca serve un tool, come search_components nel catalogo EneUI.

Quante resource espone EneUI?

Quattro, una per design system: minimal-dark, minimal-light, corporate-blue e warm-editorial, tutte in Markdown sotto lo schema eneui://design/.

Un client deve supportare le resource?

No. La capacità è opzionale: un client che non le dichiara usa i tool e riceve gli stessi token tramite get_design_system.

Cosa succede con un URI sconosciuto?

Il server risponde con errore -32602 e il messaggio «unknown resource» seguito dall'URI. Non restituisce contenuto vuoto né un 404 HTTP.