3.2 定义Hooks
Claude Code 中的 Hooks 能在工具执行之前或之后拦截并控制调用,从而让你精细掌控 Claude 在开发环境中能做与不能做的事情。
一、构建一个 Hook
创建 Hook 包含四个主要步骤:

1.决定使用 PreToolUse 还是 PostToolUse——PreToolUse 可阻止工具调用执行;PostToolUse 在工具已被使用后运行。
2.确定你要监控的工具调用类型——需要明确哪些工具会触发你的 Hook。
3.编写一个接收工具调用的命令——该命令通过标准输入接收关于拟执行工具调用的 JSON 数据。
4.如有需要,为 Claude 提供反馈——你的命令退出码会告知 Claude 是否允许或阻止该操作。
二、可用工具
Claude Code 提供多种内置工具,可用 hooks 进行监控。

要查看当前环境中具体可用的工具列表,你可以直接询问 Claude。这一点尤其重要,因为当你添加自定义 MCP 服务器后,可用工具会发生变化。
三、工具调用数据结构
当你的 hook 命令执行时,Claude 会通过标准输入(stdin)发送包含拟执行工具调用细节的 JSON 数据,例如:

{
“session_id”: “2d6a1e4d-6…”,
“transcript_path”: “/Users/sg/…”,
“hook_event_name”: “PreToolUse”,
“tool_name”: “Read”,
“tool_input”: {
“file_path”: “/code/queries/.env”
}
}
你的命令需要从标准输入读取并解析该 JSON,再根据工具名称与输入参数决定是否允许或阻止操作。
四、退出码与控制流程
你的 hook 命令通过退出码与 Claude 通信:

退出码 0:一切正常,允许工具调用继续。
退出码 2:阻止工具调用(仅适用于 PreToolUse hooks)。
在 PreToolUse hook 中以 2 退出时,你写入标准错误(stderr)的任何错误消息都会作为反馈发送给 Claude,说明为何阻止该操作。
五、示例用例
一个常见用法是阻止 Claude 读取敏感文件(如 .env)。由于 Read 与 Grep 两种工具都能访问文件内容,你应同时监控它们,并检查是否试图访问受限文件路径。
这种方法能让你完全控制 Claude 的文件系统访问,并对受限操作提供清晰的原因说明。
六、附件