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 eine leere Zeichenkette ("") verwenden odermatcherleer lassen.
- Einfache Strings stimmen genau überein:
- hooks: Array von Hooks, die ausgeführt werden, wenn das Muster übereinstimmt
type: Hook-Ausführungstyp -"command"für Bash-Befehle oder"prompt"für LLM-basierte Evaluierungcommand: (Fürtype: "command") Der auszuführende Bash-Befehl (kann die Umgebungsvariable$CLAUDE_PROJECT_DIRverwenden)prompt: (Fürtype: "prompt") Der Prompt, der an das LLM zur Evaluierung gesendet wirdtimeout: (Optional) Wie lange ein Hook ausgeführt werden soll, in Sekunden, bevor dieser spezifische Hook 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 mit Ihren 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 Feld
description zur Erklärung des Zwecks des Hooks.Plugin-Hooks werden zusammen mit Ihren benutzerdefinierten Hooks ausgeführt. Wenn mehrere Hooks ein Ereignis abgleichen, 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
Prompt-basierte Hooks
Zusätzlich zu Bash-Befehls-Hooks (type: "command") unterstützt Claude Code prompt-basierte Hooks (type: "prompt"), die ein LLM verwenden, um zu evaluieren, ob eine Aktion erlaubt oder blockiert werden soll. Prompt-basierte Hooks werden derzeit nur für Stop und SubagentStop Hooks unterstützt, wo sie intelligente, kontextabhängige Entscheidungen ermöglichen.
Wie prompt-basierte Hooks funktionieren
Anstatt einen Bash-Befehl auszuführen, prompt-basierte Hooks:- Senden die Hook-Eingabe und Ihren Prompt an ein schnelles LLM (Haiku)
- Das LLM antwortet mit strukturiertem JSON, das eine Entscheidung enthält
- Claude Code verarbeitet die Entscheidung automatisch
Konfiguration
type: Muss"prompt"seinprompt: Der Prompt-Text, der an das LLM gesendet wird- Verwenden Sie
$ARGUMENTSals Platzhalter für die Hook-Eingabe JSON - Wenn
$ARGUMENTSnicht vorhanden ist, wird die Eingabe JSON an den Prompt angehängt
- Verwenden Sie
timeout: (Optional) Timeout in Sekunden (Standard: 30 Sekunden)
Antwortschema
Das LLM muss mit JSON antworten, das Folgendes enthält:decision:"approve"erlaubt die Aktion,"block"verhindert siereason: Erklärung, die Claude angezeigt wird, wenn die Entscheidung"block"istcontinue: (Optional) Wennfalse, stoppt die Ausführung von Claude vollständigstopReason: (Optional) Nachricht, die angezeigt wird, wenncontinuefalse istsystemMessage: (Optional) Zusätzliche Nachricht, die dem Benutzer angezeigt wird
Unterstützte Hook-Ereignisse
Prompt-basierte Hooks funktionieren mit jedem Hook-Ereignis, sind aber am nützlichsten für:- Stop: Intelligente Entscheidung, ob Claude weiterarbeiten sollte
- SubagentStop: Evaluieren Sie, ob ein Subagent seine Aufgabe abgeschlossen hat
- UserPromptSubmit: Validieren Sie Benutzer-Prompts mit LLM-Unterstützung
- PreToolUse: Treffen Sie kontextabhängige Berechtigungsentscheidungen
Beispiel: Intelligenter Stop-Hook
Beispiel: SubagentStop mit benutzerdefinierter Logik
Vergleich mit Bash-Befehls-Hooks
| Funktion | Bash-Befehls-Hooks | Prompt-basierte Hooks |
|---|---|---|
| Ausführung | Führt Bash-Skript aus | Fragt LLM ab |
| Entscheidungslogik | Sie implementieren im Code | LLM evaluiert Kontext |
| Setup-Komplexität | Erfordert Skriptdatei | Nur Prompt konfigurieren |
| Kontextbewusstsein | Begrenzt auf Skript-Logik | Natürlichsprachliches Verständnis |
| Leistung | Schnell (lokale Ausführung) | Langsamer (API-Aufruf) |
| Anwendungsfall | Deterministische Regeln | Kontextabhängige Entscheidungen |
Best Practices
- Seien Sie spezifisch in Prompts: Geben Sie klar an, was das LLM evaluieren soll
- Entscheidungskriterien einbeziehen: Listen Sie die Faktoren auf, die das LLM berücksichtigen sollte
- Testen Sie Ihre Prompts: Überprüfen Sie, dass das LLM korrekte Entscheidungen für Ihre Anwendungsfälle trifft
- Legen Sie angemessene Timeouts fest: Standard ist 30 Sekunden, passen Sie bei Bedarf an
- Verwenden Sie für komplexe Entscheidungen: Bash-Hooks sind besser für einfache, deterministische Regeln
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-AbgleichGrep- 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 benötigt, um ein Tool zu verwenden. Beispiel: “Claude benötigt Ihre Berechtigung, um Bash zu verwenden”
- Die Prompt-Eingabe mindestens 60 Sekunden untätig war. “Claude wartet auf Ihre Eingabe”
UserPromptSubmit
Wird ausgeführt, wenn der Benutzer einen Prompt einreicht, bevor Claude ihn verarbeitet. Dies ermöglicht es Ihnen, zusätzlichen Kontext basierend auf dem Prompt/Gespräch hinzuzufügen, Prompts zu validieren oder bestimmte Arten von Prompts 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 erfolgt ist.SubagentStop
Wird ausgeführt, wenn ein Claude Code-Subagent (Task-Tool-Aufruf) die Antwort beendet hat.PreCompact
Wird ausgeführt, bevor Claude Code einen Kompaktierungsvorgang ausführen wird. Matcher:manual- Aufgerufen von/compactauto- Aufgerufen von Auto-Kompaktierung (aufgrund eines vollen Kontextfensters)
SessionStart
Wird ausgeführt, wenn Claude Code eine neue Sitzung startet oder eine bestehende 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 Einrichten von Umgebungsvariablen. Matcher:startup- Aufgerufen beim Startupresume- Aufgerufen von--resume,--continueoder/resumeclear- Aufgerufen von/clearcompact- Aufgerufen von Auto- oder manueller Kompaktierung.
Persistieren von Umgebungsvariablen
SessionStart-Hooks haben Zugriff auf die UmgebungsvariableCLAUDE_ENV_FILE, die einen Dateipfad bereitstellt, wo Sie Umgebungsvariablen für nachfolgende Bash-Befehle persistieren können.
Beispiel: Einzelne Umgebungsvariablen setzen
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 Sitzungszustands. Das Feldreason in der Hook-Eingabe ist eines von:
clear- Sitzung mit /clear-Befehl gelöschtlogout- Benutzer abgemeldetprompt_input_exit- Benutzer beendet, während die Prompt-Eingabe 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, wie Hooks Ausgaben an Claude Code zurückgeben können. Die Ausgabe kommuniziert, ob blockiert werden soll und welches Feedback Claude und dem Benutzer angezeigt werden soll.Einfach: Exit-Code
Hooks kommunizieren den Status durch Exit-Codes, stdout und stderr:- Exit-Code 0: Erfolg.
stdoutwird dem Benutzer im Transkriptmodus angezeigt (CTRL-R), außer fürUserPromptSubmitundSessionStart, wo stdout zum Kontext hinzugefügt wird. - Exit-Code 2: Blockierungsfehler.
stderrwird an Claude zurückgesendet, um automatisch verarbeitet zu werden. Siehe verhaltensweisen pro Hook-Ereignis unten. - Andere Exit-Codes: Nicht blockierender Fehler.
stderrwird dem Benutzer angezeigt und die Ausführung wird fortgesetzt.
Exit-Code 2-Verhalten
| Hook-Ereignis | Verhalten |
|---|---|
PreToolUse | Blockiert den Tool-Aufruf, zeigt stderr Claude |
PostToolUse | Zeigt stderr Claude (Tool wurde bereits ausgeführt) |
Notification | N/A, zeigt stderr nur dem Benutzer |
UserPromptSubmit | Blockiert die Prompt-Verarbeitung, löscht Prompt, zeigt stderr nur dem Benutzer |
Stop | Blockiert die Beendigung, zeigt stderr Claude |
SubagentStop | Blockiert die Beendigung, zeigt stderr Claude-Subagent |
PreCompact | N/A, zeigt stderr nur dem Benutzer |
SessionStart | N/A, zeigt stderr nur dem Benutzer |
SessionEnd | N/A, zeigt stderr nur dem Benutzer |
Erweitert: JSON-Ausgabe
Hooks können strukturiertes JSON instdout zurückgeben, um eine anspruchsvollere Kontrolle zu ermöglichen:
Gemeinsame JSON-Felder
Alle Hook-Typen können diese optionalen Felder einschließen: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 des Prompts. - Für
StopundSubagentStophat dies Vorrang vor jedem"decision": "block"-Ausgabe. - In allen Fällen hat
"continue" = falseVorrang vor jedem"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"fragt den Benutzer, um 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" und "deny" abgebildet.PostToolUse-Entscheidungskontrolle
PostToolUse-Hooks können Feedback an Claude nach der Tool-Ausführung geben.
"block"fordert Claude automatisch mitreasonauf.undefinedmacht nichts.reasonwird ignoriert."hookSpecificOutput.additionalContext"fügt Kontext für Claude hinzu, um zu berücksichtigen.
UserPromptSubmit-Entscheidungskontrolle
UserPromptSubmit-Hooks können steuern, ob ein Benutzer-Prompt verarbeitet wird.
"block"verhindert die Verarbeitung des Prompts. Der eingereichte Prompt wird aus dem Kontext gelöscht."reason"wird dem Benutzer angezeigt, aber nicht zum Kontext hinzugefügt.undefinederlaubt dem Prompt, normal fortzufahren."reason"wird ignoriert."hookSpecificOutput.additionalContext"fügt die Zeichenkette 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 vorzugehen ist.undefinederlaubt Claude zu stoppen.reasonwird ignoriert.
SessionStart-Entscheidungskontrolle
SessionStart-Hooks ermöglichen es Ihnen, Kontext beim Start einer Sitzung zu laden.
"hookSpecificOutput.additionalContext"fügt die Zeichenkette zum Kontext hinzu.- Mehrere Hooks’
additionalContext-Werte 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-Befehls-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’s create entities Toolmcp__filesystem__read_file- Filesystem-Server’s read file Toolmcp__github__search_repositories- GitHub-Server’s search Tool
Konfigurieren von Hooks für MCP-Tools
Sie können spezifische MCP-Tools oder ganze MCP-Server als Ziel festlegen:Beispiele
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 Befehle sind, die Sie konfigurieren
- Hooks können alle Dateien ändern, löschen oder auf die Ihr Benutzerkonto zugreifen kann
- Böswillige oder schlecht geschriebene Hooks können Datenverlust oder Systemschäden verursachen
- 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
Sicherheits-Best-Practices
Hier sind einige wichtige Praktiken zum Schreiben sichererer Hooks:- Validieren und bereinigen Sie Eingaben - Vertrauen Sie Eingabedaten nie blind
- Zitieren Sie immer Shell-Variablen - Verwenden Sie
"$VAR"nicht$VAR - Blockieren Sie Pfad-Traversal - Ü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, etc.
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 Überprüfung im
/hooks-Menü, damit Änderungen wirksam werden
Hook-Ausführungsdetails
- Timeout: 60-Sekunden-Ausführungslimit standardmäßig, konfigurierbar pro Befehl.
- Ein Timeout für einen einzelnen Befehl beeinflusst 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 Claude Codes Umgebung ausgeführt
- Die Umgebungsvariable
CLAUDE_PROJECT_DIRist verfügbar und enthält den absoluten Pfad zum Projekt-Root-Verzeichnis (wo Claude Code gestartet wurde) - Die Umgebungsvariable
CLAUDE_CODE_REMOTEgibt an, ob der Hook in einer Remote- (Web-) Umgebung ("true") oder lokalen CLI-Umgebung (nicht gesetzt oder leer) ausgeführt wird. Verwenden Sie dies, um verschiedene Logik basierend auf dem Ausführungskontext auszuführen.
- Die Umgebungsvariable
- Eingabe: JSON über stdin
- Ausgabe:
- PreToolUse/PostToolUse/Stop/SubagentStop: Fortschritt im Transkript angezeigt (Ctrl-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 zu sehen
- Nicht entgangene Anführungszeichen - Verwenden Sie
\"in JSON-Strings - Falscher Matcher - Überprüfen Sie, dass Toolnamen genau übereinstimmen (Groß-/Kleinschreibung beachtet)
- Befehl nicht gefunden - Verwenden Sie vollständige Pfade für Skripte
Erweitertes Debugging
Für komplexe Hook-Probleme:- Inspizieren Sie die Hook-Ausführung - Verwenden Sie
claude --debug, um detaillierte Hook- Ausführung zu sehen - Validieren Sie JSON-Schemas - Testen Sie Hook-Eingabe/Ausgabe mit externen Tools
- Überprüfen Sie Umgebungsvariablen - Überprüfen Sie, dass Claude Codes Umgebung 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 Logging in Ihren Hook-Skripten
Debug-Ausgabe-Beispiel
Verwenden Sieclaude --debug, um Hook-Ausführungsdetails zu sehen:
- Welcher Hook ausgeführt wird
- Befehl wird ausgeführt
- Erfolgs-/Fehlerstatus
- Ausgabe- oder Fehlermeldungen