Pour un guide de démarrage rapide avec des exemples, consultez Démarrer avec les hooks Claude Code.
Configuration
Les hooks Claude Code sont configurés dans vos fichiers de paramètres :~/.claude/settings.json- Paramètres utilisateur.claude/settings.json- Paramètres du projet.claude/settings.local.json- Paramètres du projet local (non validés)- Paramètres de politique gérés par l’entreprise
Structure
Les hooks sont organisés par matchers, où chaque matcher peut avoir plusieurs hooks :- matcher : Motif pour correspondre aux noms d’outils, sensible à la casse (applicable uniquement pour
PreToolUseetPostToolUse)- Les chaînes simples correspondent exactement :
Writecorrespond uniquement à l’outil Write - Supporte les expressions régulières :
Edit|WriteouNotebook.* - Utilisez
*pour correspondre à tous les outils. Vous pouvez également utiliser une chaîne vide ("") ou laissermatchervide.
- Les chaînes simples correspondent exactement :
- hooks : Tableau de commandes à exécuter lorsque le motif correspond
type: Actuellement, seul"command"est supportécommand: La commande bash à exécuter (peut utiliser la variable d’environnement$CLAUDE_PROJECT_DIR)timeout: (Optionnel) Durée pendant laquelle une commande doit s’exécuter, en secondes, avant d’annuler cette commande spécifique.
UserPromptSubmit, Notification, Stop et SubagentStop
qui n’utilisent pas de matchers, vous pouvez omettre le champ matcher :
Scripts de hooks spécifiques au projet
Vous pouvez utiliser la variable d’environnementCLAUDE_PROJECT_DIR (disponible uniquement lorsque
Claude Code lance la commande hook) pour référencer les scripts stockés dans votre projet,
en garantissant qu’ils fonctionnent quel que soit le répertoire courant de Claude :
Hooks de plugins
Les plugins peuvent fournir des hooks qui s’intègrent de manière transparente avec vos hooks utilisateur et projet. Les hooks de plugins sont automatiquement fusionnés avec votre configuration lorsque les plugins sont activés. Comment fonctionnent les hooks de plugins :- Les hooks de plugins sont définis dans le fichier
hooks/hooks.jsondu plugin ou dans un fichier donné par un chemin personnalisé vers le champhooks. - Lorsqu’un plugin est activé, ses hooks sont fusionnés avec les hooks utilisateur et projet
- Plusieurs hooks de différentes sources peuvent répondre au même événement
- Les hooks de plugins utilisent la variable d’environnement
${CLAUDE_PLUGIN_ROOT}pour référencer les fichiers de plugins
Les hooks de plugins utilisent le même format que les hooks réguliers avec un champ
description optionnel pour expliquer le but du hook.Les hooks de plugins s’exécutent aux côtés de vos hooks personnalisés. Si plusieurs hooks correspondent à un événement, ils s’exécutent tous en parallèle.
${CLAUDE_PLUGIN_ROOT}: Chemin absolu vers le répertoire du plugin${CLAUDE_PROJECT_DIR}: Répertoire racine du projet (identique à celui des hooks de projet)- Toutes les variables d’environnement standard sont disponibles
Événements de hooks
PreToolUse
S’exécute après que Claude crée les paramètres d’outil et avant de traiter l’appel d’outil. Matchers courants :Task- Tâches de sous-agent (consultez la documentation des sous-agents)Bash- Commandes shellGlob- Correspondance de motif de fichierGrep- Recherche de contenuRead- Lecture de fichierEdit- Édition de fichierWrite- Écriture de fichierWebFetch,WebSearch- Opérations web
PostToolUse
S’exécute immédiatement après qu’un outil se termine avec succès. Reconnaît les mêmes valeurs de matcher que PreToolUse.Notification
S’exécute lorsque Claude Code envoie des notifications. Les notifications sont envoyées lorsque :- Claude a besoin de votre permission pour utiliser un outil. Exemple : « Claude a besoin de votre permission pour utiliser Bash »
- L’entrée de l’invite est restée inactive pendant au moins 60 secondes. « Claude attend votre entrée »
UserPromptSubmit
S’exécute lorsque l’utilisateur soumet une invite, avant que Claude la traite. Cela vous permet d’ajouter du contexte supplémentaire basé sur l’invite/conversation, de valider les invites ou de bloquer certains types d’invites.Stop
S’exécute lorsque l’agent Claude Code principal a terminé sa réponse. Ne s’exécute pas si l’arrêt s’est produit en raison d’une interruption utilisateur.SubagentStop
S’exécute lorsqu’un sous-agent Claude Code (appel d’outil Task) a terminé sa réponse.PreCompact
S’exécute avant que Claude Code ne soit sur le point d’exécuter une opération de compactage. Matchers :manual- Invoqué depuis/compactauto- Invoqué depuis le compactage automatique (en raison d’une fenêtre de contexte complète)
SessionStart
S’exécute lorsque Claude Code démarre une nouvelle session ou reprend une session existante (ce qui démarre actuellement une nouvelle session en arrière-plan). Utile pour charger du contexte de développement comme les problèmes existants ou les modifications récentes de votre base de code, installer des dépendances ou configurer des variables d’environnement. Matchers :startup- Invoqué au démarrageresume- Invoqué depuis--resume,--continueou/resumeclear- Invoqué depuis/clearcompact- Invoqué depuis le compactage automatique ou manuel.
Persistance des variables d’environnement
Les hooks SessionStart ont accès à la variable d’environnementCLAUDE_ENV_FILE, qui fournit un chemin de fichier où vous pouvez persister les variables d’environnement pour les commandes bash ultérieures.
Exemple : Définition de variables d’environnement individuelles
nvm use), capturez et persistez tous les changements en comparant l’environnement :
CLAUDE_ENV_FILE n’est disponible que pour les hooks SessionStart. Les autres types de hooks n’ont pas accès à cette variable.SessionEnd
S’exécute lorsqu’une session Claude Code se termine. Utile pour les tâches de nettoyage, la journalisation des statistiques de session ou l’enregistrement de l’état de la session. Le champreason dans l’entrée du hook sera l’un des suivants :
clear- Session effacée avec la commande /clearlogout- Utilisateur déconnectéprompt_input_exit- Utilisateur quitté alors que l’entrée d’invite était visibleother- Autres raisons de sortie
Entrée de hook
Les hooks reçoivent des données JSON via stdin contenant les informations de session et les données spécifiques à l’événement :Entrée PreToolUse
Le schéma exact pourtool_input dépend de l’outil.
Entrée PostToolUse
Le schéma exact pourtool_input et tool_response dépend de l’outil.
Entrée Notification
Entrée UserPromptSubmit
Entrée Stop et SubagentStop
stop_hook_active est true lorsque Claude Code continue déjà en raison d’un
hook stop. Vérifiez cette valeur ou traitez la transcription pour empêcher Claude Code
de s’exécuter indéfiniment.
Entrée PreCompact
Pourmanual, custom_instructions provient de ce que l’utilisateur passe dans
/compact. Pour auto, custom_instructions est vide.
Entrée SessionStart
Entrée SessionEnd
Sortie de hook
Il y a deux façons pour les hooks de retourner une sortie à Claude Code. La sortie communique s’il faut bloquer et tout retour d’information qui doit être montré à Claude et à l’utilisateur.Simple : Code de sortie
Les hooks communiquent le statut via les codes de sortie, stdout et stderr :- Code de sortie 0 : Succès.
stdoutest montré à l’utilisateur en mode transcription (CTRL-R), sauf pourUserPromptSubmitetSessionStart, où stdout est ajouté au contexte. - Code de sortie 2 : Erreur de blocage.
stderrest renvoyé à Claude pour être traité automatiquement. Consultez le comportement spécifique à chaque événement de hook ci-dessous. - Autres codes de sortie : Erreur sans blocage.
stderrest montré à l’utilisateur et l’exécution continue.
Rappel : Claude Code ne voit pas stdout si le code de sortie est 0, sauf pour
le hook
UserPromptSubmit où stdout est injecté comme contexte.Comportement du code de sortie 2
| Événement de hook | Comportement |
|---|---|
PreToolUse | Bloque l’appel d’outil, montre stderr à Claude |
PostToolUse | Montre stderr à Claude (l’outil a déjà été exécuté) |
Notification | N/A, montre stderr à l’utilisateur uniquement |
UserPromptSubmit | Bloque le traitement de l’invite, efface l’invite, montre stderr à l’utilisateur uniquement |
Stop | Bloque l’arrêt, montre stderr à Claude |
SubagentStop | Bloque l’arrêt, montre stderr au sous-agent Claude |
PreCompact | N/A, montre stderr à l’utilisateur uniquement |
SessionStart | N/A, montre stderr à l’utilisateur uniquement |
SessionEnd | N/A, montre stderr à l’utilisateur uniquement |
Avancé : Sortie JSON
Les hooks peuvent retourner du JSON structuré dansstdout pour un contrôle plus sophistiqué :
Champs JSON communs
Tous les types de hooks peuvent inclure ces champs optionnels :continue est false, Claude arrête le traitement après l’exécution des hooks.
- Pour
PreToolUse, ceci est différent de"permissionDecision": "deny", qui bloque uniquement un appel d’outil spécifique et fournit un retour automatique à Claude. - Pour
PostToolUse, ceci est différent de"decision": "block", qui fournit un retour automatisé à Claude. - Pour
UserPromptSubmit, ceci empêche le traitement de l’invite. - Pour
StopetSubagentStop, ceci a priorité sur tout"decision": "block"en sortie. - Dans tous les cas,
"continue" = falsea priorité sur tout"decision": "block"en sortie.
stopReason accompagne continue avec une raison montrée à l’utilisateur, non montrée
à Claude.
Contrôle de décision PreToolUse
Les hooks PreToolUse peuvent contrôler si un appel d’outil procède.
"allow"contourne le système de permission.permissionDecisionReasonest montré à l’utilisateur mais pas à Claude."deny"empêche l’exécution de l’appel d’outil.permissionDecisionReasonest montré à Claude."ask"demande à l’utilisateur de confirmer l’appel d’outil dans l’interface utilisateur.permissionDecisionReasonest montré à l’utilisateur mais pas à Claude.
updatedInput :
updatedInputvous permet de modifier les paramètres d’entrée de l’outil avant l’exécution de l’outil. C’est un objetRecord<string, unknown>contenant les champs que vous souhaitez modifier ou ajouter.- Ceci est très utile avec
"permissionDecision": "allow"pour modifier et approuver les appels d’outil.
Les champs
decision et reason sont dépréciés pour les hooks PreToolUse.
Utilisez hookSpecificOutput.permissionDecision et
hookSpecificOutput.permissionDecisionReason à la place. Les champs dépréciés
"approve" et "block" correspondent à "allow" et "deny" respectivement.Contrôle de décision PostToolUse
Les hooks PostToolUse peuvent fournir un retour à Claude après l’exécution de l’outil.
"block"invite automatiquement Claude avecreason.undefinedne fait rien.reasonest ignoré."hookSpecificOutput.additionalContext"ajoute du contexte pour que Claude le considère.
Contrôle de décision UserPromptSubmit
Les hooks UserPromptSubmit peuvent contrôler si une invite utilisateur est traitée.
"block"empêche le traitement de l’invite. L’invite soumise est effacée du contexte."reason"est montré à l’utilisateur mais pas ajouté au contexte.undefinedpermet à l’invite de procéder normalement."reason"est ignoré."hookSpecificOutput.additionalContext"ajoute la chaîne au contexte si elle n’est pas bloquée.
Contrôle de décision Stop/SubagentStop
Les hooks Stop et SubagentStop peuvent contrôler si Claude doit continuer.
"block"empêche Claude de s’arrêter. Vous devez remplirreasonpour que Claude sache comment procéder.undefinedpermet à Claude de s’arrêter.reasonest ignoré.
Contrôle de décision SessionStart
Les hooks SessionStart vous permettent de charger du contexte au démarrage d’une session.
"hookSpecificOutput.additionalContext"ajoute la chaîne au contexte.- Les valeurs
additionalContextde plusieurs hooks sont concaténées.
Contrôle de décision SessionEnd
Les hooks SessionEnd s’exécutent lorsqu’une session se termine. Ils ne peuvent pas bloquer la terminaison de la session
mais peuvent effectuer des tâches de nettoyage.
Exemple de code de sortie : Validation de commande Bash
Exemple de sortie JSON : UserPromptSubmit pour ajouter du contexte et de la validation
Pour les hooks
UserPromptSubmit, vous pouvez injecter du contexte en utilisant l’une ou l’autre méthode :- Code de sortie 0 avec stdout : Claude voit le contexte (cas spécial pour
UserPromptSubmit) - Sortie JSON : Fournit plus de contrôle sur le comportement
Exemple de sortie JSON : PreToolUse avec approbation
Travailler avec les outils MCP
Les hooks Claude Code fonctionnent de manière transparente avec les outils Model Context Protocol (MCP). Lorsque les serveurs MCP fournissent des outils, ils apparaissent avec un motif de nommage spécial que vous pouvez correspondre dans vos hooks.Nommage des outils MCP
Les outils MCP suivent le motifmcp__<server>__<tool>, par exemple :
mcp__memory__create_entities- Outil create entities du serveur Memorymcp__filesystem__read_file- Outil read file du serveur Filesystemmcp__github__search_repositories- Outil search du serveur GitHub
Configuration des hooks pour les outils MCP
Vous pouvez cibler des outils MCP spécifiques ou des serveurs MCP entiers :Exemples
Pour des exemples pratiques incluant le formatage du code, les notifications et la protection des fichiers, consultez Plus d’exemples dans le guide de démarrage.
Considérations de sécurité
Avertissement
UTILISATION À VOS PROPRES RISQUES : Les hooks Claude Code exécutent des commandes shell arbitraires sur votre système automatiquement. En utilisant les hooks, vous reconnaissez que :- Vous êtes seul responsable des commandes que vous configurez
- Les hooks peuvent modifier, supprimer ou accéder à tous les fichiers auxquels votre compte utilisateur peut accéder
- Les hooks malveillants ou mal écrits peuvent causer une perte de données ou des dommages au système
- Anthropic ne fournit aucune garantie et n’assume aucune responsabilité pour les dommages résultant de l’utilisation des hooks
- Vous devez tester minutieusement les hooks dans un environnement sûr avant l’utilisation en production
Meilleures pratiques de sécurité
Voici quelques pratiques clés pour écrire des hooks plus sécurisés :- Valider et nettoyer les entrées - Ne faites jamais confiance aux données d’entrée aveuglément
- Toujours citer les variables shell - Utilisez
"$VAR"et non$VAR - Bloquer la traversée de répertoires - Vérifiez la présence de
..dans les chemins de fichier - Utiliser des chemins absolus - Spécifiez les chemins complets pour les scripts (utilisez “$CLAUDE_PROJECT_DIR” pour le chemin du projet)
- Ignorer les fichiers sensibles - Évitez
.env,.git/, les clés, etc.
Sécurité de la configuration
Les modifications directes des hooks dans les fichiers de paramètres ne prennent pas effet immédiatement. Claude Code :- Capture un instantané des hooks au démarrage
- Utilise cet instantané tout au long de la session
- Avertit si les hooks sont modifiés de manière externe
- Nécessite un examen dans le menu
/hookspour que les modifications s’appliquent
Détails d’exécution des hooks
- Timeout : Limite d’exécution de 60 secondes par défaut, configurable par commande.
- Un timeout pour une commande individuelle n’affecte pas les autres commandes.
- Parallélisation : Tous les hooks correspondants s’exécutent en parallèle
- Déduplication : Les commandes de hook identiques multiples sont automatiquement dédupliquées
- Environnement : S’exécute dans le répertoire courant avec l’environnement de Claude Code
- La variable d’environnement
CLAUDE_PROJECT_DIRest disponible et contient le chemin absolu vers le répertoire racine du projet (où Claude Code a été lancé) - La variable d’environnement
CLAUDE_CODE_REMOTEindique si le hook s’exécute dans un environnement distant (web) ("true") ou un environnement CLI local (non défini ou vide). Utilisez ceci pour exécuter une logique différente en fonction du contexte d’exécution.
- La variable d’environnement
- Entrée : JSON via stdin
- Sortie :
- PreToolUse/PostToolUse/Stop/SubagentStop : Progression affichée en transcription (Ctrl-R)
- Notification/SessionEnd : Enregistré au débogage uniquement (
--debug) - UserPromptSubmit/SessionStart : stdout ajouté comme contexte pour Claude
Débogage
Dépannage de base
Si vos hooks ne fonctionnent pas :- Vérifier la configuration - Exécutez
/hookspour voir si votre hook est enregistré - Vérifier la syntaxe - Assurez-vous que votre JSON de paramètres est valide
- Tester les commandes - Exécutez d’abord les commandes de hook manuellement
- Vérifier les permissions - Assurez-vous que les scripts sont exécutables
- Consulter les journaux - Utilisez
claude --debugpour voir les détails d’exécution des hooks
- Guillemets non échappés - Utilisez
\"dans les chaînes JSON - Matcher incorrect - Vérifiez que les noms d’outils correspondent exactement (sensible à la casse)
- Commande non trouvée - Utilisez les chemins complets pour les scripts
Débogage avancé
Pour les problèmes de hook complexes :- Inspecter l’exécution du hook - Utilisez
claude --debugpour voir l’exécution détaillée du hook - Valider les schémas JSON - Testez l’entrée/sortie du hook avec des outils externes
- Vérifier les variables d’environnement - Vérifiez que l’environnement de Claude Code est correct
- Tester les cas limites - Essayez les hooks avec des chemins de fichier ou des entrées inhabituels
- Surveiller les ressources système - Vérifiez l’épuisement des ressources pendant l’exécution du hook
- Utiliser la journalisation structurée - Implémentez la journalisation dans vos scripts de hook
Exemple de sortie de débogage
Utilisezclaude --debug pour voir les détails d’exécution du hook :
- Quel hook s’exécute
- Commande en cours d’exécution
- Statut de succès/échec
- Messages de sortie ou d’erreur