Claude Code: technische tutorial
Claude Code: ReviewInstalleren & instellenNieuwsTechnische tutorial
Stand september 2026, samengesteld uit onze eigen notities en nieuwsarchief; tekst machinaal opgesteld en redactioneel gecontroleerd. Controleer versies en commando's in de officiële documentatie.
Deze tutorial is voor developers die Claude Code verder willen inrichten dan de standaard: instellingenbestanden en hun volgorde, permissieregels, hooks, MCP-servers, de sandbox, headless gebruik in scripts en CI, en een eigen gateway. Alle sleutels en commando's zijn gecontroleerd tegen de officiële documentatie (stand september 2026, Claude Code 2.1.28x).
Instellingenbestanden en hun volgorde
Claude Code leest instellingen uit vijf lagen. Een hogere laag wint van een lagere:
- Managed settings (
managed-settings.json, MDM of de beheerconsole): door je organisatie, niet te overschrijven. - Commandoregel:
claude --settings '<json-of-pad>', alleen voor die sessie. - Project lokaal:
.claude/settings.local.json, alleen voor jou, komt niet in git. - Project gedeeld:
.claude/settings.json, gaat mee in de repository. - Gebruiker:
~/.claude/settings.json, voor al je projecten.
De bestanden zijn strikte JSON: een //-commentaar of een komma te veel geeft een foutmelding bij de volgende start. Zet bovenaan de schema-regel voor autocomplete in je editor:
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"model": "claude-opus-5-5"
}
Controleer na een wijziging met /status welke bronnen geladen zijn. Eén waarde tijdelijk proberen zonder iets op te slaan kan met --settings, met een eigen vlag (--model, --effort) of een omgevingsvariabele (ANTHROPIC_MODEL).
Permissies
Elke regel noemt een tool en wat die mag. Dit voorbeeld laat lint- en testcommando's toe zonder te vragen en blokkeert het lezen van .env-bestanden:
{
"permissions": {
"allow": [
"Bash(npm run lint)",
"Bash(npm run test *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)"
]
}
}
Let op de spatie in Bash(npm run test *): de * maakt het een prefix-match. Zonder spatie matcht Bash(git diff*) ook git diff-index.
De standaardmodus (permissions.defaultMode) bepaalt hoeveel er gevraagd wordt. De modi auto en bypassPermissions werken alleen vanuit je gebruikers- of managed settings, niet vanuit een projectbestand: een gekloonde repository kan zichzelf dus geen vrijbrief geven.
Hooks
Hooks zijn shellcommando's die op vaste momenten draaien, ongeacht wat het model besluit. Daarmee dwing je dingen af die in CLAUDE.md alleen een verzoek zijn. De structuur is: gebeurtenis → lijst van matchers → per matcher een lijst hooks.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/lint.sh"
}
]
}
]
}
}
Veelgebruikte gebeurtenissen:
PreToolUse: vóór een toolaanroep; geschikt om iets te blokkeren.PostToolUse: na een geslaagde toolaanroep, zoals lint of formatteren na een bewerking.UserPromptSubmit: als jij een bericht verstuurt.SessionStartenSessionEnd: begin en einde van een sessie.Stop: als Claude klaar is met antwoorden.PreCompact: vlak voordat de context wordt samengevat.
Hooks kunnen in elk instellingenbestand staan, maar ook in een plugin (hooks/hooks.json) of in de frontmatter van een skill of subagent.
MCP-servers koppelen
Een externe (HTTP-)server:
claude mcp add --transport http github https://api.githubcopilot.com/mcp/
Een lokale server die via stdio draait; de -- scheidt de opties van Claude Code van het commando van de server:
claude mcp add --transport stdio --env API_KEY=xyz mijn-server -- npx -y mijn-mcp-server
Met --scope bepaal je waar de configuratie komt:
local(standaard): alleen dit project, alleen voor jou, opgeslagen in~/.claude.json.project: in.mcp.jsonin de projectroot, bedoeld om mee te committen.user: al je projecten, alleen voor jou.
Een .mcp.json ziet er zo uit:
{
"mcpServers": {
"docs": { "type": "http", "url": "https://example.com/mcp" },
"lokaal": { "type": "stdio", "command": "npx", "args": ["-y", "server-package"] }
}
}
In een sessie toont /mcp de status van elke server, en daar rond je ook een OAuth-login af.
Beveiliging. Een .mcp.json in een repository die je net hebt gekloond, is code van iemand anders. Interactief vraagt Claude Code per server om toestemming. Bij claude -p gebeurt dat niet (zie hieronder).
De sandbox
De sandbox laat Claude de meeste shellcommando's draaien zonder telkens te vragen. In ruil daarvoor bepaal jij welke bestanden en domeinen die commando's mogen raken. Het besturingssysteem dwingt dat af: Seatbelt op macOS, bubblewrap op Linux en WSL 2. Native Windows wordt niet ondersteund.
Op Linux installeer je eerst de afhankelijkheden:
sudo apt-get install bubblewrap socat
Het paneel /sandbox toont de status en laat je een modus kiezen. In settings.json:
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["/tmp/build"],
"denyRead": ["~/.ssh"]
},
"network": {
"allowedDomains": ["github.com", "*.npmjs.org"]
}
}
}
Standaard draait Claude Code gewoon door zonder sandbox als die niet kan starten, met alleen een waarschuwing. Moet de sandbox een harde eis zijn, zet dan sandbox.failIfUnavailable op true. Wil je niet dat Claude een geblokkeerd commando buiten de sandbox opnieuw probeert, gebruik dan "allowUnsandboxedCommands": false.
Headless: scripts en CI
Met -p (of --print) draait Claude Code zonder interactie. De exitcode is 0 bij succes, zodat je script erop kan reageren.
claude -p "Draai de tests en repareer wat faalt" \
--allowedTools "Bash,Read,Edit" \
--permission-mode acceptEdits
Belangrijke opties:
--bare: slaat het automatisch laden van hooks, skills, plugins, MCP-servers, auto memory enCLAUDE.mdover. Aanbevolen voor CI, omdat het resultaat dan niet afhangt van wat er op de machine staat. In bare mode gebruikt Claude Code je abonnementslogin niet; zetANTHROPIC_API_KEY.--output-format json: het tekstresultaat staat in.result, plussession_iden een kostenschatting (total_cost_usd). Met--json-schemakrijg je gestructureerde uitvoer in.structured_output.--output-format stream-json --verbose: gebeurtenissen als losse JSON-regels.--permission-mode:dontAskweigert alles wat anders een vraag zou opleveren, handig voor dichtgetimmerde CI.acceptEditslaat bestandsbewerkingen toe.autolaat een classifier meekijken.--permission-prompts none(vanaf 2.1.259): voor onbewaakte runs; alles wat een vraag zou opleveren, wordt geweigerd.--continueof--resume <session_id>: een eerdere run voortzetten.
Een voorbeeld met jq:
claude --bare -p "Vat README.md samen" --allowedTools "Read" \
--output-format json | jq -r '.result'
Let op: zonder --bare laadt een -p-run de hooks uit .claude/settings.json en de servers uit .mcp.json van de map waarin hij draait, zonder vertrouwensvraag. Draai claude -p dus nooit zonder --bare in een onbekende repository.
Via een eigen LLM-gateway
Draai je een gateway voor sleutelbeheer, kostenbewaking of logging, dan wijs je Claude Code erheen met ANTHROPIC_BASE_URL en geef je een gatewaysleutel mee. De gateway moet een ondersteund API-formaat aanbieden, het Anthropic-formaat voorop. Twee valkuilen:
- Zet je alleen
ANTHROPIC_BASE_URLzonder gatewaysleutel, dan blijft je claude.ai-login de actieve credential, met de limieten en facturatie van je abonnement. - Anthropic ondersteunt het niet om Claude Code via een gateway naar niet-Claude-modellen te sturen. Dat kan technisch soms werken, maar functies kunnen dan stilletjes breken.
Zet de variabelen blijvend in het env-blok van ~/.claude/settings.json, zodat je ze niet per shell hoeft te exporteren.
Kosten beperken
- Kies per taak een model met
/model, en de denkinspanning met/effort. Niet elke taak vraagt het zwaarste model. - Houd
CLAUDE.mdonder de 200 regels. Zet taakspecifieke instructies in skills of in regels metpaths:-frontmatter, zodat ze alleen laden als ze nodig zijn. - Gebruik
--barein scripts, zodat er geen onnodige context meelaadt. - Kijk bij scripted runs naar
total_cost_usdin de JSON-uitvoer. Dat is een schatting aan de kant van de client, geen factuur.
Veelvoorkomende fouten
claude: command not foundna installatie —~/.local/binstaat niet inPATH; open een nieuwe terminal of voeg het pad toe.- Settings Error bij het starten — Ongeldige JSON (commentaar of een komma te veel) in een instellingenbestand;
claude doctorwijst het bestand aan. - Claude negeert je
AGENTS.md— Er staat ergens boven je werkmap eenCLAUDE.mdofCLAUDE.local.md; zet in/configProject instructions opclaude-md-and-agents-md. - MCP-server ontbreekt in een
-p-run — Ongeldige entry in--mcp-config; controleermcp_server_errorsin desystem/init-gebeurtenis vanstream-json. - Sandbox doet niets op Linux —
bubblewrapofsocatontbreekt;/sandboxlaat zien wat er mist.
Documentatie: code.claude.com/docs.