Agent skills, MCP-servers of rules-bestanden gebruiken?
Kies de juiste methode voor uw coding agent. Ontdek de verschillen in tokenverbruik en onderhoud tussen skills, MCP-servers en rules-bestanden om uw contextvenster te optimaliseren.
Agent skills versus MCP-servers versus rules-bestanden: het korte antwoord
Agent skills, MCP-servers en rules-bestanden bieden alle drie kennis aan een coding agent. Maak uw keuze op basis van de functie van de kennis. MCP (Model Context Protocol) is bedoeld voor gegevens die kunnen veranderen wanneer u ze opnieuw raadpleegt. Een skill is bedoeld voor een procedure die u vandaag kunt uitschrijven en die over zes weken nog steeds correct is. Een rules-bestand is bedoeld voor de weinige feiten die in elke sessie moeten gelden.
Aan deze keuze zijn kosten verbonden, en die kosten worden uitgedrukt in context. Elke token die wordt besteed aan een instructie die de agent niet nodig had, is een token die niet beschikbaar is voor de code die de agent leest. Bovendien betaalt u deze token bij elke beurt opnieuw, omdat het volledige contextvenster bij elk verzoek opnieuw wordt verzonden. De relevante vraag is dus niet welk mechanisme de taak kan uitvoeren. Meestal kunnen ze alle drie de taak aan. De vraag is welke optie de minste kosten met zich meebrengt wanneer deze niet actief is.
Wat elk onderdeel kost voordat u het gebruikt
De drie onderdelen worden op verschillende momenten geladen, en dat tijdsverschil is cruciaal.
Een rules-bestand wordt bij de start van elke sessie volledig geladen, ongeacht of het relevant is. Claude Code leest CLAUDE.md aan het begin van elk gesprek en laadt het volledig, ongeacht de lengte. Het aanbevolen doel is minder dan 200 regels per bestand, omdat een langer bestand meer context kost en minder betrouwbaar wordt opgevolgd. Beide effecten werken in dezelfde richting, wat de reden is dat een rules-bestand van 900 regels averechts werkt.
Een skill wordt in twee fasen geladen. Bij het opstarten wordt alleen de description-regel uit de SKILL.md-frontmatter in de context geladen, zodat het model weet dat de skill bestaat en wanneer deze ongeveer van toepassing is. De inhoud wordt pas geladen wanneer de skill wordt aangeroepen. Een referentiedocument van 400 regels kost u daarom vrijwel niets totdat het moment daar is dat het nodig is.
Een MCP-server was voorheen de kostbare optie, en dit is waar de meeste vergelijkingen die u leest inmiddels verouderd zijn. Tool search staat in de huidige versie van Claude Code standaard aan. Alleen de toolnamen en het instructieveld van de server worden bij de start van de sessie geladen, en de volledige JSON (JavaScript object notation)-schema's worden uitgesteld totdat Claude ernaar zoekt. Het toevoegen van een server kost niet langer duizenden tokens vooraf. Het kost nog steeds iets, en het kost nog steeds alles vooraf in configuraties waar tool search is uitgeschakeld.
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"
}
]Dit zijn schattingen, geen metingen vanaf uw eigen machine. Ze zijn gebaseerd op de omvang van de tekst die elk mechanisme laadt, uitgaande van ongeveer vier tekens per token: een rules-bestand van 200 regels is ongeveer 10 KB aan markdown, een skill-beschrijving is ongeveer 160 tekens, en een server die twaalf tools aanbiedt bevat ongeveer 18 KB aan schema plus een instructieblok van 2 KB. Claude Code kapt elke toolbeschrijving en elk instructieveld van de server af op 2 KB, waardoor dat deel een bovengrens heeft. De volgende sectie laat zien hoe u uw eigen werkelijke cijfers kunt inzien.
Bekijk de eerste twee rijen in samenhang. Het rules-bestand kost 2,500 tokens in een sessie waarin niemand het nodig had. De skill kost 40 tokens in diezelfde sessie, en 3,000 in de ene sessie op de tien waarin deze wordt geactiveerd. De laatste twee rijen betreffen dezelfde server, met tool search aan en uit: 500 tokens tegenover 4,500. Dat verschil is de reden waarom verouderd advies over MCP-contextvervuiling nog steeds de ronde doet.
Tool search vereist een model dat tool_reference-blokken ondersteunt, wat per augustus 2026 betekent: Claude Sonnet 4.5, Haiku 4.5, Opus 4.5 en nieuwer. Claude Code schakelt dit uit wanneer ANTHROPIC_BASE_URL naar een host wijst die geen first-party host is, omdat de meeste proxy's deze blokken niet doorsturen. Stel ENABLE_TOOL_SEARCH in om dit te beheren: false laadt elk schema vooraf, true stelt ze allemaal uit, en auto laadt ze alleen vooraf als ze binnen 10% van het contextvenster passen.
# Load schemas up front only if they fit in 5% of the window
ENABLE_TOOL_SEARCH=auto:5 claudeDe doorslaggevende vraag: verandert de data tussen aanroepen?
Stel deze vraag als eerste, omdat hiermee direct één optie wordt geëlimineerd. Als de agent iets moet lezen of schrijven dat de volgende keer anders kan zijn, heeft u een server nodig. Een issue tracker, een database, een monitoring-dashboard, uw eigen interne API (application programming interface). Het opschrijven helpt niet, omdat wat u heeft opgeschreven verouderd is zodra iemand anders het record bewerkt.
Als het antwoord over zes weken nog steeds correct zou zijn zonder dat iemand het onderhoudt, dan heeft u een skill nodig. Een release-checklist. Een migratieprocedure. De vorm van uw foutmeldingen. Hoe dit repository wil dat tests worden geschreven. Een skill is een bestand in git. Het heeft geen poort, geen proces en geen faalmodus, behalve dat het onjuist kan zijn, wat door een code review kan worden opgevangen.
Als het één feit is dat van toepassing moet zijn op werk waar u nog niet aan heeft gedacht, plaats het dan in het rules-bestand. Run make lint before committing. Never push to main. Handlers live in src/api/handlers/. Eén regel per item. Zodra een invoer uitgroeit tot stappen, is het geen feit meer maar een procedure, en moet het worden verplaatst naar een skill.
Wanneer een regelsbestand volstaat
Regelsbestanden worden vanaf verschillende locaties geladen, van algemeen naar specifiek: een beheerd beleidsbestand, uw persoonlijke ~/.claude/CLAUDE.md, het ./CLAUDE.md of ./.claude/CLAUDE.md van het project, en een ./CLAUDE.local.md die door git wordt genegeerd. Alle gevonden bestanden worden samengevoegd in plaats van elkaar te overschrijven, en bestanden die zich dichter bij uw werkmap bevinden, worden als laatste gelezen.
Claude Code leest CLAUDE.md, niet AGENTS.md. Als uw repository al een AGENTS.md bevat voor andere tools, onderhoud dan geen twee kopieën die na verloop van tijd van elkaar gaan afwijken.
ln -s AGENTS.md CLAUDE.mdDe symlink geeft bij succes geen uitvoer. Start een sessie, voer /context uit en bevestig dat CLAUDE.md verschijnt onder Memory files. Als het daar niet wordt vermeld, heeft de agent het bestand nooit gezien en zal herschrijven niet helpen. Wanneer u ook Claude-specifieke regels wilt, gebruik dan de import-vorm en plaats deze onder de import.
@AGENTS.md
## Claude Code
Use plan mode for changes under `src/billing/`.Hier schuilt een valkuil. @path-imports slaan geen context op. Het geïmporteerde bestand wordt bij het opstarten geëxpandeerd en geladen naast het bestand dat ernaar verwijst, tot een diepte van vier niveaus. Het opsplitsen van een regelsbestand van 600 regels in zes imports zorgt voor overzicht voor mensen, maar verandert niets aan de tokencost. De conventies achter AGENTS.md en de tegenhanger voor mensen zijn het lezen waard voordat u een structuur vastlegt.
Wat de kosten wel verlaagt, is .claude/rules/ met een paths-veld. Een regelsbestand met paths-frontmatter wordt alleen geladen wanneer de agent een bestand aanraakt dat overeenkomt met een van de patronen.
---
paths:
- "src/api/**/*.ts"
---
# API rules
- Every endpoint validates its input.
- Use the standard error response shape.Een regel zonder paths-veld wordt bij het opstarten geladen met dezelfde prioriteit als .claude/CLAUDE.md. De werkbare methode is daarom korte, onvoorwaardelijke regels, aangevuld met een paths-lijst voor alles wat alleen relevant is binnen één specifieke map.
Wanneer u een skill wilt gebruiken
Een skill is een map met daarin een SKILL.md. Persoonlijke skills bevinden zich in ~/.claude/skills/<name>/SKILL.md en zijn van toepassing op elk project op uw machine. Project-skills bevinden zich in .claude/skills/<name>/SKILL.md, reizen mee met de repository en kunnen net als elk ander bestand worden beoordeeld in een pull request.
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.De description is het enige onderdeel van dat bestand dat in de context staat voordat de skill wordt uitgevoerd, dus het vervult twee taken. Het beschrijft wat de skill doet en wanneer deze moet worden ingezet. Een beschrijving als "Helpt bij deploys" geeft het model geen aanknopingspunten om een verzoek aan te koppelen, waardoor de skill stilzwijgend nooit wordt geactiveerd en u concludeert dat skills niet werken.
De mapnaam wordt het commando, dus het bovenstaande voorbeeld geeft u /summarize-changes. In een persoonlijke of project-skill stelt de frontmatter name alleen het weergavelabel in lijsten in.
Zodra een skill is aangeroepen, wordt de gegenereerde inhoud als één bericht in het gesprek opgenomen en blijft daar voor de rest van de sessie staan. Claude Code leest het bestand niet opnieuw bij latere beurten. Schrijf permanente instructies in plaats van eenmalige stappen en houd de tekst beknopt, omdat vanaf dat moment elke regel een terugkerende kostenpost is bij elk verzoek. Na automatische compressie voegt Claude Code de meest recente aanroep van elke skill opnieuw toe, waarbij de eerste 5.000 tokens van elk worden behouden binnen een gecombineerd budget van 25.000 tokens. Roep meerdere grote skills aan in één sessie en de oudste worden volledig verwijderd; dit is de reden waarom een skill na een lang gesprek niet meer relevant lijkt te zijn. Roep deze opnieuw aan en de skill is weer actief. Wanneer dezelfde procedure op meer dan één codebase van toepassing is, deel één skill over meerdere repositories in plaats van het bestand te kopiëren.
Wanneer u een MCP-server nodig heeft
Het toevoegen van een server is een enkel commando, en het transport bepaalt de vorm ervan.
# 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-serverDe -- is van belang. Bij een stdio-server scheidt deze de opties van Claude Code zelf van de command line die uw server start. Laat u deze weg, dan wordt een --port 8080 die voor de server bedoeld is, geparseerd als een optie voor claude mcp add, welke deze vervolgens afwijst.
claude mcp list
claude mcp get notionclaude mcp add bevestigt dit met een Added ...-regel, die enkel aangeeft dat de configuratie naar de schijf is geschreven. claude mcp list is het commando dat u de waarheid vertelt, omdat het een gezondheidsstatus naast elke server afdrukt: ✔ Connected, ! Needs authentication of ✘ Failed to connect. Een foutstatus betekent dat Claude Code die server niet kon bereiken, niet dat het list-commando defect is. Binnen een sessie geeft /mcp hetzelfde overzicht per server, inclusief het aantal tools.
Elke aanroep naar een MCP-server staat op zichzelf en bevat alles wat nodig is, wat de reden is waarom een MCP-server uw vorige verzoek niet onthoudt. Dat is een ontwerpkeuze met een consequentie die u overneemt: elke status die het bewaren waard is, moet achter de server worden opgeslagen, in een database of een bestand, en dat is iets wat u vanaf nu beheert.
Een MCP server is een proces dat u moet draaien
Dit zijn de kosten die vergelijkingen van leveranciers vaak achterwege laten. Een skill is een bestand. Een MCP server is software die ergens draait, en wanneer dat 'ergens' uw VPS (virtual private server) is, bent u zelf verantwoordelijk voor de uptime.
Een stdio server is de goedkope variant. Claude Code start deze als een onderliggend proces wanneer de sessie begint, en het proces stopt wanneer de sessie eindigt. Er is niets om te monitoren en niets dat volgens een eigen schema gepatcht moet worden. Een remote HTTP server is een langlopende service, en deze vereist wat elke langlopende service nodig heeft.
[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 hoort active te printen. Als het failed print, bevat de journal de reden. Bij een eerste uitvoering is dit bijna altijd een ontbrekende omgevingsvariabele of een poort die al door iets anders in gebruik is. Restart=on-failure is hier niet optioneel, omdat een gecrashte MCP server zichzelf niet aankondigt. U merkt het pas wanneer de agent aangeeft dat deze uw issue tracker niet kan lezen.
Bind het proces aan 127.0.0.1 en plaats een reverse proxy met TLS (transport layer security) ervoor. Een MCP server die uw database bereikt en antwoordt op een publieke poort zonder authenticatie, is in feite een database die u openbaar heeft gemaakt. Het draaien van een MCP server op een VPS behandelt de proxy, het certificaat en de firewall op de juiste wijze.
Weeg daarna de terugkerende werkzaamheden eerlijk af. De service ontvangt beveiligingsupdates volgens een eigen schema, los van de agent die ermee communiceert. Het OAuth-token verloopt en claude mcp list begint op een ongelegen moment ! Needs authentication te printen. De inloggegevens staan in een configuratiebestand of een Authorization header, dus deze vereisen dezelfde zorg als elk ander geheim, wat op zichzelf al een volledig onderwerp is: geheimen buiten het bereik van een AI-agent houden. Dat werk bestaat niet voor een skill.
Overweeg het alternatief voordat u begint met bouwen. Als de data achter de voorgestelde server ongeveer eens per kwartaal wijzigt, is een skill die de agent vertelt waar hij moet kijken en wat de velden betekenen goedkoper dan een service die u in de lucht moet houden.
Hoe u uw eigen contextkosten meet
Stop met schatten en voer /context uit binnen een sessie. Dit toont het overzicht van de opstartfase: de system prompt, geheugenbestanden, tools en MCP-servers, inclusief het token-gewicht van elk onderdeel.
Controleer twee zaken. Bevestig onder Memory files of elk rules-bestand dat u verwacht, in de lijst staat. Een ontbrekend bestand is onzichtbaar voor de agent; dit is dus het eerste wat u moet uitsluiten wanneer instructies worden genegeerd. Kijk vervolgens naar de kosten van uw servers. Als een server die u twee keer per maand gebruikt een van de grootste posten in die lijst is, schakel deze dan uit in /mcp en schakel hem weer in voor de sessies die hem nodig hebben. De configuratie blijft in beide gevallen behouden.
Een externe server kan ook een status zoals cached 2h ago · connects on first use · 5 tools rapporteren. Dit betekent dat Claude Code de tool-lijst uit een vorige sessie heeft gelezen in plaats van bij het opstarten verbinding te maken; de verbinding wordt gelegd zodra een tool voor het eerst wordt aangeroepen. De tools zijn beschikbaar vanaf uw eerste bericht, dus er is niets dat u hoeft te herstellen. Stel MCP_DISCOVERY_CACHE=0 in als u liever heeft dat elke server bij het opstarten verbinding maakt. Voor een breder overzicht behandelt het beheren van het Claude Code contextvenster wat behouden blijft na compressie, en wat die tokens u daadwerkelijk kosten zet de getallen om in geld.
Waarom wordt mijn skill nooit geactiveerd?
De gebruikelijke oorzaak is de description. Dit is de enige tekst in de context voordat de skill wordt uitgevoerd; als deze de situatie niet benoemt, komt er niets overeen. Verwerk de trigger in de zin: "Use when the user asks what changed, wants a commit message, or asks to review their diff." Vage beschrijvingen falen geruisloos, waardoor dit lastig op te merken is.
De tweede oorzaak is een typefout in de frontmatter, en dit is een opvallend probleem. Een onbekende key wordt direct geweigerd:
Unexpected key(s) in SKILL.md frontmatter: argument-hint. Allowed properties are: allowed-tools, compatibility, description, license, metadata, nameDe derde oorzaak is de locatie. Project-skills worden geladen vanuit .claude/skills/ in uw werkmap en in elke bovenliggende map tot aan de repository-root. Skills in geneste mappen onder de map waar u bent gestart, worden bij het opstarten niet geladen. Ze verschijnen pas de eerste keer dat de agent een bestand in die submap leest of bewerkt; tot die tijd worden ze niet aangevuld en kunnen ze niet bij naam worden aangeroepen.
Het MCP-equivalent van dit geruisloze falen is een .mcp.json-vermelding met een url en zonder type. Claude Code leest elke vermelding zonder type als een stdio-server, dus slaat het de vermelding over en rapporteert:
MCP server "notes" has a "url" but no "type"; add "type": "http" (or "sse" / "ws") to this entryAlle drie tegelijk gebruiken
Deze mechanismen concurreren niet met elkaar. Een werkende configuratie gebruikt elk mechanisme daar waar het efficiënt is. Het rules-bestand bevat een beperkt aantal regels die overal gelden. Skills bevatten de procedures en worden alleen geladen wanneer ze van toepassing zijn. Eén MCP-server, soms twee, verbindt de systemen waarvan de inhoud niet vooraf te voorspellen is. Als u nog bezig bent met het vormen van een mentaal model van het eerste mechanisme, behandelt wat een agent skill precies is het formaat in detail.
Eén test beslecht de meeste discussies over waar iets thuishoort. Verwijder het onderdeel, start een nieuwe sessie en geef de agent de taak. Als de agent alleen trager is, hoorde het thuis in een skill. Als de agent zelfverzekerd een fout maakt, hoorde het thuis in het rules-bestand. Als de agent de informatie helemaal niet kan verkrijgen, had u de server nodig, en nu heeft u ook een plan nodig om die server draaiende te houden.
FAQ
Moet ik een skill schrijven of een MCP-server opzetten?
Maak uw keuze op basis van de vraag of de informatie verandert tussen twee aanroepen. Als de agent live-status moet lezen die door anderen kan worden gewijzigd, zoals een issue tracker, een database of een dashboard, dan heeft u een MCP-server nodig. Alles wat u opschrijft is namelijk verouderd zodra het record wijzigt. Als u het antwoord één keer kunt opschrijven en het over zes weken nog steeds correct is, schrijf dan een skill. De skill is een bestand in git zonder proces dat moet draaien, zonder poort die moet worden blootgesteld en zonder patchschema. Het is daarom de goedkopere optie wanneer dit mogelijk is.
Vullen MCP-servers nog steeds mijn contextvenster?
Veel minder dan voorheen. Tool-zoeken is standaard ingeschakeld in de huidige Claude Code. Hierdoor worden bij de start van een sessie alleen de toolnamen en het instructieveld van de server geladen. De volledige schema's worden opgehaald wanneer Claude ernaar zoekt. Vooraf laden gebeurt nog wel als tool-zoeken is uitgeschakeld: bij gebruik van ENABLE_TOOL_SEARCH=false, bij ANTHROPIC_BASE_URL gericht op een proxy die geen first-party is, of bij een model ouder dan de Claude 4.5-generatie. Voer /context uit om te zien in welke situatie u zich bevindt, aangezien de cijfers in oudere vergelijkingsartikelen uitgaan van vooraf laden.
Leest Claude Code AGENTS.md?
Nee. Claude Code leest CLAUDE.md. Als uw repository al een AGENTS.md heeft voor andere agents, verwijs dan naar de andere in plaats van twee kopieën bij te houden. Voer ln -s AGENTS.md CLAUDE.md uit voor een eenvoudige symlink, of plaats @AGENTS.md op de eerste regel van een CLAUDE.md en voeg daaronder Claude-specifieke instructies toe. Start vervolgens een sessie en voer /context uit om te bevestigen dat CLAUDE.md verschijnt onder Memory files.
Waarom heeft mijn skill halverwege een sessie geen effect meer?
Auto-compaction is meestal de reden. Wanneer het gesprek wordt samengevat, koppelt Claude Code de meest recente aanroep van elke skill opnieuw, waarbij de eerste 5.000 tokens van elk worden behouden, binnen een gezamenlijk budget van 25.000 tokens voor alle skills samen. Dit budget wordt gevuld vanaf de meest recent aangeroepen skill. Als u dus verschillende grote skills heeft aangeroepen, worden de oudere volledig verwijderd. Roep de skill opnieuw aan om de volledige inhoud te herstellen.
Hoe voorkom ik dat een lang rules-bestand in elke sessie wordt geladen?
Verplaats de onderdelen die slechts soms relevant zijn naar .claude/rules/-bestanden met een paths-veld in hun frontmatter. Zo wordt elk bestand alleen geladen wanneer de agent een bijbehorend bestand aanraakt. Het opsplitsen van het bestand in @path-imports helpt niet, omdat geïmporteerde bestanden bij het opstarten worden uitgebreid en geladen naast het bestand dat ernaar verwees. Alles wat een procedure in meerdere stappen is in plaats van een vaststaand feit, moet een skill worden, aangezien de inhoud van een skill niets kost totdat deze wordt aangeroepen.