
Et là, on tient (enfin) le chaînon manquant entre nos stacks Laravel et l'écosystème des LLM qui ne parle, pour l'instant, qu'en JSON-RPC. Pas une révolution silencieuse — une mise à jour structurante.
Ce qui change vraiment sous le capot
La 1.0 embarque la révision 2026-07-28 du protocole, avec un changement de paradigme: les serveurs deviennent officiellement sans état. Chaque requête HTTP ou stdio porte désormais sa propre version de protocole et ses features dans params._meta, ce qui veut dire — accrochez-vous — que tout ce qui ressemblait à un identifiant de session côté serveur disparaît. Finis donc le header MCP-Session-Id, Request::sessionId, Request::setSessionId et l'event SessionInitialized. À nous de gérer l'identifiant de corrélation (dans les arguments ou _meta, comme on veut, du moment qu'on le fait).
Côté catalogue d'outils, on salue l'arrivée de ToolSearch. Parce que, soyons honnêtes, bombarder la fenêtre de contexte d'un modèle avec la liste complète de nos outils, c'est du gaspillage pur. Les outils courants restent au menu, les autres passent derrière une recherche — search_tools accepte une query et une limite de résultats, puis renvoie les noms, descriptions et inputs attendus. Une fois le bon outil trouvé, execute_tools se charge de l'exécution. Malin, et bien pensé pour les agents qui découvrent un serveur à la volée.
Cache, OAuth et headers: le trio de conformité
Le cache n'est plus un gros mot. Un attribut Cacheable pose le défaut, cacheHints ajuste au cas par cas, et Laravel applique la consigne dès qu'on active withCache. Petit piège dans le panneau: les tool calls ne sont jamais cachés, et un ttlMs manquant ou égal à zéro passe à la trappe.
Côté OAuth, le durcissement se précise. PKCE devient obligatoire — OAuthClient::redirect lèvera une OAuthException si le serveur d'autorisation oublie code_challenge_methods_supported dans ses métadonnées. Et pour un setup propre, les Client ID Metadata Documents arrivent via Mcp::oAuthRoutesFor: votre client_id devient une URL HTTPS pointant vers un JSON descriptif. Dynamic Client Registration (déprécié par le protocole 2026-07-28) reste en filet de secours, mais autant migrer tout de suite, non?
Pour ceux qui passent de la 0.9 à la 1.0, attention tout de même: le middleware ValidateMcpHeaders tourne désormais sur chaque route enregistrée via Mcp::web. Les POST doivent aligner MCP-Protocol-Version et Mcp-Method avec le body, et tools/call, prompts/get, resources/read ajoutent un header Mcp-Name qui doit matcher le nom (ou l'URI pour les resources). Un mismatch? HTTP 400 et JSON-RPC code -32020. Les vieux clients qui utilisent encore initialize et n'envoient rien dans _meta sont exemptés — pour le moment.
Et pendant ce temps, côté Symfony
Pendant qu'on s'occupe de nos serveurs MCP, on note au passage la sortie de Symfony 8.1.7, annoncée par Fabien Potencier sur le blog officiel. Une release de maintenance sur la branche 8.1, à appliquer sans tarder — pas le feu, mais la piqûre de rappel utile pour bien démarrer la semaine.
Laravel MCP 1.0, c'est une brique qu'on attendait pour industrialiser proprement le dialogue entre nos applis et les agents IA. La promesse d'un protocole stable, c'est la promesse d'outils stables — et là, on y est. Reste maintenant à voir comment la communauté va s'en emparer pour bâtir des intégrations qui ne soient plus de simples POC brillants mais des solutions vraiment durables. À vos IDE!