Para una guía de inicio rápido con ejemplos, consulta Comenzar con hooks de Claude Code.
Configuración
Los hooks de Claude Code se configuran en tus archivos de configuración:~/.claude/settings.json- Configuración de usuario.claude/settings.json- Configuración del proyecto.claude/settings.local.json- Configuración local del proyecto (no confirmada)- Configuración de política gestionada por Enterprise
Estructura
Los hooks se organizan por matchers, donde cada matcher puede tener múltiples hooks:- matcher: Patrón para coincidir con nombres de herramientas, sensible a mayúsculas (solo aplicable para
PreToolUseyPostToolUse)- Las cadenas simples coinciden exactamente:
Writecoincide solo con la herramienta Write - Admite regex:
Edit|WriteoNotebook.* - Usa
*para coincidir con todas las herramientas. También puedes usar una cadena vacía ("") o dejarmatcheren blanco.
- Las cadenas simples coinciden exactamente:
- hooks: Array de comandos a ejecutar cuando el patrón coincide
type: Actualmente solo se admite"command"command: El comando bash a ejecutar (puede usar la variable de entorno$CLAUDE_PROJECT_DIR)timeout: (Opcional) Cuánto tiempo debe ejecutarse un comando, en segundos, antes de cancelar ese comando específico.
UserPromptSubmit, Notification, Stop y SubagentStop
que no usan matchers, puedes omitir el campo matcher:
Scripts de Hook Específicos del Proyecto
Puedes usar la variable de entornoCLAUDE_PROJECT_DIR (solo disponible cuando
Claude Code genera el comando hook) para hacer referencia a scripts almacenados en tu proyecto,
asegurando que funcionen independientemente del directorio actual de Claude:
Hooks de complementos
Los complementos pueden proporcionar hooks que se integren sin problemas con tus hooks de usuario y proyecto. Los hooks de complementos se fusionan automáticamente con tu configuración cuando los complementos están habilitados. Cómo funcionan los hooks de complementos:- Los hooks de complementos se definen en el archivo
hooks/hooks.jsondel complemento o en un archivo dado por una ruta personalizada al campohooks. - Cuando un complemento está habilitado, sus hooks se fusionan con los hooks de usuario y proyecto
- Múltiples hooks de diferentes fuentes pueden responder al mismo evento
- Los hooks de complementos usan la variable de entorno
${CLAUDE_PLUGIN_ROOT}para hacer referencia a archivos de complementos
Los hooks de complementos usan el mismo formato que los hooks regulares con un campo
description opcional para explicar el propósito del hook.Los hooks de complementos se ejecutan junto con tus hooks personalizados. Si múltiples hooks coinciden con un evento, todos se ejecutan en paralelo.
${CLAUDE_PLUGIN_ROOT}: Ruta absoluta al directorio del complemento${CLAUDE_PROJECT_DIR}: Directorio raíz del proyecto (igual que para hooks de proyecto)- Todas las variables de entorno estándar están disponibles
Eventos de Hook
PreToolUse
Se ejecuta después de que Claude crea parámetros de herramienta y antes de procesar la llamada de herramienta. Matchers comunes:Task- Tareas de subagentes (consulta la documentación de subagentes)Bash- Comandos de shellGlob- Coincidencia de patrones de archivoGrep- Búsqueda de contenidoRead- Lectura de archivoEdit- Edición de archivoWrite- Escritura de archivoWebFetch,WebSearch- Operaciones web
PostToolUse
Se ejecuta inmediatamente después de que una herramienta se completa exitosamente. Reconoce los mismos valores de matcher que PreToolUse.Notification
Se ejecuta cuando Claude Code envía notificaciones. Las notificaciones se envían cuando:- Claude necesita tu permiso para usar una herramienta. Ejemplo: “Claude necesita tu permiso para usar Bash”
- La entrada del prompt ha estado inactiva durante al menos 60 segundos. “Claude está esperando tu entrada”
UserPromptSubmit
Se ejecuta cuando el usuario envía un prompt, antes de que Claude lo procese. Esto te permite agregar contexto adicional basado en el prompt/conversación, validar prompts o bloquear ciertos tipos de prompts.Stop
Se ejecuta cuando el agente principal de Claude Code ha terminado de responder. No se ejecuta si la detención ocurrió debido a una interrupción del usuario.SubagentStop
Se ejecuta cuando un subagente de Claude Code (llamada de herramienta Task) ha terminado de responder.PreCompact
Se ejecuta antes de que Claude Code esté a punto de ejecutar una operación de compactación. Matchers:manual- Invocado desde/compactauto- Invocado desde compactación automática (debido a ventana de contexto llena)
SessionStart
Se ejecuta cuando Claude Code inicia una nueva sesión o reanuda una sesión existente (que actualmente inicia una nueva sesión bajo el capó). Útil para cargar contexto de desarrollo como problemas existentes o cambios recientes en tu base de código, instalar dependencias o configurar variables de entorno. Matchers:startup- Invocado desde el inicioresume- Invocado desde--resume,--continueo/resumeclear- Invocado desde/clearcompact- Invocado desde compactación automática o manual.
Persistencia de variables de entorno
Los hooks de SessionStart tienen acceso a la variable de entornoCLAUDE_ENV_FILE, que proporciona una ruta de archivo donde puedes persistir variables de entorno para comandos bash posteriores.
Ejemplo: Configurar variables de entorno individuales
nvm use), captura y persiste todos los cambios comparando el entorno:
CLAUDE_ENV_FILE solo está disponible para hooks de SessionStart. Otros tipos de hooks no tienen acceso a esta variable.SessionEnd
Se ejecuta cuando una sesión de Claude Code termina. Útil para tareas de limpieza, registro de estadísticas de sesión o guardado del estado de la sesión. El camporeason en la entrada del hook será uno de:
clear- Sesión borrada con comando /clearlogout- Usuario cerró sesiónprompt_input_exit- Usuario salió mientras la entrada del prompt era visibleother- Otras razones de salida
Entrada de Hook
Los hooks reciben datos JSON a través de stdin que contienen información de sesión y datos específicos del evento:Entrada de PreToolUse
El esquema exacto paratool_input depende de la herramienta.
Entrada de PostToolUse
El esquema exacto paratool_input y tool_response depende de la herramienta.
Entrada de Notification
Entrada de UserPromptSubmit
Entrada de Stop y SubagentStop
stop_hook_active es true cuando Claude Code ya está continuando como resultado de
un hook de stop. Verifica este valor o procesa la transcripción para evitar que Claude Code
se ejecute indefinidamente.
Entrada de PreCompact
Paramanual, custom_instructions proviene de lo que el usuario pasa a
/compact. Para auto, custom_instructions está vacío.
Entrada de SessionStart
Entrada de SessionEnd
Salida de Hook
Hay dos formas para que los hooks devuelvan salida a Claude Code. La salida comunica si se debe bloquear y cualquier retroalimentación que deba mostrarse a Claude y al usuario.Simple: Código de Salida
Los hooks comunican estado a través de códigos de salida, stdout y stderr:- Código de salida 0: Éxito.
stdoutse muestra al usuario en modo de transcripción (CTRL-R), excepto paraUserPromptSubmitySessionStart, donde stdout se agrega al contexto. - Código de salida 2: Error de bloqueo.
stderrse retroalimenta a Claude para procesar automáticamente. Consulta el comportamiento específico de cada evento de hook a continuación. - Otros códigos de salida: Error no bloqueante.
stderrse muestra al usuario y la ejecución continúa.
Recordatorio: Claude Code no ve stdout si el código de salida es 0, excepto para
el hook
UserPromptSubmit donde stdout se inyecta como contexto.Comportamiento del Código de Salida 2
| Evento de Hook | Comportamiento |
|---|---|
PreToolUse | Bloquea la llamada de herramienta, muestra stderr a Claude |
PostToolUse | Muestra stderr a Claude (herramienta ya se ejecutó) |
Notification | N/A, muestra stderr solo al usuario |
UserPromptSubmit | Bloquea el procesamiento del prompt, borra el prompt, muestra stderr solo al usuario |
Stop | Bloquea la detención, muestra stderr a Claude |
SubagentStop | Bloquea la detención, muestra stderr al subagente de Claude |
PreCompact | N/A, muestra stderr solo al usuario |
SessionStart | N/A, muestra stderr solo al usuario |
SessionEnd | N/A, muestra stderr solo al usuario |
Avanzado: Salida JSON
Los hooks pueden devolver JSON estructurado enstdout para un control más sofisticado:
Campos JSON Comunes
Todos los tipos de hook pueden incluir estos campos opcionales:continue es false, Claude detiene el procesamiento después de que se ejecuten los hooks.
- Para
PreToolUse, esto es diferente de"permissionDecision": "deny", que solo bloquea una llamada de herramienta específica y proporciona retroalimentación automática a Claude. - Para
PostToolUse, esto es diferente de"decision": "block", que proporciona retroalimentación automatizada a Claude. - Para
UserPromptSubmit, esto evita que el prompt sea procesado. - Para
StopySubagentStop, esto tiene prioridad sobre cualquier salida"decision": "block". - En todos los casos,
"continue" = falsetiene prioridad sobre cualquier salida"decision": "block".
stopReason acompaña a continue con una razón mostrada al usuario, no mostrada
a Claude.
Control de Decisión de PreToolUse
Los hooks de PreToolUse pueden controlar si una llamada de herramienta procede.
"allow"omite el sistema de permisos.permissionDecisionReasonse muestra al usuario pero no a Claude."deny"evita que la llamada de herramienta se ejecute.permissionDecisionReasonse muestra a Claude."ask"pide al usuario que confirme la llamada de herramienta en la interfaz de usuario.permissionDecisionReasonse muestra al usuario pero no a Claude.
updatedInput:
updatedInputte permite modificar los parámetros de entrada de la herramienta antes de que la herramienta se ejecute. Este es un objetoRecord<string, unknown>que contiene los campos que deseas cambiar o agregar.- Esto es más útil con
"permissionDecision": "allow"para modificar y aprobar llamadas de herramientas.
Los campos
decision y reason están deprecados para hooks de PreToolUse.
Usa hookSpecificOutput.permissionDecision y
hookSpecificOutput.permissionDecisionReason en su lugar. Los campos deprecados
"approve" y "block" se asignan a "allow" y "deny" respectivamente.Control de Decisión de PostToolUse
Los hooks de PostToolUse pueden proporcionar retroalimentación a Claude después de la ejecución de la herramienta.
"block"solicita automáticamente a Claude conreason.undefinedno hace nada.reasonse ignora."hookSpecificOutput.additionalContext"agrega contexto para que Claude considere.
Control de Decisión de UserPromptSubmit
Los hooks de UserPromptSubmit pueden controlar si un prompt de usuario es procesado.
"block"evita que el prompt sea procesado. El prompt enviado se borra del contexto."reason"se muestra al usuario pero no se agrega al contexto.undefinedpermite que el prompt proceda normalmente."reason"se ignora."hookSpecificOutput.additionalContext"agrega la cadena al contexto si no está bloqueada.
Control de Decisión de Stop/SubagentStop
Los hooks de Stop y SubagentStop pueden controlar si Claude debe continuar.
"block"evita que Claude se detenga. Debes completarreasonpara que Claude sepa cómo proceder.undefinedpermite que Claude se detenga.reasonse ignora.
Control de Decisión de SessionStart
Los hooks de SessionStart te permiten cargar contexto al inicio de una sesión.
"hookSpecificOutput.additionalContext"agrega la cadena al contexto.- Los valores
additionalContextde múltiples hooks se concatenan.
Control de Decisión de SessionEnd
Los hooks de SessionEnd se ejecutan cuando una sesión termina. No pueden bloquear la terminación de la sesión
pero pueden realizar tareas de limpieza.
Ejemplo de Código de Salida: Validación de Comando Bash
Ejemplo de Salida JSON: UserPromptSubmit para Agregar Contexto y Validación
Para hooks de
UserPromptSubmit, puedes inyectar contexto usando cualquiera de los métodos:- Código de salida 0 con stdout: Claude ve el contexto (caso especial para
UserPromptSubmit) - Salida JSON: Proporciona más control sobre el comportamiento
Ejemplo de Salida JSON: PreToolUse con Aprobación
Trabajar con Herramientas MCP
Los hooks de Claude Code funcionan sin problemas con herramientas del Protocolo de Contexto de Modelo (MCP). Cuando los servidores MCP proporcionan herramientas, aparecen con un patrón de nomenclatura especial que puedes coincidir en tus hooks.Nomenclatura de Herramientas MCP
Las herramientas MCP siguen el patrónmcp__<server>__<tool>, por ejemplo:
mcp__memory__create_entities- Herramienta de crear entidades del servidor Memorymcp__filesystem__read_file- Herramienta de leer archivo del servidor Filesystemmcp__github__search_repositories- Herramienta de búsqueda del servidor GitHub
Configurar Hooks para Herramientas MCP
Puedes dirigirte a herramientas MCP específicas o servidores MCP completos:Ejemplos
Para ejemplos prácticos incluyendo formato de código, notificaciones y protección de archivos, consulta Más Ejemplos en la guía de inicio.
Consideraciones de Seguridad
Descargo de Responsabilidad
ÚSALO BAJO TU PROPIO RIESGO: Los hooks de Claude Code ejecutan comandos de shell arbitrarios en tu sistema automáticamente. Al usar hooks, reconoces que:- Eres el único responsable de los comandos que configures
- Los hooks pueden modificar, eliminar o acceder a cualquier archivo que tu cuenta de usuario pueda acceder
- Los hooks maliciosos o mal escritos pueden causar pérdida de datos o daño del sistema
- Anthropic no proporciona garantía y no asume responsabilidad por ningún daño resultante del uso de hooks
- Debes probar a fondo los hooks en un entorno seguro antes del uso en producción
Mejores Prácticas de Seguridad
Aquí hay algunas prácticas clave para escribir hooks más seguros:- Valida y desinfecta entradas - Nunca confíes en datos de entrada ciegamente
- Siempre entrecomilla variables de shell - Usa
"$VAR"no$VAR - Bloquea el recorrido de ruta - Verifica
..en rutas de archivo - Usa rutas absolutas - Especifica rutas completas para scripts (usa “$CLAUDE_PROJECT_DIR” para la ruta del proyecto)
- Omite archivos sensibles - Evita
.env,.git/, claves, etc.
Seguridad de Configuración
Las ediciones directas de hooks en archivos de configuración no surten efecto inmediatamente. Claude Code:- Captura una instantánea de hooks al inicio
- Usa esta instantánea durante toda la sesión
- Advierte si los hooks se modifican externamente
- Requiere revisión en el menú
/hookspara que los cambios se apliquen
Detalles de Ejecución de Hook
- Timeout: Límite de ejecución de 60 segundos por defecto, configurable por comando.
- Un timeout para un comando individual no afecta a los otros comandos.
- Paralelización: Todos los hooks coincidentes se ejecutan en paralelo
- Deduplicación: Múltiples comandos de hook idénticos se deduplicarán automáticamente
- Entorno: Se ejecuta en el directorio actual con el entorno de Claude Code
- La variable de entorno
CLAUDE_PROJECT_DIRestá disponible y contiene la ruta absoluta al directorio raíz del proyecto (donde se inició Claude Code) - La variable de entorno
CLAUDE_CODE_REMOTEindica si el hook se ejecuta en un entorno remoto (web) ("true") o entorno CLI local (no establecido o vacío). Úsalo para ejecutar lógica diferente basada en el contexto de ejecución.
- La variable de entorno
- Entrada: JSON a través de stdin
- Salida:
- PreToolUse/PostToolUse/Stop/SubagentStop: Progreso mostrado en transcripción (Ctrl-R)
- Notification/SessionEnd: Registrado solo en depuración (
--debug) - UserPromptSubmit/SessionStart: stdout agregado como contexto para Claude
Depuración
Solución de Problemas Básica
Si tus hooks no funcionan:- Verifica la configuración - Ejecuta
/hookspara ver si tu hook está registrado - Verifica la sintaxis - Asegúrate de que tu JSON de configuración sea válido
- Prueba comandos - Ejecuta comandos de hook manualmente primero
- Verifica permisos - Asegúrate de que los scripts sean ejecutables
- Revisa registros - Usa
claude --debugpara ver detalles de ejecución de hooks
- Comillas no escapadas - Usa
\"dentro de cadenas JSON - Matcher incorrecto - Verifica que los nombres de herramientas coincidan exactamente (sensible a mayúsculas)
- Comando no encontrado - Usa rutas completas para scripts
Depuración Avanzada
Para problemas de hooks complejos:- Inspecciona la ejecución de hooks - Usa
claude --debugpara ver detalles de ejecución de hooks - Valida esquemas JSON - Prueba entrada/salida de hooks con herramientas externas
- Verifica variables de entorno - Verifica que el entorno de Claude Code sea correcto
- Prueba casos extremos - Intenta hooks con rutas de archivo o entradas inusuales
- Monitorea recursos del sistema - Verifica el agotamiento de recursos durante la ejecución de hooks
- Usa registro estructurado - Implementa registro en tus scripts de hook
Ejemplo de Salida de Depuración
Usaclaude --debug para ver detalles de ejecución de hooks:
- Qué hook se está ejecutando
- Comando siendo ejecutado
- Estado de éxito/fallo
- Mensajes de salida o error