内容
<div align="center">
# MCP 切换器
**一个 MCP 端点,掌控一切。**
一个自托管的网关,聚合您的本地 **和** 远程 MCP 服务器到一个单独的、 OAuth 安全的端点 — 然后将其暴露给任何支持 MCP 的 AI(claude.ai、ChatGPT 等)。



**简体中文** · [English](README.en.md) · [日本語](README.ja.md)
🔗 **[实时控制台演示](https://show.asashiki.com/console/)** · 📖 **[用户手册](docs/manual.md)**
</div>
---
## 为什么
网络/应用程序 AI 只能连接到 **远程** MCP 服务器,而且大多数服务器只提供 **一个** 自定义连接器插槽。同时,半数有用的 MCP 服务器是 **本地** 的(`npx`/`uvx` 标准输入/输出进程),只有 Claude Desktop 或命令行界面才能访问。
MCP 切换器位于两者之间:
```
本地标准输入/输出 MCP ─┐
┼──► MCP 切换器 ──► 一个 OAuth URL ──► claude.ai / ChatGPT / …
另一个 MCP ─┘ (您的 VPS)
```
- **聚合** 任意数量的 MCP 服务器 — 远程(URL)或本地(标准输入/输出,托管在您的服务器上) — 到一个端点。
- **一次连接。** 您的 AI 看到一个连接器;其背后是所有您的工具。
- **从控制台管理** — 添加服务器,组织工具,限定哪些代理可以看到什么,查看审计日志。
- **纯中转。** MCP 切换器不附带任何工具;它透明地转发工具、模式、结果甚至 MCP 应用 UI 小部件。
## 架构
一个 **单一服务** (`:4200`)+ 一个它所提供的控制台 SPA:
| 部分 | 角色 |
|---|---|
| MCP 网关 | 公共 MCP 端点(`/mcp`),OAuth 2.1,管理控制台(`/console`) |
| 注册表 | 连接到上游 MCP 服务器 — 远程(HTTP)和本地(标准输入/输出) |
| 存储 | 一个 SQLite 文件:代理,OAuth,审计,技能注册表和服务器注册表 |
没有单独的后端,没有服务间 HTTP — 网关直接与上游服务器通信并聚合它们。
## 快速开始(Docker)
```bash
git clone https://github.com/asashiki/mcp-switch.git
cd mcp-switch
cp .env.example .env
# 编辑 .env → 设置 MCP_PUBLIC_URL 以启用 OAuth + 控制台(留空用于本地)
docker compose -f infra/docker/compose.yaml --env-file .env up -d --build
```
然后:
- 健康检查:`curl http://127.0.0.1:4200/health`
- 控制台:打开 `http://127.0.0.1:4200/console`(首先设置密码 — 参见下文)
> 在反向代理后面?在 `.env` 中设置 `MCP_PUBLIC_URL` 和 `MCP_GATEWAY_BIND_HOST=0.0.0.0`。
### 设置控制台密码
```bash
docker compose -f infra/docker/compose.yaml exec mcp-switch \
node dist/cli/console-admin.js set admin "your-password"
```
## 快速开始(本地开发)
```bash
pnpm install
cp .env.example .env # 留空 MCP_PUBLIC_URL 以获取匿名本地 /mcp
pnpm dev # 网关 :4200 + 控制台 :5173
```
如果没有 `MCP_PUBLIC_URL`,网关将提供一个匿名 `/mcp` — 在连接 OAuth 之前在本地试用它很方便。
## 连接 AI
在 claude.ai → 设置 → 连接器 → **添加自定义连接器**,指向:
```
https://<您的 MCP_PUBLIC_URL>/mcp
```
完成 OAuth 登录(在同意屏幕中选择一个代理身份)。您的聚合工具现在出现在客户端。
## 添加上游 MCP 服务器
打开控制台 → **连接**。两种方法:
**远程(HTTP)。** 粘贴服务器 URL;添加头部(例如 API 密钥)或 OAuth(如果需要身份验证)。示例 — Context7:
```json
{ "mcpServers": { "context7": {
"serverUrl": "https://mcp.context7.com/mcp",
"headers": { "CONTEXT7_API_KEY": "..." }
}}}
```
**本地(标准输入/输出)。** MCP 切换器在您的服务器上启动进程并远程公开它。示例 — 通过 `npx` 使用 Steam MCP:
```json
{ "mcpServers": { "steam": {
"command": "npx",
"args": ["-y", "steam-mcp-server"],
"env": { "STEAM_API_KEY": "..." }
}}}
```
将任一 JSON 直接粘贴到控制台的导入框中 — 它会自动检测传输并填写表单。容器提供 Node/`npx`;对于 `uvx`/Python 服务器,请将这些运行时添加到镜像中。
## 配置
全部通过 `.env`(参见 [`.env.example`](.env.example)):
| 变量 | 用途 |
|---|---|
| `MCP_PUBLIC_URL` | 公共源;**设置它以启用 OAuth + 控制台**,取消设置 = 匿名本地 `/mcp` |
| `MCP_AUTH_DB_PATH` | SQLite 文件(代理,OAuth,审计,技能,服务器注册表) |
| `MCP_OAUTH_SCOPE` | 客户端宣传的 OAuth 范围 |
| `REMOTE_MCP_SERVERS_JSON` | 可选:预先设置上游服务器而不是使用控制台 |
| `MCP_GATEWAY_BIND_HOST` | 在反向代理后面运行时绑定 `0.0.0.0` |
## 文档
- 📖 [使用手册](docs/manual.md) — 控制台的逐步演练。
## 开发
```bash
pnpm typecheck # 所有软件包
pnpm test # 网关测试套件(包括上游→网关 e2e)
pnpm build # 构建所有内容
```
Monorepo:`apps/{mcp-gateway,console-web}`,`packages/{schemas,config}`。
## 许可证
[MIT](LICENSE)