Para um guia de início rápido com exemplos, consulte Comece com hooks do Claude Code.
Configuração
Os hooks do Claude Code são configurados em seus arquivos de configuração:~/.claude/settings.json- Configurações do usuário.claude/settings.json- Configurações do projeto.claude/settings.local.json- Configurações locais do projeto (não confirmadas)- Configurações de política gerenciada pela empresa
Estrutura
Os hooks são organizados por matchers, onde cada matcher pode ter vários hooks:- matcher: Padrão para corresponder nomes de ferramentas, sensível a maiúsculas e minúsculas (aplicável apenas para
PreToolUseePostToolUse)- Strings simples correspondem exatamente:
Writecorresponde apenas à ferramenta Write - Suporta regex:
Edit|WriteouNotebook.* - Use
*para corresponder a todas as ferramentas. Você também pode usar string vazia ("") ou deixarmatcherem branco.
- Strings simples correspondem exatamente:
- hooks: Array de comandos a executar quando o padrão corresponde
type: Atualmente apenas"command"é suportadocommand: O comando bash a executar (pode usar a variável de ambiente$CLAUDE_PROJECT_DIR)timeout: (Opcional) Quanto tempo um comando deve executar, em segundos, antes de cancelar esse comando específico.
UserPromptSubmit, Notification, Stop e SubagentStop
que não usam matchers, você pode omitir o campo matcher:
Scripts de Hook Específicos do Projeto
Você pode usar a variável de ambienteCLAUDE_PROJECT_DIR (disponível apenas quando
Claude Code executa o comando hook) para referenciar scripts armazenados em seu projeto,
garantindo que funcionem independentemente do diretório atual do Claude:
Hooks de plugin
Plugins podem fornecer hooks que se integram perfeitamente com seus hooks de usuário e projeto. Os hooks de plugin são automaticamente mesclados com sua configuração quando os plugins estão ativados. Como funcionam os hooks de plugin:- Os hooks de plugin são definidos no arquivo
hooks/hooks.jsondo plugin ou em um arquivo fornecido por um caminho personalizado para o campohooks. - Quando um plugin é ativado, seus hooks são mesclados com hooks de usuário e projeto
- Vários hooks de diferentes fontes podem responder ao mesmo evento
- Os hooks de plugin usam a variável de ambiente
${CLAUDE_PLUGIN_ROOT}para referenciar arquivos de plugin
Os hooks de plugin usam o mesmo formato que hooks regulares com um campo
description opcional para explicar o propósito do hook.Os hooks de plugin são executados junto com seus hooks personalizados. Se vários hooks corresponderem a um evento, todos serão executados em paralelo.
${CLAUDE_PLUGIN_ROOT}: Caminho absoluto para o diretório do plugin${CLAUDE_PROJECT_DIR}: Diretório raiz do projeto (igual ao dos hooks de projeto)- Todas as variáveis de ambiente padrão estão disponíveis
Eventos de Hook
PreToolUse
Executado após Claude criar parâmetros de ferramenta e antes de processar a chamada de ferramenta. Matchers comuns:Task- Tarefas de subagente (consulte documentação de subagentes)Bash- Comandos de shellGlob- Correspondência de padrão de arquivoGrep- Pesquisa de conteúdoRead- Leitura de arquivoEdit- Edição de arquivoWrite- Escrita de arquivoWebFetch,WebSearch- Operações web
PostToolUse
Executado imediatamente após uma ferramenta ser concluída com sucesso. Reconhece os mesmos valores de matcher que PreToolUse.Notification
Executado quando Claude Code envia notificações. As notificações são enviadas quando:- Claude precisa de sua permissão para usar uma ferramenta. Exemplo: “Claude precisa de sua permissão para usar Bash”
- A entrada do prompt ficou ociosa por pelo menos 60 segundos. “Claude está aguardando sua entrada”
UserPromptSubmit
Executado quando o usuário envia um prompt, antes de Claude processá-lo. Isso permite que você adicione contexto adicional com base no prompt/conversa, valide prompts ou bloqueie certos tipos de prompts.Stop
Executado quando o agente principal do Claude Code terminou de responder. Não é executado se a parada ocorreu devido a uma interrupção do usuário.SubagentStop
Executado quando um subagente do Claude Code (chamada de ferramenta Task) terminou de responder.PreCompact
Executado antes de Claude Code estar prestes a executar uma operação de compactação. Matchers:manual- Invocado de/compactauto- Invocado de auto-compact (devido à janela de contexto cheia)
SessionStart
Executado quando Claude Code inicia uma nova sessão ou retoma uma sessão existente (que atualmente inicia uma nova sessão internamente). Útil para carregar contexto de desenvolvimento como problemas existentes ou alterações recentes em sua base de código, instalar dependências ou configurar variáveis de ambiente. Matchers:startup- Invocado na inicializaçãoresume- Invocado de--resume,--continueou/resumeclear- Invocado de/clearcompact- Invocado de compactação automática ou manual.
Persistindo variáveis de ambiente
Os hooks SessionStart têm acesso à variável de ambienteCLAUDE_ENV_FILE, que fornece um caminho de arquivo onde você pode persistir variáveis de ambiente para comandos bash subsequentes.
Exemplo: Configurando variáveis de ambiente individuais
nvm use), capture e persista todas as alterações comparando o ambiente:
CLAUDE_ENV_FILE está disponível apenas para hooks SessionStart. Outros tipos de hook não têm acesso a esta variável.SessionEnd
Executado quando uma sessão do Claude Code termina. Útil para tarefas de limpeza, registro de estatísticas de sessão ou salvamento do estado da sessão. O camporeason na entrada do hook será um de:
clear- Sessão limpa com comando /clearlogout- Usuário desconectadoprompt_input_exit- Usuário saiu enquanto a entrada do prompt estava visívelother- Outros motivos de saída
Entrada de Hook
Os hooks recebem dados JSON via stdin contendo informações de sessão e dados específicos do evento:Entrada PreToolUse
O esquema exato paratool_input depende da ferramenta.
Entrada PostToolUse
O esquema exato paratool_input e tool_response depende da ferramenta.
Entrada de Notificação
Entrada UserPromptSubmit
Entrada Stop e SubagentStop
stop_hook_active é verdadeiro quando Claude Code já está continuando como resultado de
um hook de parada. Verifique este valor ou processe a transcrição para evitar que Claude Code
execute indefinidamente.
Entrada PreCompact
Paramanual, custom_instructions vem do que o usuário passa para
/compact. Para auto, custom_instructions está vazio.
Entrada SessionStart
Entrada SessionEnd
Saída de Hook
Existem duas maneiras para hooks retornarem saída de volta ao Claude Code. A saída comunica se deve bloquear e qualquer feedback que deve ser mostrado ao Claude e ao usuário.Simples: Código de Saída
Os hooks comunicam status através de códigos de saída, stdout e stderr:- Código de saída 0: Sucesso.
stdouté mostrado ao usuário no modo de transcrição (CTRL-R), exceto paraUserPromptSubmiteSessionStart, onde stdout é adicionado ao contexto. - Código de saída 2: Erro de bloqueio.
stderré alimentado de volta ao Claude para processar automaticamente. Consulte o comportamento específico do evento de hook abaixo. - Outros códigos de saída: Erro não bloqueador.
stderré mostrado ao usuário e a execução continua.
Lembrete: Claude Code não vê stdout se o código de saída for 0, exceto para
o hook
UserPromptSubmit onde stdout é injetado como contexto.Comportamento do Código de Saída 2
| Evento de Hook | Comportamento |
|---|---|
PreToolUse | Bloqueia a chamada de ferramenta, mostra stderr ao Claude |
PostToolUse | Mostra stderr ao Claude (ferramenta já foi executada) |
Notification | N/A, mostra stderr apenas ao usuário |
UserPromptSubmit | Bloqueia o processamento de prompt, apaga o prompt, mostra stderr apenas ao usuário |
Stop | Bloqueia a parada, mostra stderr ao Claude |
SubagentStop | Bloqueia a parada, mostra stderr ao subagente Claude |
PreCompact | N/A, mostra stderr apenas ao usuário |
SessionStart | N/A, mostra stderr apenas ao usuário |
SessionEnd | N/A, mostra stderr apenas ao usuário |
Avançado: Saída JSON
Os hooks podem retornar JSON estruturado emstdout para controle mais sofisticado:
Campos JSON Comuns
Todos os tipos de hook podem incluir estes campos opcionais:continue for false, Claude para de processar após os hooks serem executados.
- Para
PreToolUse, isso é diferente de"permissionDecision": "deny", que apenas bloqueia uma chamada de ferramenta específica e fornece feedback automático ao Claude. - Para
PostToolUse, isso é diferente de"decision": "block", que fornece feedback automatizado ao Claude. - Para
UserPromptSubmit, isso impede que o prompt seja processado. - Para
StopeSubagentStop, isso tem precedência sobre qualquer saída"decision": "block". - Em todos os casos,
"continue" = falsetem precedência sobre qualquer saída"decision": "block".
stopReason acompanha continue com um motivo mostrado ao usuário, não mostrado
ao Claude.
Controle de Decisão PreToolUse
Os hooks PreToolUse podem controlar se uma chamada de ferramenta prossegue.
"allow"ignora o sistema de permissão.permissionDecisionReasoné mostrado ao usuário mas não ao Claude."deny"impede que a chamada de ferramenta seja executada.permissionDecisionReasoné mostrado ao Claude."ask"pede ao usuário para confirmar a chamada de ferramenta na UI.permissionDecisionReasoné mostrado ao usuário mas não ao Claude.
Os campos
decision e reason estão descontinuados para hooks PreToolUse.
Use hookSpecificOutput.permissionDecision e
hookSpecificOutput.permissionDecisionReason em vez disso. Os campos descontinuados
"approve" e "block" mapeiam para "allow" e "deny" respectivamente.Controle de Decisão PostToolUse
Os hooks PostToolUse podem fornecer feedback ao Claude após a execução da ferramenta.
"block"solicita automaticamente ao Claude comreason.undefinednão faz nada.reasoné ignorado."hookSpecificOutput.additionalContext"adiciona contexto para Claude considerar.
Controle de Decisão UserPromptSubmit
Os hooks UserPromptSubmit podem controlar se um prompt do usuário é processado.
"block"impede que o prompt seja processado. O prompt enviado é apagado do contexto."reason"é mostrado ao usuário mas não adicionado ao contexto.undefinedpermite que o prompt prossiga normalmente."reason"é ignorado."hookSpecificOutput.additionalContext"adiciona a string ao contexto se não bloqueado.
Controle de Decisão Stop/SubagentStop
Os hooks Stop e SubagentStop podem controlar se Claude deve continuar.
"block"impede que Claude pare. Você deve preencherreasonpara Claude saber como proceder.undefinedpermite que Claude pare.reasoné ignorado.
Controle de Decisão SessionStart
Os hooks SessionStart permitem que você carregue contexto no início de uma sessão.
"hookSpecificOutput.additionalContext"adiciona a string ao contexto.- Os valores
additionalContextde vários hooks são concatenados.
Controle de Decisão SessionEnd
Os hooks SessionEnd são executados quando uma sessão termina. Eles não podem bloquear o término da sessão
mas podem executar tarefas de limpeza.
Exemplo de Código de Saída: Validação de Comando Bash
Exemplo de Saída JSON: UserPromptSubmit para Adicionar Contexto e Validação
Para hooks
UserPromptSubmit, você pode injetar contexto usando qualquer método:- Código de saída 0 com stdout: Claude vê o contexto (caso especial para
UserPromptSubmit) - Saída JSON: Fornece mais controle sobre o comportamento
Exemplo de Saída JSON: PreToolUse com Aprovação
Trabalhando com Ferramentas MCP
Os hooks do Claude Code funcionam perfeitamente com ferramentas do Model Context Protocol (MCP). Quando servidores MCP fornecem ferramentas, elas aparecem com um padrão de nomenclatura especial que você pode corresponder em seus hooks.Nomenclatura de Ferramentas MCP
As ferramentas MCP seguem o padrãomcp__<server>__<tool>, por exemplo:
mcp__memory__create_entities- Ferramenta create entities do servidor Memorymcp__filesystem__read_file- Ferramenta read file do servidor Filesystemmcp__github__search_repositories- Ferramenta search do servidor GitHub
Configurando Hooks para Ferramentas MCP
Você pode direcionar ferramentas MCP específicas ou servidores MCP inteiros:Exemplos
Para exemplos práticos incluindo formatação de código, notificações e proteção de arquivo, consulte Mais Exemplos no guia de início.
Considerações de Segurança
Aviso de Isenção
USE POR SUA CONTA E RISCO: Os hooks do Claude Code executam comandos shell arbitrários em seu sistema automaticamente. Ao usar hooks, você reconhece que:- Você é o único responsável pelos comandos que configura
- Os hooks podem modificar, deletar ou acessar qualquer arquivo que sua conta de usuário possa acessar
- Hooks maliciosos ou mal escritos podem causar perda de dados ou danos ao sistema
- Anthropic não fornece garantia e não assume responsabilidade por qualquer dano resultante do uso de hooks
- Você deve testar completamente os hooks em um ambiente seguro antes do uso em produção
Melhores Práticas de Segurança
Aqui estão algumas práticas-chave para escrever hooks mais seguros:- Valide e sanitize entradas - Nunca confie cegamente em dados de entrada
- Sempre cite variáveis de shell - Use
"$VAR"não$VAR - Bloqueie travessia de caminho - Verifique
..em caminhos de arquivo - Use caminhos absolutos - Especifique caminhos completos para scripts (use “$CLAUDE_PROJECT_DIR” para o caminho do projeto)
- Pule arquivos sensíveis - Evite
.env,.git/, chaves, etc.
Segurança de Configuração
Edições diretas de hooks em arquivos de configuração não entram em vigor imediatamente. Claude Code:- Captura um snapshot de hooks na inicialização
- Usa este snapshot durante toda a sessão
- Avisa se hooks forem modificados externamente
- Requer revisão no menu
/hookspara que as alterações entrem em vigor
Detalhes de Execução de Hook
- Timeout: Limite de execução de 60 segundos por padrão, configurável por comando.
- Um timeout para um comando individual não afeta os outros comandos.
- Paralelização: Todos os hooks correspondentes são executados em paralelo
- Deduplicação: Múltiplos comandos de hook idênticos são automaticamente deduplicated
- Ambiente: Executado no diretório atual com o ambiente do Claude Code
- A variável de ambiente
CLAUDE_PROJECT_DIRestá disponível e contém o caminho absoluto para o diretório raiz do projeto (onde Claude Code foi iniciado) - A variável de ambiente
CLAUDE_CODE_REMOTEindica se o hook está sendo executado em um ambiente remoto (web) ("true") ou ambiente CLI local (não definido ou vazio). Use isso para executar lógica diferente com base no contexto de execução.
- A variável de ambiente
- Entrada: JSON via stdin
- Saída:
- PreToolUse/PostToolUse/Stop/SubagentStop: Progresso mostrado na transcrição (Ctrl-R)
- Notification/SessionEnd: Registrado apenas em debug (
--debug) - UserPromptSubmit/SessionStart: stdout adicionado como contexto para Claude
Depuração
Solução de Problemas Básica
Se seus hooks não estão funcionando:- Verifique a configuração - Execute
/hookspara ver se seu hook está registrado - Verifique a sintaxe - Certifique-se de que suas configurações JSON são válidas
- Teste comandos - Execute comandos de hook manualmente primeiro
- Verifique permissões - Certifique-se de que os scripts são executáveis
- Revise logs - Use
claude --debugpara ver detalhes de execução de hook
- Aspas não escapadas - Use
\"dentro de strings JSON - Matcher errado - Verifique se os nomes de ferramentas correspondem exatamente (sensível a maiúsculas e minúsculas)
- Comando não encontrado - Use caminhos completos para scripts
Depuração Avançada
Para problemas complexos de hook:- Inspecione a execução do hook - Use
claude --debugpara ver a execução detalhada do hook - Valide esquemas JSON - Teste entrada/saída de hook com ferramentas externas
- Verifique variáveis de ambiente - Verifique se o ambiente do Claude Code está correto
- Teste casos extremos - Tente hooks com caminhos de arquivo ou entradas incomuns
- Monitore recursos do sistema - Verifique se há esgotamento de recursos durante a execução do hook
- Use logging estruturado - Implemente logging em seus scripts de hook
Exemplo de Saída de Debug
Useclaude --debug para ver detalhes de execução de hook:
- Qual hook está sendo executado
- Comando sendo executado
- Status de sucesso/falha
- Mensagens de saída ou erro