|
| 1 | +--- |
| 2 | +title: "Serveurs MCP et Claude Code : ce que ça change pour un développeur Symfony" |
| 3 | +date: "2026-03-29" |
| 4 | +author: "Efficience IT" |
| 5 | +category: "IA" |
| 6 | +excerpt: "Les serveurs MCP connectent Claude Code à vos bases de données, votre GitHub et vos outils de monitoring. Cas d'usage concrets pour un workflow Symfony." |
| 7 | +image: "/images/blog/serveurs-mcp-symfony.webp" |
| 8 | +proficiencyLevel: "Intermediate" |
| 9 | +faq: |
| 10 | + - question: "Un serveur MCP peut-il modifier ma base de données de production ?" |
| 11 | + answer: "Oui, si le compte utilisé a les droits d'écriture. C'est pourquoi il est recommandé de configurer un accès en lecture seule pour la production et de réserver les droits d'écriture aux environnements de développement et de staging." |
| 12 | + - question: "Les serveurs MCP fonctionnent-ils uniquement avec Claude Code ?" |
| 13 | + answer: "Non. Le Model Context Protocol est un standard ouvert. D'autres outils compatibles MCP peuvent utiliser les mêmes serveurs. Cependant, Claude Code offre l'intégration la plus mature à ce jour, avec une gestion native de l'authentification et du cycle de vie des connexions." |
| 14 | + - question: "Faut-il héberger les serveurs MCP soi-même ?" |
| 15 | + answer: "Pas forcément. Certains services proposent des serveurs MCP hébergés (GitHub, Sentry, Notion). Pour les bases de données ou les outils internes, un serveur MCP local tourne sur votre machine et communique avec Claude Code via stdio. Aucune infrastructure supplémentaire n'est nécessaire." |
| 16 | + - question: "Les données transitent-elles par les serveurs d'Anthropic ?" |
| 17 | + answer: "Les données récupérées par un serveur MCP sont injectées dans le contexte de la conversation Claude. Elles transitent donc par l'API Anthropic au même titre que votre code source. Pour les données sensibles, vérifiez que votre politique de sécurité autorise ce traitement." |
| 18 | +--- |
| 19 | + |
| 20 | +Tu utilises Claude Code au quotidien sur tes projets Symfony. Tu as configuré ton [CLAUDE.md, tes skills et tes hooks](/article/monter-en-competence-claude-code). Mais chaque fois que tu as besoin d'une information qui n'est pas dans le code, tu dois la chercher toi-même : un schéma de table, une erreur Sentry, le contenu d'une PR. Le serveur MCP supprime cette friction. Il connecte Claude Code directement à tes outils, et l'agent accède aux données sans que tu aies à quitter le terminal. |
| 21 | + |
| 22 | +## Le Model Context Protocol en bref |
| 23 | + |
| 24 | +MCP est un protocole ouvert créé par Anthropic et publié sur [modelcontextprotocol.io](https://modelcontextprotocol.io). Il standardise la communication entre un agent IA et des services externes. Sans MCP, Claude Code est limité à ce qu'il voit dans ton arborescence de fichiers. Avec MCP, il peut interroger une base de données, lire tes erreurs Sentry, consulter une PR GitHub ou appeler une API interne. |
| 25 | + |
| 26 | +Un serveur MCP expose deux types de capacités : des **outils** (des fonctions que Claude Code peut appeler, comme "execute cette requête SQL") et des **ressources** (des données consultables, comme le schéma d'une table). Le protocole gère la découverte automatique : quand Claude Code se connecte à un serveur, il apprend quels outils sont disponibles et sait quand les utiliser. |
| 27 | + |
| 28 | +Le principe est simple. Tu déclares un serveur dans la configuration de ton projet. Claude Code le démarre automatiquement au lancement d'une session. Tu lui demandes "montre-moi le schéma de la table orders", il interroge le serveur MCP, récupère le résultat et raisonne dessus. Pas de copier-coller, pas de changement de fenêtre, pas d'aller-retour entre le terminal et un dashboard. |
| 29 | + |
| 30 | +Trois modes de transport existent : **stdio** pour les serveurs locaux (un processus sur ta machine, le plus courant en développement), **HTTP** pour les serveurs distants hébergés par un service tiers, et **SSE** (Server-Sent Events) pour les connexions persistantes. Sur un projet Symfony typique, tu utiliseras stdio pour la base de données et HTTP pour GitHub ou Sentry. |
| 31 | + |
| 32 | +## Connecter sa base de données Doctrine |
| 33 | + |
| 34 | +C'est le cas d'usage le plus immédiat pour un développeur Symfony. Ton application tourne sur MySQL ou PostgreSQL via [Doctrine](/article/doctrine-orm-3-0-une-nouvelle-version-majeure-pour-les-bases-de-donnees). Avec un serveur MCP, Claude Code peut interroger cette base directement. |
| 35 | + |
| 36 | +La configuration tient en une ligne : |
| 37 | + |
| 38 | +```bash |
| 39 | +claude mcp add --transport stdio db -- npx -y @bytebase/dbhub \ |
| 40 | + --dsn "mysql://readonly:password@localhost:3306/monprojet" |
| 41 | +``` |
| 42 | + |
| 43 | +Une fois connecté, tu peux demander : |
| 44 | + |
| 45 | +- "Montre-moi le schéma de la table product avec ses index" |
| 46 | +- "Combien de commandes ont un statut pending depuis plus de 7 jours ?" |
| 47 | +- "Trouve les utilisateurs qui ont un email en double" |
| 48 | +- "Génère une migration Doctrine pour ajouter une colonne deleted_at" |
| 49 | + |
| 50 | +Claude Code écrit la requête SQL, l'exécute via le serveur MCP, analyse le résultat et propose une action. Sur un projet en cours de [migration MySQL vers PostgreSQL](/article/migration-mysql-postgresql-doctrine-guide), tu peux même connecter les deux bases simultanément et demander à Claude de comparer les schémas. |
| 51 | + |
| 52 | +La question de la sécurité est centrale. En production, configure un accès en lecture seule. Un utilisateur MySQL ou PostgreSQL sans droits INSERT/UPDATE/DELETE garantit que Claude Code ne peut pas modifier les données par accident. En développement ou en staging, un accès complet permet à Claude Code de tester ses migrations en les appliquant directement. Combine ça avec un hook qui lance `php bin/console doctrine:schema:validate` après chaque modification et tu obtiens un workflow ou chaque changement de schéma est vérifié automatiquement. |
| 53 | + |
| 54 | +L'avantage par rapport à un simple copier-coller de schéma dans le chat : le serveur MCP donne à Claude Code un accès vivant à la base. Il peut vérifier ses hypothèses en temps réel, tester une requête avant de la transformer en QueryBuilder Doctrine, ou compter les lignes affectées par une migration avant de la proposer. |
| 55 | + |
| 56 | +## GitHub : piloter ses PRs sans quitter le terminal |
| 57 | + |
| 58 | +Le serveur MCP GitHub connecte Claude Code à ton repository. Tu peux lui demander de lire une PR, de commenter, de créer une issue ou de consulter les résultats de la CI. |
| 59 | + |
| 60 | +```bash |
| 61 | +claude mcp add --transport http github https://api.githubcopilot.com/mcp/ |
| 62 | +``` |
| 63 | + |
| 64 | +En pratique, tu ouvres Claude Code sur ta branche et tu lui dis : "Revois la PR #42 et identifie les problèmes d'architecture." Il lit le diff complet, le compare aux conventions de ton CLAUDE.md, et produit une review structurée. Si tu développes une [API REST](/article/api-rest-les-bonnes-pratiques), il peut vérifier que les endpoints respectent les conventions de nommage et les codes de retour HTTP. |
| 65 | + |
| 66 | +L'intégration GitHub devient encore plus intéressante quand tu la combines avec d'autres serveurs MCP. Claude Code peut lire une issue, consulter le schéma de la base pour comprendre le contexte, proposer une implémentation, puis créer la PR. Le tout sans que tu aies tapé une seule commande git. |
| 67 | + |
| 68 | +## Sentry : debugger la production en temps réel |
| 69 | + |
| 70 | +Un serveur MCP Sentry donne à Claude Code un accès direct à tes erreurs de production. Plus besoin d'aller lire les stack traces dans le dashboard. |
| 71 | + |
| 72 | +```bash |
| 73 | +claude mcp add --transport http sentry https://mcp.sentry.dev/mcp \ |
| 74 | + --header "Authorization: Bearer ${SENTRY_TOKEN}" |
| 75 | +``` |
| 76 | + |
| 77 | +Tu peux demander : "Quelles sont les 5 erreurs les plus fréquentes depuis le dernier déploiement ?" ou "Montre-moi la stack trace de cette exception EntityNotFoundException." Claude Code récupère les données, les croise avec ton code source, et propose un correctif. |
| 78 | + |
| 79 | +Sur un projet Symfony avec [de l'IA intégrée dans du code legacy](/article/symfony-ai-projet-legacy-retour-experience), la capacité de croiser les erreurs Sentry avec le code et la base de données accélère considérablement le diagnostic. Tu décris le symptôme, Claude Code récupère la stack trace via Sentry, inspecte le code concerné dans ton repo, et interroge la base si nécessaire pour reproduire le contexte. Le diagnostic qui prenait 30 minutes se fait en 2 minutes. |
| 80 | + |
| 81 | +## Créer un serveur MCP personnalisé |
| 82 | + |
| 83 | +Les serveurs communautaires couvrent les cas génériques. Mais sur un projet Symfony, tu as souvent des besoins spécifiques : interroger une API interne, consulter un cache Redis, lire la configuration d'un service métier. |
| 84 | + |
| 85 | +Créer un serveur MCP basique ne demande que quelques dizaines de lignes. Le SDK existe en TypeScript et en Python. Voici la structure minimale en TypeScript : |
| 86 | + |
| 87 | +```typescript |
| 88 | +import { Server } from "@modelcontextprotocol/sdk/server/index.js"; |
| 89 | +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; |
| 90 | + |
| 91 | +const server = new Server({ |
| 92 | + name: "symfony-tools", |
| 93 | + version: "1.0.0", |
| 94 | +}); |
| 95 | + |
| 96 | +server.setRequestHandler(ListToolsRequestSchema, async () => ({ |
| 97 | + tools: [{ |
| 98 | + name: "list_routes", |
| 99 | + description: "List Symfony routes matching a pattern", |
| 100 | + inputSchema: { |
| 101 | + type: "object", |
| 102 | + properties: { |
| 103 | + pattern: { type: "string" } |
| 104 | + } |
| 105 | + } |
| 106 | + }] |
| 107 | +})); |
| 108 | + |
| 109 | +server.setRequestHandler(CallToolRequestSchema, async (request) => { |
| 110 | + if (request.params.name === "list_routes") { |
| 111 | + const result = execSync( |
| 112 | + `php bin/console debug:router | grep ${request.params.arguments.pattern}` |
| 113 | + ); |
| 114 | + return { content: [{ type: "text", text: result.toString() }] }; |
| 115 | + } |
| 116 | +}); |
| 117 | + |
| 118 | +const transport = new StdioServerTransport(); |
| 119 | +await server.connect(transport); |
| 120 | +``` |
| 121 | + |
| 122 | +Ce serveur expose une commande `list_routes` qui appelle `debug:router` sur ton projet Symfony. Claude Code peut l'utiliser pour explorer les routes avant de modifier un contrôleur. Tu peux ajouter d'autres outils : `cache:clear`, `messenger:stats`, `doctrine:schema:validate`, ou n'importe quelle commande console Symfony. |
| 123 | + |
| 124 | +Le pattern [RAG avec Symfony AI et Doctrine](/article/rag-symfony-ai-doctrine-indexer-base-metier) va encore plus loin : un serveur MCP qui indexe tes données métier et les expose via une recherche vectorielle. Claude Code peut alors répondre a des questions comme "quel client a rencontré un problème similaire ?" en s'appuyant sur tes propres données. |
| 125 | + |
| 126 | +## Configuration projet vs configuration personnelle |
| 127 | + |
| 128 | +MCP supporte deux niveaux de configuration : |
| 129 | + |
| 130 | +Le fichier **`.mcp.json`** à la racine du projet est partagé via Git. Toute l'équipe accède aux mêmes serveurs. C'est l'endroit pour déclarer la base de données de dev, le GitHub du projet, le Sentry de l'équipe. |
| 131 | + |
| 132 | +Le fichier **`~/.claude.json`** est personnel. C'est l'endroit pour tes outils privés, tes tokens d'API, ou des serveurs expérimentaux que tu testes avant de les proposer à l'équipe. |
| 133 | + |
| 134 | +```json |
| 135 | +{ |
| 136 | + "mcpServers": { |
| 137 | + "db": { |
| 138 | + "type": "stdio", |
| 139 | + "command": "npx", |
| 140 | + "args": ["-y", "@bytebase/dbhub", "--dsn", "${DATABASE_URL}"] |
| 141 | + }, |
| 142 | + "github": { |
| 143 | + "type": "http", |
| 144 | + "url": "https://api.githubcopilot.com/mcp/" |
| 145 | + } |
| 146 | + } |
| 147 | +} |
| 148 | +``` |
| 149 | + |
| 150 | +Les variables d'environnement (`${DATABASE_URL}`) évitent de committer des credentials. Chaque développeur définit ses propres valeurs dans son `.env.local`, exactement comme pour la configuration Symfony. |
| 151 | + |
| 152 | +Le registre officiel sur [GitHub](https://github.com/modelcontextprotocol/servers) référence des centaines de serveurs communautaires. Pour un projet Symfony, commence par la base de données et GitHub. Ajoute Sentry quand tu gères de la production. Quand tu identifies un pattern répétitif dans tes échanges avec Claude Code, un [assistant IA bien configuré](/article/quel-assistant-ia-choisir-pour-coder) connecté à tes outils via MCP devient un vrai multiplicateur de productivité. La combinaison d'un CLAUDE.md solide, de skills adaptés et de serveurs MCP ciblés transforme un outil d'aide au code en plateforme de développement intégrée. |
0 commit comments