Le 30 août 2026, Symfony a supprimé une brique que tout l'écosystème PHP réclamait huit mois plus tôt : le serveur MCP de Mate, son assistant pour agents de code1. Pas parce que l'idée était mauvaise. Parce qu'un benchmark a montré qu'un simple exécutable en ligne de commande, accompagné de deux fichiers Markdown, faisait mieux. J'y vois la meilleure illustration de ce que je répète depuis un an : en matière d'IA, personne n'a encore la carte. Et la seule vraie erreur est de refuser de jeter ce qu'on vient de construire. Y compris, peut-être, ce serveur MCP GitHub que j'ai sous la main.

Trois réponses en dix-huit mois à la même question

Le problème de départ est simple, et tous ceux qui font du vibe-coding sur Symfony l'ont rencontré. L'agent lit votre code, mais il ne voit pas votre application tourner : ni le profiler, ni les logs, ni le conteneur compilé. Alors il reconstruit le projet fichier par fichier, à chaque tâche, avec la lenteur et les approximations que ça implique. Johannes Wachter, l'auteur de Mate, le résume en une phrase que je trouve très juste : le code source décrit ce qu'un système peut faire, il ne dit rien de ce qu'il vient de faire2.

Pour ouvrir cette porte à l'agent, la communauté a produit trois solutions en un an et demi.

  • Mars 2025Hamdi Laadhari publie un bundle MCP pour le profiler : requêtes, exceptions et requêtes SQL exposées à l'agent en JSON-RPC3.
  • 24 déc. 2025Symfony AI 0.1, première version taguée, embarque Mate, un serveur MCP qui expose le conteneur, le profiler et les logs à Claude Code, Codex ou Cursor4. La solution officielle valide l'approche.
  • 22 juil. 2026Mate 0.12 ajoute l'installation d'Agent Skills : des fiches qui expliquent à l'agent quand se servir de chaque outil1.
  • 30 août 2026Mate 0.13 remplace le serveur MCP par un CLI natif. Plus de dépendance au SDK MCP, plus de commandes de démarrage et d'arrêt, plus de fichier mcp.json : mate init écrit des instructions dans AGENTS.md et un CLAUDE.md qui l'importe1.
  • 16 sept. 2026Hamdi Laadhari déprécie son bundle. Sa conclusion : "l'accès était la moitié facile. La moitié qui rend l'outil utile, c'est de décider ce que l'agent doit regarder"3.

Dix-huit mois, trois architectures, pour le même besoin. Ce n'est pas de l'amateurisme : c'est à quoi ressemble un domaine qui n'a pas encore trouvé sa forme.

Ce que le benchmark a montré

La décision ne vient pas d'une intuition. Fin août, Wachter a comparé trois configurations : pas de Mate du tout, Mate en serveur MCP, et Mate en CLI nu, puis en CLI accompagné de sa couche de découverte, les skills et les instructions dans AGENTS.md5. Le modèle est volontairement petit, Claude Haiku, parce qu'un petit modèle a plus besoin d'être guidé. Deux tâches avec un bug de performance injecté, dix exécutions par condition. Et une seule mesure : l'agent va-t-il chercher l'outil sans qu'on le lui demande ?

3/10 · 2/10serveur MCP
0/10 · 0/10CLI nu, sans instructions
10/10 · 5/10CLI + skills + AGENTS.md

Deux tâches, dix essais chacune. L'agent a-t-il utilisé Mate de lui-même ?

Deux enseignements. Le premier : un CLI que personne ne présente à l'agent est invisible, zéro sur vingt. Le second, plus intéressant : le MCP, qui annonce pourtant ses outils automatiquement à chaque session, ne fait guère mieux. Ce que la couche de découverte apporte, ce n'est pas un moyen d'appeler l'outil, c'est le moment où l'appeler. Une fiche qui dit "quand tu diagnostiques une requête lente, commence par lister les profils récents" vaut plus qu'un schéma JSON de vingt paramètres.

La question n'a jamais été "comment l'agent appelle l'outil". C'était "sait-il qu'il existe, et sait-il quand s'en servir".

Le protocole était le mauvais endroit où chercher. Symfony a passé des mois à optimiser le transport, jusqu'à ajouter un format d'encodage plus compact pour économiser des tokens dès la version 0.71, avant de se rendre compte que le levier était ailleurs. Ça m'arrive tout le temps sur mes propres projets. La différence, c'est qu'eux l'ont mesuré.

Même Anthropic tâtonne

On pourrait croire que Symfony a juste pris du retard sur un standard bien établi. C'est l'inverse. Le MCP a été annoncé par Anthropic le 25 novembre 20246. Un an plus tard, presque jour pour jour, Anthropic publie deux billets d'ingénierie qui disent en substance : ne chargez pas tout ça.

Le premier, début novembre 2025, montre un workflow qui passe de 150 000 à 2 000 tokens en présentant les outils MCP comme des fichiers de code que l'agent va lire à la demande, au lieu de tout mettre dans son contexte7. Le second, fin novembre, décrit un exemple de cinq serveurs MCP : 58 outils, environ 55 000 tokens consommés avant la première question, dont 26 000 pour le seul serveur GitHub8. La réponse est un outil de recherche d'outils : le modèle ne voit que ce dont il a besoin, et sa précision sur les évaluations MCP passe de 79,5 % à 88,1 %. En janvier 2026, Claude Code bascule tout seul dans ce mode dès que les définitions d'outils dépassent 10 % du contexte9.

L'inventeur du protocole a passé sa deuxième année à expliquer comment en charger le moins possible.

Ajoutez que Symfony AI en est à sa version 0.14, sortie le 25 septembre, sans 1.0 en vue1. En août, dans mon article sur le vibe-coding, je rangeais le MCP dans les choses qui bougent encore : "le standard s'impose, les usages se cherchent encore". Deux mois plus tard, le framework que j'utilise depuis plus de dix ans lâche le standard pour un shell. Je ne pensais pas avoir raison aussi vite.

L'aversion à la perte, notre vrai adversaire

Ce que Symfony a fait est plus difficile qu'il n'y paraît. Kahneman et Tversky l'ont mesuré en 1979 : une perte pèse environ deux fois plus lourd qu'un gain de même taille10. Et Arkes et Blumer ont montré en 1985 que plus on a investi dans une voie, plus on s'y accroche, même quand elle ne mène nulle part11. C'est le coût irrécupérable, et tout développeur le connaît : la lib interne qu'on maintient par fidélité, le framework choisi il y a six mois qu'on n'ose plus remettre en cause, l'archi qu'on défend parce qu'on l'a dessinée.

Regardez ce que Mate avait accumulé en août : huit mois de développement, une conférence dédiée à SymfonyLive Berlin et une autre à SymfonyOnline en juin12, une organisation communautaire d'extensions pour PHPUnit, PHPStan et Rector. Tout ça bâti sur le serveur MCP. Et en une version mineure, sur la foi de vingt exécutions de Haiku, le serveur disparaît. Les extensions, elles, survivent : les outils étaient déjà décrits par des attributs PHP, seul le transport a changé1. C'est ça, une bonne architecture : celle qui rend l'abandon bon marché.

Ce n'est pas un hasard. Symfony vit comme ça depuis vingt ans. Chaque version mineure déprécie, chaque majeure supprime, et la promesse de compatibilité13 existe précisément pour rendre ce cycle prévisible. Un framework qui n'aurait rien su jeter n'aurait pas survécu à Symfony 1.

Savoir s'arrêter n'est pas un échec du projet. C'est une compétence du projet.

La question à se poser régulièrement sur tout ce qui touche à l'IA tient en une phrase : si je découvrais cet outil aujourd'hui, est-ce que je l'installerais ? Votre configuration MCP de janvier, votre prompt "ultime", votre workflow d'agents en parallèle. Si la réponse est non, ce n'est pas le temps passé qui doit trancher. C'est le temps qui reste.

Retour à ce MCP GitHub

C'est l'exemple sur lequel je m'interroge en ce moment : j'ai le serveur MCP GitHub sous la main, et je doute de sa viabilité. Ce que je me dis pour le moment, et j'insiste sur "pour le moment" : un MCP est utile quand il n'y a pas d'autre porte. Dans un terminal, avec gh installé et authentifié, la réponse est non aujourd'hui.

Le modèle connaît déjà gh apprentissage

Les modèles ont été entraînés sur des millions de sessions de terminal, dont une bonne part de git et de gh. Ils en connaissent les sous-commandes, les options, les formats de sortie. Un serveur MCP, lui, est un schéma que le modèle découvre pour la première fois au moment de s'en servir. Le benchmark de Wachter mesure exactement ça : la familiarité vaut plus que l'annonce automatique.

Avec gh, l'agent n'apprend rien. Il se souvient.

Zéro token tant qu'on ne s'en sert pas contexte

Le CLI ne coûte rien avant d'être appelé : une commande, une sortie, quelques centaines de tokens. Le serveur GitHub pèse environ 26 000 tokens de définitions à chaque tour, d'après le compte d'Anthropic8. GitHub le sait, d'ailleurs : son serveur permet de n'activer que certains groupes d'outils, voire des outils à l'unité, "pour aider le modèle à choisir et réduire la taille du contexte"14. Quand il faut configurer l'outil pour qu'il pèse moins, c'est que le poids est le problème.

Chaque token de schéma est un token que l'agent n'a plus pour réfléchir à votre code.

Ça se compose shell

gh api enchaîné à jq, une boucle sur vingt dépôts, un filtre sur les issues ouvertes avant de remonter le résultat : le shell fait le tri avant que le modèle ne lise. Avec un MCP, chaque appel renvoie son résultat brut dans le contexte, et c'est le modèle qui filtre, à son tarif. C'est le point central du billet d'Anthropic sur l'exécution de code7 : traiter les données avant qu'elles n'arrivent au modèle.

Un pipe coûte zéro token. Un aller-retour par le modèle, non.

Reste que ce constat a une clause, et elle est importante : "quand il n'y a pas d'autre porte". Il y a des cas où le MCP est la seule porte, et là il gagne sans discussion.

Quand le MCP mérite sa place exceptions

Pas de shell. Un agent dans une interface de chat, sur mobile, ou hébergé chez un fournisseur qui n'ouvre pas de terminal : le MCP est la seule façon de lui donner des mains. C'est le cas de la plupart des usages non-développeurs.

Pas de CLI digne de ce nom. Gmail, Figma, Notion, un navigateur : soit l'outil en ligne de commande n'existe pas, soit il faudrait porter soi-même le flux OAuth. C'est pour ça que mon agent qui lit les e-mails des clients passe par le MCP Gmail : personne ne m'a écrit de meilleur chemin.

Un agent partagé. Quand plusieurs personnes ou plusieurs clients passent par le même agent, le serveur MCP offre ce qu'un CLI ne sait pas faire : des permissions au périmètre fin, un mode lecture seule, une trace d'audit par outil.

Trois questions avant d'ajouter un serveur MCP :

  1. Existe-t-il un outil en ligne de commande pour ce service ?
  2. Mon agent a-t-il un shell ?
  3. Le modèle connaît-il déjà cet outil ?

Trois oui : pas de MCP. Un seul non : le MCP a probablement sa place.

Ce n'est pas une règle, et je ne veux pas que ça en devienne une. C'est ce que je constate en septembre 2026, avec les serveurs MCP et les agents d'aujourd'hui. Personne ne sait si les prochains MCP ne seront pas chargés à la demande partout, ni si les prochains agents ne s'en serviront pas bien mieux que Haiku dans le benchmark de Wachter. Le jour où les chiffres diront l'inverse, je changerai d'avis, et j'espère ne pas y mettre plus de temps que Symfony.

Ce que je retiens

Dix-huit mois, trois approches, un composant encore en 0.x chez le framework le plus structuré de l'écosystème PHP, et l'inventeur du protocole qui réécrit ses recommandations tous les six mois. Voilà à quoi ressemble un domaine à ses balbutiements. Ce n'est pas une critique, c'est une description, et c'est ce qui rend la période passionnante.

Puisque personne n'a la carte, la boussole compte plus. Mesurer plutôt que croire : vingt exécutions de Haiku, ce n'est pas un laboratoire, et ça a pourtant suffi à trancher. Construire de façon à pouvoir jeter : Mate a survécu à la disparition de son transport parce que ses outils n'en dépendaient pas. Et jeter quand les chiffres le disent, sans compter ce que ça a coûté.

Symfony vient de montrer les trois d'un coup. Ce n'est pas la première fois que ce framework m'apprend quelque chose qui dépasse le PHP.

Sources

  1. symfony/ai-mate, CHANGELOG et versions : 0.7 le 10 avril 2026, 0.12 le 22 juillet, 0.13 le 30 août, 0.14 le 25 septembre 2026.
  2. Johannes Wachter, Symfony AI Spotlight: Mate, an Agent's Way into Your Runtime, blog Symfony, 14 septembre 2026.
  3. Hamdi Laadhari, Deprecating My Symfony Profiler MCP Bundle: Right About the Problem, Half-Wrong About the Solution, septembre 2026.
  4. Symfony, Symfony AI v0.1.0, First Tagged Release, décembre 2025, et la documentation du composant Mate.
  5. Johannes Wachter, Mate Lab, benchmark MCP contre CLI, 25 août 2026.
  6. Anthropic, Introducing the Model Context Protocol, 25 novembre 2024.
  7. Anthropic, Code execution with MCP, 4 novembre 2025.
  8. Anthropic, Introducing advanced tool use on the Claude Developer Platform, 24 novembre 2025.
  9. Tessl, Anthropic brings MCP tool search to Claude Code, janvier 2026.
  10. Kahneman et Tversky, Prospect Theory: An Analysis of Decision under Risk, Econometrica, 1979.
  11. Arkes et Blumer, The psychology of sunk cost, Organizational Behavior and Human Decision Processes, 1985.
  12. Symfony, SymfonyLive Berlin 2026: Symfony AI-Mate et SymfonyOnline June 2026: Symfony Mate.
  13. Symfony, Our Backward Compatibility Promise.
  14. GitHub, github-mcp-server, section sur les toolsets.

Écrit en septembre 2026, trois semaines après la sortie de Mate 0.13. Les trois questions sont celles de cette rentrée, pas une règle gravée : si elles ne tiennent plus dans six mois, je l'écrirai ici, et ce sera plutôt une bonne nouvelle.