# key-guard A local MCP server that keeps API keys off Claude's servers. ## Why This Exists When Claude reads a file containing an API key, the raw key content gets sent to Claude's servers. key-guard prevents this by acting as a local middleman — Claude calls a tool, the tool reads the key and makes the API call locally, and only the result is returned to Claude.

防止API密钥被发送到Claude服务器的本地MCP安全插件。

已扫描
适合谁
使用Claude且需调用外部API的开发者、关注API密钥安全的高级用户
不适合谁
不使用API密钥的普通用户、不愿配置本地MCP服务器的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
中等(★★☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @domjeff/key-guard

Skill 说明

命令、参数、文件名以原文为准

Key Guard

一个安全技能,确保 API 密钥保留在本地,绝不会发送给 Claude。

何时使用此技能

当用户想要进行以下操作时激活:

  • 调用外部 API(OpenAI、DeepL、牛津词典等)
  • 检查 API 密钥是否配置
  • 读取 .env*.keysecrets.* 或任何凭据文件
  • 查看或编辑可能包含硬编码 API 密钥的脚本(.sh.bash、curl 命令、配置文件)
  • 调试 API 调用失败的原因

规则(始终遵守)

  1. **绝不直接读取 .env 或密钥文件** —— 不要使用 bash 的 cat .env 或文件读取工具读取任何包含密钥的文件
  2. 绝不直接读取可能包含硬编码 API 密钥的脚本或配置文件 —— 改用 read_file_masked
  3. 绝不在响应中包含密钥值,即使是部分也不行
  4. **始终使用 key-guard MCP 服务器** 处理任何与密钥相关的事务

如何使用 MCP 服务器

key-guard MCP 服务器提供五个工具:

工具 1:list_keys

列出所有可用的密钥名称 —— 绝不显示值。

调用:list_keys()
返回:{ keys: ["KEY_A", "KEY_B", "KEY_C"] }

工具 2:validate_key

检查密钥是否已配置,但不直接看到它。

调用:validate_key({ key_name: "OPENAI_API_KEY" })
返回:{ exists: true, length: 51, preview: "sk-a****", message: "Key is set" }

工具 2:call_api

在本地发出经过身份验证的 HTTP 请求。密钥由 MCP 服务器注入 —— Claude 只看到 API 响应。

调用:call_api({
  key_name: "OPENAI_API_KEY",
  url: "https://api.openai.com/v1/models",
  method: "GET"
})
返回:{ status: 200, data: { ... API 响应 ... } }

工具 3:read_file_masked

读取脚本或配置文件,所有密钥值替换为 {{KEY_NAME}} 占位符。使用此工具代替直接读取文件。

调用:read_file_masked({ file_path: "./call.sh" })
返回:{
  content: "curl -H 'Authorization: Bearer {{OPENAI_API_KEY}}' https://..."
}

现在你可以安全查看非密钥部分并提出修改建议。

工具 4:write_file_with_keys

编辑后写回文件,其中的 {{KEY_NAME}} 占位符在本地替换为真实的密钥值。

调用:write_file_with_keys({
  file_path: "./call.sh",
  content: "curl -H 'Authorization: Bearer {{OPENAI_API_KEY}}' https://api.openai.com/v1/chat/completions ..."
})
返回:{ success: true, message: "File written with keys substituted locally" }

设置说明(如果 MCP 未运行,请告知用户)

如果 MCP 服务器尚未注册:

# 克隆仓库
git clone https://github.com/your-username/key-guard.git

# 复制 .env.example 为 .env 并填入你的密钥
cp .env.example .env

# 注册 MCP 服务器(仅需运行一次)— 将路径替换为你实际的克隆位置
/mcp add key-guard node /path/to/key-guard/key-guard.js

# 或者直接添加到 ~/.copilot/mcp-config.json 以便重启后自动加载:
# {
#   "mcpServers": {
#     "key-guard": {
#       "command": "node",
#       "args": ["/path/to/key-guard/key-guard.js"]
#     }
#   }
# }

示例工作流程

用户:“我的 OpenAI 密钥设置好了吗?”

1. 调用 validate_key({ key_name: "OPENAI_API_KEY" })
2. 报告结果:“您的密钥已设置(51 个字符,以 sk-a**** 开头)”

用户:“调用 OpenAI API 获取单词定义”

1. 调用 call_api({
     key_name: "OPENAI_API_KEY",
     url: "https://api.openai.com/v1/chat/completions",
     method: "POST",
     body: { model: "gpt-4o-mini", messages: [...] }
   })
2. 使用返回的响应 —— 绝不使用密钥本身

用户:“显示我的 .env 文件”

绝对不要直接读取 .env。
改为:对每个预期密钥名称调用 validate_key,然后显示:
- 哪些密钥已配置
- 大致长度(作为合理性检查)
绝不显示实际值。

用户:“编辑我的 curl 脚本,添加一个请求头”

1. 调用 read_file_masked({ file_path: "./call.sh" })
   → Claude 看到 "curl -H 'Authorization: Bearer {{OPENAI_API_KEY}}' ..."
2. 对非密钥部分进行所请求的修改
3. 调用 write_file_with_keys({ file_path: "./call.sh", content: "<编辑后的内容,{{OPENAI_API_KEY}} 仍然保留>" })
   → MCP 在写入磁盘前将占位符替换为真实密钥
D
@domjeff

已收录 1 个 Skill

相关推荐