Wat zijn AI Skills & Tools

Hoe AI-agents verpakte mogelijkheden gebruiken — van function calls tot MCP-servers. Een praktische gids voor developers die met LLMs bouwen.

7 min leestijdBijgewerkt: april 2026

🔧 Wat is een Skill?

In de context van AI-agents is een skill (ook genoemd een tool or function) een verpakte, herbruikbare mogelijkheid die een LLM kan aanroepen om te communiceren met de wereld buiten zijn contextvenster. Skills overbruggen de kloof tussen taalbegrip en echte acties.

Elke skill heeft vier componenten:

  • Name — een unieke identifier die het model gebruikt om naar de skill te verwijzen (bijv., web_search)
  • Description — natuurlijke taaltekst die uitlegt wat de skill doet en wanneer deze te gebruiken is; de LLM leest dit om te beslissen wanneer de skill aan te roepen
  • Inputschema — een gestructureerde definitie van de argumenten (JSON Schema); het model vult deze in op basis van de taak
  • Implementation — de daadwerkelijke code die draait: een API-call, databasequery, shell-commando, of enige andere bewerking

Voorbeeld: A get_weather skill heeft de beschrijving "Haalt de huidige weersvoorspelling voor een stad op", accepteert { "city": "string" } als invoer, en roept een weer-API aan. De LLM ziet nooit de API-sleutel of de HTTP-call — het ontvangt alleen het resultaat terug als tekst.

⚙️ Hoe Tool Calling Werkt

Wanneer een agent toegang heeft tot skills, roept de LLM ze niet direct aan — het requests een oproep door een gestructureerde output te genereren. De runtime (jouw applicatiecode) voert de feitelijke oproep uit en geeft het resultaat terug. Dit is de volledige cyclus:

  1. Tool-registratie — Je code stuurt het model een lijst van beschikbare skills met hun beschrijvingen en schema's
  2. Modelredenering — De LLM leest de taak en de beschikbare tools, beslist welke tool aan te roepen en met welke argumenten
  3. Tool call request — Het model geeft een gestructureerd "tool call" bericht uit (bijv., { "tool": "web_search", "args": { "query": "current Gemini models" } })
  4. Execution — Jouw runtime-code roept de daadwerkelijke functie, API of service aan
  5. Resultaatinjectie — Het resultaat wordt weer aan de conversatiecontext toegevoegd
  6. Voortgezette redenering — Het model leest het resultaat en roept ofwel een andere tool aan, stelt een vervolgvraag, of genereert het definitieve antwoord

Deze lus kan vele malen herhalen in één beurt. Een complexe agent-achtige taak kan 10–20 tools achtereenvolgens aanroepen voordat er een definitief antwoord wordt gegenereerd.

📊 Skills vs Plugins vs MCP Servers

De terminologie heeft zich snel ontwikkeld. Zo verhouden de concepten zich historisch:

EraNameHoe het werkteStatus
2023ChatGPT PluginsDoor de gebruiker installeerbare extensies met een OpenAPI-spec; ChatGPT riep ze aan via HTTPVerouderd (vervangen door GPTs + tools)
2023OpenAI Function CallingAPI-niveau JSON Schema-definities; het model geeft een gestructureerde function call uit, jouw code voert deze uitActief — hernoemd naar "tool use"
2023–Tool Use / SkillsHetzelfde als function calling; Anthropic introduceerde "tool use", anderen gebruiken "skills" of "functions"Actief — huidige standaard
2024–MCP ServersGestandaardiseerd protocol (Anthropic, Dec 2024) voor het verpakken en distribueren van tool-servers; elke MCP-client kan verbinden met elke MCP-serverActief — groeiend ecosysteem

Belangrijk onderscheid: Traditioneel tool use wordt inline gedefinieerd in je applicatiecode. MCP servers zijn zelfstandige processen die tools blootstellen via een gestandaardiseerd protocol — waardoor ze herbruikbaar zijn over verschillende AI-clients (Claude Desktop, Cursor, VS Code, aangepaste agents). Lees meer: Wat is MCP.

🗂️ Toolcategorieën & Risiconiveaus

Niet alle tools dragen hetzelfde risico. Groeperen op risiconiveau helpt bij het definiëren van deactieruimteen waar HITL-controles toe te voegen:

CategoryExamplesRiskRecommendation
Read-onlyweb_search, read_file, get_weather, list_dirLowSta autonoom toe; log alle oproepen
Schrijven (lokaal)write_file, create_dir, edit_codeMediumBeperk tot een gesandboxte werkmapdirectory
Netwerk / Externsend_email, post_to_slack, call_apiMedium–HoogHITL-goedkeuring voor onomkeerbare verzendacties
OS / Shellrun_command, execute_script, install_packageHighBeperk tot containerized omgeving; HITL vereist
Destructivedelete_file, drop_table, revoke_accessCriticalAltijd expliciete menselijke bevestiging vereisen

🏗️ Anatomie van een Goede Skill

De belangrijkste ontwerpoverweging voor een skill is zijn description. De LLM leest beschrijvingen om te beslissen welke tool aan te roepen — een slecht geschreven beschrijving leidt tot verkeerde toolkeuze, het missen van oproepen of onduidelijke argumenten.

Wat een beschrijving effectief maakt

  • Wees expliciet over wanneer het te gebruiken — "Gebruik deze tool wanneer de gebruiker vraagt naar realtime gegevens of actuele gebeurtenissen" is beter dan "Zoekt op het web"
  • Geef aan wat het NIET doet — "Geeft geen historische gegevens ouder dan 30 dagen terug"
  • Beschrijf het uitvoerformaat — "Geeft een JSON-array van zoekresultaten terug met title, url en snippet velden"
  • Houd het onder 200 woorden — beschrijvingen langer dan ~200 tokens kunnen het model overweldigen wanneer veel tools zijn geregistreerd

Principes voor schema-ontwerp

  • Vereist vs optioneel — Markeer velden alleen als vereist als het echt noodzakelijk is; optionele velden met standaardwaarden verminderen model fouten
  • Gebruik enums voor beperkte waarden — "format": {"enum": ["json", "markdown", "text"]} voorkomt gefabriceerde waarden
  • Geef de voorkeur aan idempotente tools — Tools die veilig opnieuw geprobeerd kunnen worden (lezen, opzoeken) zijn veiliger dan éénmalige acties (verzenden, verwijderen)
  • Geef gestructureerde data terug — JSON-antwoorden zijn voor het model gemakkelijker om over te redeneren dan ongestructureerde tekstblokken

💡 Praktijkvoorbeelden

SkillnaamWat het doetBelangrijke argumentenRisk
web_searchVraag een zoekmachine en geef de bovenste resultaten terugquery: string, num_results?: numberLow
read_fileLees een bestand uit de werkmapdirectorypath: string, offset?: number, limit?: numberLow
write_fileMaak of overschrijf een bestandpath: string, content: stringMedium
run_testsVoer de project test suite uit en geef de resultaten terugfilter?: stringMedium
browser_screenshotNavigeer naar een URL en geef een screenshot terugurl: stringMedium
send_emailStuur een e-mail naar een of meer ontvangersto: string[], subject: string, body: stringHoog — altijd HITL
run_shellVoer een willekeurig shell-commando uitcommand: string, cwd?: stringHoog — sandbox vereist

✅ Best Practices

Minimale permissies

Ken iedere agent alleen de tools toe die hij nodig heeft voor zijn specifieke taak. Een agent die FAQ's beantwoordt heeft geen behoefte aan write_file or send_email. Hoe kleiner de actieruimte, o hoe kleiner de schade als de agent wordt gemanipuleerd. Zie:Excessieve autonomie.

Audit alle tool-oproepen

Log elke tool-aanroep met zijn argumenten en resultaat. Dit maakt debugging, kostentoewijzing, en detectie van afwijkend gedrag mogelijk (bijv., een agent die ~/.ssh/ wanneer hij alleen toegang zou moeten hebben tot de projectdirectory). AgentOps-platforms zoals LangSmith maken dit eenvoudig.

Mens-in-de-lus voor onomkeerbare acties

Elke actie die moeilijk of onmogelijk ongedaan te maken is — berichten verzenden, gegevens verwijderen, aankopen doen — moet expliciete menselijke bevestiging vereisen voordat deze wordt uitgevoerd. Bouw HITL-controles in je agent-runtime, niet alleen in de prompt. Prompts kunnen worden overschreven; code niet.

Pas op voor tool-poisoning

Als je agents toestaat om MCP-servers dynamisch te installeren of te ontdekken, kan een kwaadwillende server een tool registreren met een beschrijving die verborgen instructies bevat. Controleer altijd tool-beschrijvingen voordat je ze toevoegt aan de agent-registratie. Zie:Tool Poisoning.

Schrijf duidelijke foutteruggaves

Wanneer een tool faalt, geef een gestructureerde fout terug met voldoende context zodat het model kan herstellen of esscaleren — geen ruwe exception stacktrace. Voorbeeld: { "error": "rate_limited", "retry_after": 5 }. Een goed beschreven fout laat de agent opnieuw proberen, een fallback-tool gebruiken, of de gebruiker op een nette manier informeren.