canUseTool 回调 在运行时处理其他所有情况。
本页面涵盖权限模式和规则。要构建交互式批准流程,其中用户在运行时批准或拒绝工具请求,请参阅 处理批准和用户输入。
权限如何被评估
当 Claude 请求一个工具时,SDK 按以下顺序检查权限:Hooks
首先运行 hooks。一个 hook 可以直接拒绝调用或将其传递下去。返回
allow 的 hook 不会跳过下面的拒绝和询问规则;无论 hook 结果如何,这些规则都会被评估。拒绝规则
检查
deny 规则(来自 disallowed_tools 和 settings.json)。如果拒绝规则匹配,工具被阻止,即使在 bypassPermissions 模式下也是如此。裸名称拒绝规则(如 Bash)在此评估开始之前将工具从 Claude 的上下文中移除,因此只有作用域规则(如 Bash(rm *))在此步骤中被检查。权限模式
应用活跃的 权限模式。
bypassPermissions 批准到达此步骤的所有内容。acceptEdits 批准文件操作。其他模式会继续进行。canUseTool 回调
如果上述任何步骤都未解决,调用您的
canUseTool 回调 以获得决定。在 dontAsk 模式下,此步骤被跳过,工具被拒绝。- Hooks: 运行自定义代码以允许、拒绝或修改工具请求。请参阅 使用 hooks 控制执行。
- canUseTool 回调: 在运行时提示用户批准。请参阅 处理批准和用户输入。
允许和拒绝规则
allowed_tools 和 disallowed_tools(TypeScript:allowedTools / disallowedTools)向上面评估流程中的允许和拒绝规则列表添加条目。允许规则仅影响批准:未在 allowed_tools 中列出的工具仍然可供 Claude 使用,并继续进行权限模式。拒绝规则的行为取决于它们是命名工具还是在工具内范围化模式。
| 选项 | 效果 |
|---|---|
allowed_tools=["Read", "Grep"] | Read 和 Grep 被自动批准。此处未列出的工具仍然存在并继续进行权限模式和 canUseTool。 |
disallowed_tools=["Bash"] | Bash 工具定义从请求中移除。Claude 看不到该工具,无法尝试它。 |
disallowed_tools=["Bash(rm *)"] | Bash 保持可用。与 rm * 匹配的调用在每个权限模式中都被拒绝,包括 bypassPermissions。其他 Bash 调用继续进行权限模式。 |
allowedTools 与 permissionMode: "dontAsk" 配对。列出的工具被批准;其他任何内容都被直接拒绝,而不是提示:
.claude/settings.json 中声明式地配置允许、拒绝和询问规则。当启用 project 设置源时,这些规则被读取,默认 query() 选项就是这样。如果您显式设置 setting_sources(TypeScript:settingSources),请包含 "project" 以使其应用。请参阅 权限设置 了解规则语法。
权限模式
权限模式提供对 Claude 如何使用工具的全局控制。您可以在调用query() 时设置权限模式,或在流式会话期间动态更改它。
可用模式
SDK 支持这些权限模式:| 模式 | 描述 | 工具行为 |
|---|---|---|
default | 标准权限行为 | 无自动批准;不匹配的工具触发您的 canUseTool 回调 |
dontAsk | 拒绝而不是提示 | 任何未被 allowed_tools 或规则预批准的内容都被拒绝;canUseTool 永远不会被调用 |
acceptEdits | 自动接受文件编辑 | 文件编辑和 文件系统操作(mkdir、rm、mv 等)被自动批准 |
bypassPermissions | 绕过所有权限检查 | 所有工具运行而无需权限提示(谨慎使用) |
plan | 规划模式 | 只读工具运行;Claude 分析和规划而不编辑您的源文件 |
auto(仅 TypeScript) | 模型分类批准 | 模型分类器批准或拒绝每个工具调用。请参阅 Auto 模式 了解可用性 |
设置权限模式
您可以在启动查询时设置权限模式一次,或在会话活跃时动态更改它。- 在查询时
- 在流式传输期间
在创建查询时传递
permission_mode(Python)或 permissionMode(TypeScript)。此模式应用于整个会话,除非动态更改。模式详情
接受编辑模式(acceptEdits)
自动批准文件操作,以便 Claude 可以编辑代码而无需提示。其他工具(如不是文件系统操作的 Bash 命令)仍然需要正常权限。
自动批准的操作:
- 文件编辑(Edit、Write 工具)
- 文件系统命令:
mkdir、touch、rm、rmdir、mv、cp、sed
additionalDirectories 内的路径。该范围外的路径和对受保护路径的写入仍然会提示。
使用时机: 您信任 Claude 的编辑并希望更快的迭代,例如在原型设计期间或在隔离目录中工作时。
不询问模式(dontAsk)
将任何权限提示转换为拒绝。由 allowed_tools、settings.json 允许规则或作为 hook 运行的工具正常运行。其他所有内容都被拒绝,无需调用 canUseTool。
使用时机: 您想要为无头代理提供固定的、明确的工具表面,并且更喜欢硬拒绝而不是默默依赖 canUseTool 不存在。
绕过权限模式(bypassPermissions)
自动批准所有工具使用而无需提示。Hooks 仍然执行,如果需要可以阻止操作。
规划模式(plan)
将 Claude 限制为只读工具。Claude 可以读取文件并运行只读 shell 命令来探索代码库,但不编辑您的源文件。Claude 可能使用 AskUserQuestion 在最终确定计划之前澄清需求。请参阅 处理批准和用户输入 以处理这些提示。
使用时机: 您想要 Claude 提议更改而不执行它们,例如在代码审查期间或当您需要在进行更改之前批准更改时。