Skip to main content

Cos’è MCP

Model Context Protocol (MCP) è la specifica che permette ai client AI (Claude, Cursor, GitHub Copilot ecc.) e alle applicazioni di comunicare tramite un protocollo standardizzato. Implementando un server MCP, gli agenti AI possono accedere ai dati della tua applicazione Laravel ed eseguire azioni.
Laravel MCP è il pacchetto ufficiale aggiunto in Laravel 13. È distribuito come laravel/mcp e fornisce tutto ciò che serve per costruire un server MCP.
Un server MCP può offrire principalmente tre tipi di funzionalità.

Installazione

Installa il pacchetto tramite Composer.
Dopo l’installazione, esegui il comando Artisan vendor:publish per generare il file routes/ai.php.
Il comando crea routes/ai.php, dove registrerai i server MCP.

Creare un server

Genera la classe server con il comando Artisan make:mcp-server.
La classe viene generata in app/Mcp/Servers.

Registrare il server

Dopo aver creato il server, registralo in routes/ai.php. Ci sono due modalità: server Web e server locale.

Server Web

Il server Web è accessibile tramite richieste HTTP POST. Ideale per client AI remoti o integrazioni web-based.
Puoi applicare middleware come per le route normali.

Server locale

Il server locale funziona come comando Artisan. Si usa per integrarsi con client AI locali come Claude Desktop.
Il server locale viene di solito avviato automaticamente dal client MCP. Non devi eseguire manualmente il comando Artisan mcp:start.

Tool

I tool sono funzioni invocabili dal client AI. Puoi implementare recupero dati, integrazione con API esterne, operazioni sul database ecc.

Creare un tool

Genera la classe tool con il comando Artisan make:mcp-tool.
Registra il tool creato nella proprietà $tools del server.
Esempio di implementazione di base.

Nome e descrizione del tool

Dal nome della classe vengono ricavati automaticamente nome e titolo di default. CurrentWeatherTool diventa current-weather come nome e Current Weather Tool come titolo. Puoi personalizzarli con gli attributi Name e Title.
La descrizione (Description) del tool non viene generata automaticamente. È indispensabile affinché il modello capisca come usare il tool: forniscine sempre una significativa.

Schema di input

Definisci lo schema dei parametri di input nel metodo schema. Con il JSON schema builder di Laravel puoi indicare tipi e vincoli.

Schema di output

Con outputSchema puoi definire la struttura della risposta, rendendola più facile da analizzare per il client AI.

Validazione

All’interno di handle puoi usare la validazione standard di Laravel.
In caso di errore di validazione, il client AI riproverà usando il messaggio di errore come indicazione. Fornisci messaggi specifici e azionabili.

Dependency injection

I tool sono risolti attraverso il service container di Laravel, quindi puoi usare hint di tipo nel costruttore o in handle.

Annotazioni

Aggiungendo annotazioni al tool, comunichi al client AI informazioni supplementari sul suo comportamento.
Le annotazioni disponibili sono:

Registrazione condizionale

Implementando shouldRegister puoi registrare condizionalmente il tool a runtime.
Restituendo false, il tool non sarà visibile al client AI.

Risposta

Un tool deve restituire un’istanza di Laravel\Mcp\Response.
Restituisce dati strutturati facili da analizzare per il client AI.
Per elaborazioni lunghe, invia aggiornamenti in tempo reale.

Prompt

I prompt sono template riutilizzabili. Ti permettono di offrire in forma standardizzata query “boilerplate” che il client AI usa quando dialoga con il language model.

Creare un prompt

Registralo nella proprietà $prompts del server.

Argomenti del prompt

Definisci i parametri nel metodo arguments.

Validazione

Gli argomenti del prompt vengono validati automaticamente in base alla definizione, ma puoi applicare regole più complesse. Laravel MCP si integra pienamente con la validazione di Laravel. Puoi validare gli argomenti dentro handle.
In caso di errore di validazione, il client AI riprova usando il messaggio. Fornisci messaggi specifici e azionabili.

Dependency injection

I prompt sono risolti dal service container di Laravel, quindi puoi usare hint di tipo nel costruttore o in handle.
Anche handle accetta type hint, risolti automaticamente dal service container.

Registrazione condizionale

Implementa shouldRegister per registrare il prompt condizionalmente a runtime.
Restituendo false, il prompt non è più visibile né invocabile dal client AI.

Risposta del prompt

In handle puoi restituire messaggi utente e messaggi assistente. Con asAssistant() marchi il messaggio come proveniente dall’assistente.

Risorse

Le risorse sono dati e informazioni che il client AI può leggere come contesto. Documentazione, dati di configurazione, dati dinamici: informazioni che migliorano la qualità delle risposte dell’AI.

Creare una risorsa

Registrala nella proprietà $resources del server.

URI e MIME type

Per default l’URI viene generato dal nome della classe (es. weather://resources/weather-guidelines). Puoi personalizzarlo con gli attributi Uri e MimeType.

Template di risorse

Per definire risorse dinamiche con variabili nell’URI, implementa l’interfaccia HasUriTemplate.
Le variabili dall’URI vengono passate automaticamente nella richiesta e le recuperi con get.

Richiesta della risorsa

A differenza di tool e prompt, le risorse non definiscono schema o argomenti di input. Tuttavia, in handle puoi accedere alle informazioni della richiesta tramite l’oggetto request.

Dependency injection nelle risorse

Anche le risorse sono risolte dal service container, quindi puoi usare hint di tipo in costruttore o handle.
Anche handle accetta type hint, risolti automaticamente.

Annotazioni delle risorse

Le risorse possono avere annotazioni come audience, priorità e data di ultima modifica.

Registrazione condizionale delle risorse

Implementa shouldRegister per registrare condizionalmente la risorsa a runtime.
Restituendo false, la risorsa non è visibile né accessibile dal client AI.

Risposta della risorsa

La risorsa deve restituire un’istanza di Laravel\Mcp\Response. Per contenuti testuali usa text.
Con resourceLink restituisci un puntatore URI a una risorsa; a differenza della risorsa embedded, il client la recupera autonomamente.
Puoi passare anche una classe o istanza di risorsa già registrata; URI, nome, titolo, descrizione e MIME type vengono ereditati automaticamente.

Risposta blob

Per contenuti binari usa blob. Il MIME type si imposta con l’attributo #[MimeType] della risorsa.

Risposta di errore

Per segnalare un errore usa error.

App

Laravel MCP supporta le MCP Apps. È un’estensione del Model Context Protocol che permette a un tool di far renderizzare un’applicazione HTML interattiva dentro un iframe sandbox nel client host che la supporta. Così puoi costruire dashboard, form, visualizzazioni ed esperienze ricche che vanno oltre la semplice risposta testuale. Una MCP App si compone di due parti che lavorano insieme.
  • App resource — restituisce l’HTML autosufficiente dell’applicazione.
  • Tool — con l’attributo #[RendersApp] viene collegato all’app resource. Quando il tool viene invocato, l’host recupera e renderizza la risorsa collegata.

Creare un’app resource

Puoi generare un’app resource con il comando Artisan make:mcp-app-resource.
Il comando crea due file: la classe PHP in app/Mcp/Resources e la view Blade in resources/views/mcp. Il nome della view è dedotto dal nome della classe; ad esempio WeatherDashboardApp è mappato a mcp.weather-dashboard-app.
AppResource estende Resource e imposta automaticamente lo schema URI ui:// e il MIME type text/html;profile=mcp-app richiesti dalla specifica MCP Apps. Come le altre risorse, va registrata nell’array $resources del server. La view Blade generata usa il componente <x-mcp::app>. Il componente renderizza un documento HTML completo con l’SDK MCP lato client incluso.
La funzione globale createMcpApp è fornita dall’SDK bundled. Gestisce la connessione dell’iframe al server, l’applicazione del tema host, ed espone helper come callServerTool, sendMessage, openLink e le callback degli eventi. Per l’API client completa consulta la specifica MCP Apps.

Renderizzare un’app da un tool

Per mostrare un’app resource, colleghi il tool con l’attributo #[RendersApp]. Quando il tool viene invocato, Laravel MCP include l’URI della risorsa nei metadati del tool, in modo che l’host possa renderizzarla nell’iframe sandbox.
Quando registri un AppResource, Laravel MCP annuncia automaticamente la capability io.modelcontextprotocol/ui. Non serve altra configurazione del server.

Visibilità dei tool app

Ogni tool #[RendersApp] può limitare i propri invocatori con l’argomento visibility. È utile per rendere invisibili al modello i tool privati usati dalla UI per caricare/aggiornare dati.
L’enum Visibility ha due casi, Model e App; il default è entrambi. Usa [Visibility::App] per azioni di backend chiamate direttamente dalla UI e [Visibility::Model] per rendere il tool inaccessibile alla UI.

Configurazione dell’app

Con l’attributo #[AppMeta] sulla risorsa configuri la Content Security Policy dell’iframe, i permessi del browser e gli script delle librerie inclusi nel <head> della view.
L’enum Library include preconfigurati gli script CDN delle librerie frontend comuni come Library::Tailwind e Library::Alpine; le origini CDN vengono unite automaticamente al CSP. L’enum Permission copre permessi del browser come Camera, Microphone, Geolocation, ClipboardWrite.
Se serve una configurazione dinamica, usa i fluent builder AppMeta, Csp e Permissions nel namespace Laravel\Mcp\Server\Ui sovrascrivendo il metodo appMeta della risorsa.

Sviluppo di app con Boost

Laravel MCP include una skill reference Boost dedicata alla costruzione di MCP Apps. Se hai installato Laravel Boost, l’agente di coding AI può richiamare la skill mcp-development per generare automaticamente app resource, view Blade e tool collegati. Per il reference completo del protocollo (API client, schemi ecc.) consulta la documentazione ufficiale MCP Apps.

Metadata

Puoi allegare il campo _meta della specifica MCP alle risposte di tool, risorse e prompt.
Per allegare metadata all’intero envelope della risposta usa Response::make.
Per associare metadata alle classi stesse (tool/risorse/prompt), definisci la proprietà $meta.

Icone

I client MCP possono mostrare le icone del server e delle sue primitive. Con l’attributo Icon puoi dichiarare icone su server, tool, risorse e prompt.
L’attributo Icon è ripetibile, quindi puoi dichiarare più icone per fornire varianti in dimensione o per tema chiaro/scuro. In alternativa, puoi definire le icone programmaticamente sovrascrivendo il metodo icons. Utile quando l’icona dipende da condizioni a runtime.
Le icone definite dagli attributi e dal metodo icons vengono unite automaticamente. I path vengono risolti così:
  • Path con schemi URI come https: o data: vengono usati così come sono.
  • I path relativi vengono risolti in URL tramite l’helper asset di Laravel.

Autenticazione

I server Web possono essere autenticati con i normali middleware di Laravel.

Sanctum

Autenticazione a token con Laravel Sanctum. Il client MCP invia l’header Authorization: Bearer <token>.

OAuth 2.1

Autenticazione OAuth con Laravel Passport. Adatta quando serve maggiore robustezza di sicurezza.
Se usi OAuth, pubblica la view di autorizzazione di Passport e configurala nel service provider.

Autorizzazione

Con $request->user() ottieni l’utente autenticato ed effettui i controlli di autorizzazione dentro tool o risorse.

Client MCP

Laravel MCP non offre solo la costruzione di server, ma anche un client per connettersi ad altri server MCP. Con il client puoi scoprire e invocare i tool esposti da server MCP esterni. È particolarmente utile per fornire ad agenti AI le funzionalità di un server MCP esterno.

Connessione a un server

Per server MCP accessibili via HTTP usa Client::web passando l’URL del server.
Per un server MCP locale avviato come comando, usa Client::local con comando e argomenti.
Il client fa lazy connect: apre effettivamente la connessione quando fai la prima chiamata (list o call di tool). Per gestire manualmente la connessione ci sono connect, connected, ping, disconnect.
Con withTimeout personalizzi il timeout delle richieste.

Client con nome

Invece di costruire il client ogni volta, puoi registrare client con nome riutilizzabili. Di solito nel metodo boot di un service provider, tramite la facade Mcp.
Dopo la registrazione risolvi il client per nome.
Un client con nome è risolto una sola volta per richiesta e viene disconnesso automaticamente a fine ciclo.

Autenticazione del client

Per connetterti a un server Web MCP protetto da Bearer token usa withToken. Puoi passare una stringa o una closure per la risoluzione lazy.
Per server protetti con OAuth 2.1 usa withOAuth.
Se il server MCP supporta la registrazione dinamica del client, puoi omettere clientId e clientSecret: il client si registra da solo.
Poi nel file routes/ai.php registri le route OAuth del client con nome tramite oAuthRoutesFor. La closure passata riceve nome del client e TokenSet dopo lo scambio del codice di autorizzazione con l’access token.
Vengono così registrate due route con nome: la route di connect (mcp.oauth.{client}.connect) che reindirizza l’utente al server di autorizzazione, e la route di callback (mcp.oauth.{client}.callback) che scambia il codice e chiama l’handler. Entrambe usano il gruppo di middleware web (sovrascrivibile con l’argomento middleware). Per avviare il flusso di autorizzazione, reindirizza l’utente alla route di connect.

Tool

Con tools ottieni i tool esposti dal server MCP, come collection con il nome come chiave.
Il client gestisce automaticamente la paginazione recuperando tutti i tool. Con l’argomento limit limiti il numero.
Per invocare un tool usa callTool con nome e array di argomenti. Ottieni la risposta dall’istanza ToolResult.
Puoi anche invocare direttamente dall’istanza tool ottenuta dall’elenco.
Se stai costruendo agenti con Laravel AI SDK, puoi passare i tool del client MCP direttamente all’agente, così il modello può invocarli mentre risponde al prompt. Per i dettagli vedi la sezione tool MCP dell’AI SDK.

Prompt

Con prompts ottieni i prompt esposti dal server, come collection con il nome come chiave.
Il client gestisce la paginazione automaticamente; con limit puoi limitare.
Per ottenere un prompt usa getPrompt con nome e array di argomenti. Il PromptResult restituito contiene i messaggi generati.

Risorse

Con resources ottieni le risorse esposte dal server, come collection con l’URI come chiave.
Il client gestisce la paginazione automaticamente; con limit puoi limitare.
Per leggere una risorsa usa readResource con l’URI. Il ResourceReadResult restituito espone il contenuto.

Test

MCP Inspector

Per verificare il comportamento del server MCP usa il tool interattivo di debug “MCP Inspector”.
L’esecuzione avvia MCP Inspector e ti permette di copiare la configurazione client. Se hai configurato middleware di autenticazione, connettiti includendo l’header Authorization.

Unit test

Puoi scrivere unit test per tool, risorse e prompt.
Prompt e risorse si testano allo stesso modo.
Per eseguire come utente autenticato usa actingAs.
Le principali asserzioni:
Per verificare presenza/assenza di errori usa assertHasErrors / assertHasNoErrors.
Puoi verificare nome, titolo e descrizione di tool, risorse e prompt.
Per verificare le notification di una risposta streaming usa assertSentNotification e assertNotificationCount.
Per fare debug del contenuto della risposta usa dd o dump.
Ultima modifica il 2 agosto 2026