内容
="center">
<img src/hero.png" alt="keyper — 一个加密的本地箱,为您的 AI 提供 API 密钥,基于 MCP" width="820">
```
██╗ ██╗███████╗██╗ ██╗██████╗ ███████╗██████╗
██║╝██╔════╝╚██╗ ██╔╝██╔╗██╔════╝██╔══██╗
█████╔╝ █████╗ ╚████╔╝ ██████╔╝╗ ██████╔╝
██╔═██╗ ██╔══╝ ╚██╔╝ ██╔═══╝ ██╔══╝ ██╔══██╗
██║ █████╗ ██║ ██║ ███████╗██║ ██║
╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝
```
**您的密钥,受到保护 — 加密,本地,MCP 原生**
停止将 `sk-...` 粘贴到您的 AI 中。`keyper` 将您的 API 密钥和环境变量**加密存储在您的机器上**,并在需要时通过 [模型上下文协议](https://modelcontextprotocol.io) 将它们提供给您的 AI 代理。



![https://img.shields.io/badge/status-beta-black)
</div>
为什么
每次您将 API 密钥粘贴到聊天中,它都会出现在记录中、日志中训练集中。`keyper` 打破了这种习惯。您的秘密存储在一个使用 AES-CM 加密的文件中,只有在您的操作系统密钥链或密码短解锁下才能访问。您的 AI 请求 `keyper` 获取所需的内容 — 在常见情况下(调用 API、运行部署),该值甚至不会进入对话。
- 🔐 **静态加密** — AES-GCM,每个秘密使用独立的随机_nonce,秘密名称作为附加绑定。
- 🗝️ **按需解锁** — 操作系统密钥链(静默)或从语派生的 scrypt。
- 🤖 **MCP 原生** — 与 Claude Desktop、Claude Code、Cowork 或任何 MCP 客户端配合使用。
- 🧾 **执行时隐藏** — `run_with_secrets` 使用密钥而不会显示- 🖥️ **本地 Web 界面** — 通过点击添加和命名密钥;所有操作均127.0.0.1` 上进行,无数据离开。
- 📄 **可审计文件** — 约 800 代码,依赖项极少。
---
## 快速入门
git clone https://github.com/sharziki/keyper
cdbash quickstart.sh
```
这将安装依赖项、创建您的保险箱、打印 MCP 配置行,并打开 Web 界面以添加密钥。如果您更喜欢手动操作,请继续阅读。
### 安装
pip install cryptography[cli]" keyring keyring 仅在模式下需要;如果使用密码短语模式,请忽略它
```
### 创建保险箱
python keyper.py init # 密钥链模式(主密钥存储在您的操作系统密钥链中)
python keyper.py initphrase # 或从密码短语派生密钥(使用 scrypt)
```
### 添加秘密
```bash
python keyper.py set OPENAI_API_KEY -d "个人密钥" # 需要交互式输入(不会记录在 shell 历史中)
echo -n 'sk-...' | python keyper STRIPE_KEY 通过管道输入
python keyper.py import-env ./.env 或批量导入 .env 文件
python keyper.py list 仅显示密钥名称,不显示值
```
… 或者完全跳:
```bash
python keyper.py ui # 打开 http://127.0.0.1:8765/?token=…
```
<div align="center">
*添加 · 命名 · 描述 — 所有操作均在 localhost 上进行,通过 token 授权,保存时立即加密*
</div>
---
## 连接到您的 AI
所有客户端都运行相同的标准输入/输出命令:`python keyper.py serve`。请使用**绝对路径**。
<details>
<summary><b>Claude Code</b></summary>
```bash
claude mcp add keyper -- /usr/bin/python3 /abs/path/keyper.py serve
# 密码短语模式:
claude mcp add keyper -e KEYPER_PASSPHRASE=your-passphrase -- /usr/bin/python3 /abs/path/keyper.py serve
```
</details>
<details>
<summary><b>Claude Desktop / Cowork</b>(<code>claude_desktop_config.json</code> → <code>mcpServers</code>)</summary>
```json
{
"mcpServers": {
"keyper": {
"command":/bin/python3",
": ["/abs/path.py", "serve"],
"env": { "KEYPERSPHRASE": "your-pass }
}
}
}
```
如果使用密钥链模式,请删除 `env` 块请重启应用程序。
</details>
然后询问您的 AI使用 `run_with_secrets `OPENAI_API_KEY列出我的模型。"*
---
## AI 可用的工具
工具 | 返回值? | 用途 |
|------|:---:|------------|
| `list_secrets` | ❌ 名称 + 描述 | 发现保险箱中的内容 |
| `describe_secret(name)` | ❌ 仅元数据 | 获取单个秘密 |
| `get_secret(name)` | ✅ **明文上下文** | 当 AI 必须读取原始值时 |
run_with_secrets(command, secret_names[])` | ❌ 从输出中隐藏 | 使用密钥而无需暴露它 |
> **衡:** `get_secret` 将明文值放入中,可能会被记录使用 `run_with_se — 它将秘密作为环境进程,并从输出任何出现。
---
## 如何保护您的秘密
- **AES-256-GCM** 认证加密;每个秘密使用新鲜 96 位_nonce。
-的**名称作为数据绑定**,因此不能在不解密的情况下静默地移动到另一个名称上。
- **主密钥** 个随机字节存储在您的操作系统密钥链中,或使用**scrypt**(n=2¹⁵)从密码短语派生。仅凭保险箱文件无法使用。
- 明文**从不**写入磁盘或审计日志。
- 保险箱文件和 `access.log` 以 `0600` 权限创建。
- Web 界面绑定到 **127.0.0.1**,需要每次启动时的**令牌**,并拒绝任何 `Host` 头部不是 localhost 的请求(阻止来自恶意站点的 DNS 重新绑定)。
### 威胁模型,简要
`keyper` 保护**静态**秘密,并将其保存在 shell 历史记录和聊天记录之外,当您使用 `run_with_secrets` 时。它**不**防御已经作为您的用户运行的恶意软件,或防御您要求 AI `get_secret` 并将结果粘贴到公共区域。
---
## 配置
| 变量 | 用途 |
|----------|---------|
| `KEYPER_VAULT` | 保险箱文件路径(默认为 `~/.config/keyper/vault.json`) |
| `KEYPER_PASSPHRASE` | 密码短语模式保险箱的密码短语(服务器需要) |
| `KEYPER_VALUE` | 非交互式 `set` 的值源(用于脚本编写) |
| `KEYPER_NO_AUDIT` | 设置为禁用访问日志 |
CLIinit · set · get · list · rm · rotate · import-env · ui · serve` — 运行 `keyper <cmd> -h`。
---
## 贡献
欢迎提出问题和拉取请求 — 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。`keyper` 故意设计得小且可审计;对加密或 UI 授权的更改必须说明其对威胁模型的影响。
## 许可证
[MIT](LICENSE) © 2026 Sharvil Saxena