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.Installatie
Installeer het pakket met Composer.vendor:publish uit om het bestand routes/ai.php te genereren.
routes/ai.php aan. Hier registreer je je MCP-servers.
Een server maken
Genereer een serverklasse met het Artisan-commandomake:mcp-server.
app/Mcp/Servers.
De server registreren
Heb je een server gemaakt, dan registreer je die inroutes/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.Lokale server
Een lokale server draait als Artisan-commando. Je gebruikt dit voor integratie met lokale AI-clients zoals Claude Desktop.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-commandomake:mcp-tool.
$tools van de server.
Naam en beschrijving van de tool
Uit de klassenaam worden automatisch een standaardnaam en -titel gegenereerd. BijCurrentWeatherTool is de naam current-weather en de titel Current Weather Tool. Met de attributen Name en Title pas je die aan.
Invoerschema
Met de methodeschema definieer je het schema van de invoerparameters. Via de JSON-schemabuilder van Laravel geef je types en beperkingen op.
Uitvoerschema
Met de methodeoutputSchema definieer je de structuur van de response. Dat maakt het voor AI-clients makkelijker om de response te parsen.
Validatie
Binnen dehandle-methode kun je de standaard validatiefunctionaliteit van Laravel gebruiken.
Dependency injection
Omdat tools worden geresolved via de servicecontainer van Laravel, kun je afhankelijkheden type-hinten in de constructor of dehandle-methode.
Annotaties
Door annotaties aan een tool toe te voegen geef je AI-clients extra informatie over het gedrag van de tool.Voorwaardelijke registratie
Door de methodeshouldRegister te implementeren registreer je tools voorwaardelijk tijdens runtime.
false terug, dan is de tool onzichtbaar voor de AI-client.
Responses
Tools moeten een instantie vanLaravel\Mcp\Response teruggeven.
Tekstresponse
Tekstresponse
Foutresponse
Foutresponse
Afbeeldings- en audioresponse
Afbeeldings- en audioresponse
Response met meerdere inhoudsdelen
Response met meerdere inhoudsdelen
Gestructureerde response
Gestructureerde response
Geeft gestructureerde data terug die een AI-client makkelijk kan parsen.
Streamingresponse
Streamingresponse
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
$prompts van de server.
Promptargumenten
Met de methodearguments 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 dehandle-methode van de prompt.
Dependency injection
Omdat prompts worden geresolved via de servicecontainer van Laravel, kun je afhankelijkheden type-hinten in de constructor of dehandle-methode.
handle-methode kun je type-hinten; de servicecontainer resolvet en injecteert automatisch.
Voorwaardelijke registratie
Door de methodeshouldRegister te implementeren registreer je prompts voorwaardelijk tijdens runtime.
false terug, dan is de prompt onzichtbaar voor de AI-client en kan hij ook niet worden aangeroepen.
Promptresponses
Dehandle-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
$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 interfaceHasUriTemplate.
get-methode.
Resourcerequests
Anders dan bij tools en prompts kun je bij resources geen invoerschema of argumenten definiëren. Binnen dehandle-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 dehandle-methode.
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 methodeshouldRegister te implementeren registreer je resources voorwaardelijk tijdens runtime.
false terug, dan is de resource onzichtbaar voor de AI-client en ook niet toegankelijk.
Resourceresponses
Resources moeten een instantie vanLaravel\Mcp\Response teruggeven.
Voor tekstuele inhoud gebruik je de methode text.
Resourcelink-responses
Met de methoderesourceLink geef je een resourcelink terug. Anders dan een ingebedde resource geef je hiermee een URI-pointer terug die de AI-client zelfstandig ophaalt.
Blob-responses
Om binaire inhoud terug te geven gebruik je de methodeblob. Het MIME-type stel je in via het #[MimeType]-attribuut van de resource.
Foutresponses
Om een fout aan te geven gebruik je de methodeerror.
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-commandomake:mcp-app-resource maak je een app-resource aan.
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.
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.
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.
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.
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 skillmcp-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.
Response::make.
$meta.
Iconen
MCP-clients kunnen iconen tonen voor de server en zijn primitieven. Met hetIcon-attribuut declareer je iconen op servers, tools, resources en prompts.
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.
icons-methode worden automatisch samengevoegd. Iconpaden worden als volgt opgelost:
- Paden met een URI-schema zoals
https:ofdata: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 headerAuthorization: Bearer <token>.
OAuth 2.1
OAuth-authenticatie met Laravel Passport. Geschikt wanneer je robuustere beveiliging nodig hebt.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 methodeClient::web met de URL van de server.
Client::local met het commando en de argumenten.
connect, connected, ping en disconnect.
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 deMcp-facade in de boot-methode van een serviceprovider.
Clientauthenticatie
Om verbinding te maken met een web-MCP-server die met een Bearer-token is beschermd, gebruik je de methodewithToken. Je kunt een tokenstring doorgeven of een closure die het token lazy resolvet.
withOAuth.
Ondersteunt de MCP-server dynamische clientregistratie, dan kun je
clientId en clientSecret weglaten. De client registreert zich dan automatisch.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.
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 methodetools haal je de tools op die de MCP-server publiceert. Ze worden teruggegeven als een collection met de naam als sleutel.
limit beperk je het aantal.
callTool met de toolnaam en een array met argumenten. Via de teruggegeven ToolResult-instantie haal je de response op.
Prompts
Met de methodeprompts haal je de prompts op die de MCP-server publiceert. Ze worden teruggegeven als een collection met de naam als sleutel.
limit beperk je het aantal.
getPrompt met de promptnaam en een array met argumenten. Via de teruggegeven PromptResult-instantie haal je de gegenereerde berichten op.
Resources
Met de methoderesources haal je de resources op die de MCP-server publiceert. Ze worden teruggegeven als een collection met de URI als sleutel.
limit beperk je het aantal.
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”.Unit tests
Je kunt unit tests schrijven voor tools, resources en prompts.actingAs.
assertHasErrors / assertHasNoErrors.
assertSentNotification en assertNotificationCount.
dd of dump.