L'hygiène des serveurs MCP & Charger les MCP à la demande
Pourquoi chaque serveur MCP branché pèse sur les Outils de Claude Code, et comment ne garder que l'utile grâce aux scopes, à --mcp-config et à --strict-mcp-config.
L’hygiène des serveurs MCP
L’idée en une phrase
Un serveur MCP n’est jamais gratuit : chaque outil qu’il expose charge sa définition — nom, description, schéma JSON des arguments — et un serveur bien fourni pèse des dizaines de milliers de tokens avant le premier appel. L’hygiène MCP, c’est Reduce appliqué aux Outils (troisième primitive des Core 4, chapitre 3) : ne configurer que les serveurs utiles, au bon scope, pour ne pas encombrer l’agent principal.
Analogie : les applications d’un téléphone qui tournent en arrière-plan. Chacune, installée « au cas où », consomme batterie et mémoire même fermée — et il faut faire défiler dix écrans pour trouver celle dont on a besoin. Un téléphone propre ne garde que ce qu’on utilise vraiment. Une liste de serveurs MCP se tient de la même façon : chaque serveur branché coûte, appelé ou non.
Points clés
- Un serveur MCP = un lot d’outils, et chaque définition est du texte. Nom, description et schéma JSON des arguments s’additionnent : un serveur riche (base de données, navigateur, plateforme SaaS) représente couramment ~10 000 à 50 000 tokens de définitions. C’est un poste de Reduce majeur sur la primitive Outils, annoncé au chapitre 3.
- Trois scopes décident où un serveur se charge :
local(défaut, privé, stocké dans~/.claude.jsonsous le chemin du projet),project(fichier.mcp.jsonà la racine, versionné, partagé avec l’équipe),user(dans~/.claude.json, présent dans tous vos projets). Choisir le scope, c’est déjà faire de l’hygiène : un utilitaire mis enusers’invite partout. - Le déport natif est aujourd’hui le comportement par défaut. Le tool search (le « déport automatique » évoqué au chapitre 2) défère les définitions : au démarrage, seuls les noms d’outils et les instructions de serveur (tronquées à ~2 Ko) se chargent ; le schéma complet n’entre que lorsque l’agent en a besoin. Ajouter un serveur a donc un coût upfront faible — sur les modèles récents (Sonnet 4.5, Haiku 4.5, Opus 4.5 et suivants).
- Le déport ne dispense pas de l’hygiène. Les instructions de chaque serveur se chargent quand même, un serveur marqué
alwaysLoadcourt-circuite le déport, une sortie d’outil peut inonder la fenêtre (avertissement au-delà de ~10 000 tokens, plafond ~25 000 par défaut), et chaque serveur reste une surface d’approbation et de risque. Moins de serveurs configurés = un espace de recherche plus étroit et une attention plus nette. - Inspecter et ranger : la commande intégrée
/mcpmontre l’état des serveurs et gère l’authentification ; côté shell,claude mcp list,claude mcp add --scope …etclaude mcp removetiennent la liste propre.
Exemple concret
Quatre serveurs MCP riches placés en scope user — donc chargés dans chaque projet. Sans déport (ancien modèle ou ENABLE_TOOL_SEARCH=false), leurs définitions entrent d’un bloc au démarrage : GitHub ~12 000, base de données ~10 000, navigateur ~14 000, documentation ~6 000 — soit ~42 000 tokens, ~21 % d’une fenêtre de 200k, avant la première question, purement sur la primitive Outils. Avec le tool search par défaut, seuls les noms et instructions se chargent (~2 000 à 3 000 tokens) et les schémas restent déférés : le même quatuor tombe sous ~2 % upfront. Mais pour une tâche qui ne touche que GitHub, garder trois serveurs en scope user reste une faute d’hygiène : ils gonflent l’espace de recherche et chargent leurs instructions dans tous les projets. Les passer en scope project (là où ils servent) ramène les instructions présentes de ~3 000 à ~700 tokens et resserre l’attention.
Le coût d’un serveur MCP dans la fenêtre
| Situation | Coût MCP upfront | Effet sur l’attention | Geste |
|---|---|---|---|
| 4 serveurs, définitions chargées (tool search off) | ~42 000 tokens (~21 %) | diluée dès le départ | Reduce |
| 4 serveurs, tool search par défaut | ~2 000 à 3 000 (noms + instructions) | quasi neutre | déport natif |
| 1 serveur utile, bien scopé | ~700 tokens | dense | hygiène + scope |
Config — ranger ses serveurs au bon scope
# Inspecter l'etat des serveurs et s'authentifier (commande integree, tapee dans le REPL) :
/mcp
# Tenir la liste propre depuis le shell — choisir le SCOPE, c'est deja faire de l'hygiene :
claude mcp list
claude mcp add --transport http stripe --scope local https://mcp.stripe.com # prive, ce projet
claude mcp add --transport http paypal --scope project https://mcp.paypal.com/mcp # equipe, versionne dans .mcp.json
claude mcp remove paypal
# Reinitialiser les approbations des serveurs project (.mcp.json) d'un depot :
claude mcp reset-project-choices
Piège courant : « depuis le tool search, l’hygiène MCP ne sert plus à rien » est inexact. Le déport supprime le coût upfront des schémas, pas le reste : les instructions de chaque serveur se chargent toujours, un serveur
alwaysLoady échappe, ses sorties peuvent inonder la fenêtre, et il faut un modèle récent pour que le déport s’applique (il est désactivé sur d’anciens modèles et derrière certains proxys). Configurer proprement reste le premier geste de Reduce.
Charger les MCP à la demande : —mcp-config et —strict-mcp-config
L’idée en une phrase
Au-delà de l’hygiène de ce qui est configuré, Claude Code laisse décider, session par session, quels serveurs existent : --mcp-config charge des serveurs depuis un fichier JSON, et --strict-mcp-config rend cet ensemble exclusif en ignorant toute autre configuration MCP. C’est Reduce rendu explicite et reproductible — une liste blanche d’outils taillée pour la tâche.
Analogie : le videur à l’entrée d’une soirée, liste nominative en main. Peu importe qui habite l’immeuble : seuls les noms sur la liste entrent, tous les autres restent dehors.
--strict-mcp-configest cette liste — la session ne voit que les serveurs du fichier passé, quels que soient ceux configurés en local, project ou user.
Points clés
--mcp-configcharge des serveurs depuis un ou plusieurs fichiers JSON (ou chaînes, séparés par des espaces), en plus de ceux déjà configurés. Pratique pour brancher un serveur ponctuel sans toucher à sa configuration permanente.--strict-mcp-configrestreint la session aux seuls serveurs de--mcp-config: tout ce qui vient des scopes local, project et user est ignoré. Combinés, les deux drapeaux définissent un jeu d’outils hermétique.claude --strict-mcp-config --mcp-config ./task.mcp.jsonouvre une session avec exactement les serveurs du fichier — la liste blanche. Employé seul,--strict-mcp-config(sans--mcp-config) ne charge aucun serveur : une « salle blanche » sans MCP.- Reproductible et versionnable : un
.mcp.jsonde tâche, rangé dans le repo, rend le jeu d’outils explicite et rejouable — précieux en exécution scriptée (-p, CI) et pour cadrer un sous-agent. - Complémentaire du déport : même avec le tool search, moins de serveurs signifie un espace de recherche réduit, moins d’instructions chargées, moins d’invites d’approbation — et
--strict-mcp-configgarantit qu’aucun serveur de scopeuserne s’invite par surprise.
Exemple concret
Une exécution headless — claude -p "mets à jour l'intégration de paiement" — hérite par défaut des cinq serveurs de scope user : leurs noms et instructions se chargent (~4 000 à 5 000 tokens), gonflent l’espace de recherche et déclenchent des invites d’approbation, alors qu’un seul serveur est utile. En lançant claude --strict-mcp-config --mcp-config ./task.mcp.json avec le seul serveur Stripe, les quatre autres n’existent pas pour cette session : aucune instruction, aucun schéma déféré, aucune approbation, un espace de recherche réduit à un serveur, un démarrage plus rapide. La dépense MCP passe de ~4 500 à ~500 tokens — et surtout, la session devient reproductible : le même fichier versionné rejoue le même contexte d’outils.
Décider quels MCP existent
| Invocation | Serveurs présents | MCP chargé | Usage |
|---|---|---|---|
claude | tous ceux configurés | instructions + schémas déférés | quotidien |
claude --mcp-config extra.mcp.json | configurés + ceux du fichier | + le serveur ajouté | ajout ponctuel |
claude --strict-mcp-config --mcp-config task.mcp.json | uniquement ceux du fichier | minimal, explicite | liste blanche par tâche |
claude --strict-mcp-config | aucun | ~0 token MCP | salle blanche |
Commande — définir la liste blanche d’une tâche
# Session hermetique : UNIQUEMENT les serveurs du fichier, tout le reste est ignore.
claude --strict-mcp-config --mcp-config ./task.mcp.json
# Ajout ponctuel d'un serveur, en gardant ceux deja configures :
claude --mcp-config ./extra.mcp.json
# Salle blanche : aucun serveur MCP (utile en CI, en -p, ou pour un sous-agent focalise) :
claude --strict-mcp-config
Piège courant : croire que «
--mcp-configajoute des serveurs et--strict-mcp-configen retire » est approximatif.--mcp-configajoute les serveurs du fichier à ceux déjà configurés ; c’est--strict-mcp-configqui rend cet ensemble exclusif en ignorant les autres sources — il ne « retire » rien, il restreint la source. Et seul, sans--mcp-config, il ne laisse aucun serveur : la salle blanche, pas un no-op.
Fil rouge — Reduce ou Delegate ?
Ce chapitre est entièrement du côté Reduce, sur la primitive Outils des Core 4. L’hygiène des scopes limite ce qui est configuré ; --mcp-config et --strict-mcp-config décident, par session, ce qui existe réellement. L’impact se chiffre : sans déport, quatre serveurs branchés « au cas où » chargent ~42 000 tokens (~21 % de la fenêtre) de définitions avant la première question ; une liste blanche d’un seul serveur ramène la dépense MCP à quelques centaines de tokens. Même avec le tool search qui défère les schémas, réduire le nombre de serveurs resserre l’espace de recherche et les instructions chargées — donc préserve l’attention de l’agent principal. Delegate interviendra plus tard pour déporter les sorties volumineuses d’un outil vers un sous-agent ; ici, on réduit à la source ce qui entre.
Travaux pratiques
À chaque leçon, un petit artefact à déposer dans ton .claude/ — commande, sous-agent, hook, mémo… — pour te bâtir, au fil du livre, une boîte à outils de context engineering réutilisable.
Une config MCP ciblée — task.mcp.json
Ce chapitre donne un levier : autant en faire un fichier prêt à dégainer. Cette config MCP ciblée, à ranger dans le repo et à charger avec --strict-mcp-config, taille une liste blanche d’outils pour une tâche précise : la session ne voit que ce serveur, rien de ce qui traîne en scope user. C’est Reduce sur la primitive Outils — on décide ce qui existe au lieu de subir ce qui est configuré.
{
"mcpServers": {
"stripe": {
"type": "http",
"url": "https://mcp.stripe.com"
}
}
}
Lance la session par claude --strict-mcp-config --mcp-config ./task.mcp.json : seul le serveur Stripe existe, les autres serveurs de scope user ne chargent ni instructions ni schémas et ne déclenchent aucune approbation — la dépense MCP tombe de plusieurs milliers de tokens à quelques centaines, et le contexte d’outils devient reproductible d’une exécution à l’autre. Pour une autre tâche, on n’ajoute au bloc mcpServers que le serveur nécessaire.