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__服务器)意味着写操作也不再问,风险自担。

  弄完后可以故意问一句需要查库的话试一下,不弹确认就是生效了。
posted @ 2026-08-18 09:58  chuangzhou  阅读(21)  评论(0)    收藏  举报