site logo

Marico's space

Claude Code 权限中自动批准 MCP 工具:mcp__ 语法及其通配符限制

Others 2026-10-01 11:28:11 7

最近折腾 Claude Code 的 MCP(模型上下文协议)权限配置,踩了几个坑,这篇把问题说清楚。

添加一个 MCP 服务器后,Claude Code 每次调用它的工具都会弹出确认框。光是查个只读数据都要点一下确认,用不了多久就烦了。

核心用法很简单:在 permissions.allow 里写 mcp__<服务器名> 就能自动批准该服务器的所有工具,或者写 mcp__<服务器名>__<工具名> 只批准单个工具。关键是 allow 通配符必须锚定在 mcp__<服务器名>__ 这个前缀上——直接写 mcp__* 会被完全跳过。

三种规则形态

文档里说得很清楚:MCP 规则用 Claude Code 里配置的服务器名,后面接该服务器提供的工具名(可选)。

规则 匹配范围
mcp__puppeteer puppeteer 服务器提供的所有工具
mcp__puppeteer__* 同上,用通配符显式写出
mcp__puppeteer__puppeteer_navigate puppeteer 服务器里名为 puppeteer_navigate 的工具

在 settings.json 里这样配:

{ "permissions": { "allow": [ "mcp__puppeteer", "mcp__github__get_issue", "mcp__github__list_pull_requests" ] }
}

服务器名是你传给 claude mcp add 的名字,或者是 .mcp.json 里的键名。分隔符是两个下划线,mcp 和服务器名之间、服务器名和工具名之间都是。

allow 通配符必须带锚点

字面量 mcp__<服务器名>__ 前缀后面才接受工具名的通配符,而且服务器那段不能有通配符,必须是具体配置的服务器名。

模式 allow 中的效果
mcp__puppeteer__* 正常。匹配 puppeteer 的所有工具
mcp__github__get_* 正常。匹配该服务器下 get_ 开头的工具
mcp__* 会被跳过,带警告提示,不会自动批准任何东西
* / B* 同样被跳过,效果同上

所以没法一个规则说"允许所有 MCP 工具",必须逐个列服务器:

{ "permissions": { "allow": [ "mcp__puppeteer__*", "mcp__github__get_*", "mcp__linear__*" ] }
}

deny 和 ask 是另一套规则

deny 和 ask 规则在工具名位置是接受通配符的。模式要匹配完整工具名:"*" 匹配所有工具,"mcp__*" 跨服务器匹配所有 MCP 工具。

{ "permissions": { "deny": [ "mcp__*" ] }
}

规则按顺序评估:deny → ask → allow,第一个命中的规则决定结果,规则的具体程度不影响优先级。宽泛的 deny 会盖过具体的 allow,allow 规则无法从 deny 里挖出一块例外。

目标 配置方式
批量允许某服务器的工具 allow: mcp__<服务器名>
屏蔽某个危险工具 deny: mcp__<服务器名>__<工具名>
屏蔽所有 MCP 工具 deny: mcp__*
每次都弹确认 ask: 任意合法模式

一个只写工具名的 deny 规则会把这个工具从 Claude 的上下文里移除,Claude 压根看不到它。有作用域限制的规则则是保留工具,只在 Claude 实际调用时拦截。

有个细节要注意:deny 或 ask 规则的工具名没有匹配到任何已知工具时,正常会报启动警告帮你发现拼写错误,但工具名里带 _ 或 * 的规则免检。每个 mcp__ 开头的名字都符合条件,所以服务器名拼错了会静默失效。

规则放在哪,哪些会被忽略

规则写在 settings.json 里,用 /permissions 命令查看。对话框会列出每条规则及其来源文件。你可以在 Claude 运行时编辑:增删规则从 Claude 下一次工具调用起生效(v2.1.234 及以上)。

带括号的 mcp__ 规则会被跳过。

这种 Bash(npm run build) 通过参数来缩小权限范围的方式,MCP 工具不支持。Claude Code 加载配置文件时,遇到带括号的 mcp__ 规则会直接跳过。被跳过的规则会在交互会话启动时的 invalid-settings 对话框里列出,也会出现在 claude doctor 输出里。想按参数匹配 MCP 工具,应该用带 --disallowedTools 的 deny 规则。

还有一种 allow 规则不生效的情况:如果团队配置了 claude.ai 连接器工具的默认行为为 ask,这个配置会覆盖到你的会话,导致该工具的 allow 规则完全失效——即便在 auto 和 bypassPermissions 模式下也会每次都弹确认。在 dontAsk 模式下则直接拒绝调用。Claude Code 自己拉取的连接器工具会以 mcp__claude_ai_<服务器名>__<工具名> 的形式出现。

总结

  • allow 用 mcp__<服务器名> 放行整个服务器,用 mcp__<服务器名>__<工具名> 放行单个工具
  • allow 通配符只能在 mcp__<服务器名>__ 后面用;mcp__* 和 * 都会被跳过并警告
  • deny 和 ask 接受完整工具名通配符,所以 deny: ["mcp__*"] 能屏蔽所有 MCP 工具
  • 评估顺序是 deny → ask → allow,first match wins,不管具体程度
  • 带括号的 mcp__ 规则会被配置文件跳过;想按参数过滤请用 --disallowedTools