Qu’est-ce que MCP ?
Le Model Context Protocol (MCP) est une spécification qui définit un protocole standardisé pour la communication entre des clients IA (Claude, Cursor, GitHub Copilot, etc.) et une application. En implémentant un serveur MCP, un agent IA peut accéder aux données de votre application Laravel ou y exécuter des actions.Laravel MCP est un package officiel introduit dans Laravel 13. Distribué sous le nom
laravel/mcp, il fournit tout le nécessaire pour construire un serveur MCP.Installation
Installez le package avec Composer.vendor:publish pour générer le fichier routes/ai.php.
routes/ai.php, où vous déclarez vos serveurs MCP.
Création d’un serveur
Générez la classe de serveur avec la commandemake:mcp-server.
app/Mcp/Servers.
Enregistrer le serveur
Une fois la classe créée, déclarez-la dansroutes/ai.php. Deux modes sont disponibles : serveur Web et serveur local.
Serveur Web
Un serveur Web est accessible via une requête HTTP POST. Il convient parfaitement aux clients IA distants et aux intégrations Web.Serveur local
Un serveur local s’exécute comme une commande Artisan. Il est destiné aux clients IA locaux comme Claude Desktop.Tools
Les tools sont les fonctions que le client IA peut appeler : lecture de données, intégration à une API externe, opérations en base, etc.Créer un tool
Générez la classe avec la commande Artisanmake:mcp-tool.
$tools du serveur.
Nom et description du tool
Le nom et le titre sont générés par défaut à partir du nom de classe. PourCurrentWeatherTool, le nom devient current-weather et le titre Current Weather Tool. Personnalisez-les via les attributs Name et Title.
Schéma d’entrée
La méthodeschema définit le schéma des paramètres d’entrée. Le builder JSON schema de Laravel permet d’exprimer types et contraintes.
Schéma de sortie
outputSchema définit la structure de la réponse, ce qui facilite son parsing par le client IA.
Validation
Utilisez la validation standard de Laravel danshandle.
Injection de dépendances
Les tools sont résolus via le service container Laravel : vous pouvez donc type-hinter des dépendances dans le constructeur ou danshandle.
Annotations
Vous pouvez ajouter des annotations aux tools pour informer le client IA sur leur comportement.Enregistrement conditionnel
En implémentantshouldRegister, vous décidez à l’exécution si un tool doit être exposé.
false, le tool est masqué aux clients IA.
Réponses
Un tool doit retourner une instance deLaravel\Mcp\Response.
Réponse texte
Réponse texte
Réponse d'erreur
Réponse d'erreur
Réponse image / audio
Réponse image / audio
Réponse multi-contenu
Réponse multi-contenu
Réponse structurée
Réponse structurée
Renvoie une donnée structurée facilement analysable par le client IA.
Réponse en streaming
Réponse en streaming
Envoie l’avancement en temps réel pour les traitements longs.
Prompts
Les prompts sont des templates réutilisables. Ils permettent d’offrir aux clients IA des requêtes prêtes à l’emploi pour dialoguer avec le modèle de langage.Créer un prompt
$prompts du serveur.
Arguments d’un prompt
Déclarez les paramètres du prompt viaarguments.
Validation
Les arguments d’un prompt sont validés automatiquement d’après leur définition, mais vous pouvez appliquer des règles plus complexes. Laravel MCP s’intègre nativement à la validation de Laravel. Validez les arguments à l’intérieur duhandle du prompt.
Injection de dépendances
Les prompts étant résolus via le service container, vous pouvez type-hinter des dépendances dans le constructeur ou danshandle.
handle accepte également des types injectés automatiquement.
Enregistrement conditionnel
En implémentantshouldRegister, vous décidez à l’exécution si le prompt doit être exposé.
false rend le prompt invisible et non-invocable pour le client IA.
Réponse d’un prompt
Unhandle de prompt peut renvoyer des messages utilisateur ou assistant. Utilisez asAssistant() pour marquer un message comme provenant de l’assistant.
Resources
Les resources sont des données ou informations que le client IA peut charger comme contexte : documentation, configuration, données dynamiques… tout ce qui améliore la qualité des réponses de l’IA.Créer une resource
$resources.
URI et type MIME
Par défaut, l’URI est déduite du nom de classe (par exempleweather://resources/weather-guidelines). Personnalisez-les via Uri et MimeType.
Resource templates
Pour définir une resource dynamique dont l’URI contient des variables, implémentez l’interfaceHasUriTemplate.
get.
Requête d’une resource
Contrairement aux tools et aux prompts, les resources ne définissent pas de schéma d’entrée ni d’arguments. Vous accédez néanmoins aux informations de la requête via l’objetRequest dans handle.
Injection de dépendances pour les resources
Les resources étant résolues via le service container, vous pouvez type-hinter des dépendances dans le constructeur ou danshandle.
handle accepte également des types injectés.
Annotations de resource
Les resources peuvent porter des annotations d’audience, de priorité, de date de dernière modification, etc.Enregistrement conditionnel d’une resource
En implémentantshouldRegister, vous décidez à l’exécution si la resource doit être exposée.
false rend la resource invisible et non-accessible.
Réponse d’une resource
Une resource doit retourner une instance deLaravel\Mcp\Response.
Pour un contenu texte, utilisez text.
Réponse de type resource link
UtilisezresourceLink pour retourner un lien de resource. Contrairement à une resource embarquée, il fournit un pointeur URI que le client IA récupérera de manière indépendante.
Réponse Blob
Pour un contenu binaire, utilisezblob. Le type MIME est défini via l’attribut #[MimeType] de la resource.
Réponse d’erreur
Pour signaler une erreur, utilisezerror.
Apps
Laravel MCP prend en charge les MCP Apps, une extension du protocole permettant à un tool de rendre une application HTML interactive dans une iframe sandbox à l’intérieur d’un hôte compatible. Cela ouvre la voie à des tableaux de bord, des formulaires, des visualisations et autres expériences riches qui vont bien au-delà d’une simple réponse texte. Une MCP App est composée de deux éléments :- App resource — retourne le HTML auto-suffisant de l’application.
- Tool — associé à l’app resource via l’attribut
#[RendersApp]. Lorsque le tool est appelé, l’hôte récupère la resource associée et la rend.
Créer une app resource
La commande Artisanmake:mcp-app-resource crée une app resource.
app/Mcp/Resources et une vue Blade dans resources/views/mcp. Le nom de la vue est déduit du nom de la classe : WeatherDashboardApp correspond à mcp.weather-dashboard-app.
AppResource hérite de la classe de base Resource et configure automatiquement le schéma d’URI ui:// et le type MIME text/html;profile=mcp-app exigés par la spécification MCP Apps. Comme n’importe quelle resource, elle doit être déclarée dans le tableau $resources du serveur.
La vue Blade générée utilise le composant <x-mcp::app>, qui produit un document HTML complet incluant le SDK MCP côté client.
createMcpApp fournie par le SDK gère la connexion de l’iframe au serveur, l’application du thème de l’hôte et expose des helpers comme callServerTool, sendMessage, openLink, ainsi que des callbacks d’événements. Pour l’API cliente complète, référez-vous à la spécification MCP Apps.
Rendre une app depuis un tool
Pour afficher une app resource, liez un tool à celle-ci via l’attribut#[RendersApp]. Quand le tool est appelé, Laravel MCP inclut l’URI de la resource dans les métadonnées du tool afin que l’hôte puisse rendre l’app dans une iframe sandbox.
Dès qu’une
AppResource est enregistrée, Laravel MCP annonce automatiquement la capability io.modelcontextprotocol/ui. Aucune configuration serveur supplémentaire n’est requise.Visibilité des tools d’app
Chaque tool#[RendersApp] peut restreindre ses appelants via l’argument visibility. C’est utile pour masquer au modèle les tools privés que l’UI utilise en interne pour charger ou actualiser des données.
Visibility a deux valeurs, Model et App ; par défaut les deux sont actives. Utilisez [Visibility::App] pour une action backend appelée uniquement par l’UI, et [Visibility::Model] pour empêcher l’UI de l’utiliser.
Configuration d’une app
L’attribut#[AppMeta] de l’app resource permet de configurer la Content Security Policy de l’iframe, les autorisations du navigateur et les bibliothèques à inclure dans le <head>.
Library inclut les scripts CDN de bibliothèques front populaires comme Library::Tailwind ou Library::Alpine, dont l’origine CDN est ajoutée automatiquement à la CSP. L’enum Permission couvre les autorisations navigateur : Camera, Microphone, Geolocation, ClipboardWrite, etc.
Développement d’app avec Boost
Laravel MCP inclut une référence Boost dédiée à la création de MCP Apps. Si Laravel Boost est installé, un agent de code IA peut invoquer la skillmcp-development pour générer automatiquement l’app resource, la vue Blade et le tool associé.
Pour la référence complète du protocole (API cliente, détails de schéma…), consultez la documentation officielle MCP Apps.
Métadonnées
Vous pouvez ajouter le champ_meta de la spécification MCP aux réponses des tools, resources et prompts.
Response::make.
$meta.
Icônes
Les clients MCP peuvent afficher des icônes pour le serveur et ses primitives. Utilisez l’attributIcon pour déclarer des icônes sur un serveur, un tool, une resource ou un prompt.
Icon est répétable : vous pouvez donc en déclarer plusieurs pour différentes tailles ou pour les variantes light / dark.
Vous pouvez également définir les icônes de manière programmatique en surchargeant la méthode icons. C’est utile quand elles dépendent de conditions d’exécution.
icons sont fusionnées automatiquement. Le chemin est résolu ainsi :
- Un chemin avec un schéma d’URI (
https:,data:, etc.) est utilisé tel quel. - Un chemin relatif est transformé en URL via le helper
assetde Laravel.
Authentification
Les serveurs Web s’authentifient via les middlewares standard de Laravel.Sanctum
Authentification par jeton avec Laravel Sanctum. Le client MCP envoie un en-têteAuthorization: Bearer <token>.
OAuth 2.1
Authentification OAuth via Laravel Passport. Recommandée lorsque vous avez besoin d’une sécurité renforcée.Autorisation
$request->user() renvoie l’utilisateur authentifié, ce qui permet d’appliquer des vérifications d’autorisation dans les tools et resources.
Client MCP
Laravel MCP fournit aussi un client pour se connecter à d’autres serveurs MCP. Grâce à lui, vous pouvez découvrir et invoquer les tools exposés par un serveur MCP externe. C’est particulièrement utile pour donner à un agent IA accès à un serveur MCP externe.Se connecter à un serveur
Pour un serveur MCP accessible en HTTP, utilisezClient::web en lui passant l’URL.
Client::local en indiquant la commande et ses arguments.
connect, connected, ping et disconnect.
withTimeout personnalise le timeout de requête.
Clients nommés
Plutôt que de construire un client à chaque fois, enregistrez un client nommé réutilisable. Cela se fait généralement dans la méthodeboot d’un service provider via la façade Mcp.
Authentification du client
Pour un serveur MCP Web protégé par un jeton Bearer, utilisezwithToken. Vous pouvez passer une chaîne ou une closure résolue paresseusement.
withOAuth.
Si le serveur MCP prend en charge l’enregistrement dynamique de client,
clientId et clientSecret peuvent être omis : le client s’enregistrera lui-même.routes/ai.php via oAuthRoutesFor. La closure passée reçoit le nom du client et un TokenSet après l’échange du code d’autorisation contre l’access token.
mcp.oauth.{client}.connect) qui redirige l’utilisateur vers le serveur d’autorisation, et la route callback (mcp.oauth.{client}.callback) qui échange le code puis appelle le handler. Toutes deux utilisent le groupe de middleware web (surchargeable via l’argument middleware).
Pour démarrer le flux d’autorisation, redirigez l’utilisateur vers la route de connexion.
Tools
tools renvoie les tools exposés par le serveur, sous forme de collection indexée par nom.
limit restreint le nombre de résultats.
callTool en indiquant son nom et ses arguments. L’instance ToolResult retournée expose la réponse.
Prompts
prompts renvoie les prompts exposés par le serveur sous forme de collection indexée par nom.
limit restreint le nombre de résultats.
getPrompt avec son nom et ses arguments. L’instance PromptResult retournée expose les messages générés.
Resources
resources renvoie les resources exposées par le serveur, indexées par URI.
limit restreint le nombre de résultats.
readResource en passant son URI. L’instance ResourceReadResult retournée expose son contenu.
Tests
MCP Inspector
Pour tester le comportement d’un serveur MCP, utilisez l’outil de debug interactif « MCP Inspector ».Tests unitaires
Vous pouvez écrire des tests unitaires pour les tools, les resources et les prompts.actingAs.
assertHasErrors / assertHasNoErrors.
assertSentNotification et assertNotificationCount.
dd ou dump.