MCP交换机(支持OAuth!)
一个轻量级的MCP路由器,将AI工具(Claude Desktop、Cursor、VS Code)连接到其他MCP服务器。它在本地处理OAuth,并将请求转发给下游MCP。它本身并不实现特定于API的MCP工具包装器。
范围澄清:本项目的责任是路由和认证。如果您需要特定于API的工具(例如Gmail、日历、GitHub问题),请将这些工具作为单独的MCP服务器运行,并将MCP-switch指向它们。避免在此处添加直接的API包装器,以防止重复和范围蠕变。
🚀 快速开始
# 1. Clone and install
git clone https://github.com/BlueprintDesignLab/mcp-switch
cd mcp-switch
npm install
# 2. Authenticate with providers (opens browser)
npm run auth:google
npm run auth:github
npm run auth:slack
# 3. Start the gateway
npm start
# Server running on http://localhost:8042
# 4. Configure your AI client (see below)就是这样! 无需创建OAuth应用程序,无需下载凭据,无需复杂的配置。
📋 这有什么作用
- 单一网关:将请求从客户端路由到一个或多个下游MCP服务器
- OAuth自动化:处理令牌刷新、PKCE流、提供程序怪癖(适用于需要OAuth的MCP)
- 本地和私人:您计算机上加密存储的所有令牌
- 多客户端:多个AI客户端共享同一服务器实例
- 超出范围:实施特定于API的MCP工具;为此目的构建或重用专用MCP服务器
Claude Desktop ──┐
├── HTTP ──▶ MCP Switch (this repo) ──▶ Downstream MCP servers
VS Code ────┤ (localhost:8042) (e.g., Gmail MCP, GitHub MCP)
│
Cursor ────┘📦 依赖项
核心依赖关系
{
"@modelcontextprotocol/sdk": "^1.0.0",
"express": "^4.18.0",
"googleapis": "^131.0.0",
"@octokit/rest": "^20.0.0",
"@slack/web-api": "^7.0.0",
"@notionhq/client": "^2.2.0",
"open": "^10.0.0"
}预先注册的OAuth应用程序
- 谷歌:日历、Gmail、驱动器API(默认为只读)
- GitHub:存储库、问题、档案(公共数据+授权私人数据)
- Slack:频道、消息、文件(您授权的工作区)
- 概念:数据库、页面(与集成共享的页面)
系统要求
- Node.js 18+ (用于ES模块和本机获取)
- macOS/Linux/Windows (跨平台)
- 端口8042 可用(可配置)
🔧 安装
1. 提供商身份验证 (如果下游MCP需要OAuth)
仅使用附带的身份验证脚本来获取访问依赖OAuth的下游MCP服务器所需的本地令牌。请勿在此处添加直接的API功能。
谷歌
npm run auth:google
# Opens browser → Sign in → Allow permissions → Done!GitHub
npm run auth:github
# Opens browser → Sign in → Allow permissions → Done!如果需要提供商的功能,请运行或安装其专用MCP服务器,并配置MCP交换机以路由到该服务器。
2. 客户端配置
克劳德桌面
// ~/.config/claude-desktop/config.json
{
"mcpServers": {
"oauth-gateway": {
"url": "http://localhost:8042"
}
}
}VS代码/光标
// settings.json
{
"mcp.servers": {
"oauth-gateway": {
"url": "http://localhost:8042"
}
}
}🔐 安全架构
威胁模型
- 资产:连接服务的OAuth访问/刷新令牌
- 边界:您的本地计算机(受信任的环境)
- 风险:通过恶意软件窃取令牌、意外暴露、令牌重放
安全控制
1. 令牌加密 (AES-256-GCM)
// tokens.json is encrypted at rest
{
"google": {
"encrypted": "a1b2c3d4...",
"iv": "random_iv",
"authTag": "auth_tag"
}
}2. 所有 OAuth 流的 PKCE
// RFC 7636 - prevents authorization code interception
const codeChallenge = crypto
.createHash('sha256')
.update(randomCodeVerifier)
.digest('base64url');3. 最小范围
// Request only necessary permissions
const googleScopes = [
'https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/drive.readonly'
// NO write permissions by default
];4. 令牌自动刷新
// Refresh tokens before expiry
if (token.expires_at - Date.now() > .gitignore
echo ".env" >> .gitignore🚨 常见问题
服务器问题
# Port 8042 already in use
# Fix: Use different port
PORT=8043 npm start
# Server won't start
# Check: Node.js version
node --version # Should be 18+OAuth错误
# "Browser didn't open"
# Fix: Manual browser navigation
npm run auth:google --manual
# "Token expired"
# Fix: Re-authenticate with provider
npm run auth:googleMCP连接问题
# Claude can't connect
# Check: Server is running
curl http://localhost:8042/health
# Should return: {"status": "ok"}🔍 运作原理
建筑
MCP Client ──HTTP/SSE──▶ MCP Switch (router) ──HTTP/SSE──▶ Downstream MCP servers
(Claude/Cursor/VS Code) (Express) (e.g., Gmail MCP, GitHub MCP)请求流
- MCP客户端 通过HTTP POST调用工具
/message - 网关 验证请求并检查令牌
- OAuth逻辑 自动刷新过期的令牌
- 供应商API 使用有效的Bearer令牌调用
- 响应 通过服务器发送的事件流式传输
令牌流
- 初始身份验证:用户运行
npm run auth:google→ 浏览器OAuth流 - 令牌存储:本地加密的访问/刷新令牌
- 自动刷新:令牌在到期前自动刷新
- 共享实例:所有MCP客户端使用相同的服务器和令牌
📚 发展
项目结构
src/
├── server.js # Express server + MCP SSE transport
├── providers/
│ ├── google.js # Google OAuth + API integration
│ ├── github.js # GitHub OAuth + API integration
│ └── base.js # Shared provider interface
├── oauth/
│ ├── manager.js # OAuth flow orchestration
│ ├── storage.js # Encrypted token storage
│ └── pkce.js # PKCE implementation
└── tools/
└── registry.js # MCP tool registration开发命令
npm start # Start server (production)
npm run dev # Start with hot reload
npm run test # Run test suite添加新目的地
- 为下游MCP服务器添加路由目标;不要添加直接的API包装。
- 公开配置以将工具命名空间映射到外部MCP端点。
- 将OAuth处理限制在达到这些MCP所需的范围内。
📜 许可证
MIT许可证-请参阅 许可证 了解详情。
🤝 贡献
- 分叉存储库
- 创建要素分支:
git checkout -b feature/new-provider - 添加测试:
npm run test - 提交拉取请求
⚠️ 免责声明
这是一个供个人使用的开发工具。在使用敏感数据之前,请先查看代码。每个OAuth提供者都有自己的服务条款,您必须遵守。
