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.Installazione
Installa il pacchetto tramite Composer.vendor:publish per generare il file routes/ai.php.
routes/ai.php, dove registrerai i server MCP.
Creare un server
Genera la classe server con il comando Artisanmake:mcp-server.
app/Mcp/Servers.
Registrare il server
Dopo aver creato il server, registralo inroutes/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.Server locale
Il server locale funziona come comando Artisan. Si usa per integrarsi con client AI locali come Claude Desktop.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 Artisanmake:mcp-tool.
$tools del server.
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.
Schema di input
Definisci lo schema dei parametri di input nel metodoschema. Con il JSON schema builder di Laravel puoi indicare tipi e vincoli.
Schema di output
ConoutputSchema puoi definire la struttura della risposta, rendendola più facile da analizzare per il client AI.
Validazione
All’interno dihandle puoi usare la validazione standard di Laravel.
Dependency injection
I tool sono risolti attraverso il service container di Laravel, quindi puoi usare hint di tipo nel costruttore o inhandle.
Annotazioni
Aggiungendo annotazioni al tool, comunichi al client AI informazioni supplementari sul suo comportamento.Registrazione condizionale
ImplementandoshouldRegister puoi registrare condizionalmente il tool a runtime.
false, il tool non sarà visibile al client AI.
Risposta
Un tool deve restituire un’istanza diLaravel\Mcp\Response.
Risposta testuale
Risposta testuale
Risposta di errore
Risposta di errore
Risposta immagine / audio
Risposta immagine / audio
Più contenuti nella risposta
Più contenuti nella risposta
Risposta strutturata
Risposta strutturata
Restituisce dati strutturati facili da analizzare per il client AI.
Risposta in streaming
Risposta in streaming
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
$prompts del server.
Argomenti del prompt
Definisci i parametri nel metodoarguments.
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 dentrohandle.
Dependency injection
I prompt sono risolti dal service container di Laravel, quindi puoi usare hint di tipo nel costruttore o inhandle.
handle accetta type hint, risolti automaticamente dal service container.
Registrazione condizionale
ImplementashouldRegister per registrare il prompt condizionalmente a runtime.
false, il prompt non è più visibile né invocabile dal client AI.
Risposta del prompt
Inhandle 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
$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’interfacciaHasUriTemplate.
get.
Richiesta della risorsa
A differenza di tool e prompt, le risorse non definiscono schema o argomenti di input. Tuttavia, inhandle 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 ohandle.
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
ImplementashouldRegister per registrare condizionalmente la risorsa a runtime.
false, la risorsa non è visibile né accessibile dal client AI.
Risposta della risorsa
La risorsa deve restituire un’istanza diLaravel\Mcp\Response.
Per contenuti testuali usa text.
Risposta con link a risorsa
ConresourceLink restituisci un puntatore URI a una risorsa; a differenza della risorsa embedded, il client la recupera autonomamente.
Risposta blob
Per contenuti binari usablob. Il MIME type si imposta con l’attributo #[MimeType] della risorsa.
Risposta di errore
Per segnalare un errore usaerror.
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 Artisanmake:mcp-app-resource.
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.
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.
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.
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.
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 skillmcp-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.
Response::make.
$meta.
Icone
I client MCP possono mostrare le icone del server e delle sue primitive. Con l’attributoIcon puoi dichiarare icone su server, tool, risorse e prompt.
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.
icons vengono unite automaticamente. I path vengono risolti così:
- Path con schemi URI come
https:odata:vengono usati così come sono. - I path relativi vengono risolti in URL tramite l’helper
assetdi 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’headerAuthorization: Bearer <token>.
OAuth 2.1
Autenticazione OAuth con Laravel Passport. Adatta quando serve maggiore robustezza di sicurezza.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 usaClient::web passando l’URL del server.
Client::local con comando e argomenti.
connect, connected, ping, disconnect.
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 metodoboot di un service provider, tramite la facade Mcp.
Autenticazione del client
Per connetterti a un server Web MCP protetto da Bearer token usawithToken. Puoi passare una stringa o una closure per la risoluzione lazy.
withOAuth.
Se il server MCP supporta la registrazione dinamica del client, puoi omettere
clientId e clientSecret: il client si registra da solo.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.
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
Contools ottieni i tool esposti dal server MCP, come collection con il nome come chiave.
limit limiti il numero.
callTool con nome e array di argomenti. Ottieni la risposta dall’istanza ToolResult.
Prompt
Conprompts ottieni i prompt esposti dal server, come collection con il nome come chiave.
limit puoi limitare.
getPrompt con nome e array di argomenti. Il PromptResult restituito contiene i messaggi generati.
Risorse
Conresources ottieni le risorse esposte dal server, come collection con l’URI come chiave.
limit puoi limitare.
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”.Unit test
Puoi scrivere unit test per tool, risorse e prompt.actingAs.
assertHasErrors / assertHasNoErrors.
assertSentNotification e assertNotificationCount.
dd o dump.