MCP 配置文件中的敏感密钥如何加密存储

文章导读
MCP 协议规范未定义配置文件内的加密字段,敏感密钥不应明文存储在 JSON 配置中,推荐通过环境变量或操作系统密钥链注入。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

MCP 协议规范未定义配置文件内的加密字段,敏感密钥不应明文存储在 JSON 配置中,推荐通过环境变量或操作系统密钥链注入。

先说结论:MCP 配置文件本身不支持内置加密,安全存储的核心是将密钥移出配置文件,改用环境变量或系统密钥管理服务。

  • 先判断:检查当前配置文件中是否包含明文 API Key 或 Token。
  • 优先做:将敏感字段替换为环境变量引用,或使用操作系统自带的密钥链存储。
  • 再验证:确认配置文件落盘内容为脱敏状态,且服务能正常读取环境变量启动。

命令速用版

若使用命令行启动 MCP 服务,可通过环境变量临时注入密钥,避免写入文件:

export MCP_API_KEY="your_secret_key"

mcp-server `--config` config.json

若需永久生效,建议将 export 命令写入 Shell 配置文件(如.bashrc),或使用dotenv工具管理本地环境变量文件。

为什么会这样

MCP 配置文件设计为明文 JSON 格式,旨在便于调试和版本管理,不具备加密存储能力。

根据 Model Context Protocol 官方规范,配置主要用于定义服务器连接参数和工具描述,敏感信息若直接写入文件,一旦文件权限配置不当或被提交至代码仓库,极易导致密钥泄露。行业通用做法是将配置与秘密分离(Secrets Separation),配置文件只存非敏感结构,敏感数据通过运行时环境注入。

分步处理

步骤 1:清理配置文件

打开 MCP 配置文件(通常为mcp.jsonconfig.json),删除所有明文密钥字段。若字段为必填,可暂时留空或填写占位符。

步骤 2:设置环境变量

在终端或系统设置中定义对应的环境变量。Linux/macOS 用户使用export命令,Windows 用户使用setx或系统属性面板。确保变量名与 MCP 服务文档要求的名称一致。

步骤 3:配置读取逻辑

部分 MCP 客户端支持在配置中引用环境变量(如${ENV_VAR}语法),若不支持,需确保启动脚本已加载环境变量。若使用 Docker 部署,通过-e参数传递密钥。

MCP 配置文件中的敏感密钥如何加密存储

步骤 4:权限加固

对配置文件执行权限限制,Linux 下使用chmod 600 config.json,确保仅当前用户可读写,防止同机其他用户读取。

怎么验证是否生效

检查文件内容:使用cat config.json查看文件,确认无明文密钥字符串。

检查进程环境:启动服务后,在另一终端使用ps eww | grep mcp(注意避免密钥出现在参数列表)或查看服务日志,确认服务启动成功且无鉴权报错。

检查版本控制:若使用 Git,执行git diff确认密钥未被暂存,并将配置文件加入.gitignore

常见坑

密钥随配置文件提交:开发者常误将含密钥的配置文件 push 到公共仓库,务必在提交前检查 diff 并将配置模板化。

环境变量未加载:在 GUI 工具或 IDE 中启动 MCP 服务时,可能无法读取终端设置的环境变量,需在 IDE 运行配置中单独指定 env 文件。

日志泄露:部分服务在 Debug 模式下会将配置打印到日志,生产环境需关闭详细日志或确保日志脱敏。

常见问题

MCP 配置文件支持 AES 加密字段吗?

不支持,目前官方规范未定义加密字段,强行加密会导致解析失败。

可以使用第三方密钥管理工具吗?

可以,推荐集成 HashiCorp Vault、AWS Secrets Manager 或本地 1Password CLI,在启动脚本中动态获取密钥。

本地开发环境如何简单保护密钥?

建议使用.env文件配合dotenv库加载,并将.env文件加入.gitignore,避免明文直接暴露在 JSON 中。

参考来源

Model Context Protocol Specification, GitHub Repository, https://github.com/modelcontextprotocol/specification