Agent : skills, serveurs MCP ou fichiers de règles ?
Comparez skills, serveurs MCP et fichiers de règles : découvrez quand les charger, leur coût en tokens à chaque échange et la règle simple pour choisir.
Compétences d’agent, serveurs MCP et fichiers de règles : la réponse courte
Les compétences d’agent, les serveurs MCP et les fichiers de règles mettent tous des connaissances à la disposition d’un agent de codage. Choisissez selon la nature de ces connaissances. MCP (model context protocol) sert aux données qui peuvent être différentes lors de la prochaine consultation. Une compétence décrit une procédure que vous pourriez rédiger aujourd’hui et qui resterait correcte dans six semaines. Un fichier de règles contient les quelques faits qui doivent être respectés à chaque session.
Ce choix a un coût : le contexte. Chaque token consacré à une instruction dont l’agent n’avait pas besoin est un token indisponible pour le code qu’il lit. Vous payez également ce token à chaque échange, car toute la fenêtre de contexte est renvoyée avec chaque requête. La bonne question n’est donc pas de savoir quel mécanisme peut effectuer la tâche. La plupart du temps, les trois le peuvent. Il faut plutôt déterminer lequel coûte le moins lorsqu’il reste inactif.
Ce que chacun vous coûte avant utilisation
Les trois mécanismes se chargent à des moments différents. C’est là toute la différence.
Un fichier de règles est chargé intégralement au démarrage, à chaque session, qu’il soit pertinent ou non. Claude Code lit CLAUDE.md au début de chaque conversation et le charge entièrement, quelle que soit sa longueur. La cible documentée est de moins de 200 lignes par fichier, car un fichier plus long consomme davantage de contexte et est moins souvent suivi correctement. Ces deux effets vont dans le même sens. C’est pourquoi un fichier de règles de 900 lignes est pire que s’il n’existait pas.
Une skill se charge en deux étapes. Au démarrage, seule la ligne description du frontmatter SKILL.md de chaque skill entre dans le contexte. Le modèle sait ainsi que la skill existe et comprend approximativement quand l’utiliser. Le corps est chargé lorsque la skill est invoquée. Un document de référence de 400 lignes ne vous coûte donc presque rien jusqu’au moment où il est nécessaire.
Un serveur MCP était auparavant le mécanisme le plus coûteux. C’est pourquoi la plupart des comparaisons que vous lirez sont désormais obsolètes. La recherche d’outils est activée par défaut dans les versions actuelles de Claude Code. Seuls les noms des outils et le champ d’instructions du serveur sont chargés au début de la session. Les schémas JSON (JavaScript Object Notation) complets sont différés jusqu’à ce que Claude les recherche. Ajouter un serveur ne coûte donc plus des milliers de tokens au démarrage. Cela a tout de même un coût, et ce coût reste entièrement immédiat lorsque la recherche d’outils est désactivée.
The data behind this chart
[
{
"label": "Rules file, 200 lines",
"at_startup": "2,500",
"after_use": "2,500"
},
{
"label": "Skill, 12 KB body",
"at_startup": 40,
"after_use": "3,000"
},
{
"label": "MCP server, tool search on",
"at_startup": 500,
"after_use": "3,200"
},
{
"label": "MCP server, tool search off",
"at_startup": "4,500",
"after_use": "4,500"
}
]Ce sont des estimations, pas des mesures effectuées sur votre machine. Elles reposent sur la taille du texte chargé par chaque mécanisme, avec environ quatre caractères par token : un fichier de règles de 200 lignes représente environ 10 KB de markdown, la description d’une skill environ 160 caractères, et un serveur exposant douze outils contient environ 18 KB de schémas, ainsi qu’un bloc d’instructions de 2 KB. Claude Code tronque chaque description d’outil et chaque champ d’instructions du serveur à 2 KB. Cette partie a donc une limite. La section suivante vous montre comment lire vos propres valeurs réelles.
Lisez les deux premières lignes ensemble. Le fichier de règles coûte 2,500 tokens dans une session où personne n’en a eu besoin. La skill coûte 40 tokens dans cette même session, et 3,000 dans la session sur dix où elle est utilisée. Les deux dernières lignes concernent le même serveur, avec la recherche d’outils activée puis désactivée : 500 tokens contre 4,500. C’est cet écart qui explique pourquoi les anciennes recommandations sur l’explosion du contexte liée à MCP circulent encore.
La recherche d’outils nécessite un modèle qui prend en charge les blocs tool_reference. En août 2026, cela signifie Claude Sonnet 4.5, Haiku 4.5, Opus 4.5 et les versions ultérieures. Claude Code la désactive lorsque ANTHROPIC_BASE_URL pointe vers un hôte qui n’est pas first-party, car la plupart des proxys ne transmettent pas ces blocs. Définissez ENABLE_TOOL_SEARCH pour la contrôler : false charge tous les schémas au démarrage, true les diffère tous, et auto les charge au démarrage uniquement lorsqu’ils tiennent dans 10% de la fenêtre de contexte.
# Load schemas up front only if they fit in 5% of the window
ENABLE_TOOL_SEARCH=auto:5 claudeLa question décisive est la suivante : les données changent-elles entre deux appels ?
Commencez par là, car cette question élimine immédiatement une option. Si l’agent doit lire ou écrire des informations qui peuvent être différentes la prochaine fois qu’il les consulte, vous avez besoin d’un serveur. Un issue tracker, une base de données, un tableau de bord de monitoring, votre propre API interne (application programming interface). Les écrire dans un fichier ne sert à rien, car ce que vous avez écrit est obsolète dès que quelqu’un d’autre modifie l’enregistrement. Votre propre codebase fait également partie de cette liste, car sa structure évolue à chaque commit. C’est pourquoi il vaut mieux fournir à l’agent une représentation parsée du repository via MCP que de décrire son organisation dans un fichier qui vieillit.
Si la réponse reste correcte dans six semaines sans que personne n’ait besoin de la maintenir, vous avez besoin d’une skill. Une checklist de release. Une procédure de migration. La structure de vos réponses d’erreur. La manière dont ce repository exige d’écrire les tests. Une skill est un fichier dans git. Elle n’a ni port ni processus, et son seul mode de défaillance consiste à être incorrecte, ce qu’une code review peut détecter.
S’il s’agit d’un fait qui doit s’appliquer à un travail auquel vous n’avez pas encore pensé, placez-le dans le fichier de règles. Run make lint before committing. Never push to main. Handlers live in src/api/handlers/. Une ligne par fait. Dès qu’une entrée se transforme en étapes, ce n’est plus un fait, mais une procédure. Elle doit alors être déplacée dans une skill.
Lorsqu’un fichier de règles suffit
Les fichiers de règles sont chargés depuis plusieurs emplacements, du plus général au plus spécifique : un fichier de stratégie géré, votre ~/.claude/CLAUDE.md personnel, le ./CLAUDE.md ou ./.claude/CLAUDE.md du projet, puis un ./CLAUDE.local.md ignoré par git. Tous les fichiers détectés sont concaténés au lieu de se remplacer mutuellement, et les fichiers les plus proches de votre répertoire de travail sont lus en dernier.
Claude Code lit CLAUDE.md, pas AGENTS.md. Si votre dépôt contient déjà un AGENTS.md pour d’autres outils, ne gérez pas deux copies qui finiront par diverger.
ln -s AGENTS.md CLAUDE.mdLe lien symbolique n’affiche rien en cas de succès. Démarrez une session, exécutez /context, puis vérifiez que CLAUDE.md apparaît sous Fichiers de mémoire. S’il n’est pas listé, l’agent ne l’a jamais vu et aucune reformulation ne résoudra le problème. Si vous voulez aussi ajouter des lignes spécifiques à Claude, utilisez plutôt la forme d’importation et placez-les sous l’import.
@AGENTS.md
## Claude Code
Use plan mode for changes under `src/billing/`.Un piège se trouve ici. Les imports @path ne réduisent pas le contexte. Le fichier importé est développé et chargé au lancement avec le fichier qui le référence, jusqu’à quatre niveaux de profondeur. Diviser un fichier de règles de 600 lignes en six imports l’organise pour les humains, mais ne change absolument pas le coût en tokens. Les conventions derrière AGENTS.md et son équivalent destiné aux humains méritent d’être lues avant de choisir une organisation.
Ce qui réduit le coût, c’est .claude/rules/ avec un champ paths. Un fichier de règles contenant un paths dans son frontmatter n’est chargé que lorsque l’agent manipule un fichier correspondant à l’un des motifs.
---
paths:
- "src/api/**/*.ts"
---
# API rules
- Every endpoint validates its input.
- Use the standard error response shape.Une règle sans champ paths est chargée au lancement avec la même priorité que .claude/CLAUDE.md. La méthode pratique consiste donc à utiliser de courtes règles inconditionnelles, ainsi qu’une liste paths pour tout ce qui ne s’applique qu’à l’intérieur d’un répertoire.
Quand vous avez besoin d’une skill
Une skill est un répertoire qui contient un fichier SKILL.md. Les skills personnelles se trouvent dans ~/.claude/skills/<name>/SKILL.md et s’appliquent à tous les projets de votre machine. Les skills de projet se trouvent dans .claude/skills/<name>/SKILL.md, sont versionnées avec le dépôt et peuvent être examinées dans une pull request comme n’importe quel autre fichier.
mkdir -p ~/.claude/skills/summarize-changes---
name: summarize-changes
description: Summarizes uncommitted changes and flags anything risky. Use when the user asks what changed, wants a commit message, or asks to review their diff.
---
Run `git status` and `git diff` against the merge base.
Group the changes by intent, not by file.
Call out anything touching auth, migrations or deletions.Le description est la seule partie de ce fichier présente dans le contexte avant l’exécution de la skill. Il remplit donc deux fonctions. Il indique ce que fait la skill et précise dans quels cas l’utiliser. Une description comme « Aide aux déploiements » ne fournit au modèle aucun élément pour faire correspondre une requête. La skill ne se déclenche alors jamais et vous concluez qu’elles ne fonctionnent pas.
Le nom du répertoire devient la commande. Dans l’exemple précédent, vous obtenez donc /summarize-changes. Dans une skill personnelle ou de projet, le frontmatter name définit uniquement le libellé affiché dans les listes.
Une fois qu’une skill est invoquée, son contenu rendu est ajouté à la conversation sous la forme d’un seul message et y reste pendant toute la session. Claude Code ne relit pas le fichier lors des tours suivants. Rédigez des consignes persistantes plutôt que des étapes ponctuelles et gardez le corps concis, car chaque ligne représente ensuite un coût récurrent à chaque requête. Après une auto-compaction, Claude Code rattache l’invocation la plus récente de chaque skill et conserve les 5 000 premiers tokens de chacune dans un budget cumulé de 25 000 tokens. Si vous invoquez plusieurs skills volumineuses au cours d’une même session, les plus anciennes sont entièrement supprimées. C’est pourquoi une skill peut sembler ne plus avoir d’effet après une longue conversation. Invoquez-la de nouveau pour la réactiver. Une skill qui impose beaucoup de procédures rend cet arbitrage concret : la skill unlazy et sa méthode Depth Tree consomme une partie réelle du contexte avec des gates et un fichier de plan, en échange d’un agent qui cesse de déclarer trop tôt que le travail est terminé. Lorsque la même procédure s’applique à plusieurs codebases, partagez une seule skill entre plusieurs dépôts au lieu de copier le fichier.
Quand vous avez besoin d’un serveur MCP
L’ajout se fait avec une seule commande, et le transport détermine sa forme.
# Remote HTTP server
claude mcp add --transport http notion https://mcp.notion.com/mcp
# Remote HTTP server behind a bearer token
claude mcp add --transport http secure-api https://api.example.com/mcp \
--header "Authorization: Bearer your-token"
# Local stdio server: everything after -- is passed through untouched
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable \
-- npx -y airtable-mcp-serverLe -- est important. Pour un serveur stdio, il sépare les options de Claude Code de la ligne de commande qui démarre votre serveur. Si vous l’omettez, un --port 8080 destiné au serveur est interprété comme une option de claude mcp add, qui le rejette ensuite.
claude mcp list
claude mcp get notionclaude mcp add confirme l’opération avec une ligne Added ..., ce qui indique uniquement que la configuration a été écrite sur le disque. claude mcp list est la commande qui permet de connaître l’état réel, car elle affiche un état de santé à côté de chaque serveur : ✔ Connected, ! Needs authentication ou ✘ Failed to connect. Un état d’échec signifie que Claude Code n’a pas pu joindre ce serveur, et non que la commande de liste a échoué. Dans une session, /mcp affiche la même vue pour chaque serveur, avec en plus le nombre d’outils.
Chaque appel à un serveur MCP est indépendant et contient tout ce dont il a besoin. C’est pourquoi un serveur MCP ne mémorise pas votre requête précédente. Il s’agit d’un choix de conception qui entraîne une conséquence à votre charge : tout état à conserver doit se trouver derrière le serveur, dans une base de données ou un fichier, et cet élément relève désormais de votre exploitation.
Un serveur MCP est un processus que vous devez exécuter
Voici le coût que les comparatifs des fournisseurs omettent. Une skill est un fichier. Un serveur MCP est un logiciel qui s’exécute quelque part. Si ce quelque part est votre VPS (virtual private server), vous êtes responsable de sa disponibilité.
Un serveur stdio est le cas le plus simple. Claude Code le lance comme processus enfant au démarrage de la session, puis il s’arrête à la fin de la session. Il n’y a rien à superviser ni à mettre à jour selon son propre calendrier. Un serveur HTTP distant est un service permanent. Il a donc besoin de tout ce qui est nécessaire à un service permanent.
[Unit]
Description=Notes MCP server
After=network-online.target
Wants=network-online.target
[Service]
User=mcp
WorkingDirectory=/srv/notes-mcp
ExecStart=/usr/bin/node /srv/notes-mcp/dist/server.js
Environment=PORT=8931
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now notes-mcp
systemctl is-active notes-mcp
journalctl -u notes-mcp -n 50 --no-pagersystemctl is-active doit afficher active. S’il affiche failed, le journal contient la raison. Lors d’un premier lancement, il s’agit presque toujours d’une variable d’environnement manquante ou d’un port déjà utilisé par un autre processus. Restart=on-failure n’est pas facultatif ici, car un serveur MCP qui plante ne le signale pas. Vous le découvrez lorsque l’agent vous indique qu’il ne peut pas lire votre issue tracker.
Liez le processus à 127.0.0.1 et placez un reverse proxy avec TLS (transport layer security) devant lui. Un serveur MCP qui accède à votre base de données et répond sur un port public sans authentification revient à publier votre base de données. Exécuter un serveur MCP sur un VPS explique correctement la configuration du proxy, du certificat et du firewall.
Évaluez ensuite honnêtement le travail récurrent. Le service installe ses mises à jour de sécurité selon son propre calendrier, indépendamment de l’agent qui communique avec lui. Son token OAuth expire, puis claude mcp list commence à afficher ! Needs authentication à un moment particulièrement mal choisi. Ses identifiants sont stockés dans un fichier de configuration ou dans un en-tête Authorization. Ils doivent donc être protégés comme n’importe quel autre secret. C’est un sujet à part entière : garder les secrets hors de portée d’un agent IA. Une skill ne nécessite aucun de ces travaux.
Comparez cette solution à l’alternative avant de la mettre en place. Si les données du serveur envisagé ne changent qu’environ une fois par trimestre, une skill qui indique à l’agent où chercher et explique la signification des champs coûte moins cher qu’un service qu’il faut maintenir en fonctionnement.
Comment mesurer le coût de votre propre contexte
Ne l’estimez plus : exécutez /context dans une session. Cette commande affiche le détail du démarrage : prompt système, fichiers de mémoire, outils et serveurs MCP, avec le poids en tokens de chacun.
Vérifiez deux éléments. Dans Memory files, confirmez que tous les fichiers de règles attendus sont répertoriés. Un fichier manquant est invisible pour l’agent. C’est donc le premier point à vérifier lorsque des instructions ne sont pas respectées. Si le fichier est répertorié mais que la règle est toujours ignorée, la cause se trouve ailleurs. Il est alors utile d’examiner les raisons pour lesquelles un agent ignore une instruction qu’il peut voir avant de réécrire la ligne. Regardez ensuite le coût de vos serveurs. Si un serveur que vous utilisez deux fois par mois figure parmi les postes les plus importants de la liste, désactivez-le dans /mcp et réactivez-le pour les sessions qui en ont besoin. La configuration est conservée dans tous les cas.
Un serveur distant peut également renvoyer un état comme cached 2h ago · connects on first use · 5 tools. Cela signifie que Claude Code a lu la liste des outils d’une session précédente au lieu de se connecter au démarrage. Il se connectera lors du premier appel d’un outil. Les outils sont disponibles dès votre premier message : il n’y a donc rien à corriger. Définissez MCP_DISCOVERY_CACHE=0 si vous préférez que chaque serveur se connecte au démarrage. Pour une vue d’ensemble, la gestion de la fenêtre de contexte de Claude Code explique ce qui est conservé après la compaction, tandis que le coût réel de ces tokens convertit ces chiffres en montant financier.
Pourquoi ma skill ne se déclenche-t-elle jamais ?
La cause la plus fréquente est le description. C’est le seul texte présent dans le contexte avant l’exécution de la skill. S’il ne décrit pas la situation, rien ne correspond. Indiquez le déclencheur directement dans la phrase : « À utiliser lorsque l’utilisateur demande ce qui a changé, souhaite un commit message ou demande une revue de son diff. » Les descriptions vagues échouent sans message d’erreur, ce qui rend le problème difficile à détecter.
La deuxième cause est une faute de frappe dans le frontmatter. Celle-ci produit une erreur explicite. Une clé inconnue est immédiatement rejetée :
Unexpected key(s) in SKILL.md frontmatter: argument-hint. Allowed properties are: allowed-tools, compatibility, description, license, metadata, nameLa troisième cause est l’emplacement. Les project skills sont chargées depuis .claude/skills/ dans votre répertoire de travail et dans chacun de ses répertoires parents jusqu’à la racine du repository. Les skills situées dans des répertoires imbriqués sous le répertoire depuis lequel vous avez démarré ne sont pas chargées au lancement. Elles apparaissent lorsque l’agent lit ou modifie pour la première fois un fichier dans ce sous-répertoire. Jusque-là, elles ne sont pas proposées par l’autocomplétion et ne peuvent pas être invoquées par leur nom.
L’équivalent MCP de cet échec silencieux est une entrée .mcp.json avec un url et sans type. Claude Code traite toute entrée dépourvue de type comme un serveur stdio. Il ignore donc l’entrée et affiche :
MCP server "notes" has a "url" but no "type"; add "type": "http" (or "sse" / "ws") to this entryUtiliser les trois ensemble
Ces mécanismes ne se disputent pas le même emplacement. Une configuration efficace utilise chacun là où son coût est faible. Le fichier de règles contient quelques lignes qui sont valables partout. Les skills contiennent les procédures et ne sont chargées que lorsqu’elles s’appliquent. Un serveur MCP, parfois deux, connecte les systèmes dont le contenu ne peut pas être prédit à l’avance. Si vous êtes encore en train de construire votre modèle mental du premier mécanisme, ce qu’est réellement une skill d’agent présente le format en détail.
Un test permet de trancher la plupart des débats sur l’emplacement d’un élément. Supprimez-le, démarrez une nouvelle session et donnez la tâche à l’agent. Si l’agent est simplement plus lent, l’élément devait se trouver dans une skill. Si l’agent se trompe avec assurance, l’élément devait se trouver dans le fichier de règles. Si l’agent ne peut pas obtenir l’information, vous aviez besoin du serveur et vous devez maintenant aussi prévoir son maintien en fonctionnement.
FAQ
Dois-je écrire une skill ou déployer un serveur MCP ?
Décidez selon que les informations changent entre deux utilisations. Si l’agent doit lire un état actuel que quelqu’un d’autre peut modifier, par exemple un outil de suivi des tickets, une base de données ou un dashboard, vous avez besoin d’un serveur MCP, car toute information écrite devient obsolète dès que l’enregistrement change. Si vous pouvez écrire la réponse une fois et qu’elle reste correcte dans six semaines, écrivez une skill. La skill est un fichier dans git : aucun processus à exécuter, aucun port à exposer et aucun calendrier de correctifs. C’est donc l’option la moins coûteuse dès qu’elle est possible.
Les serveurs MCP remplissent-ils toujours ma fenêtre de contexte ?
Beaucoup moins qu’avant. La recherche d’outils est activée par défaut dans Claude Code actuel. Seuls les noms des outils et le champ d’instructions du serveur sont chargés au démarrage de la session. Les schémas complets sont récupérés lorsque Claude les recherche. Le chargement initial a toujours lieu lorsque la recherche d’outils est désactivée : avec ENABLE_TOOL_SEARCH=false, avec ANTHROPIC_BASE_URL pointé vers un proxy qui n’est pas first-party, ou avec un modèle antérieur à la génération Claude 4.5. Exécutez /context pour savoir dans quelle situation vous êtes, car les chiffres des anciens articles comparatifs supposent un chargement initial.
Claude Code lit-il AGENTS.md ?
Non. Claude Code lit CLAUDE.md. Si votre dépôt contient déjà un AGENTS.md destiné à d’autres agents, faites pointer l’un vers l’autre au lieu de conserver deux copies. Exécutez ln -s AGENTS.md CLAUDE.md pour créer un lien symbolique simple, ou placez @AGENTS.md sur la première ligne d’un CLAUDE.md et ajoutez les instructions propres à Claude en dessous. Démarrez ensuite une session et exécutez /context pour confirmer que CLAUDE.md apparaît sous Memory files.
Pourquoi ma skill n’a-t-elle plus aucun effet au milieu d’une session ?
La compaction automatique en est généralement la cause. Lorsque la conversation est résumée, Claude Code rattache l’invocation la plus récente de chaque skill. Il conserve les 5,000 premiers tokens de chacune, dans une limite globale de 25,000 tokens pour l’ensemble. Il remplit cette limite en commençant par la skill invoquée le plus récemment. Si vous avez invoqué plusieurs skills volumineuses, les plus anciennes sont entièrement supprimées. Invoquez de nouveau la skill pour restaurer son contenu complet.
Comment empêcher un fichier de règles volumineux de se charger à chaque session ?
Déplacez les parties qui ne sont utiles que dans certains cas vers des fichiers .claude/rules/ comportant un champ paths dans leur frontmatter. Ainsi, chaque fichier ne se charge que lorsque l’agent manipule un fichier correspondant. Diviser le fichier en imports @path ne sert à rien, car les fichiers importés sont développés et chargés au démarrage, avec le fichier qui les référence. Toute procédure en plusieurs étapes, plutôt qu’un fait permanent, doit devenir une skill, car le contenu d’une skill ne consomme rien tant qu’elle n’est pas invoquée.