Was ist MCP
Das Model Context Protocol (MCP) ist eine Spezifikation, mit der KI-Clients (Claude, Cursor, GitHub Copilot etc.) und Anwendungen über ein standardisiertes Protokoll kommunizieren. Durch die Implementierung eines MCP-Servers können KI-Agents auf Daten Ihrer Laravel-Anwendung zugreifen oder Aktionen ausführen.Laravel MCP ist ein in Laravel 13 hinzugekommenes offizielles Paket. Es wird als
laravel/mcp bereitgestellt und liefert die zum Aufbau eines MCP-Servers benötigten Funktionen.Installation
Installieren Sie das Paket mit Composer.vendor:publish aus, um die Datei routes/ai.php zu erzeugen.
routes/ai.php angelegt. Dort registrieren Sie Ihre MCP-Server.
Einen Server erstellen
Erzeugen Sie eine Serverklasse mit dem Artisan-Befehlmake:mcp-server.
app/Mcp/Servers angelegt.
Server registrieren
Nachdem Sie den Server erstellt haben, registrieren Sie ihn inroutes/ai.php. Es gibt zwei Registrierungsvarianten: Webserver und lokaler Server.
Webserver
Auf einen Webserver kann per HTTP-POST-Request zugegriffen werden. Er eignet sich ideal für entfernte KI-Clients oder Web-basierte Integrationen.Lokaler Server
Ein lokaler Server läuft als Artisan-Befehl. Er wird für die Integration mit lokalen KI-Clients wie Claude Desktop verwendet.Tools
Tools sind Funktionen, die der KI-Client aufrufen kann. Sie können damit Daten abrufen, externe APIs anbinden, Datenbanken bearbeiten und vieles mehr.Ein Tool erstellen
Erzeugen Sie eine Tool-Klasse mit dem Artisan-Befehlmake:mcp-tool.
$tools des Servers.
Name und Beschreibung eines Tools
Aus dem Klassennamen werden automatisch ein Standardname und ein Standardtitel abgeleitet. FürCurrentWeatherTool lautet der Name current-weather und der Titel Current Weather Tool. Mit den Attributen Name und Title können Sie diese Werte anpassen.
Eingabeschema
In der Methodeschema definieren Sie das Schema der Eingabeparameter. Mit dem JSON-Schema-Builder von Laravel können Sie Typen und Constraints angeben.
Ausgabeschema
In der MethodeoutputSchema können Sie die Struktur der Antwort definieren. Das erleichtert es dem KI-Client, die Antwort zu parsen.
Validierung
Innerhalb der Methodehandle können Sie die Standard-Validierung von Laravel nutzen.
Dependency Injection
Da Tools über den Service-Container von Laravel aufgelöst werden, können Sie Abhängigkeiten im Konstruktor oder in der Methodehandle per Typ-Hint einbinden.
Annotationen
Mit zusätzlichen Annotationen können Sie dem KI-Client weitergehende Informationen zum Verhalten des Tools mitgeben.Bedingte Registrierung
Durch Implementieren der MethodeshouldRegister können Sie ein Tool zur Laufzeit bedingt registrieren.
false zurück, ist das Tool für den KI-Client nicht sichtbar.
Antworten
Ein Tool muss eine Instanz vonLaravel\Mcp\Response zurückgeben.
Textantwort
Textantwort
Fehlerantwort
Fehlerantwort
Bild- oder Audioantwort
Bild- oder Audioantwort
Antwort mit mehreren Inhalten
Antwort mit mehreren Inhalten
Strukturierte Antwort
Strukturierte Antwort
Sie geben strukturierte Daten zurück, die vom KI-Client leicht geparst werden können.
Streaming-Antwort
Streaming-Antwort
Bei länger laufenden Vorgängen können Sie den Fortschritt in Echtzeit übertragen.
Prompts
Prompts sind wiederverwendbare Prompt-Vorlagen. Sie standardisieren typische Abfragen, mit denen KI-Clients mit Sprachmodellen interagieren.Einen Prompt erstellen
$prompts des Servers.
Prompt-Argumente
In der Methodearguments definieren Sie die Parameter des Prompts.
Validierung
Die Prompt-Argumente werden gemäß Definition automatisch validiert; Sie können aber auch komplexere Validierungsregeln anwenden. Laravel MCP arbeitet nahtlos mit der Validierung von Laravel zusammen. Innerhalb der Methodehandle können Sie die Argumente validieren.
Dependency Injection
Da Prompts über den Service-Container von Laravel aufgelöst werden, können Sie Abhängigkeiten im Konstruktor oder in der Methodehandle per Typ-Hint einbinden.
handle können Sie Typ-Hints setzen; der Service-Container löst sie automatisch auf und injiziert die Instanzen.
Bedingte Registrierung
Durch Implementieren der MethodeshouldRegister können Sie einen Prompt zur Laufzeit bedingt registrieren.
false zurück, ist der Prompt für den KI-Client weder sichtbar noch aufrufbar.
Prompt-Antworten
In der Methodehandle eines Prompts können Sie Benutzer- und Assistant-Nachrichten zurückgeben. Mit asAssistant() behandeln Sie eine Nachricht als Assistant-Message.
Ressourcen
Ressourcen sind Daten oder Informationen, die der KI-Client als Kontext einlesen kann. Sie stellen zum Beispiel Dokumentationen, Konfigurationsinformationen oder dynamische Daten bereit, um die Antwortqualität der KI zu verbessern.Eine Ressource erstellen
$resources des Servers.
URI und MIME-Typ
Standardmäßig wird die URI aus dem Klassennamen erzeugt (z. B.weather://resources/weather-guidelines). Mit den Attributen Uri und MimeType können Sie beide anpassen.
Ressourcen-Templates
Um eine dynamische Ressource mit URI-Variablen zu definieren, implementieren Sie das InterfaceHasUriTemplate.
get abrufen.
Anfragen an Ressourcen
Anders als Tools und Prompts können Ressourcen kein Eingabeschema und keine Argumente definieren. Sie können jedoch innerhalb der Methodehandle über das Request-Objekt auf Informationen der Anfrage zugreifen.
Dependency Injection für Ressourcen
Da Ressourcen über den Service-Container von Laravel aufgelöst werden, können Sie Abhängigkeiten im Konstruktor oder in der Methodehandle per Typ-Hint einbinden.
handle können Sie Typ-Hints verwenden; der Service-Container löst sie automatisch auf und injiziert sie.
Annotationen für Ressourcen
Ressourcen können mit Annotationen für Zielgruppe, Priorität und letztes Änderungsdatum versehen werden.Bedingte Registrierung von Ressourcen
Durch Implementieren der MethodeshouldRegister können Sie eine Ressource zur Laufzeit bedingt registrieren.
false zurück, ist die Ressource für den KI-Client weder sichtbar noch abrufbar.
Ressourcen-Antworten
Eine Ressource muss eine Instanz vonLaravel\Mcp\Response zurückgeben.
Für Textinhalte verwenden Sie die Methode text.
Antworten mit Ressourcen-Link
MitresourceLink können Sie einen Ressourcen-Link zurückgeben. Anders als eine eingebettete Ressource liefert dies einen URI-Verweis, den der KI-Client eigenständig abruft.
Blob-Antwort
Um Binärinhalte zurückzugeben, verwenden Sie die Methodeblob. Den MIME-Typ legen Sie über das Attribut #[MimeType] der Ressource fest.
Fehlerantwort
Zum Signalisieren eines Fehlers verwenden Sie die Methodeerror.
Apps
Laravel MCP unterstützt MCP Apps. Dabei handelt es sich um eine Erweiterung des Model Context Protocol, mit der Tools interaktive HTML-Anwendungen in einem Sandbox-iframe des unterstützten Hosts rendern können. Damit lassen sich – über reine Textantworten hinaus – Dashboards, Formulare, Visualisierungen und andere Rich-Erlebnisse aufbauen. Eine MCP-App besteht aus zwei zusammenspielenden Teilen:- App-Ressource – Gibt das selbstständige HTML der Anwendung zurück.
- Tool – Wird über das Attribut
#[RendersApp]mit der App-Ressource verknüpft. Wird das Tool aufgerufen, ruft der Host die verknüpfte Ressource ab und rendert sie.
Eine App-Ressource erstellen
Mit dem Artisan-Befehlmake:mcp-app-resource legen Sie eine App-Ressource an.
app/Mcp/Resources und eine Blade-View in resources/views/mcp. Der View-Name wird aus dem Klassennamen abgeleitet – aus WeatherDashboardApp wird zum Beispiel mcp.weather-dashboard-app.
AppResource erweitert die Basisklasse Resource und setzt automatisch das von der MCP-Apps-Spezifikation geforderte URI-Schema ui:// und den MIME-Typ text/html;profile=mcp-app. Wie andere Ressourcen muss die Klasse im Array $resources des Servers registriert werden.
Die generierte Blade-View verwendet die Komponente <x-mcp::app>. Diese rendert ein vollständiges HTML-Dokument, das das clientseitige MCP-SDK bündelt.
createMcpApp stellt das gebündelte SDK bereit. Sie kümmert sich um die Verbindung des iframes zum Server, wendet das Theme des Hosts an und stellt Helfer wie callServerTool, sendMessage und openLink sowie Event-Callbacks bereit. Die vollständige clientseitige API finden Sie in der MCP-Apps-Spezifikation.
Eine App aus einem Tool rendern
Um eine App-Ressource anzuzeigen, verknüpfen Sie sie über das Attribut#[RendersApp] mit einem Tool. Wird das Tool aufgerufen, nimmt Laravel MCP die URI der Ressource in die Metadaten des Tools auf, sodass der Host die App in einem Sandbox-iframe rendern kann.
Sobald eine
AppResource registriert ist, wirbt Laravel MCP automatisch mit der Capability io.modelcontextprotocol/ui. Eine zusätzliche Server-Konfiguration ist nicht nötig.Sichtbarkeit von App-Tools
Jedes#[RendersApp]-Tool lässt sich über das Argument visibility in den erlaubten Aufrufern einschränken. Das ist praktisch, wenn Sie private, nur für die App gedachte Tools, mit denen die UI Daten lädt oder aktualisiert, vor dem Modell verbergen möchten.
Visibility kennt die Fälle Model und App. Voreingestellt sind beide. Für Backend-Aktionen, die die UI direkt aufruft, verwenden Sie [Visibility::App]; um ein Tool für die UI unerreichbar zu machen, [Visibility::Model].
App-Konfiguration
Über das Attribut#[AppMeta] an der App-Ressource konfigurieren Sie die Content Security Policy des iframes, Browser-Berechtigungen und Bibliotheks-Skripte, die im <head> der View eingebunden werden.
Library enthält vordefinierte CDN-Skripte gängiger Frontend-Bibliotheken wie Library::Tailwind oder Library::Alpine; deren CDN-Origins werden automatisch in die CSP eingebunden. Das Enum Permission deckt Browser-Berechtigungen wie Camera, Microphone, Geolocation, ClipboardWrite etc. ab.
App-Entwicklung mit Boost
Laravel MCP enthält eine spezielle Boost-Skill-Referenz zum Erstellen von MCP-Apps. Wenn Laravel Boost installiert ist, können KI-Coding-Agents die Skillmcp-development aufrufen und automatisch App-Ressourcen, Blade-Views und verknüpfte Tools generieren.
Die vollständige Referenz des Protokolls (inklusive Details zur clientseitigen API und den Schemata) finden Sie in der offiziellen MCP-Apps-Dokumentation.
Metadaten
Sie können Antworten von Tools, Ressourcen und Prompts das im MCP-Standard vorgesehene Feld_meta beifügen.
Response::make.
$meta.
Icons
MCP-Clients können Icons für den Server und dessen Primitives anzeigen. Mit dem AttributIcon deklarieren Sie Icons für Server, Tools, Ressourcen und Prompts.
Icon ist wiederholbar, sodass Sie mehrere Icons für verschiedene Größen oder Light-/Dark-Varianten deklarieren können.
Alternativ können Sie die Methode icons überschreiben und Icons programmatisch definieren. Das ist nützlich, wenn Icons von Laufzeitbedingungen abhängen.
icons definierten Icons werden automatisch zusammengeführt. Icon-Pfade werden folgendermaßen aufgelöst:
- Pfade mit einem URI-Schema wie
https:oderdata:werden unverändert übernommen. - Relative Pfade werden mit dem Laravel-Helper
assetin URLs aufgelöst.
Authentifizierung
Webserver können mit der Standard-Middleware von Laravel authentifiziert werden.Sanctum
Token-Authentifizierung mit Laravel Sanctum. Der MCP-Client sendet den HeaderAuthorization: Bearer <token>.
OAuth 2.1
OAuth-Authentifizierung mit Laravel Passport. Geeignet, wenn Sie eine robustere Sicherheit benötigen.Autorisierung
Mit$request->user() erhalten Sie den authentifizierten Benutzer und können in Tools oder Ressourcen Autorisierungsprüfungen durchführen.
MCP-Clients
Laravel MCP unterstützt nicht nur den Aufbau von Servern, sondern liefert auch einen Client, mit dem Sie eine Verbindung zu anderen MCP-Servern aufbauen. Damit können Sie Tools, die ein externer MCP-Server anbietet, entdecken und aufrufen. Das ist besonders nützlich, wenn Sie KI-Agents mit den Funktionen externer MCP-Server ausstatten möchten.Verbindung zu einem Server
Für einen per HTTP erreichbaren MCP-Server verwenden Sie die MethodeClient::web und übergeben die URL des Servers.
Client::local und übergeben Kommando und Argumente.
connect, connected, ping und disconnect.
withTimeout können Sie das Request-Timeout anpassen.
Benannte Clients
Statt einen Client jedes Mal neu zu erzeugen, können Sie wiederverwendbare benannte Clients registrieren. In der Regel geschieht das in der Methodeboot eines Service-Providers über die Fassade Mcp.
Client-Authentifizierung
Um sich zu einem per Bearer-Token geschützten Web-MCP-Server zu verbinden, verwenden SiewithToken. Sie können einen Token-String oder eine Closure für die verzögerte Auflösung übergeben.
withOAuth.
Wenn der MCP-Server Dynamic Client Registration unterstützt, können Sie
clientId und clientSecret weglassen. Der Client registriert sich dann automatisch.routes/ai.php mit der Methode oAuthRoutesFor OAuth-Routen für den benannten Client. Die übergebene Closure erhält nach dem Austausch des Authorization Codes gegen einen Access Token den Client-Namen und ein TokenSet.
mcp.oauth.{client}.connect), die Benutzer zum Autorisierungsserver weiterleitet, und eine Callback-Route (mcp.oauth.{client}.callback), die den Authorization Code austauscht und den Handler aufruft. Beide verwenden die Middleware-Gruppe web (überschreibbar über das Argument middleware).
Um den Autorisierungsablauf zu starten, leiten Sie den Benutzer auf die Connect-Route weiter.
Tools
Mit der Methodetools erhalten Sie die von einem MCP-Server angebotenen Tools. Sie werden als Collection mit dem Namen als Schlüssel zurückgegeben.
limit können Sie die abgerufene Anzahl begrenzen.
callTool und übergeben den Namen und ein Argument-Array. Die zurückgegebene ToolResult-Instanz enthält die Antwort.
Prompts
Mit der Methodeprompts erhalten Sie die vom MCP-Server angebotenen Prompts. Sie werden als Collection mit dem Namen als Schlüssel zurückgegeben.
limit können Sie die abgerufene Anzahl begrenzen.
getPrompt und übergeben Name und Argument-Array. Die zurückgegebene PromptResult-Instanz enthält die generierten Nachrichten.
Ressourcen
Mit der Methoderesources erhalten Sie die vom MCP-Server angebotenen Ressourcen. Sie werden als Collection mit der URI als Schlüssel zurückgegeben.
limit können Sie die abgerufene Anzahl begrenzen.
readResource und übergeben die URI. Die zurückgegebene ResourceReadResult-Instanz enthält die Inhalte.
Tests
MCP Inspector
Zum Testen eines MCP-Servers eignet sich das interaktive Debugging-Tool „MCP Inspector“.Unit-Tests
Für Tools, Ressourcen und Prompts können Sie Unit-Tests schreiben.actingAs.
assertHasErrors bzw. assertHasNoErrors.
assertSentNotification und assertNotificationCount.
dd bzw. dump.