SSD Nodes Learn 🎉 VPS dès $4.99/mois
Guides Matt ConnorPar Matt Connor

Compétence d’agent, MCP ou fichier de règles ?

Comparez compétence d’agent, serveur MCP et fichier de règles : tokens consommés, coût à chaque tour et règle pratique pour choisir le bon mécanisme.

Compétences d’agent, serveurs MCP et fichiers de règles : réponse courte

Les compétences d’agent, les serveurs MCP et les fichiers de règles fournissent tous des connaissances à un agent de codage. Choisissez selon la fonction de ces connaissances. Le 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 rester valables à 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 tour, car l’ensemble de la fenêtre de contexte est renvoyé avec chaque requête. La question utile 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 son utilisation

Les trois se chargent à des moments différents, et c’est toute la différence.

Un fichier de règles est chargé entièrement au lancement, à 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 bien suivi. 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 entre dans le contexte de chaque skill. Le modèle sait ainsi que la skill existe et comprend approximativement quand l’appliquer. 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 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émarrage 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 immédiatement. Il coûte toujours quelque chose, et il coûte toujours tout immédiatement dans les configurations où la recherche d’outils est désactivée.

ChartStartup and post-use context cost, estimated tokens
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"
  }
]

Ces valeurs sont des estimations, pas des mesures effectuées sur votre machine. Elles sont calculées à partir de la taille du texte chargé par chaque mécanisme, à raison d’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 qui expose douze outils contient environ 18 KB de schémas, plus un bloc d’instructions de 2 KB. Claude Code tronque la description de chaque outil et le champ d’instructions de chaque serveur à 2 KB. Cette partie est donc plafonnée. 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 besoin. La skill coûte 40 tokens dans cette même session, et 3,000 dans la session sur dix où elle est exécutée. Les deux dernières lignes concernent deux fois le même serveur, avec la recherche d’outils activée puis désactivée : 500 tokens contre 4,500. Cet écart explique pourquoi les anciennes recommandations sur l’encombrement du contexte par MCP continuent de circuler.

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 proxies 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 claude

La question décisive est la suivante : les données changent-elles entre deux appels ?

Posez d’abord cette question, car elle élimine immédiatement une option. Si l’agent doit lire ou écrire quelque chose qui peut être différent la prochaine fois qu’il le consulte, vous avez besoin d’un serveur. Par exemple, un outil de suivi des tickets, une base de données, un tableau de bord de supervision ou votre propre API interne (interface de programmation d’application). Le noter ne résout rien, car ce que vous avez écrit devient obsolète dès qu’une autre personne modifie l’enregistrement.

Si la réponse reste correcte dans six semaines sans que personne ne l’entretienne, vous avez besoin d’une skill. Par exemple, une checklist de release, une procédure de migration, la structure de vos réponses d’erreur ou la manière dont ce repository attend que les tests soient écrits. Une skill est un fichier dans git. Elle n’a ni port, ni processus, ni mode de défaillance autre qu’une erreur de contenu, qu’une code review peut détecter.

S’il s’agit d’un fait unique 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.

Quand 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, et les fichiers situés plus près 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 susceptibles de diverger.

ln -s AGENTS.md CLAUDE.md

Le 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’y figure pas, l’agent ne l’a jamais vu et aucune reformulation ne changera cela. Si vous voulez également ajouter des lignes spécifiques à Claude, utilisez plutôt la forme d’import 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 modifie 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 une paths dans ses frontmatter n’est chargé que lorsque l’agent manipule un fichier correspondant à l’un des patterns.

---
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. Le modèle à retenir est donc le suivant : des règles inconditionnelles courtes, complétées par 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 repository 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 quand l’utiliser. Une description comme « Aide aux déploiements » ne fournit aucun élément permettant au modèle de l’associer à une demande. La skill ne se déclenche alors jamais et vous pouvez conclure 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 champ de frontmatter name définit uniquement le libellé affiché dans les listings.

Lorsqu’une skill est invoquée, son contenu rendu entre dans 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. Écrivez des instructions permanentes plutôt que des étapes ponctuelles, et gardez le corps concis, car chaque ligne représente ensuite un coût récurrent pour chaque requête. Après une auto-compaction, Claude Code rattache la dernière invocation de chaque skill. Il conserve les 5,000 premiers tokens de chacune dans une limite combinée de 25,000 tokens. Si vous invoquez plusieurs skills volumineuses au cours d’une 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. Lorsque la même procédure s’applique à plusieurs codebases, partagez une skill entre plusieurs repositories 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-server

Le -- est important. Pour un serveur stdio, il sépare les propres 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 notion

claude mcp add confirme l’opération avec une ligne Added ..., ce qui indique seulement que la configuration a été écrite sur le disque. claude mcp list est la commande qui permet de vérifier la situation réelle, car elle affiche un état de santé à côté de chaque serveur : ✔ Connected, ! Needs authentication ou ✘ Failed to connect. Un état en échec signifie que Claude Code n’a pas pu joindre ce serveur, et non que la commande d’affichage de la 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 transporte tout ce dont il a besoin. C’est pourquoi un serveur MCP ne mémorise pas votre requête précédente. Cette conception a une conséquence que vous devez prendre en charge : tout état qui doit être conservé doit être stocké derrière le serveur, dans une base de données ou un fichier. Vous devez alors administrer cet élément.

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. Lorsque cet endroit est votre VPS (virtual private server), vous êtes responsable de sa disponibilité.

Un serveur stdio est le cas le moins coûteux. 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 cycle. Un serveur HTTP distant est un service de longue durée. Il nécessite donc les mêmes opérations que tout service de longue durée.

[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.target
sudo systemctl daemon-reload
sudo systemctl enable --now notes-mcp
systemctl is-active notes-mcp
journalctl -u notes-mcp -n 50 --no-pager

systemctl is-active doit afficher active. S’il affiche failed, le journal contient la cause. Lors d’une première exécution, 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 arrêté brutalement ne vous avertit pas. Vous l’apprenez lorsque l’agent vous indique qu’il ne peut pas lire votre outil de suivi des tickets.

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 correspond à une base de données que vous avez publiée. 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 reçoit des mises à jour de sécurité selon son propre cycle, indépendamment de l’agent qui communique avec lui. Son jeton OAuth expire, puis claude mcp list commence à afficher ! Needs authentication à un moment inopportun. Ses identifiants sont stockés dans un fichier de configuration ou dans un en-tête Authorization. Ils nécessitent donc les mêmes précautions que tout 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 aucune de ces opérations.

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 que vous devez maintenir en fonctionnement.

Comment mesurer le coût de votre propre contexte

Ne faites plus d’estimations : exécutez /context dans une session. Cette commande affiche le détail du démarrage : invite système, fichiers de mémoire, outils et serveurs MCP, avec le poids en tokens de chacun.

Vérifiez deux éléments. Sous 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 les instructions ne sont pas respectées. Examinez ensuite le coût de vos serveurs. Si un serveur que vous utilisez deux fois par mois représente l’une des lignes les plus importantes de cette liste, désactivez-le dans /mcp, puis réactivez-le pour les sessions qui en ont besoin. La configuration est conservée dans tous les cas.

Un serveur distant peut également indiquer 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 à 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 tous les serveurs se connectent au démarrage. Pour une vue d’ensemble, gérer la fenêtre de contexte de Claude Code explique ce qui est conservé lors de la compaction, et 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 habituelle est le description. C’est le seul texte disponible dans le contexte avant l’exécution de la skill. S’il ne décrit pas la situation, rien ne correspond. Écrivez le déclencheur directement dans la phrase : « Use when the user asks what changed, wants a commit message, or asks to review their diff. » Les descriptions vagues échouent silencieusement, ce qui les rend difficiles à repérer.

La deuxième cause est une erreur de saisie dans le frontmatter. Celle-ci est 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, name

La troisième cause concerne 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 dépôt. 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 la première fois que l’agent lit ou modifie 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 considère toute entrée sans 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 entry

Utiliser 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 le plus 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 anticipé. 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 questions concernant l’emplacement approprié. Supprimez l’élément, 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 fournit une réponse erronée 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 comment le maintenir opérationnel.

FAQ

Dois-je écrire une skill ou mettre en place un serveur MCP ?

Décidez selon que les informations changent entre deux invocations. Si l’agent doit lire un état en temps réel qu’une autre personne peut modifier, par exemple dans 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 restera correcte dans six semaines, écrivez une skill. La skill est un fichier dans git, sans processus à exécuter, sans port à exposer et sans 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’auparavant. 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 configuré 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 connaître votre situation, 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 pour 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 symlink simple, ou placez @AGENTS.md sur la première ligne d’un CLAUDE.md et ajoutez les instructions spécifiques à Claude en dessous. Démarrez ensuite une session et exécutez /context pour vérifier que CLAUDE.md apparaît sous Memory files.

Pourquoi ma skill a-t-elle cessé d’avoir un effet au milieu d’une session ?

L’auto-compaction est généralement en 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 combinée de 25,000 tokens pour l’ensemble. Il remplit cette limite en commençant par la skill invoquée le plus récemment. Ainsi, si vous avez invoqué plusieurs skills volumineuses, les plus anciennes sont complètement supprimées. Invoquez de nouveau la skill pour restaurer son contenu complet.

Comment empêcher le chargement d’un long fichier de règles à chaque session ?

Déplacez les parties qui ne sont utiles que dans certains cas vers des fichiers .claude/rules/ contenant un champ paths dans leur frontmatter. Chaque fichier ne sera alors chargé que lorsque l’agent accède à un fichier correspondant. Diviser le fichier en imports @path ne résout pas le problème, car les fichiers importés sont développés et chargés au démarrage en même temps que le fichier qui les référence. Toute procédure en plusieurs étapes, plutôt qu’un fait permanent, devrait devenir une skill, car le contenu d’une skill ne consomme rien tant qu’elle n’est pas invoquée.