Hook-Events in Claude Code
Die Referenz listet mehr als dreißig Events. Das hier sind die, die die meisten Hooks nutzen; ein matcher beschränkt einen Hook auf bestimmte Tools, Dateien oder Quellen.
| Event | Wann es auslöst | Typischer Einsatz |
|---|---|---|
SessionStart | Eine Session beginnt oder wird fortgesetzt | Kontext laden, die Umgebung prüfen |
UserPromptSubmit | Du schickst einen Prompt ab, bevor Claude ihn sieht | Kontext ergänzen, heikle Prompts blockieren |
PreToolUse | Bevor ein Tool-Call läuft; kann ihn blockieren | Gefährliche Befehle blockieren, Dateien schützen |
PermissionRequest | Ein Tool-Call braucht eine Berechtigungsentscheidung | Bestimmte Anfragen automatisch erlauben oder ablehnen |
PostToolUse | Nachdem ein Tool-Call erfolgreich war | Bearbeitete Dateien formatieren, linten oder testen |
Notification | Claude Code schickt eine Benachrichtigung | Desktop-Hinweise, wenn Claude dich braucht |
SubagentStart, SubagentStop | Ein Subagent startet oder ist fertig | Delegierte Arbeit protokollieren oder prüfen |
Stop | Claude ist mit der Antwort fertig | Prüfen, ob die Aufgabe wirklich erledigt ist |
PreCompact, PostCompact | Rund um die Komprimierung des Kontexts | Wichtigen Kontext sichern oder erneut einspielen |
FileChanged, CwdChanged | Eine beobachtete Datei oder das Arbeitsverzeichnis ändert sich | Umgebung neu laden, Dateien neu formatieren |
SessionEnd | Die Session endet | Aufräumen, ein Log schreiben |
Wo Hooks hingehören
| Ort | Geltungsbereich | Geteilt |
|---|---|---|
~/.claude/settings.json | Alle deine Projekte | Nein |
.claude/settings.json | Ein Projekt | Ja, committen |
.claude/settings.local.json | Ein Projekt | Nein, per gitignore ausgeschlossen |
| Verwaltete Richtlinieneinstellungen | Die ganze Organisation | Vom Admin gesteuert |
hooks/hooks.json eines Plugins | Solange das Plugin aktiviert ist | Ja, mit dem Plugin |
| Frontmatter eines Skills oder Subagents | Sobald der Skill aufgerufen wird oder solange der Subagent läuft | Ja, in der Datei |
Beispiele für Claude Code Hooks, Schritt für Schritt
Füge jeden Block unter dem Schlüssel hooks einer Settings-Datei ein; hat die Datei schon ein hooks-Objekt, ergänze das Event als weiteren Schlüssel daneben, statt es zu ersetzen. Führe /hooks aus, um zu prüfen, ob Claude Code den Hook geladen hat. Du kannst Claude auch bitten, den Hook für dich zu schreiben.
Lass dich per Desktop-Benachrichtigung rufen, wenn Claude dich braucht
Ein
Notification-Hook in~/.claude/settings.json. Dieser nutztosascriptunter macOS; unter Linux nimmst dunotify-send, unter Windows PowerShell.{ "hooks": { "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'" } ] } ] } }Formatiere jede Datei automatisch, die Claude bearbeitet
Ein
PostToolUse-Hook mit dem MatcherEdit|Writeliest mitjqden bearbeiteten Pfad aus dem JSON auf stdin und lässt Prettier darüber laufen. Leg ihn in.claude/settings.jsonab, damit das ganze Team ihn nutzt.{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" } ] } ] } }Blockiere einen gefährlichen Befehl
Ein
PreToolUse-Hook aufBashführt dieses Skript aus. Exit-Code 2 blockiert den Aufruf, und was du nach stderr schreibst, wird zu Claudes Feedback, damit es umsteuern kann. Exit 0 heißt keine Entscheidung, die normalen Berechtigungen gelten also weiter.#!/bin/bash # .claude/hooks/block-drop-table.sh, läuft als PreToolUse-Hook auf Bash INPUT=$(cat) COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command') if echo "$COMMAND" | grep -q "drop table"; then echo "Blocked: dropping tables is not allowed" >&2 # wird zu Claudes Feedback exit 2 # 2 = Aktion blockieren fi exit 0 # keine Entscheidung: der normale Berechtigungsablauf greiftLass Claude weiterarbeiten, bis die Aufgabe erledigt ist
Ein
Stop-Hook vom Typpromptfragt ein Modell, ob alles fertig ist. Antwortet es mitok: false, arbeitet Claude weiter, mit demreasonals nächster Anweisung. Das ist das klassische Beispiel für einen Stop-Hook.{ "hooks": { "Stop": [ { "hooks": [ { "type": "prompt", "prompt": "Check if all tasks are complete. If not, respond with {\"ok\": false, \"reason\": \"what remains to be done\"}." } ] } ] } }
Quelle: Claude-Code-Dokumentation, Automate actions with hooks
Wie Hooks entscheiden, was passiert
- Eingabe: Jeder Hook bekommt das Event als JSON auf stdin, etwa den Tool-Namen und
tool_input, die Session-ID undcwd. - Exit 0: kein Einwand. Bei einigen Events, etwa
SessionStartundUserPromptSubmit, wird einfacher stdout-Text in Claudes Kontext aufgenommen. - Exit 2: blockieren, sofern das Event es zulässt. Stderr geht je nach Event an Claude oder an dich.
- JSON auf stdout: feinere Steuerung, etwa
hookSpecificOutputmit einer Berechtigungsentscheidung,updatedInput, um die Eingabe eines Tools umzuschreiben, oderadditionalContext. - Andere Exit-Codes: meist ein nicht blockierender Fehler, außer der Hook setzt
onFailure: "block". - Passende Hooks für dasselbe Event laufen parallel.
Command-, Prompt-, Agent- und HTTP-Hooks
| Typ | Was läuft | Standard-Timeout |
|---|---|---|
command | Ein Shell-Befehl | 10 Minuten |
http | Ein POST des Event-JSON an eine URL; der Response-Body wirkt wie die Ausgabe eines Befehls | 10 Minuten |
mcp_tool | Ein Tool auf einem konfigurierten MCP-Server | 10 Minuten |
prompt | Ein einzelner Modellaufruf, der mit ok antwortet oder nicht | 30 Sekunden |
agent | Ein Subagent, der vor der Entscheidung Dateien lesen und Tools ausführen kann (experimentell) | 60 Sekunden |
Hooks vs. Skills vs. CLAUDE.md und weitere Stolperfallen
- CLAUDE.md und Skills sind Anweisungen, die Claude meistens befolgt; Hooks laufen immer. Alles, was nie übersprungen werden darf, gehört in einen Hook.
PostToolUsekann eine bereits ausgeführte Aktion nicht rückgängig machen; nutzePreToolUse, um sie zu verhindern.Stoplöst jedes Mal aus, wenn Claude eine Antwort beendet, nicht nur am Ende einer Aufgabe, und nicht, wenn der Nutzer unterbricht.- Hooks können selbst keine Slash-Commands ausführen und keine Tools aufrufen; sie antworten nur über Exit-Codes, stdout, stderr oder JSON.
"disableAllHooks": trueschaltet Hooks ab; verwaltete Hooks laufen trotzdem, außer die verwalteten Einstellungen schalten sie ebenfalls ab.- Hooks gelten nur für deine eigene Claude-Code-Installation. Organisationsweite Prüfungen für alle Claude-Produkte sind ein anderes Feature: Claude Inference Hooks.
- Ein PreToolUse-Hook, der Testausgaben filtert, ist außerdem einer der besten Wege, den Token-Verbrauch zu senken.
Hooks halten Claude Code in der Spur. Crewmark hält es am Arbeiten.
Hooks machen einen unbeaufsichtigten Agenten erst sicher: Formatierung, Tests und Leitplanken laufen jedes Mal. Crewmark macht aus einer Session von Claude Code, Codex, DeepSeek Harness oder OpenCode einen KI-Mitarbeiter mit Rolle, Ziel und Arbeitszeiten und weckt ihn per Heartbeat, damit er das nächste Issue von einem Board übernimmt, mit den Hooks deines Projekts an Ort und Stelle.
Committe deine Hooks
Hooks aus
.claude/settings.jsonladen in der Session des Mitarbeiters genau wie in deiner, seine Änderungen werden also formatiert und riskante Befehle blockiert.Lass den Heartbeat die Arbeit starten
Während seiner Arbeitszeiten wacht der Mitarbeiter alle 15, 30 oder 60 Minuten in derselben Unterhaltung auf; siehe wie du Claude Code proaktiv machst.
Beantworte nur, was dich braucht
Er kommentiert seine Issues und schreibt dir, wenn er eine Entscheidung braucht. Lies, was ein KI-Mitarbeiter ist.
FAQ zu Claude Code Hooks
Was sind Claude Code Hooks?
Selbst definierte Befehle, HTTP-Aufrufe oder Modellprüfungen, die Claude Code bei Lifecycle-Events automatisch ausführt, etwa bevor ein Tool läuft oder wenn Claude fertig ist. Sie geben dir deterministische Kontrolle, statt darauf zu setzen, dass Claude sich an eine Anweisung erinnert.
Wo konfiguriere ich Claude Code Hooks?
Unter hooks in ~/.claude/settings.json (alle Projekte), .claude/settings.json (mit dem Team geteilt) oder .claude/settings.local.json (nur für dich). Auch Plugins, Skills und Subagents können Hooks mitbringen. Führe /hooks aus, um zu sehen, was geladen ist.
Wie blockiere ich einen Befehl mit einem Hook?
Nutze einen PreToolUse-Hook mit dem Matcher Bash. Lies den Befehl aus dem JSON auf stdin und beende das Skript mit Exit-Code 2 und einer Begründung auf stderr, um ihn zu blockieren; Claude sieht die Begründung und passt sich an.
Was ist ein Stop-Hook?
Ein Hook auf das Event Stop, das auslöst, wenn Claude mit einer Antwort fertig ist. Ein Stop-Hook vom Typ prompt kann prüfen, ob die Aufgabe erledigt ist, und Claude andernfalls mit einer Begründung zurück an die Arbeit schicken.
Hooks vs. Skills: Was ist der Unterschied?
Skills sind Anweisungen und Dateien, die Claude lädt, wenn sie relevant sind, und meistens befolgt. Hooks sind Code, den Claude Code jedes Mal ausführt, wenn ein Event auslöst, egal wie Claude entscheidet.
Warum löst mein Hook nicht aus?
Prüfe, ob er in /hooks auftaucht, ob Event-Name und Matcher exakt richtig geschrieben sind, ob das Skript ausführbar ist und ob Ausgaben deines Shell-Profils sein JSON nicht verfälschen. Starte Claude Code mit einem Debug-Log, um zu sehen, was jeder Hook getan hat.
Sind Claude Code Hooks dasselbe wie Inference Hooks?
Nein. Claude Code Hooks laufen auf deinem Rechner für deine Sessions. Inference Hooks sind ein Feature von Claude Enterprise, das jeden Prompt der Organisation an einen Sicherheitsserver schickt, bevor Claude läuft.
Am 6. November 2026 mit der Claude-Code-Dokumentation (Hooks-Anleitung und Hooks-Referenz) abgeglichen.