帖子说了什么
@madaearly 提醒:克隆一个带 .mcp.json 的仓库,在里面跑 claude -p,项目里声明的 MCP 服务器会不经你确认就启动。官方文档也写了:批准提示只在有人能点「同意」的时候才会出现。本地跑的 MCP 进程还不进沙箱,权限等同于你自己。
官方文档怎么写
对照官方 MCP 文档 的「Project scope」和「Project server approvals and workspace trust」:
- 交互会话会先问:出于安全,Claude Code 在交互会话里使用项目级
.mcp.json里的服务器前,会先请你批准。 - 没人能点时就不问:在
claude -p、Agent SDK 会话,以及项目线程之外的部分云会话里,无法弹出该提示,会直接加载项目级服务器。 - bypassPermissions 也会跳过:若会话以
bypassPermissions启动,且用户或组织管理设置里开了skipDangerousModePermissionPrompt,同样会跳过批准提示。 - 仓库里写的批准不算数:别人提交进
.claude/settings.json的enableAllProjectMcpServers/enabledMcpjsonServers,在你尚未信任该工作区前会被忽略;但-p根本不问。 - 本地 MCP 在沙箱外:stdio 本地服务器以你的用户权限跑,沙箱主要包住 shell 命令,不包住本地 MCP。
怎么防护
- 按名拉黑:在你自己的用户设置里用
disabledMcpjsonServers列出不信任的服务器名,对所有权限模式都生效。 - CI / 脚本用严格模式:
claude -p --strict-mcp-config --mcp-config ci-mcp.json,只加载你显式传入的配置。 - 丢掉项目设置源:用
--setting-sources(或 SDK 的settingSources)排除项目级设置,避免带上仓库里的 MCP 与规则。 - 清掉旧批准:交互里点通过的批准可用
claude mcp reset-project-choices重置。 - 先审计再跑:对陌生仓库,先读
.mcp.json,看每个服务器的命令或 URL、是不是本地进程,再决定要不要在自动化里打开它。
小结
项目级 MCP 方便团队共享工具,但在无人值守的 -p 里等于「克隆即加载」。自动化流水线务必白名单化;个人机器上对陌生仓库先看 .mcp.json。
