Eine Schnellstartanleitung mit Beispielen finden Sie unter Erste Schritte mit Claude Code Hooks.
Konfiguration
Claude Code Hooks werden in Ihren Einstellungsdateien konfiguriert:~/.claude/settings.json- Benutzereinstellungen.claude/settings.json- Projekteinstellungen.claude/settings.local.json- Lokale Projekteinstellungen (nicht committed)- Von Unternehmen verwaltete Richtlinieneinstellungen
Struktur
Hooks sind nach Matchern organisiert, wobei jeder Matcher mehrere Hooks haben kann:- matcher: Muster zum Abgleich von Toolnamen, Groß-/Kleinschreibung beachtet (nur anwendbar für
PreToolUseundPostToolUse)- Einfache Strings stimmen genau überein:
Writestimmt nur mit dem Write-Tool überein - Unterstützt Regex:
Edit|WriteoderNotebook.* - Verwenden Sie
*, um alle Tools abzugleichen. Sie können auch einen leeren String ("") verwenden odermatcherleer lassen.
- Einfache Strings stimmen genau überein:
- hooks: Array von Befehlen, die ausgeführt werden, wenn das Muster übereinstimmt
type: Derzeit wird nur"command"unterstütztcommand: Der auszuführende Bash-Befehl (kann die Umgebungsvariable$CLAUDE_PROJECT_DIRverwenden)timeout: (Optional) Wie lange ein Befehl ausgeführt werden soll, in Sekunden, bevor dieser spezifische Befehl abgebrochen wird.
UserPromptSubmit, Notification, Stop und SubagentStop
die keine Matcher verwenden, können Sie das Matcher-Feld weglassen:
Projektspezifische Hook-Skripte
Sie können die UmgebungsvariableCLAUDE_PROJECT_DIR (nur verfügbar, wenn
Claude Code den Hook-Befehl startet) verwenden, um auf Skripte zu verweisen, die in Ihrem Projekt gespeichert sind,
um sicherzustellen, dass sie unabhängig vom aktuellen Verzeichnis von Claude funktionieren:
Plugin-Hooks
Plugins können Hooks bereitstellen, die sich nahtlos in Ihre Benutzer- und Projekt-Hooks integrieren. Plugin-Hooks werden automatisch mit Ihrer Konfiguration zusammengeführt, wenn Plugins aktiviert sind. Wie Plugin-Hooks funktionieren:- Plugin-Hooks werden in der Datei
hooks/hooks.jsondes Plugins oder in einer Datei definiert, die durch einen benutzerdefinierten Pfad zum Feldhooksangegeben wird. - Wenn ein Plugin aktiviert ist, werden seine Hooks mit Benutzer- und Projekt-Hooks zusammengeführt
- Mehrere Hooks aus verschiedenen Quellen können auf dasselbe Ereignis reagieren
- Plugin-Hooks verwenden die Umgebungsvariable
${CLAUDE_PLUGIN_ROOT}, um auf Plugin-Dateien zu verweisen
Plugin-Hooks verwenden das gleiche Format wie reguläre Hooks mit einem optionalen
description-Feld, um den Zweck des Hooks zu erklären.Plugin-Hooks werden zusammen mit Ihren benutzerdefinierten Hooks ausgeführt. Wenn mehrere Hooks auf ein Ereignis passen, werden sie alle parallel ausgeführt.
${CLAUDE_PLUGIN_ROOT}: Absoluter Pfad zum Plugin-Verzeichnis${CLAUDE_PROJECT_DIR}: Projektroot-Verzeichnis (gleich wie für Projekt-Hooks)- Alle Standard-Umgebungsvariablen sind verfügbar
Hook-Ereignisse
PreToolUse
Wird ausgeführt, nachdem Claude Tool-Parameter erstellt hat und bevor der Tool-Aufruf verarbeitet wird. Häufige Matcher:Task- Subagent-Aufgaben (siehe Subagents-Dokumentation)Bash- Shell-BefehleGlob- Dateimuster-MatchingGrep- InhaltssucheRead- DateilesevorgängeEdit- DateibearbeitungWrite- DateischreibenWebFetch,WebSearch- Web-Operationen
PostToolUse
Wird unmittelbar nach erfolgreichem Abschluss eines Tools ausgeführt. Erkennt die gleichen Matcher-Werte wie PreToolUse.Notification
Wird ausgeführt, wenn Claude Code Benachrichtigungen sendet. Benachrichtigungen werden gesendet, wenn:- Claude Ihre Berechtigung zur Verwendung eines Tools benötigt. Beispiel: “Claude benötigt Ihre Berechtigung zur Verwendung von Bash”
- Die Eingabeaufforderung mindestens 60 Sekunden lang untätig war. “Claude wartet auf Ihre Eingabe”
UserPromptSubmit
Wird ausgeführt, wenn der Benutzer eine Eingabeaufforderung sendet, bevor Claude diese verarbeitet. Dies ermöglicht es Ihnen, zusätzlichen Kontext basierend auf der Eingabeaufforderung/dem Gespräch hinzuzufügen, Eingabeaufforderungen zu validieren oder bestimmte Arten von Eingabeaufforderungen zu blockieren.Stop
Wird ausgeführt, wenn der Haupt-Claude-Code-Agent die Antwort beendet hat. Wird nicht ausgeführt, wenn die Beendigung aufgrund einer Benutzerunterbrechung erfolgte.SubagentStop
Wird ausgeführt, wenn ein Claude-Code-Subagent (Task-Tool-Aufruf) die Antwort beendet hat.PreCompact
Wird ausgeführt, bevor Claude Code einen Compact-Vorgang ausführt. Matcher:manual- Aufgerufen von/compactauto- Aufgerufen von Auto-Compact (aufgrund eines vollen Kontextfensters)
SessionStart
Wird ausgeführt, wenn Claude Code eine neue Sitzung startet oder eine vorhandene Sitzung fortsetzt (die derzeit unter der Haube eine neue Sitzung startet). Nützlich zum Laden von Entwicklungskontext wie vorhandene Probleme oder kürzliche Änderungen an Ihrer Codebasis, Installation von Abhängigkeiten oder Einrichtung von Umgebungsvariablen. Matcher:startup- Aufgerufen beim Startenresume- Aufgerufen von--resume,--continueoder/resumeclear- Aufgerufen von/clearcompact- Aufgerufen von Auto- oder manuellem Compact.
Persistieren von Umgebungsvariablen
SessionStart-Hooks haben Zugriff auf die UmgebungsvariableCLAUDE_ENV_FILE, die einen Dateipfad bereitstellt, in dem Sie Umgebungsvariablen für nachfolgende Bash-Befehle persistieren können.
Beispiel: Festlegen einzelner Umgebungsvariablen
nvm use), erfassen und persistieren Sie alle Änderungen durch Vergleich der Umgebung:
CLAUDE_ENV_FILE ist nur für SessionStart-Hooks verfügbar. Andere Hook-Typen haben keinen Zugriff auf diese Variable.SessionEnd
Wird ausgeführt, wenn eine Claude-Code-Sitzung endet. Nützlich für Cleanup-Aufgaben, Protokollierung von Sitzungsstatistiken oder Speicherung des Sitzungsstatus. Das Feldreason in der Hook-Eingabe ist eines der folgenden:
clear- Sitzung mit dem Befehl /clear gelöschtlogout- Benutzer hat sich abgemeldetprompt_input_exit- Benutzer hat beendet, während die Eingabeaufforderung sichtbar warother- Andere Beendigungsgründe
Hook-Eingabe
Hooks erhalten JSON-Daten über stdin, die Sitzungsinformationen und ereignisspezifische Daten enthalten:PreToolUse-Eingabe
Das genaue Schema fürtool_input hängt vom Tool ab.
PostToolUse-Eingabe
Das genaue Schema fürtool_input und tool_response hängt vom Tool ab.
Notification-Eingabe
UserPromptSubmit-Eingabe
Stop- und SubagentStop-Eingabe
stop_hook_active ist true, wenn Claude Code bereits als Ergebnis eines
Stop-Hooks fortgesetzt wird. Überprüfen Sie diesen Wert oder verarbeiten Sie das Transkript, um zu verhindern, dass Claude Code
unbegrenzt ausgeführt wird.
PreCompact-Eingabe
Fürmanual kommt custom_instructions von dem, was der Benutzer in
/compact übergibt. Für auto ist custom_instructions leer.
SessionStart-Eingabe
SessionEnd-Eingabe
Hook-Ausgabe
Es gibt zwei Möglichkeiten für Hooks, Ausgaben an Claude Code zurückzugeben. Die Ausgabe teilt mit, ob blockiert werden soll und welches Feedback Claude und dem Benutzer angezeigt werden soll.Einfach: Exit-Code
Hooks teilen den Status über Exit-Codes, stdout und stderr mit:- Exit-Code 0: Erfolg.
stdoutwird dem Benutzer im Transkriptmodus angezeigt (STRG+R), außer fürUserPromptSubmitundSessionStart, wobei stdout zum Kontext hinzugefügt wird. - Exit-Code 2: Blockierender Fehler.
stderrwird an Claude zurückgegeben, um automatisch verarbeitet zu werden. Siehe das Verhalten pro Hook-Ereignis unten. - Andere Exit-Codes: Nicht blockierender Fehler.
stderrwird dem Benutzer angezeigt und die Ausführung wird fortgesetzt.
Erinnerung: Claude Code sieht stdout nicht, wenn der Exit-Code 0 ist, außer für
den
UserPromptSubmit-Hook, bei dem stdout als Kontext eingefügt wird.Exit-Code-2-Verhalten
| Hook-Ereignis | Verhalten |
|---|---|
PreToolUse | Blockiert den Tool-Aufruf, zeigt stderr Claude an |
PostToolUse | Zeigt stderr Claude an (Tool wurde bereits ausgeführt) |
Notification | N/A, zeigt stderr nur dem Benutzer an |
UserPromptSubmit | Blockiert die Eingabeaufforderungsverarbeitung, löscht die Eingabeaufforderung, zeigt stderr nur dem Benutzer an |
Stop | Blockiert die Beendigung, zeigt stderr Claude an |
SubagentStop | Blockiert die Beendigung, zeigt stderr dem Claude-Subagent an |
PreCompact | N/A, zeigt stderr nur dem Benutzer an |
SessionStart | N/A, zeigt stderr nur dem Benutzer an |
SessionEnd | N/A, zeigt stderr nur dem Benutzer an |
Erweitert: JSON-Ausgabe
Hooks können strukturierte JSON instdout zurückgeben, um eine anspruchsvollere Kontrolle zu ermöglichen:
Gemeinsame JSON-Felder
Alle Hook-Typen können diese optionalen Felder enthalten:continue false ist, stoppt Claude die Verarbeitung nach der Hook-Ausführung.
- Für
PreToolUseunterscheidet sich dies von"permissionDecision": "deny", das nur einen bestimmten Tool-Aufruf blockiert und automatisches Feedback an Claude bietet. - Für
PostToolUseunterscheidet sich dies von"decision": "block", das automatisiertes Feedback an Claude bietet. - Für
UserPromptSubmitverhindert dies die Verarbeitung der Eingabeaufforderung. - Für
StopundSubagentStophat dies Vorrang vor jeder"decision": "block"-Ausgabe. - In allen Fällen hat
"continue" = falseVorrang vor jeder"decision": "block"-Ausgabe.
stopReason begleitet continue mit einem Grund, der dem Benutzer angezeigt wird, nicht Claude.
PreToolUse-Entscheidungskontrolle
PreToolUse-Hooks können steuern, ob ein Tool-Aufruf fortgesetzt wird.
"allow"umgeht das Berechtigungssystem.permissionDecisionReasonwird dem Benutzer angezeigt, aber nicht Claude."deny"verhindert die Ausführung des Tool-Aufrufs.permissionDecisionReasonwird Claude angezeigt."ask"fordert den Benutzer auf, den Tool-Aufruf in der Benutzeroberfläche zu bestätigen.permissionDecisionReasonwird dem Benutzer angezeigt, aber nicht Claude.
updatedInput ändern:
updatedInputermöglicht es Ihnen, die Eingabeparameter des Tools vor der Ausführung zu ändern. Dies ist einRecord<string, unknown>-Objekt, das die Felder enthält, die Sie ändern oder hinzufügen möchten.- Dies ist am nützlichsten mit
"permissionDecision": "allow", um Tool-Aufrufe zu ändern und zu genehmigen.
Die Felder
decision und reason sind für PreToolUse-Hooks veraltet.
Verwenden Sie stattdessen hookSpecificOutput.permissionDecision und
hookSpecificOutput.permissionDecisionReason. Die veralteten Felder
"approve" und "block" werden auf "allow" bzw. "deny" abgebildet.PostToolUse-Entscheidungskontrolle
PostToolUse-Hooks können Feedback an Claude nach der Tool-Ausführung geben.
"block"fordert Claude automatisch mitreasonauf.undefinedtut nichts.reasonwird ignoriert."hookSpecificOutput.additionalContext"fügt Kontext hinzu, den Claude berücksichtigen soll.
UserPromptSubmit-Entscheidungskontrolle
UserPromptSubmit-Hooks können steuern, ob eine Benutzereingabeaufforderung verarbeitet wird.
"block"verhindert die Verarbeitung der Eingabeaufforderung. Die eingereichte Eingabeaufforderung wird aus dem Kontext gelöscht."reason"wird dem Benutzer angezeigt, aber nicht zum Kontext hinzugefügt.undefinedermöglicht der Eingabeaufforderung, normal fortzufahren."reason"wird ignoriert."hookSpecificOutput.additionalContext"fügt den String zum Kontext hinzu, wenn nicht blockiert.
Stop/SubagentStop-Entscheidungskontrolle
Stop- und SubagentStop-Hooks können steuern, ob Claude fortfahren muss.
"block"verhindert, dass Claude stoppt. Sie müssenreasonausfüllen, damit Claude weiß, wie es fortfahren soll.undefinedermöglicht Claude zu stoppen.reasonwird ignoriert.
SessionStart-Entscheidungskontrolle
SessionStart-Hooks ermöglichen es Ihnen, Kontext zu Beginn einer Sitzung zu laden.
"hookSpecificOutput.additionalContext"fügt den String zum Kontext hinzu.- Mehrere
additionalContext-Werte von Hooks werden verkettet.
SessionEnd-Entscheidungskontrolle
SessionEnd-Hooks werden ausgeführt, wenn eine Sitzung endet. Sie können die Sitzungsbeendigung nicht blockieren,
können aber Cleanup-Aufgaben ausführen.
Exit-Code-Beispiel: Bash-Befehl-Validierung
JSON-Ausgabe-Beispiel: UserPromptSubmit zum Hinzufügen von Kontext und Validierung
Für
UserPromptSubmit-Hooks können Sie Kontext mit einer der beiden Methoden injizieren:- Exit-Code 0 mit stdout: Claude sieht den Kontext (Spezialfall für
UserPromptSubmit) - JSON-Ausgabe: Bietet mehr Kontrolle über das Verhalten
JSON-Ausgabe-Beispiel: PreToolUse mit Genehmigung
Arbeiten mit MCP-Tools
Claude Code Hooks funktionieren nahtlos mit Model Context Protocol (MCP) Tools. Wenn MCP-Server Tools bereitstellen, erscheinen sie mit einem speziellen Namensmuster, das Sie in Ihren Hooks abgleichen können.MCP-Tool-Benennung
MCP-Tools folgen dem Mustermcp__<server>__<tool>, zum Beispiel:
mcp__memory__create_entities- Memory-Server-Tool zum Erstellen von Entitätenmcp__filesystem__read_file- Filesystem-Server-Tool zum Lesen von Dateienmcp__github__search_repositories- GitHub-Server-Suchtool
Konfigurieren von Hooks für MCP-Tools
Sie können spezifische MCP-Tools oder ganze MCP-Server als Ziel festlegen:Beispiele
Praktische Beispiele einschließlich Code-Formatierung, Benachrichtigungen und Dateischutz finden Sie unter Weitere Beispiele im Leitfaden für den Einstieg.
Sicherheitsüberlegungen
Haftungsausschluss
VERWENDUNG AUF EIGENES RISIKO: Claude Code Hooks führen automatisch beliebige Shell-Befehle auf Ihrem System aus. Durch die Verwendung von Hooks bestätigen Sie, dass:- Sie allein verantwortlich für die von Ihnen konfigurierten Befehle sind
- Hooks alle Dateien ändern, löschen oder darauf zugreifen können, auf die Ihr Benutzerkonto zugreifen kann
- Bösartige oder schlecht geschriebene Hooks können zu Datenverlust oder Systemschäden führen
- Anthropic bietet keine Garantie und übernimmt keine Haftung für Schäden, die sich aus der Verwendung von Hooks ergeben
- Sie sollten Hooks in einer sicheren Umgebung gründlich testen, bevor Sie sie in der Produktion verwenden
Best Practices für Sicherheit
Hier sind einige wichtige Praktiken zum Schreiben sicherer Hooks:- Validieren und bereinigen Sie Eingaben - Vertrauen Sie Eingabedaten nie blind
- Zitieren Sie Shell-Variablen immer - Verwenden Sie
"$VAR"nicht$VAR - Blockieren Sie Pfadtraversal - Überprüfen Sie auf
..in Dateipfaden - Verwenden Sie absolute Pfade - Geben Sie vollständige Pfade für Skripte an (verwenden Sie “$CLAUDE_PROJECT_DIR” für den Projektpfad)
- Überspringen Sie sensible Dateien - Vermeiden Sie
.env,.git/, Schlüssel usw.
Konfigurationssicherheit
Direkte Bearbeitungen von Hooks in Einstellungsdateien werden nicht sofort wirksam. Claude Code:- Erfasst einen Snapshot von Hooks beim Start
- Verwendet diesen Snapshot während der gesamten Sitzung
- Warnt, wenn Hooks extern geändert werden
- Erfordert eine Überprüfung im Menü
/hooks, damit Änderungen wirksam werden
Hook-Ausführungsdetails
- Timeout: 60-Sekunden-Ausführungslimit standardmäßig, konfigurierbar pro Befehl.
- Ein Timeout für einen einzelnen Befehl beeinträchtigt nicht die anderen Befehle.
- Parallelisierung: Alle übereinstimmenden Hooks werden parallel ausgeführt
- Deduplizierung: Mehrere identische Hook-Befehle werden automatisch dedupliziert
- Umgebung: Wird im aktuellen Verzeichnis mit der Umgebung von Claude Code ausgeführt
- Die Umgebungsvariable
CLAUDE_PROJECT_DIRist verfügbar und enthält den absoluten Pfad zum Projektroot-Verzeichnis (wo Claude Code gestartet wurde) - Die Umgebungsvariable
CLAUDE_CODE_REMOTEgibt an, ob der Hook in einer Remote- (Web-) Umgebung ("true") oder einer lokalen CLI-Umgebung (nicht gesetzt oder leer) ausgeführt wird. Verwenden Sie dies, um unterschiedliche Logik basierend auf dem Ausführungskontext auszuführen.
- Die Umgebungsvariable
- Eingabe: JSON über stdin
- Ausgabe:
- PreToolUse/PostToolUse/Stop/SubagentStop: Fortschritt im Transkript angezeigt (Strg+R)
- Notification/SessionEnd: Nur in Debug protokolliert (
--debug) - UserPromptSubmit/SessionStart: stdout als Kontext für Claude hinzugefügt
Debugging
Grundlegende Fehlerbehebung
Wenn Ihre Hooks nicht funktionieren:- Überprüfen Sie die Konfiguration - Führen Sie
/hooksaus, um zu sehen, ob Ihr Hook registriert ist - Überprüfen Sie die Syntax - Stellen Sie sicher, dass Ihre JSON-Einstellungen gültig sind
- Testen Sie Befehle - Führen Sie Hook-Befehle zuerst manuell aus
- Überprüfen Sie Berechtigungen - Stellen Sie sicher, dass Skripte ausführbar sind
- Überprüfen Sie Protokolle - Verwenden Sie
claude --debug, um Hook-Ausführungsdetails anzuzeigen
- Nicht entgangene Anführungszeichen - Verwenden Sie
\"in JSON-Strings - Falscher Matcher - Überprüfen Sie, ob Toolnamen genau übereinstimmen (Groß-/Kleinschreibung beachtet)
- Befehl nicht gefunden - Verwenden Sie vollständige Pfade für Skripte
Erweitertes Debugging
Für komplexe Hook-Probleme:- Überprüfen Sie die Hook-Ausführung - Verwenden Sie
claude --debug, um detaillierte Hook- Ausführung anzuzeigen - Validieren Sie JSON-Schemas - Testen Sie Hook-Eingabe/Ausgabe mit externen Tools
- Überprüfen Sie Umgebungsvariablen - Überprüfen Sie, ob die Umgebung von Claude Code korrekt ist
- Testen Sie Grenzfälle - Versuchen Sie Hooks mit ungewöhnlichen Dateipfaden oder Eingaben
- Überwachen Sie Systemressourcen - Überprüfen Sie auf Ressourcenerschöpfung während der Hook- Ausführung
- Verwenden Sie strukturiertes Logging - Implementieren Sie Protokollierung in Ihren Hook-Skripten
Debug-Ausgabe-Beispiel
Verwenden Sieclaude --debug, um Hook-Ausführungsdetails anzuzeigen:
- Welcher Hook ausgeführt wird
- Befehl wird ausgeführt
- Erfolgs-/Fehlerstatus
- Ausgabe- oder Fehlermeldungen