内容
<div align="center">
# JanusMCP
**一个 MCP 端点,所有账户。**
只需添加一次凭证,即可切换身份,无需重新连接 — 适用于任何 LLM。
[](https://github.com/bayway/janusmcp/actions/workflows/ci.yml)
[](https://github.com/bayway/janusmcp/releases)
[](LICENSE)

[](https://janusmcp.dev)
<br/>
[](cursor://anysphere.cursor-deeplink/mcp/install?name=janusmcp&config=eyJjb21tYW5kIjogIm5weCIsICJhcmdzIjogWyIteSIsICJAYmF5d2F5L2phbnVzbWNwIiwgInNlcnZlIl19)
[](https://insiders.vscode.dev/redirect/mcp/install?name=janusmcp&config=%7B%22command%22%3A%20%22npx%22%2C%20%22args%22%3A%20%5B%22-y%22%2C%20%22%40bayway/janusmcp%22%2C%20%22serve%22%5D%7D)
<sub>一键安装按钮需要 npm 包发布。参见 <a href="RELEASING.md">RELEASING.md</a>。</sub>
</div>
## 问题
如果你与多个公司合作,你会使用 *相同的* MCP 服务器(Supabase、GitHub、Slack……)但 **不同的身份** — 每个客户端都有不同的账户、电子邮件和令牌。目前,大多数 LLM 客户端每个连接器仅持有 **一个账户**:要切换客户端,你需要断开连接、重新连接并重新进行 OAuth 登录。每次。
MCP 协议没有“账户”的概念:**一个会话 = 一个身份 = 一组凭证。** JanusMCP 填补了这一空白。
## 功能
JanusMCP 是一个 **本地代理**,位于您的 LLM 客户端和实际的 MCP 服务器之间:
- **一次性添加 N 个账户**,用于同一服务,并保持所有账户可用。
- **切换身份无需重新连接** — 无需重新登录,无需配置。
- **适用于任何 LLM 客户端** — 它只使用标准 MCP(stdio + Streamable HTTP)。
- **本地运行** — 您的机器,您的密钥链,您的控制。
- **保持上下文清洁** — 它只公开 **活动** 账户的工具,而不是 N× 工具。
```
┌─────────────────────────────┐ ┌─ Supabase (Client A)
LLM client ─MCP─▶│ JanusMCP 代理 │─▶ ├─ Supabase (Client B)
(Claude/GPT/ │ 活动账户 · 保密库 · │ ├─ GitHub (Client A)
Gemini/…) │ 会话范围 │ └─ …
└─────────────────────────────┘
```
您可以使用三个控制工具来驱动它,它们出现在任何客户端:
`janus_list_accounts`、`janus_use_account`、`janus_whoami`。
## 安装
一旦发布,您可以通过您喜欢的渠道安装(所有渠道都会自动发布每个标签 — 参见 [RELEASING.md](RELEASING.md)):
```bash
npx @bayway/janusmcp serve # npm(适用于 MCP/npx 设置)
brew install bayway/janusmcp/janusmcp # Homebrew(macOS/Linux)
scoop install janusmcp # Windows
docker run --rm -p 7332:7332 ghcr.io/bayway/janusmcp:latest
```
…或从 [Releases](https://github.com/bayway/janusmcp/releases) 下载预编译的二进制文件。
## 从源代码构建(60 秒快速入门)
```bash
git clone https://github.com/bayway/janusmcp
cd janusmcp/go
make build # 生成 ./bin/janusmcp
cp config.example.json config.json # 编辑您的账户
./bin/janusmcp serve # stdio,适用于 Claude Desktop/Code
```
两个 Supabase 客户端,PAT 保存在您的 OS 密钥链中(从不保存在配置文件中):
```bash
./bin/janusmcp vault set supabase_client_a # 粘贴 PAT
./bin/janusmcp vault set supabase_client_b
```
```jsonc
// config.json
{
"bindingMode": "session",
"accounts": [
{ "id": "client_a", "service": "supabase", "command": "npx",
"args": ["-y", "@supabase/mcp-server-supabase@latest", "--read-only", "--project-ref=REF_A"],
"env": { "SUPABASE_ACCESS_TOKEN": "vault:supabase_client_a" } },
{ "id": "client_b", "service": "supabase", "command": "npx",
"args": ["-y", "@supabase/mcp-server-supabase@latest", "--read-only", "--project-ref=REF_B"],
"env": { "SUPABASE_ACCESS_TOKEN": "vault:supabase_client_b" } }
]
}
```
添加到 Claude Desktop:
```json
{ "mcpServers": { "janusmcp": {
"command": "/abs/path/janusmcp/go/bin/janusmcp", "args": ["serve"],
"env": { "JANUS_CONFIG": "/abs/path/janusmcp/go/config.json" } } } }
```
对于 ChatGPT / Gemini / Cursor / Copilot,运行 HTTP 并指向 URL:
```bash
JANUS_TRANSPORT=http JANUS_HTTP_PORT=7332 ./bin/janusmcp serve
# → http://127.0.0.1:7332/mcp
```
## 命令
运行 `janusmcp help` 以获取完整参考。基本命令:
| 命令 | 功能 |
|---|---|
| `janusmcp serve` | 运行代理(默认)。通过环境变量传输:`JANUS_TRANSPORT=stdio\|http\|both`,`JANUS_HTTP_HOST`,`JANUS_HTTP_PORT`。 |
| `janusmcp ui` | 打开本地控制面板 — 添加账户,登录,设置机密。 |
| `janusmcp add <template> [id]` | 从模板添加账户(`janusmcp catalog` 列出它们)。 |
| `janusmcp catalog` | 列出内置账户模板。 |
| `janusmcp connect <id>` | 连接账户;对于远程 OAuth,打开浏览器。 |
| `janusmcp status` | 显示每个账户的登录/机密状态(无机密值)。 |
| `janusmcp vault set <name>` / `delete <name>` | 在 OS 密钥链中存储/删除机密。 |
| `janusmcp login <provider> <name>` | OAuth 回路登录;令牌引用为 `oauth:<name>`。 |
| `janusmcp providers` | 列出内置 OAuth 提供者。 |
| `janusmcp install <client>` | 配置 LLM 客户端以启动 JanusMCP。 |
| `janusmcp uninstall <client>` | 从 LLM 客户端的配置中删除 JanusMCP。 |
| `janusmcp version` · `janusmcp help` | 版本 · 本参考。 |
支持的 `<client>` 值用于 `install` / `uninstall`:`claude-desktop`、`claude-code`、`cursor`、`vscode`、`gemini`、`codex`、`chatgpt`、`print`。运行 `janusmcp install list`(或 `uninstall list`)以查看每个目标及其是否已配置。
```bash
janusmcp install claude-desktop # 一键设置
janusmcp uninstall claude-desktop # 清洁删除(之后重启客户端)
```
在任何连接的客户端中,您还可以使用控制工具 `janus_list_accounts`、`janus_use_account`、`janus_whoami` 和 `janus_login`。
## 主要功能
| | |
|---|---|
| **多账户,一个端点** | 同一服务的 N 个身份,无需重新连接 |
| **身份范围** | 按调用 → 会话(`Mcp-Session-Id`)→ 全局,通过 `bindingMode: global \| session \| locked` |
| **双重传输** | stdio(本地优先客户端)+ 流式 HTTP(远程优先客户端),同一进程 |
| **安全保密库** | OS 密钥链(macOS/Windows/Linux)+ 加密文件备用;机密为 `vault:<name>` |
| **OAuth 回路** | `janusmcp login`(PKCE),令牌存储在保密库中,自动刷新,`oauth:<name>` |
| **上下文安全** | 仅公开活动账户的工具;切换发出 `tools/list_changed` |
## 它有何不同
MCP 网关空间(MetaMCP、mcp-proxy、IBM ContextForge、…)聚合了 **不同的** 服务器到一个端点。JanusMCP 解决了正交的、服务不足的问题:**同一服务的多个身份**,无需占用模型的上下文,从任何 LLM,完全本地。它是一个凭证感知的代理,而不是一个扁平的聚合器。
## 提供者说明
### Figma
Figma 提供两个 MCP 服务器,处理方式不同:
- **本地开发模式服务器(推荐)。** Figma 的桌面应用程序在 `http://127.0.0.1:3845/mcp` 上托管一个 MCP 服务器。它是本地的,不需要 OAuth,并且开箱即用:在桌面应用程序中启用它(开发模式 → 检查 → *启用桌面 MCP 服务器*),并使用 `janusmcp add figma-desktop figma_work` 添加它。需要付费 Figma 计划上的开发/完整席位。
- **远程服务器(`https://mcp.figma.com/mcp`)— 限制。** Figma **允许 OAuth 客户端名称** 在动态客户端注册期间,并对不在其 [MCP 目录](https://www.figma.com/mcp-catalog/) 中的任何客户端返回 **403 Forbidden**(VS Code、Cursor、Claude Code、…)。JanusMCP 尚未获得批准。
> ⚠️ **变通方法 — 选择加入,自担风险。** 您可以通过在 `config.json` 中为远程 `figma` 账户设置 `"clientName": "Claude Code"`,使 JanusMCP 注册为批准的名称。这会冒充批准的客户端,**可能会违反 Figma 的服务条款**;它也可能在 Figma 更新其允许列表时中断。它 **不** 默认启用。最好使用上面的本地开发模式服务器进行实际工作。
适当的长期解决方案是 JanusMCP 被提交并批准为 Figma 的 MCP 目录,因此不需要 `client_name` 覆盖。这正在计划中。
## 状态和路线图
Alpha — 核心已实现并在 Go 中测试。
- [x] 活动账户模型,会话范围/全局/锁定范围
- [x] stdio + 流式 HTTP 传输
- [x] OS 密钥链保密库 + 加密文件备用
- [x] OAuth 回路(PKCE)与自动刷新和每个进程令牌解析
- [x] 一键客户端安装 (`janusmcp install …`),Claude Desktop `.mcpb`,注册表 `server.json`
- [ ] 客户端的多服务器“配置文件”(Supabase + GitHub + Slack 客户端 A 一次)
- [ ] `with_account` 一次性跨客户端调用
- [ ] CLI / 代码执行模式 — 按需通过 CLI 调用工具,而不是加载所有工具定义,以减少令牌使用(类似于“MCP 代码执行”)
- [ ] SSE 上游传输(除了 Streamable HTTP + stdio)用于仅 SSE 服务器
- [ ] 签名,每个 OS 版本二进制文件和 CI 中的注册表自动发布
参见 [`design-broker-mcp-multi-account.md`](design-broker-mcp-multi-account.md) 以获取完整设计。
## 仓库布局
- [`go/`](go/) — 代理(Go)。这是真正的实现。 **[构建和文档 →](go/README.md)**
- [`spike/`](spike/) — 原始 TypeScript 快速原型,保持行为的已验证参考。
- [`design-broker-mcp-multi-account.md`](design-broker-mcp-multi-account.md) — 架构和原理。
## 隐私政策
JanusMCP 完全在您的机器上运行。**没有后端服务器,不收集数据,不包含分析或遥测** — 开发人员不会收到有关您或您的使用情况的任何信息。凭证和令牌存储在您的 OS 密钥链中(或,如果您选择加入,则存储在加密的本地文件中),仅用于您配置的服务的身份验证;它们不会通过模型上下文传递。仅与您配置的 MCP 服务器和 OAuth 提供者建立网络连接。由于所有内容都是本地的,因此只要您保留数据,数据就会保留在您的设备上,删除它 (`janusmcp vault delete <name>` 或卸载)会完全删除它。
完整政策:<https://janusmcp.dev/privacy>。
## 贡献
非常欢迎贡献 — 参见 [CONTRIBUTING.md](CONTRIBUTING.md)。新的连接器预设、客户端集成指南和打包帮助尤其受欢迎。
## 许可证
MIT — 参见 [LICENSE](LICENSE)。