Skip to main content

Wat is MCP

Het Model Context Protocol (MCP) is een specificatie waarmee AI-clients (Claude, Cursor, GitHub Copilot enz.) en applicaties via een gestandaardiseerd protocol communiceren. Door een MCP-server te implementeren kunnen AI-agents toegang krijgen tot de data van je Laravel-applicatie en acties uitvoeren.
Laravel MCP is een officieel pakket dat is toegevoegd in Laravel 13. Het wordt geleverd als laravel/mcp en biedt alle functionaliteit die nodig is om MCP-servers te bouwen.
Een MCP-server kan hoofdzakelijk drie soorten functionaliteit aanbieden.

Installatie

Installeer het pakket met Composer.
Voer na de installatie het Artisan-commando vendor:publish uit om het bestand routes/ai.php te genereren.
Dit commando maakt het bestand routes/ai.php aan. Hier registreer je je MCP-servers.

Een server maken

Genereer een serverklasse met het Artisan-commando make:mcp-server.
De serverklasse wordt gegenereerd in de directory app/Mcp/Servers.

De server registreren

Heb je een server gemaakt, dan registreer je die in routes/ai.php. Er zijn twee manieren van registreren: als webserver en als lokale server.

Webserver

Een webserver is bereikbaar via HTTP POST-requests. Ideaal voor externe AI-clients en webgebaseerde integraties.
Net als bij gewone routes kun je middleware toepassen.

Lokale server

Een lokale server draait als Artisan-commando. Je gebruikt dit voor integratie met lokale AI-clients zoals Claude Desktop.
Een lokale server wordt normaal gesproken automatisch gestart door de MCP-client. Je hoeft het Artisan-commando mcp:start niet handmatig uit te voeren.

Tools

Tools zijn functies die een AI-client kan aanroepen. Je kunt er onder meer het ophalen van data, integratie met externe API’s en databasebewerkingen mee implementeren.

Een tool maken

Genereer een toolklasse met het Artisan-commando make:mcp-tool.
Registreer de gemaakte tool in de property $tools van de server.
Een implementatievoorbeeld van een eenvoudige toolklasse:

Naam en beschrijving van de tool

Uit de klassenaam worden automatisch een standaardnaam en -titel gegenereerd. Bij CurrentWeatherTool is de naam current-weather en de titel Current Weather Tool. Met de attributen Name en Title pas je die aan.
De beschrijving van een tool (Description) wordt niet automatisch gegenereerd. Die is essentieel zodat het AI-model begrijpt hoe de tool moet worden gebruikt; stel dus altijd een betekenisvolle beschrijving in.

Invoerschema

Met de methode schema definieer je het schema van de invoerparameters. Via de JSON-schemabuilder van Laravel geef je types en beperkingen op.

Uitvoerschema

Met de methode outputSchema definieer je de structuur van de response. Dat maakt het voor AI-clients makkelijker om de response te parsen.

Validatie

Binnen de handle-methode kun je de standaard validatiefunctionaliteit van Laravel gebruiken.
Bij een validatiefout gebruikt de AI-client de foutmelding als leidraad voor een nieuwe poging. Zorg dus voor concrete en uitvoerbare foutmeldingen.

Dependency injection

Omdat tools worden geresolved via de servicecontainer van Laravel, kun je afhankelijkheden type-hinten in de constructor of de handle-methode.

Annotaties

Door annotaties aan een tool toe te voegen geef je AI-clients extra informatie over het gedrag van de tool.
De beschikbare annotaties zijn als volgt.

Voorwaardelijke registratie

Door de methode shouldRegister te implementeren registreer je tools voorwaardelijk tijdens runtime.
Geef je false terug, dan is de tool onzichtbaar voor de AI-client.

Responses

Tools moeten een instantie van Laravel\Mcp\Response teruggeven.
Geeft gestructureerde data terug die een AI-client makkelijk kan parsen.
Verstuurt bij langdurige verwerking de voortgang in realtime.

Prompts

Prompts zijn herbruikbare prompttemplates. Je kunt gestandaardiseerde varianten aanbieden van de terugkerende query’s die AI-clients gebruiken in hun interactie met taalmodellen.

Een prompt maken

Registreer de prompt in de property $prompts van de server.

Promptargumenten

Met de methode arguments definieer je de parameters van de prompt.

Validatie

Promptargumenten worden automatisch gevalideerd op basis van hun definitie, maar je kunt ook complexere validatieregels toepassen. Laravel MCP werkt naadloos samen met de validatiefunctionaliteit van Laravel. Je valideert de argumenten binnen de handle-methode van de prompt.
Bij een validatiefout gebruikt de AI-client de foutmelding als leidraad voor een nieuwe poging. Zorg voor concrete en uitvoerbare meldingen.

Dependency injection

Omdat prompts worden geresolved via de servicecontainer van Laravel, kun je afhankelijkheden type-hinten in de constructor of de handle-methode.
Ook in de handle-methode kun je type-hinten; de servicecontainer resolvet en injecteert automatisch.

Voorwaardelijke registratie

Door de methode shouldRegister te implementeren registreer je prompts voorwaardelijk tijdens runtime.
Geef je false terug, dan is de prompt onzichtbaar voor de AI-client en kan hij ook niet worden aangeroepen.

Promptresponses

De handle-methode van een prompt kan gebruikers- en assistentberichten teruggeven. Met asAssistant() behandel je een bericht als afkomstig van de assistent.

Resources

Resources zijn data en informatie die een AI-client als context kan inlezen. Je kunt er informatie mee aanbieden die de kwaliteit van AI-antwoorden verbetert, zoals documentatie, configuratie-informatie en dynamische data.

Een resource maken

Registreer de resource in de property $resources van de server.

URI en MIME-type

Standaard wordt de URI automatisch gegenereerd uit de klassenaam (bijv. weather://resources/weather-guidelines). Met de attributen Uri en MimeType pas je die aan.

Resourcetemplates

Om een dynamische resource met URI-variabelen te definiëren implementeer je de interface HasUriTemplate.
Variabelen uit de URI worden automatisch in het request opgenomen en zijn op te halen met de get-methode.

Resourcerequests

Anders dan bij tools en prompts kun je bij resources geen invoerschema of argumenten definiëren. Binnen de handle-methode heb je echter via het requestobject wel toegang tot requestinformatie.

Dependency injection bij resources

Omdat resources worden geresolved via de servicecontainer van Laravel, kun je afhankelijkheden type-hinten in de constructor of de handle-methode.
Ook in de handle-methode kun je type-hinten; de servicecontainer resolvet en injecteert automatisch.

Resource-annotaties

Aan resources kun je annotaties toevoegen voor onder meer doelgroep, prioriteit en laatste wijzigingsdatum.

Voorwaardelijke registratie van resources

Door de methode shouldRegister te implementeren registreer je resources voorwaardelijk tijdens runtime.
Geef je false terug, dan is de resource onzichtbaar voor de AI-client en ook niet toegankelijk.

Resourceresponses

Resources moeten een instantie van Laravel\Mcp\Response teruggeven. Voor tekstuele inhoud gebruik je de methode text.
Met de methode resourceLink geef je een resourcelink terug. Anders dan een ingebedde resource geef je hiermee een URI-pointer terug die de AI-client zelfstandig ophaalt.
Je kunt ook een geregistreerde resourceklasse of -instantie doorgeven. De URI, naam, titel, beschrijving en het MIME-type worden dan automatisch overgenomen.

Blob-responses

Om binaire inhoud terug te geven gebruik je de methode blob. Het MIME-type stel je in via het #[MimeType]-attribuut van de resource.

Foutresponses

Om een fout aan te geven gebruik je de methode error.

Apps

Laravel MCP ondersteunt MCP Apps. Dit is een uitbreiding van het Model Context Protocol waarmee tools interactieve HTML-applicaties kunnen renderen in een sandbox-iframe binnen ondersteunende hosts. Zo bouw je dashboards, formulieren, visualisaties en andere rijke ervaringen die verder gaan dan platte-tekstresponses. Een MCP-app bestaat uit twee samenwerkende onderdelen:
  • App-resource — geeft de zelfstandige HTML van de applicatie terug.
  • Tool — wordt via het attribuut #[RendersApp] gekoppeld aan de app-resource. Wanneer de tool wordt aangeroepen, haalt de host de gekoppelde resource op en rendert die.

Een app-resource maken

Met het Artisan-commando make:mcp-app-resource maak je een app-resource aan.
Dit commando maakt twee bestanden aan: een PHP-klasse in app/Mcp/Resources en een Blade-view in resources/views/mcp. De viewnaam wordt automatisch afgeleid uit de klassenaam. WeatherDashboardApp wordt bijvoorbeeld gemapt naar mcp.weather-dashboard-app.
AppResource erft over van de basisklasse Resource en stelt automatisch het ui://-URI-schema en het MIME-type text/html;profile=mcp-app in die de MCP Apps-specificatie vereist. Net als andere resources moet je de klasse registreren in de $resources-array van de server. De gegenereerde Blade-view gebruikt de component <x-mcp::app>. Deze component rendert een compleet HTML-document met de client-side MCP SDK gebundeld.
De globale functie createMcpApp wordt geleverd door de gebundelde SDK. Die regelt het verbinden van het iframe met de server, het toepassen van het host-thema en het beschikbaar stellen van helpers zoals callServerTool, sendMessage en openLink, plus eventcallbacks. Zie de MCP Apps-specificatie voor de volledige client-side API.

Een app renderen vanuit een tool

Om een app-resource weer te geven koppel je die met het attribuut #[RendersApp] aan een tool. Wanneer de tool wordt aangeroepen, neemt Laravel MCP de URI van de resource op in de metadata van de tool, zodat de host de app in een sandbox-iframe kan renderen.
Wanneer een AppResource is geregistreerd, adverteert Laravel MCP automatisch de capability io.modelcontextprotocol/ui. Extra serverconfiguratie is niet nodig.

Zichtbaarheid van app-tools

Elke #[RendersApp]-tool kan met het argument visibility beperken door wie hij kan worden aangeroepen. Dit is handig voor private, app-specifieke tools die de UI aanroept om data te laden of bij te werken, en die je voor het model verborgen wilt houden.
De Visibility-enum heeft twee cases, Model en App; standaard gelden beide. Gebruik [Visibility::App] voor backend-acties die de UI direct aanroept, en [Visibility::Model] om de tool onbereikbaar te maken vanuit de UI.

App-configuratie

Met het #[AppMeta]-attribuut van een app-resource stel je de Content Security Policy van het iframe, de browserrechten en de libraryscripts voor de <head> van de view in.
De Library-enum bevat vooraf geconfigureerde CDN-scripts voor gangbare frontend-libraries zoals Library::Tailwind en Library::Alpine; de CDN-origins worden automatisch samengevoegd met de CSP. De Permission-enum dekt browserrechten zoals Camera, Microphone, Geolocation en ClipboardWrite.
Heb je dynamische configuratie nodig, override dan de appMeta-methode van de resource met de fluente builders AppMeta, Csp en Permissions uit de namespace Laravel\Mcp\Server\Ui.

App-ontwikkeling met Boost

Laravel MCP bevat een speciale Boost-skillreferentie voor het bouwen van MCP Apps. Is Laravel Boost geïnstalleerd, dan kan een AI-codeeragent de skill mcp-development aanroepen en automatisch app-resources, Blade-views en gekoppelde tools genereren. Voor de volledige protocolreferentie (inclusief details over de client-side API en schema’s) raadpleeg je de officiële MCP Apps-documentatie.

Metadata

Je kunt het _meta-veld uit de MCP-specificatie toevoegen aan responses van tools, resources en prompts.
Wil je metadata toevoegen aan de hele response-envelope, gebruik dan Response::make.
Om metadata toe te voegen aan de tool-, resource- of promptklasse zelf, definieer je de property $meta.

Iconen

MCP-clients kunnen iconen tonen voor de server en zijn primitieven. Met het Icon-attribuut declareer je iconen op servers, tools, resources en prompts.
Het Icon-attribuut is herhaalbaar, zodat je meerdere iconen kunt declareren voor verschillende formaten en licht/donker-themavarianten. Als alternatief kun je de icons-methode overriden om iconen programmatisch te definiëren. Dat is handig wanneer de iconen afhangen van runtime-omstandigheden.
Iconen gedefinieerd via attributen en via de icons-methode worden automatisch samengevoegd. Iconpaden worden als volgt opgelost:
  • Paden met een URI-schema zoals https: of data: worden ongewijzigd gebruikt.
  • Relatieve paden worden met de asset-helper van Laravel omgezet naar een URL.

Authenticatie

Webservers kun je authenticeren met de standaard middleware van Laravel.

Sanctum

Tokenauthenticatie met Laravel Sanctum. De MCP-client stuurt de header Authorization: Bearer <token>.

OAuth 2.1

OAuth-authenticatie met Laravel Passport. Geschikt wanneer je robuustere beveiliging nodig hebt.
Gebruik je OAuth-authenticatie, publiceer dan de autorisatieviews van Passport en configureer ze in een serviceprovider.

Autorisatie

Met $request->user() haal je de geauthenticeerde gebruiker op en voer je autorisatiechecks uit binnen tools en resources.

MCP-client

Laravel MCP biedt niet alleen het bouwen van servers, maar ook een client om verbinding te maken met andere MCP-servers. Met de client kun je tools ontdekken en aanroepen die externe MCP-servers publiceren. Dit is vooral nuttig om de functionaliteit van externe MCP-servers beschikbaar te stellen aan AI-agents.

Verbinden met een server

Voor MCP-servers die via HTTP bereikbaar zijn gebruik je de methode Client::web met de URL van de server.
Voor lokale MCP-servers die als commando starten gebruik je de methode Client::local met het commando en de argumenten.
De client maakt lazy verbinding: de verbinding wordt automatisch opgezet wanneer voor het eerst tools worden opgesomd of aangeroepen. Wil je de verbinding handmatig beheren, gebruik dan de methoden connect, connected, ping en disconnect.
Met de methode withTimeout pas je de requesttime-out aan.

Benoemde clients

In plaats van elke keer een client op te bouwen, kun je herbruikbare benoemde clients registreren. Meestal doe je dat via de Mcp-facade in de boot-methode van een serviceprovider.
Na registratie resolve je de client op naam.
Benoemde clients worden per request slechts één keer geresolved en aan het einde van de requestlifecycle automatisch verbroken.

Clientauthenticatie

Om verbinding te maken met een web-MCP-server die met een Bearer-token is beschermd, gebruik je de methode withToken. Je kunt een tokenstring doorgeven of een closure die het token lazy resolvet.
Voor servers die zijn beschermd met OAuth 2.1 gebruik je de methode withOAuth.
Ondersteunt de MCP-server dynamische clientregistratie, dan kun je clientId en clientSecret weglaten. De client registreert zich dan automatisch.
Registreer vervolgens in het bestand routes/ai.php de OAuth-routes voor de benoemde client met de methode oAuthRoutesFor. De doorgegeven closure ontvangt de clientnaam en een TokenSet nadat de autorisatiecode is ingewisseld voor een access token.
Hiermee worden twee benoemde routes geregistreerd: een connect-route (mcp.oauth.{client}.connect) die de gebruiker naar de autorisatieserver redirect, en een callback-route (mcp.oauth.{client}.callback) die de autorisatiecode inwisselt en de handler aanroept. Beide gebruiken de web-middlewaregroep (te overschrijven via het argument middleware). Om de autorisatieflow te starten redirect je de gebruiker naar de connect-route.

Tools

Met de methode tools haal je de tools op die de MCP-server publiceert. Ze worden teruggegeven als een collection met de naam als sleutel.
De client handelt paginatie automatisch af en haalt alle tools op. Met het argument limit beperk je het aantal.
Om een tool aan te roepen gebruik je de methode callTool met de toolnaam en een array met argumenten. Via de teruggegeven ToolResult-instantie haal je de response op.
Je kunt ook direct aanroepen vanaf een opgesomde toolinstantie.
Bouw je agents met de Laravel AI SDK, dan kun je de tools van de MCP-client direct aan een agent doorgeven, zodat het model ze kan aanroepen tijdens het beantwoorden van een prompt. Zie de sectie MCP-tools van de AI SDK voor details.

Prompts

Met de methode prompts haal je de prompts op die de MCP-server publiceert. Ze worden teruggegeven als een collection met de naam als sleutel.
De client handelt paginatie automatisch af en haalt alle prompts op. Met het argument limit beperk je het aantal.
Om een prompt op te halen gebruik je de methode getPrompt met de promptnaam en een array met argumenten. Via de teruggegeven PromptResult-instantie haal je de gegenereerde berichten op.

Resources

Met de methode resources haal je de resources op die de MCP-server publiceert. Ze worden teruggegeven als een collection met de URI als sleutel.
De client handelt paginatie automatisch af en haalt alle resources op. Met het argument limit beperk je het aantal.
Om een resource in te lezen gebruik je de methode readResource met de URI van de resource. Via de teruggegeven ResourceReadResult-instantie haal je de inhoud op.

Testen

MCP Inspector

Om de werking van je MCP-server te controleren gebruik je de interactieve debugtool “MCP Inspector”.
Als je het commando uitvoert start de MCP Inspector en kun je de clientconfiguratie kopiëren. Heb je authenticatiemiddleware ingesteld, verbind dan inclusief de Authorization-header.

Unit tests

Je kunt unit tests schrijven voor tools, resources en prompts.
Prompts en resources test je op dezelfde manier.
Om als geauthenticeerde gebruiker te draaien gebruik je actingAs.
De belangrijkste assertion-methoden zijn als volgt.
Om te verifiëren of er fouten zijn gebruik je assertHasErrors / assertHasNoErrors.
Je kunt de naam, titel en beschrijving van tools, resources en prompts verifiëren.
Om de notificaties van een streamingresponse te verifiëren gebruik je assertSentNotification en assertNotificationCount.
Om de inhoud van een response te debuggen gebruik je de methoden dd of dump.
Laatst gewijzigd op 6 september 2026