
最近折腾 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 和服务器名之间、服务器名和工具名之间都是。
字面量 mcp__<服务器名>__ 前缀后面才接受工具名的通配符,而且服务器那段不能有通配符,必须是具体配置的服务器名。
| 模式 | allow 中的效果 |
|---|---|
mcp__puppeteer__* |
正常。匹配 puppeteer 的所有工具 |
mcp__github__get_* |
正常。匹配该服务器下 get_ 开头的工具 |
mcp__* |
会被跳过,带警告提示,不会自动批准任何东西 |
* / B* |
同样被跳过,效果同上 |
所以没法一个规则说"允许所有 MCP 工具",必须逐个列服务器:
{ "permissions": { "allow": [ "mcp__puppeteer__*", "mcp__github__get_*", "mcp__linear__*" ] }
}
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__<服务器名>__<工具名> 放行单个工具mcp__<服务器名>__ 后面用;mcp__* 和 * 都会被跳过并警告deny: ["mcp__*"] 能屏蔽所有 MCP 工具mcp__ 规则会被配置文件跳过;想按参数过滤请用 --disallowedTools