claude -p 会自动启动仓库里 .mcp.json 的 MCP 服务器吗?无人值守运行前要做的 3 个设置(2026)
一句话结论
会。 在交互式会话里,Claude Code 第一次遇到仓库根目录 .mcp.json 里的项目级 MCP 服务器时会先请你批准;但在 claude -p(无头模式)、Agent SDK 会话,以及项目线程之外的云端会话里,没有地方弹出这个确认,官方文档写明此时会不经询问直接加载这些服务器。所以在 CI、定时脚本里对一个别人的仓库跑 claude -p 之前,先用下面的设置把不认识的 MCP 服务器挡掉。
阅读说明
官方信息查阅日期:2026-10-26,来源:Claude Code 官方文档「Connect Claude Code to tools via MCP」(Project scope 一节)。这条规则最近在 X 上被不少开发者转发讨论,本页只按官方文档整理。
为什么这件事要紧
.mcp.json 是跟着仓库一起提交的文件。里面的本地(stdio)MCP 服务器本质上是一条会在你机器上运行的命令。交互式会话里有一道「是否批准」的确认挡着;到了无人值守的场景,这道确认就没有了。如果你 clone 一个来源不明的仓库,然后在里面直接跑 claude -p,仓库作者写进 .mcp.json 的服务器就会跟着启动。
官方在同一页也提醒:连接任何 MCP 服务器之前都要确认你信任它,抓取外部内容的服务器还可能带来提示注入风险。
哪些运行方式会受影响
| 运行方式 | 项目级 .mcp.json 服务器 |
|---|---|
交互式 claude | 先弹出确认,你批准后才加载 |
claude -p 无头运行 | 不询问,直接加载 |
| Agent SDK 会话 | 不询问,直接加载 |
| 项目线程之外的云端会话 | 不询问,直接加载 |
以 bypassPermissions 启动且在用户或托管设置里开了 skipDangerousModePermissionPrompt | 跳过确认 |
三种挡掉的办法
官方文档给了三种做法,按需要选一种或叠加:
- 点名禁用某个服务器:把它加进
disabledMcpjsonServers。官方说明这个设置在任何权限模式下都会拦住该服务器。 - 完全不读项目设置:命令行加
--setting-sources(SDK 里是settingSources选项),把项目这一层设置排除在外。 - 只用你指定的 MCP:启动时加
--strict-mcp-config,再用--mcp-config传入你自己的服务器清单,Claude Code 就只连这些。注意:Claude Code v2.1.246 之前,严格模式下仍会卡在项目服务器的确认上,导致后台会话启动时一直等待,所以先升级到 v2.1.246 或更新版本。
仓库能不能自己「预先批准」
不能。官方说明:克隆下来的仓库无法批准自己的服务器。即使仓库在 .claude/settings.json 里提交了 enableAllProjectMcpServers 或 enabledMcpjsonServers,在你没有信任过的文件夹里也会被忽略,服务器停在「Pending approval(等待批准)」状态。真正生效的批准只来自你自己的 ~/.claude/settings.json、托管设置,或启动时用 --settings 传入的设置。
想撤销以前做过的批准,可以运行:
claude mcp reset-project-choices
跑 claude -p 前的检查清单
- 打开仓库根目录的
.mcp.json,看清每个服务器的command、args和url指向哪里; - 来源不明的仓库,默认加
--strict-mcp-config,只传你自己的 MCP 配置; - 已知不需要的服务器,写进
disabledMcpjsonServers; - 用
claude mcp list查看各服务器状态,显示「Pending approval」的就是还没被你批准的项目级服务器(这条在交互式环境下才会经过确认)。