Skip to main content

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.
Ein MCP-Server kann im Wesentlichen drei Arten von Funktionen bereitstellen:

Installation

Installieren Sie das Paket mit Composer.
Nach der Installation führen Sie den Artisan-Befehl vendor:publish aus, um die Datei routes/ai.php zu erzeugen.
Dadurch wird die Datei routes/ai.php angelegt. Dort registrieren Sie Ihre MCP-Server.

Einen Server erstellen

Erzeugen Sie eine Serverklasse mit dem Artisan-Befehl make:mcp-server.
Die Serverklasse wird im Verzeichnis app/Mcp/Servers angelegt.

Server registrieren

Nachdem Sie den Server erstellt haben, registrieren Sie ihn in routes/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.
Wie bei normalen Routen können Sie Middleware anwenden.

Lokaler Server

Ein lokaler Server läuft als Artisan-Befehl. Er wird für die Integration mit lokalen KI-Clients wie Claude Desktop verwendet.
Ein lokaler Server wird üblicherweise vom MCP-Client automatisch gestartet. Sie müssen den Artisan-Befehl mcp:start nicht manuell ausführen.

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-Befehl make:mcp-tool.
Registrieren Sie das erzeugte Tool anschließend in der Eigenschaft $tools des Servers.
Ein Beispiel für eine einfache Tool-Klasse:

Name und Beschreibung eines Tools

Aus dem Klassennamen werden automatisch ein Standardname und ein Standardtitel abgeleitet. Für CurrentWeatherTool lautet der Name current-weather und der Titel Current Weather Tool. Mit den Attributen Name und Title können Sie diese Werte anpassen.
Die Beschreibung eines Tools (Description) wird nicht automatisch erzeugt. Sie ist unerlässlich, damit das KI-Modell versteht, wie das Tool zu verwenden ist. Legen Sie daher unbedingt eine aussagekräftige Beschreibung fest.

Eingabeschema

In der Methode schema definieren Sie das Schema der Eingabeparameter. Mit dem JSON-Schema-Builder von Laravel können Sie Typen und Constraints angeben.

Ausgabeschema

In der Methode outputSchema können Sie die Struktur der Antwort definieren. Das erleichtert es dem KI-Client, die Antwort zu parsen.

Validierung

Innerhalb der Methode handle können Sie die Standard-Validierung von Laravel nutzen.
Schlägt die Validierung fehl, versucht es der KI-Client anhand der Fehlermeldung erneut. Stellen Sie konkrete, umsetzbare Fehlermeldungen bereit.

Dependency Injection

Da Tools über den Service-Container von Laravel aufgelöst werden, können Sie Abhängigkeiten im Konstruktor oder in der Methode handle per Typ-Hint einbinden.

Annotationen

Mit zusätzlichen Annotationen können Sie dem KI-Client weitergehende Informationen zum Verhalten des Tools mitgeben.
Verfügbar sind folgende Annotationen:

Bedingte Registrierung

Durch Implementieren der Methode shouldRegister können Sie ein Tool zur Laufzeit bedingt registrieren.
Gibt die Methode false zurück, ist das Tool für den KI-Client nicht sichtbar.

Antworten

Ein Tool muss eine Instanz von Laravel\Mcp\Response zurückgeben.
Sie geben strukturierte Daten zurück, die vom KI-Client leicht geparst werden können.
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

Registrieren Sie den Prompt in der Eigenschaft $prompts des Servers.

Prompt-Argumente

In der Methode arguments 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 Methode handle können Sie die Argumente validieren.
Schlägt die Validierung fehl, versucht der KI-Client den Aufruf anhand der Fehlermeldung erneut. Stellen Sie konkrete und umsetzbare Meldungen bereit.

Dependency Injection

Da Prompts über den Service-Container von Laravel aufgelöst werden, können Sie Abhängigkeiten im Konstruktor oder in der Methode handle per Typ-Hint einbinden.
Auch in der Methode handle können Sie Typ-Hints setzen; der Service-Container löst sie automatisch auf und injiziert die Instanzen.

Bedingte Registrierung

Durch Implementieren der Methode shouldRegister können Sie einen Prompt zur Laufzeit bedingt registrieren.
Gibt die Methode false zurück, ist der Prompt für den KI-Client weder sichtbar noch aufrufbar.

Prompt-Antworten

In der Methode handle 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

Registrieren Sie die Ressource in der Eigenschaft $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 Interface HasUriTemplate.
Die Variablen aus der URI werden automatisch in den Request übernommen und lassen sich mit 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 Methode handle ü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 Methode handle per Typ-Hint einbinden.
Auch in der Methode 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 Methode shouldRegister können Sie eine Ressource zur Laufzeit bedingt registrieren.
Gibt die Methode false zurück, ist die Ressource für den KI-Client weder sichtbar noch abrufbar.

Ressourcen-Antworten

Eine Ressource muss eine Instanz von Laravel\Mcp\Response zurückgeben. Für Textinhalte verwenden Sie die Methode text.
Mit resourceLink 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.
Sie können auch eine registrierte Ressourcen-Klasse oder -Instanz übergeben. URI, Name, Titel, Beschreibung und MIME-Typ werden automatisch übernommen.

Blob-Antwort

Um Binärinhalte zurückzugeben, verwenden Sie die Methode blob. Den MIME-Typ legen Sie über das Attribut #[MimeType] der Ressource fest.

Fehlerantwort

Zum Signalisieren eines Fehlers verwenden Sie die Methode error.

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-Befehl make:mcp-app-resource legen Sie eine App-Ressource an.
Der Befehl erstellt zwei Dateien: eine PHP-Klasse in 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.
Die globale Funktion 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.
Das Enum 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.
Das Enum 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.
Wenn Sie eine dynamische Konfiguration benötigen, überschreiben Sie die Methode appMeta der Ressource mithilfe der Fluent-Builder AppMeta, Csp und Permissions im Namespace Laravel\Mcp\Server\Ui.

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 Skill mcp-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.
Wenn Sie Metadaten dem gesamten Response-Umschlag hinzufügen möchten, verwenden Sie Response::make.
Um der Klasse selbst – also einem Tool, einer Ressource oder einem Prompt – Metadaten zuzuweisen, definieren Sie die Eigenschaft $meta.

Icons

MCP-Clients können Icons für den Server und dessen Primitives anzeigen. Mit dem Attribut Icon deklarieren Sie Icons für Server, Tools, Ressourcen und Prompts.
Das Attribut 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.
Die per Attribut und über die Methode icons definierten Icons werden automatisch zusammengeführt. Icon-Pfade werden folgendermaßen aufgelöst:
  • Pfade mit einem URI-Schema wie https: oder data: werden unverändert übernommen.
  • Relative Pfade werden mit dem Laravel-Helper asset in 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 Header Authorization: Bearer <token>.

OAuth 2.1

OAuth-Authentifizierung mit Laravel Passport. Geeignet, wenn Sie eine robustere Sicherheit benötigen.
Wenn Sie OAuth verwenden, veröffentlichen Sie die Autorisierungs-View von Passport und richten sie in einem Service-Provider ein.

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 Methode Client::web und übergeben die URL des Servers.
Für einen lokalen MCP-Server, der als Kommando startet, verwenden Sie Client::local und übergeben Kommando und Argumente.
Der Client verbindet sich verzögert (lazy connect): Die Verbindung wird beim ersten Auflisten oder Aufrufen von Tools automatisch aufgebaut. Möchten Sie die Verbindung manuell verwalten, verwenden Sie die Methoden connect, connected, ping und disconnect.
Mit 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 Methode boot eines Service-Providers über die Fassade Mcp.
Nach der Registrierung lösen Sie den Client per Name auf.
Ein benannter Client wird pro Request nur einmal aufgelöst und am Ende des Request-Lebenszyklus automatisch getrennt.

Client-Authentifizierung

Um sich zu einem per Bearer-Token geschützten Web-MCP-Server zu verbinden, verwenden Sie withToken. Sie können einen Token-String oder eine Closure für die verzögerte Auflösung übergeben.
Für per OAuth 2.1 geschützte Server verwenden Sie withOAuth.
Wenn der MCP-Server Dynamic Client Registration unterstützt, können Sie clientId und clientSecret weglassen. Der Client registriert sich dann automatisch.
Registrieren Sie anschließend in der Datei 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.
Dadurch werden zwei benannte Routen registriert: eine Connect-Route (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 Methode tools erhalten Sie die von einem MCP-Server angebotenen Tools. Sie werden als Collection mit dem Namen als Schlüssel zurückgegeben.
Der Client übernimmt die Pagination automatisch und ruft alle Tools ab. Mit dem Argument limit können Sie die abgerufene Anzahl begrenzen.
Um ein Tool aufzurufen, verwenden Sie callTool und übergeben den Namen und ein Argument-Array. Die zurückgegebene ToolResult-Instanz enthält die Antwort.
Sie können ein Tool auch direkt über die aufgelistete Instanz aufrufen.
Wenn Sie mit dem Laravel AI SDK einen Agent bauen, können Sie die Tools des MCP-Clients direkt an den Agent übergeben. So kann das Modell sie beim Beantworten von Prompts aufrufen. Näheres finden Sie im Abschnitt MCP-Tools des AI SDK.

Prompts

Mit der Methode prompts erhalten Sie die vom MCP-Server angebotenen Prompts. Sie werden als Collection mit dem Namen als Schlüssel zurückgegeben.
Der Client übernimmt die Pagination automatisch und ruft alle Prompts ab. Mit dem Argument limit können Sie die abgerufene Anzahl begrenzen.
Um einen Prompt zu erhalten, verwenden Sie getPrompt und übergeben Name und Argument-Array. Die zurückgegebene PromptResult-Instanz enthält die generierten Nachrichten.

Ressourcen

Mit der Methode resources erhalten Sie die vom MCP-Server angebotenen Ressourcen. Sie werden als Collection mit der URI als Schlüssel zurückgegeben.
Der Client übernimmt die Pagination automatisch und ruft alle Ressourcen ab. Mit dem Argument limit können Sie die abgerufene Anzahl begrenzen.
Um eine Ressource zu laden, verwenden Sie 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“.
Der Befehl startet den MCP Inspector; die Client-Konfiguration können Sie kopieren. Wenn Sie Authentifizierungs-Middleware konfiguriert haben, verbinden Sie sich inklusive des Authorization-Headers.

Unit-Tests

Für Tools, Ressourcen und Prompts können Sie Unit-Tests schreiben.
Prompts und Ressourcen testen Sie analog.
Um als authentifizierter Benutzer auszuführen, verwenden Sie actingAs.
Wichtige Assertion-Methoden sind:
Um das Vorhandensein von Fehlern zu prüfen, nutzen Sie assertHasErrors bzw. assertHasNoErrors.
Sie können Name, Titel und Beschreibung eines Tools, einer Ressource oder eines Prompts verifizieren.
Zum Prüfen von Notifications einer Streaming-Antwort verwenden Sie assertSentNotification und assertNotificationCount.
Zum Debuggen des Antwort-Inhalts nutzen Sie die Methoden dd bzw. dump.
Zuletzt geändert am 20. Juli 2026