定义钩子
Claude Code 中的钩子允许你在工具调用执行之前或之后拦截和控制它们。这让你能够精细控制 Claude 在你的开发环境中能做什么和不能做什么。
构建钩子
创建钩子涉及四个主要步骤:
-
1. 决定使用 PreToolUse 或 PostToolUse 钩子- PreToolUse 钩子可以阻止工具调用的执行,而 PostToolUse 钩子在工具已经被使用后运行 -
2. 确定你想要监视哪种类型的工具调用- 你需要准确指定哪些工具应该触发你的钩子 -
3. 编写一个将接收工具调用的命令- 这个命令通过标准输入获得关于建议工具调用的 JSON 数据 -
4. 如果需要,命令应向 Claude 提供反馈- 你的命令的退出码告诉 Claude 是否允许或阻止操作
可用工具
Claude Code 提供了几个内置工具,你可以用钩子监控它们:
要查看当前设置中确切的可用工具,你可以直接向 Claude 询问列表。这特别有用,因为当你添加自定义 MCP 服务器时,可用工具会发生变化。
工具调用数据结构
当你的钩子命令执行时,Claude 通过标准输入发送包含关于建议工具调用详细信息的 JSON 数据:
{
"session_id": "2d6a1e4d-6...",
"transcript_path": "/Users/sg/...",
"hook_event_name": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "/code/queries/.env"
}
}
你的命令从标准输入读取这个 JSON,解析它,然后根据工具名称和输入参数决定是否允许或阻止操作。
退出码和控制流
你的钩子命令通过退出码与 Claude 通信:
-
• 退出码 0- 一切正常,允许工具调用继续进行 -
• 退出码 2- 阻止工具调用(仅限 PreToolUse 钩子)
当你在 PreToolUse 钩子中使用退出码 2 退出时,你写入标准错误的任何错误消息都会作为反馈发送给 Claude,解释为什么操作被阻止。
示例用例
一个常见的用例是防止 Claude 读取敏感文件,如 .env文件。由于 Read和 Grep工具都可以访问文件内容,你会想要监控这两种工具类型,并检查它们是否试图访问受限制的文件路径。
这种方法让你完全控制 Claude 的文件系统访问,同时提供关于为什么某些操作受限制的清晰反馈。

