mcp 工具关闭提示
为什么会提示
Claude Code 对 MCP 工具默认弹确认,是权限系统的刻意设计,不是 bug。核心原因有四个:
1. MCP 工具是任意外部程序,Claude Code 看不到它干了什么
一个工具叫 query,但 MCP 服务器收到请求后实际执行什么,完全由服务器代码决定——可能是 SELECT,也可能是 DROP TABLE。对 Claude Code
来说这就是个黑盒调用,无法区分只读和写操作,所以只能按“可能有副作用”处理。
2. 副作用可能不可逆
权限系统的原则是:对会产生实际影响的操作(Bash 命令、写文件、MCP 调用),默认需要人确认;只有明确无副作用的内置只读工具(Read / Grep /
Glob)才免确认。文件读错了没关系,数据库数据删了就没了,所以确认框放在执行前。
3. 防提示注入和恶意 MCP
MCP 服务器返回的内容会直接进入模型上下文。存在“工具投毒”这类攻击:返回内容里夹带指令,诱导模型去调用工具做用户没要求的事。确认框是最后一道防线——保证“真的要执行这次调用”的是你本人,而不是
被服务器内容带偏的模型。
4. 信任不能默认持久化
两个原因:
- MCP 服务器代码会更新。今天放行的 query 工具,明天服务器改了实现,行为就变了(甚至存在先装乖、被信任后再改行为的 rug-pull 式攻击);
- 项目里的 .mcp.json 会随仓库分发。如果信任默认全局记住,你 clone 一个陌生仓库、一启动 Claude Code,就等于静默放行了一个别人写的外部程序。
所以整个设计是:默认每次问 → 你点确认 → 用得多了、你确认这工具安全,再由你显式写进 allow
白名单。白名单的含义就是“这个工具我担保,出了事算我的,不用再问我”——这也正是我上一条建议里提醒只放行只读查询工具、别放行整个服务器的原因。
如何关闭
把对应 MCP 工具加进 allow 白名单就不会再弹确认了。三种做法,推荐第 2 种:
1. 弹窗时直接选“始终允许
确认框里除了"Yes"之外,一般还有 “Always allow” 选项,选一次以后就不再问了(会自动写入 settings)。
2. 在 settings.json 里配置 allow 规则(最干净)
MCP 工具的规则格式是 mcp__服务器名__工具名,可以精确到工具,也可以放行整个服务器:
{
"permissions": {
"allow": [
"mcp__mysql__query",
"mcp__postgres"
]
}
}
- mcp__mysql__query — 只放行这一个工具
- mcp__postgres — 放行该服务器下所有工具
写到哪个文件:
- C:\Users\win\.claude\settings.json — 全局生效,所有项目都不再确认(推荐)
- 项目下 .claude\settings.json / .claude\settings.local.json — 只对当前项目生效
完整工具名可以在弹确认框时看到(框上会显示 mcp__xxx__yyy),或者用 claude mcp list 查服务器名。
3. 用 /permissions 命令
在会话里输入 /permissions,交互式添加 Allow 规则,效果一样。
一个提醒:如果那个数据库 MCP 除了查询还有写操作工具(执行任意 SQL),建议只放行只读的查询工具(精确到 mcp__服务器__工具),别放行整个服务器,避免 UPDATE/DELETE/DROP 也静默执行。
怎么加入到白名单?具体规则是什么?
1. 加到哪个文件
┌────────────────────────────────────┬──────────────────────────────────────┐
│ 文件 │ 生效范围 │
├────────────────────────────────────┼──────────────────────────────────────┤
│ C:\Users\win\.claude\settings.json │ 全局,所有项目 │
├────────────────────────────────────┼──────────────────────────────────────┤
│ <项目>\.claude\settings.json │ 仅当前项目(会随仓库提交,团队共享) │
├────────────────────────────────────┼──────────────────────────────────────┤
│ <项目>\.claude\settings.local.json │ 仅当前项目,仅你自己 │
└────────────────────────────────────┴──────────────────────────────────────┘
数据库 MCP 一般是你个人环境,建议放全局那个。注意:是 C:\Users\win\.claude\settings.json(settings 目录下),别和 C:\Users\win\.claude.json 混淆——后者是 MCP
服务器定义文件,不是放权限的地方。
数据库 MCP 一般是你个人环境,建议放全局那个。注意:是 C:\Users\win\.claude\settings.json(settings 目录下),别和 C:\Users\win\.claude.json 混淆——后者是 MCP
服务器定义文件,不是放权限的地方。
2. 规则语法
MCP 工具的规则名 = 字面前缀 mcp__ + 服务器名 +(可选)__工具名:
mcp__mysql__query ← 只放行 mysql 服务器上的 query 工具
mcp__mysql ← 放行 mysql 服务器上的所有工具
- 前缀 mcp__ 是固定的,双下划线;
- 服务器名就是你在 claude mcp add / .mcp.json 里配置的名字;
- 精确匹配、区分大小写,写错一个字符就不生效(还是照样弹确认)。
3. 完整示例
如果文件已有内容,把 permissions.allow 合并进去(没有就整个新建):
{
"permissions": {
"allow": [
"mcp__mysql__query"
]
}
}
4. 怎么查准确的工具名
三个途径任选:
- 看弹窗:再触发一次确认,弹窗标题上就是全名,如 mcp__mysql__query,照抄即可;
- 命令行:claude mcp list 看服务器名;
- 会话内:输入 /mcp 查看已连接服务器及其工具列表。
5. 两个注意点
- 保存后新会话必定生效;如果当前正在跑的会话没变化,重启会话即可。
- 如果只想免去只读查询的确认,就把规则写到具体工具(mcp__服务器__工具);整个服务器放行(mcp__服务器)意味着写操作也不再问,风险自担。
弄完后可以故意问一句需要查库的话试一下,不弹确认就是生效了。
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/22537329

浙公网安备 33010602011771号