珍妮🔐
通过MCP对AI代理进行秘密管理
](https://www.npmjs.com/package/@true-and-useful/janee) ](https://www.npmjs.com/package/@true-and-useful/janee)  ](https://github.com/rsdouglas/janee)
您的人工智能代理需要API访问才能发挥作用。但是他们不应该有你的原始API密钥。 Janee位于代理和API之间——注入凭据、执行策略和记录所有内容。
✨ 特性
| 🔒 零知识代理 | 代理在没有看到密钥的情况下调用API |
| 📋 完整的审计追踪 | 每个请求都记录了时间戳、方法、路径和状态 |
| 🛡️ 请求策略 | 允许/拒绝每个功能的规则(例如,只读条带) |
| ⏱️ 会话TTL | 具有即时撤销功能的限时访问 |
| 🔌 适用于任何MCP客户端 | Claude Desktop、Cursor、OpenClaw等 |
| 🏠 本地优先 | 密钥在您的计算机上加密,从不发送到云端 |
| 🖥️ 执行模式 | 使用注入的凭据运行CLI工具——代理永远看不到密钥 |
| 🤖 GitHub应用程序认证 | 自治代理的短期令牌——没有静态PAT |
| 🐦 Twitter/X OAuth 1.0a | 按请求OAuth签名——4个秘密保持加密 |
| ☁️ AWS SigV4 | 签署AWS API服务器端请求-SES、S3等 |
| 🔧 自动git身份验证 | git push/pull 仅在凭据包含GitHub令牌时有效 |
______________________________________________________________________
问题
人工智能代理需要API访问才能发挥作用。目前的做法是给他们你的钥匙,并希望他们表现良好。
- 🔓 客服可以完全访问Stripe、Gmail和数据库
- 📊 没有访问内容或原因的审计跟踪
- 🚫 事情出错时没有停止开关
- 💉 一次及时注射远离灾难
______________________________________________________________________
解决方案
珍妮是一个 主控程序 为人工智能代理管理API机密的服务器:
- 存储API密钥 --在本地加密
~/.janee/ - 跑
janee serve--启动MCP服务器 - 代理请求访问 --via
executeMCP工具 - Janee注入真正的密钥 --特工从未见过它
- 所有内容都已记录 --完整审计追踪
你的钥匙留在你的机器上。特工们从未见过他们。你保持控制。
______________________________________________________________________
配置一次,随处使用
在Janee中设置API一次:
services:
stripe:
baseUrl: https://api.stripe.com
auth: { type: bearer, key: sk_live_xxx }
github:
baseUrl: https://api.github.com
auth: { type: bearer, key: ghp_xxx }
openai:
baseUrl: https://api.openai.com
auth: { type: bearer, key: sk-xxx }现在 每个代理人 连接到Janee的用户可以使用它们:
- 克劳德桌面版 --访问您的API
- 光标 --访问您的API
- 开爪 --访问您的API
- 任何MCP客户端 --访问您的API
不再在工具之间复制密钥。不再是“哪个代理配置了哪个API?”添加新代理?它已经可以访问一切。撤销钥匙?在Janee中更新一次。
一个配置。每个特工。完整的审计跟踪。
______________________________________________________________________
快速开始
安装
npm install -g @true-and-useful/janee初始化
janee init这创造了 ~/.janee/config.yaml 示例服务。
添加服务
选项1:交互式(建议首次使用)
janee addJanee将指导您添加服务:
Service name: stripe
Base URL: https://api.stripe.com
Auth type: bearer
API key: sk_live_xxx
✓ Added service "stripe"
Create a capability for this service? (Y/n): y
Capability name (default: stripe):
TTL (e.g., 1h, 30m): 1h
Auto-approve? (Y/n): y
✓ Added capability "stripe"
Done! Run 'janee serve' to start.使用AI代理? 看 非交互式设置 对于跳过提示的标志,或 特定代理指南 在......下面
选项2:直接编辑配置
编辑 ~/.janee/config.yaml:
services:
stripe:
baseUrl: https://api.stripe.com
auth:
type: bearer
key: sk_live_xxx
capabilities:
stripe:
service: stripe
ttl: 1h
autoApprove: true添加CLI工具(exec模式)
一些工具需要凭据作为环境变量,而不是HTTP标头。Exec模式处理此问题:
janee add twitter --exec \
--key "tvly-xxx" \
--allow-commands "bird,tweet-cli" \
--env-map "TWITTER_API_KEY={{credential}}"现在,代理可以通过Janee运行CLI工具,而无需看到API密钥:
// Agent calls janee_exec tool
janee_exec({
capability: "twitter",
command: ["bird", "post", "Hello world!"],
cwd: "/home/agent/project", // optional working directory
reason: "User asked to post a tweet"
})Janee创建了这个过程 TWITTER_API_KEY 注入后,运行命令并返回stdout/stderr。凭证永远不会进入代理的上下文。
关键标志:
--exec--配置为exec模式(CLI包装器而不是HTTP代理)--allow-commands--允许的可执行文件白名单(安全)--env-map--将凭据映射到环境变量--work-dir--子流程的工作目录--timeout--最大执行时间(默认值:30秒)
Git操作(自动HTTPS身份验证)
当使用带有GitHub凭据的exec模式时,Janee会自动处理git身份验证。无需额外配置-- git push, git pull,以及 git clone 只是工作:
capabilities:
- name: git-ops
service: github
mode: exec
allowCommands: [git]
env:
GH_TOKEN: "{{credential}}"// Agent can push code without ever seeing the token
janee_exec({
capability: "git-ops",
command: ["git", "push", "origin", "main"],
cwd: "/workspace/my-repo"
})Janee检测到 git 命令与 GH_TOKEN/GITHUB_TOKEN 并为HTTPS身份验证创建临时askpass脚本。命令完成后,脚本会自动清理。
添加GitHub App auth(适用于自主代理)
静态令牌对于长时间运行的代理来说是有风险的。GitHub App auth按需生成短期安装令牌,不需要长期PAT。
选项1:使用create gh应用程序(推荐)
npx @true-and-useful/create-gh-app create my-agent --owner @me
# Opens browser → creates app → saves credentials locally
# Install the app on your repos
# https://github.com/apps/my-agent/installations/new
# Register with Janee in one command
npx @true-and-useful/create-gh-app janee-add my-agent完成。您的代理现在通过Janee的MCP代理获得短期GitHub令牌。
选项2:手动设置
janee add github-app \
--auth-type github-app \
--app-id 123456 \
--pem-file /path/to/private-key.pem \
--installation-id 789或者通过配置:
services:
github:
baseUrl: https://api.github.com
auth:
type: github-app
appId: "123456"
pemFile: /path/to/private-key.pem
installationId: "789"它是如何工作的: 当代理请求访问时,Janee使用应用程序的私钥签署JWT,通过GitHub的API将其交换为1小时的安装令牌,并缓存该令牌直到到期。代理永远看不到私钥——只有短暂的令牌到达API。
启动MCP服务器
janee serve与您的代理人一起使用
支持MCP(Claude Desktop、Cursor、OpenClaw)的代理现在可以调用 execute 通过Janee发出API请求的工具:
// Agent calls the execute tool
execute({
capability: "stripe",
method: "GET",
path: "/v1/balance",
reason: "User asked for account balance"
})Janee解密密钥,发出请求,记录所有内容,并返回响应。
______________________________________________________________________
集成
与任何讲MCP的代理合作:
- 开爪 --原生插件(
@true-and-useful/janee-openclaw)
- 集装箱代理? 看 容器设置指南
______________________________________________________________________
OpenClaw集成
如果你正在使用 开爪,安装本机工具支持插件:
npm install -g @true-and-useful/janee
janee init
# Edit ~/.janee/config.yaml with your services
# Install the OpenClaw plugin
openclaw plugins install @true-and-useful/janee-openclaw在代理配置中启用:
{
agents: {
list: [{
id: "main",
tools: { allow: ["janee"] }
}]
}
}您的代理现在拥有以下工具:
janee_list_services--发现可用的APIjanee_execute-通过Janee发出API请求
插件生成 janee serve 自动。所有请求都记录到 ~/.janee/logs/.
______________________________________________________________________
MCP工具
Janee公开了三个MCP工具:
| 工具 | 说明 |
|---|---|
list_services | 发现可用的API及其策略 |
execute | 通过Janee(HTTP代理模式)发出API请求 |
exec | 使用注入的凭据运行CLI命令(exec模式) |
manage_credential | 查看、授予或撤销对代理范围凭据的访问权限 |
reload_config | 添加/删除服务后从磁盘重新加载配置(在启动时可用 janee serve) |
代理发现可用的内容,然后通过Janee调用API。相同的审计追踪,相同的保护。
______________________________________________________________________
配置
Config住在 ~/.janee/config.yaml:
server:
host: localhost
services:
stripe:
baseUrl: https://api.stripe.com
auth:
type: bearer
key: sk_live_xxx # encrypted at rest
github:
baseUrl: https://api.github.com
auth:
type: bearer
key: ghp_xxx
capabilities:
stripe:
service: stripe
ttl: 1h
autoApprove: true
stripe_sensitive:
service: stripe
ttl: 5m
requiresReason: true服务 =具有真实密钥的真实API\ 能力 =代理可以根据策略请求什么
支持的身份验证类型
| 类型 | 描述 | 示例 |
|---|---|---|
bearer | 授权头中的承载令牌 | Stripe、OpenAI、GitHub |
basic | HTTP基本身份验证(用户名+密码) | 内部API |
hmac-bybit | Bybit的HMAC-SHA256签名 | Bybit交换 |
hmac-okx | HMAC-SHA256+用于OKX | OKX交换的密码 |
hmac-mexc | MEXC | MEXC交易所的HMAC-SHA256签名 |
headers | 自定义键值头 | 非标准API |
service-account | 谷歌服务帐户JSON密钥 | 谷歌云 |
github-app | 短时间使用的GitHub安装令牌 | GitHub API |
oauth1a-twitter | OAuth 1.0a per-request签名 | Twitter/X API v2 |
aws-sigv4 | AWS Signature V4每次请求签名 | SES、S3和其他AWS服务 |
Twitter/X OAuth 1.0a
Janee在服务器端计算OAuth 1.0a签名(HMAC-SHA1),因此您的4个推特秘密在静止时保持加密,永远不会进入代理的上下文:
services:
twitter:
baseUrl: https://api.x.com
auth:
type: oauth1a-twitter
consumerKey: xxx # encrypted at rest
consumerSecret: xxx # encrypted at rest
accessToken: xxx # encrypted at rest
accessTokenSecret: xxx # encrypted at rest
capabilities:
twitter:
service: twitter
ttl: 1h
autoApprove: true或者使用内置模板:
janee add twitterAWS SigV4
Janee根据每个请求计算AWS签名V4(HMAC-SHA256),使您的访问密钥保持加密状态。非机密字段(region, awsService)保持普通配置:
services:
aws-ses:
baseUrl: https://email.us-east-1.amazonaws.com
auth:
type: aws-sigv4
accessKeyId: AKIA... # encrypted at rest
secretAccessKey: xxx # encrypted at rest
region: us-east-1
awsService: ses
capabilities:
aws-ses:
service: aws-ses
ttl: 1h
autoApprove: true常见AWS服务的内置模板:
janee add aws-ses # Amazon SES
janee add aws-s3 # Amazon S3访问控制
控制哪些代理可以使用哪些功能:
server:
host: localhost
defaultAccess: restricted # capabilities require explicit allowlist
capabilities:
stripe:
service: stripe
ttl: 1h
allowedAgents: ["agent-a", "agent-b"] # only these agents can use it
github:
service: github
ttl: 1h
# no allowedAgents + defaultAccess: restricted → no agent can use thisdefaultAccess: restricted--能力没有allowedAgents列表对所有代理隐藏defaultAccess: open(默认)--没有allowedAgents列表可供所有代理使用allowedAgents--代理名称的每个功能列表(与clientInfo.name从MCP初始化握手开始)
代理在运行时创建的凭据默认为 agent-only access——只有创建代理可以使用它们,除非它通过 manage_credential 工具。
执行模式功能
services:
twitter:
auth:
type: bearer
key: tvly-xxx
capabilities:
twitter:
service: twitter
mode: exec
allowCommands: ["bird", "tweet-cli"]
envMap:
TWITTER_API_KEY: "{{credential}}"
ttl: 1h
autoApprove: true执行模式功能使用 janee_exec 而不是 execute。凭据作为环境变量注入——代理只看到stdout/stderr。
exec模式下的转轮硬化默认值:
- 隔离的最小环境(没有完整的主机环境继承)
- 临时的
HOME按命令 - 超时会终止进程组
运行者/权限模式(适用于容器)
当代理在Docker容器内运行时, janee_exec 在远程主机上无法访问容器文件系统。Runner/Authority架构解决了这个问题:
- 权威 在主机上运行:保存凭据,强制执行策略,代理API请求
- 跑者 在每个容器内运行:将MCP提供给代理,将非exec调用转发给权威机构,运行
janee_exec本地
# Host: start Authority (MCP + exec authorization on one port)
janee serve -t http -p 3100 --host 0.0.0.0 --runner-key "$JANEE_RUNNER_KEY"
# Container: start Runner (agent talks to this)
janee serve -t http -p 3200 --host 127.0.0.1 \
--authority http://host.docker.internal:3100 --runner-key "$JANEE_RUNNER_KEY"代理人只需要 JANEE_URL=http://localhost:3200.
您还可以将管理局作为独立进程运行:
janee authority --runner-key "$JANEE_RUNNER_KEY" --host 127.0.0.1 --port 9120请参阅 跑步者/权威指南 完整的架构、exec授权流程、Docker Compose示例和故障排除。
______________________________________________________________________
请求策略
准确控制每个功能可以使用哪些请求 rules:
capabilities:
stripe_readonly:
service: stripe
ttl: 1h
rules:
allow:
- GET *
deny:
- POST *
- PUT *
- DELETE *
stripe_billing:
service: stripe
ttl: 15m
requiresReason: true
rules:
allow:
- GET *
- POST /v1/refunds/*
- POST /v1/invoices/*
deny:
- POST /v1/charges/* # Can't charge cards
- DELETE *规则如何运作:
deny先检查图案 --明确否认总是成功的- 然后
allow检查图案 --必须匹配才能继续 - 未定义规则 → 允许所有(向后兼容)
- 规则已定义但不匹配 → 默认拒绝
图案格式: METHOD PATH
GET *→ 任何GET请求POST /v1/charges/*→ POST到/v1/charges/和子路径* /v1/customers→ 任何方法到/v1/客户DELETE /v1/customers/*→ 删除任何客户
这使得安全成为现实: 即使代理对其“原因”撒谎,它也只能访问策略允许的端点。执行发生在服务器端。
______________________________________________________________________
CLI参考
janee init # Set up ~/.janee/ with example config
janee add # Add a service (interactive)
janee add stripe -u https://api.stripe.com -k sk_xxx # Add with args
janee remove # Remove a service
janee remove --yes # Remove without confirmation
janee list # List configured services
janee list --json # Output as JSON (for integrations)
janee search [query] # Search service directory
janee search stripe --json # Search with JSON output
janee cap list # List capabilities
janee cap list --json # List capabilities as JSON
janee cap add --service # Add capability
janee cap edit # Edit capability
janee cap remove # Remove capability
janee serve # Start MCP server (stdio, default)
janee serve --transport http --port 9100 # Start with HTTP transport (for containers)
janee serve --authority https://janee.example.com --runner-key $JANEE_RUNNER_KEY # Runner mode
janee authority --runner-key $JANEE_RUNNER_KEY # Start authority API
janee logs # View audit log
janee logs -f # Tail audit log
janee logs --json # Output as JSON
janee sessions # List active sessions
janee sessions --json # Output as JSON
janee revoke # Kill a session非交互式设置(适用于AI代理)
AI代理无法响应交互式提示。使用 --*-from-env 从环境变量中读取凭据的标志——这可以将秘密排除在代理的上下文窗口之外:
# Bearer auth (Stripe, OpenAI, etc.)
janee add stripe -u https://api.stripe.com --auth-type bearer --key-from-env STRIPE_KEY
# HMAC auth (Bybit)
janee add bybit --auth-type hmac-bybit --key-from-env BYBIT_KEY --secret-from-env BYBIT_SECRET
# HMAC auth with passphrase (OKX)
janee add okx --auth-type hmac-okx --key-from-env OKX_KEY --secret-from-env OKX_SECRET --passphrase-from-env OKX_PASS
# GitHub App auth (short-lived tokens)
janee add github --auth-type github-app --app-id-from-env GH_APP_ID --pem-from-env GH_PEM --installation-id-from-env GH_INSTALL_ID
# Twitter/X OAuth 1.0a (per-request signing)
janee add twitter --consumer-key $TWITTER_CONSUMER_KEY --consumer-secret $TWITTER_CONSUMER_SECRET \
--access-token $TWITTER_ACCESS_TOKEN --access-token-secret $TWITTER_ACCESS_TOKEN_SECRET
# AWS SigV4 (SES, S3, etc.)
janee add aws-ses --access-key-id $AWS_ACCESS_KEY_ID --secret-access-key $AWS_SECRET_ACCESS_KEY \
--region us-east-1 --aws-service ses当所有必需的凭据都通过标志提供时,Janee:
- 从不打开读线(不挂在stdin上)
- 自动创建具有合理默认值的功能(1h TTL,自动批准)
您还可以编辑 ~/.janee/config.yaml 如果你愿意,可以直接。
______________________________________________________________________
运作原理
┌─────────────┐ ┌──────────┐ ┌─────────┐
│ AI Agent │─────▶│ Janee │─────▶│ Stripe │
│ │ MCP │ MCP │ HTTP │ API │
└─────────────┘ └──────────┘ └─────────┘
│ │
No key Injects key
+ logs request- 客服电话
execute具有能力、方法和路径的MCP工具 - Janee查找服务配置,解密真实密钥
- 使用密钥向真实的API发出HTTP请求
- 日志:时间戳、服务、方法、路径、状态
- 向代理返回响应
特工从不碰真正的钥匙。
📐 深潜: 看 架构和安全模型 查看详细的图表、威胁模型以及与替代方案的比较。
______________________________________________________________________
安全
- 加密:使用AES-256-GCM存储的密钥
- 代理人身份:源自
clientInfo.name在MCP初始化握手中--不需要自定义标头 - 代理隔离:每个代理都有自己的会话,具有隔离的身份(HTTP传输为每个会话创建服务器+传输)
- 访问控制:按能力
allowedAgents白名单+服务器范围defaultAccess政策 - 凭证范围:代理创建的凭据默认为
agent-only - 审核日志:记录到的每个请求
~/.janee/logs/ - 会话:有时限,可撤销
- 紧急停止开关:
janee revoke或删除配置
______________________________________________________________________
码头工人
将Janee作为容器运行——不需要本地Node.js:
# Build
docker build -t janee .
# Run in HTTP mode
docker run -d -p 3000:3000 \
-v ~/.janee:/root/.janee:ro \
janee --transport http --port 3000 --host 0.0.0.0或者使用Docker Compose:
mkdir -p config && cp ~/.janee/config.yaml config/
docker compose up -d有关带Docker的Claude Desktop,请参阅 .
______________________________________________________________________
贡献
我们欢迎捐款!请阅读 贡献.md 在提交PR之前,它包括所需的PR清单(测试、变更日志、版本升级等)。
______________________________________________________________________
许可证
麻省理工学院-由 真实有用有限责任公司
______________________________________________________________________
停止向AI代理提供密钥。开始控制访问。 🔐
