帖子说了什么
@KoderNeverDie 在讨论「把 Claude Code 配置放进 Git 共享」时提醒:配置能进仓库,密钥要拆出去。Claude Code 的 .mcp.json 支持环境变量引用,仓库里只留配置结构和变量名,不留 token 明文。他验收共享模板时会同时检查两件事:全新环境能不能复现,提交记录里有没有凭据。这样才不会「共享模板的同时把权限也共享了」。
官方规则
官方 MCP 文档里,.mcp.json 支持两种写法:
${VAR}:展开成环境变量VAR的值;${VAR:-default}:VAR有值就用它,没有就用默认值。
文档也说明了这样设计的目的:让团队共享配置,同时把机器相关路径和 API key 这类敏感值留在各自环境里。
还有两个容易踩的细节:
- 变量没设置时不会报错退出。 引用的变量不存在且没写默认值,配置照样加载,只在
claude mcp list和/mcp里给出缺失变量的警告,并把${VAR}原文传下去。连接失败时先看这里。 - Claude 自己的凭证变量在远程服务器配置里会读成空。 在远程 MCP 服务器的
url和headers里,像ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN这类 Claude Code 自身和云平台的凭证变量会被当作空值,不会展开。这是为了防止某个项目的.mcp.json或插件把你的 Claude 凭证发给它指定的服务器。所以写Bearer ${ANTHROPIC_AUTH_TOKEN}会得到 401,这是有意的保护,别想办法绕过去。
落地做法
- 把
.mcp.json里所有 token、key 改成${SERVICE_TOKEN}这类引用,真实值放在本机 shell 环境或密钥管理工具里。 - 在 README 里列出需要的变量名,不写值。
- 提交前搜一遍 diff,确认没有
sk-、ghp_、Bearer后面跟着真实字符串。 - 给每个 MCP 服务单独发 token,权限按需最小化,别复用 Claude 账号或主力云账号的凭证。
- 一旦明文 token 进过 Git 历史,删文件不够,要先去对应服务吊销重发。
小结
配置共享、凭证留本机。${VAR} 一行改动,就能避免把团队模板变成密钥分发渠道。
