使用说明
MCP隧道
通过Ably发布/订阅(Pub/Sub)服务,将来自MCP服务器的HTTP请求隧道化,以访问防火墙后的服务
概述
MCP隧道启用 模型上下文协议(MCP) 服务器可安全地访问防火墙后的内部API和服务,而无需将这些资源暴露给公共互联网。它使用 Ably Pub/Sub(发布/订阅服务) 用于实现封装器(npm 包)和工作器(Docker 容器)之间的实时双向通信。
核心价值主张使AI助手能够在不暴露给公共互联网或不需要复杂VPN设置的情况下,与内部API和服务进行交互。
建筑
┌─────────────────────────────────────────────────────────────┐
│ AI Assistant / Client │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ MCP Server (stdio, JSON-RPC 2.0) │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Wrapper (@mcp-tunnel/wrapper) │ │ │
│ │ │ - Wraps MCP server execution │ │ │
│ │ │ - Intercepts HTTP/HTTPS requests │ │ │
│ │ │ - Publishes requests to Ably │ │ │
│ │ │ - Receives responses from Ably │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
│ Ably Pub/Sub
│ (Internet)
▼
┌─────────────────────────────────────────────────────────────┐
│ Private Network / Behind Firewall │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Worker (Docker Container) │ │
│ │ - Subscribes to Ably request channel │ │
│ │ - Executes HTTP requests to internal services │ │
│ │ - Publishes responses to Ably │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Internal APIs / Services │ │
│ │ (not publicly accessible) │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
特性/功能
- ✅ 通用HTTP拦截 - 与 fetch、axios、http/https 以及所有 Node.js HTTP 客户端兼容
- ✅ 透明隧道技术 - MCP服务器无需代码更改即可运行
- ✅ 对防火墙友好 - 无需入站端口
- ✅ 设计时即考虑安全性 - 通过Ably功能实现多租户隔离
- ✅ 主机允许列表 - Worker 强制执行允许的目标主机
- ✅ 低延迟 - 实时发布/订阅通信
- ✅ TypeScript - 在严格模式下实现完全类型安全
- ✅(对号,表示正确、同意或确认) 已准备好投入生产 - 速率限制,请求大小限制,健康检查
- ✅(对号,表示正确、确认或完成) 调试日志记录 - 可选的基于文件的日志记录,用于故障排除
- ✅ 智能绕过 - 自动绕过 Ably 域名以防止循环
快速入门
1. 创建Ably账户
- 注册免费账号 熟练地处理(或管理)账户
- 在 Ably 控制面板中创建一个新应用
- 创建一个具有作用域权限的API密钥:
{ "mcp-tunnel:your-tenant-id:*": ["publish", "subscribe"] }
2. 安装包装器(客户端)
npm install -g @mcp-tunnel/wrapper
3. 部署工作节点(私有网络)
# Pull the Docker image
docker pull ghcr.io/mslavov/mcp-tunnel-worker:latest
# Create .env file
cat > .env <<EOF
ABLY_API_KEY=your-ably-api-key
TENANT_ID=your-tenant-id
ALLOWED_HOSTS=api.internal.company.com,*.internal.company.com
EOF
# Run the worker
docker run -d \
--name mcp-tunnel-worker \
--env-file .env \
ghcr.io/mslavov/mcp-tunnel-worker:latest
4. 与MCP服务器配合使用
# Set environment variables
export ABLY_API_KEY=your-ably-api-key
export TENANT_ID=your-tenant-id
# Test the tunnel
mcp-tunnel --test https://api.internal.company.com/health
# Or run with an MCP server
mcp-tunnel --server ./my-mcp-server.js
Claude Desktop 示例:
见 examples/slack-mcp-tunneled.json 以下是使用Slack MCP服务器的真实世界配置示例。
HTTP客户端兼容性
该隧道采用 @mswjs/interceptors(这个表述在中文中不直接对应一个具体词汇或短语,但可以理解为“@mswjs的拦截器”或“用于@mswjs的拦截器模块”,具体翻译取决于上下文和使用场景。) 拦截 全部 HTTP 请求,无论您的 MCP 服务器使用的是哪个库:
✅ 支持的HTTP客户端:
- 本土的;原生的
fetch(Node.js 18+) axios(官方MCP天气服务器示例中使用)got,node-fetch,request- 本地的
http/https模块 - 任何基于Node.js的http/https构建的库
其工作原理如下:
// Your MCP server code - NO CHANGES NEEDED!
import axios from 'axios';
// This request is automatically intercepted and tunneled
const response = await axios.get('https://api.internal.company.com/data');
包装器在(某个位置)拦截请求 http/https 模块级别,因此它能与任何HTTP客户端库透明地协同工作。
配置
包装配置
环境变量:
ABLY_API_KEY(必需)- 具有发布/订阅功能的Ably API密钥TENANT_ID(必填) - 租户唯一标识符TUNNEL_TIMEOUT(可选)- 请求超时时间(毫秒)(默认:30000)MCP_TUNNEL_DEBUG(可选)- 启用调试日志记录到.mcp-tunnel/wrapper.log
工作配置
环境变量:
ABLY_API_KEY(必填)- 具备发布/订阅功能的Ably API密钥TENANT_ID(必填项)- 租户唯一标识符ALLOWED_HOSTS(可选)- 以逗号分隔的允许主机列表(支持通配符,如*.example.com)MAX_REQUEST_SIZE(可选)- 请求的最大大小(以字节为单位)(默认:10485760 = 10MB)RATE_LIMIT_PER_TENANT(可选)- 每个租户每分钟的请求次数(默认:100)
安全
多租户隔离
每个租户都通过Ably的能力系统实现隔离:
{
"mcp-tunnel:tenant-123:*": ["publish", "subscribe"]
}
这确保了:
- ✅ 租户只能访问自己的频道
- ✅ 无跨租户数据泄露
- API密钥针对特定租户进行限定
工人安全
该工人执行:
- 主机允许列表 - 只允许访问已授权的主机
- 请求大小限制 - 防止滥用
- 速率限制 - 每租户请求限制
调试
启用详细日志记录以进行故障排除:
# Enable debug logging
export MCP_TUNNEL_DEBUG=1
export ABLY_API_KEY=your-key
export TENANT_ID=your-tenant-id
# Run your MCP server with tunnel
mcp-tunnel --server ./my-mcp-server.js
# View logs in real-time
tail -f .mcp-tunnel/wrapper.log
调试日志包括:
- 预加载脚本初始化
- HTTP请求/响应拦截
- 卓越的连接状态
- 请求/响应详情
- 错误堆栈跟踪
注: 调试日志写入文件以避免污染标准输入输出(这会破坏MCP协议通信)。
发展
先决条件
- Node.js 18及以上版本
- npm 8+
- Docker 20+(用于工作节点)
设置
# Clone the repository
git clone https://github.com/mslavov/mcp-tunnel.git
cd mcp-tunnel
# Install dependencies
npm install
# Build packages
npm run build
# Run linter
npm run lint
项目结构
mcp-tunnel/
├── packages/
│ ├── wrapper/ # npm package for wrapping MCP servers
│ │ ├── src/
│ │ │ ├── ably-client.ts
│ │ │ ├── tunnel-fetch.ts
│ │ │ ├── cli.ts
│ │ │ ├── types.ts
│ │ │ └── index.ts
│ │ ├── package.json
│ │ └── tsconfig.json
│ └── worker/ # Docker container for executing requests
│ ├── src/
│ │ ├── ably-client.ts
│ │ ├── request-handler.ts
│ │ ├── types.ts
│ │ └── index.ts
│ ├── Dockerfile
│ ├── package.json
│ └── tsconfig.json
├── .github/
│ └── workflows/
│ ├── test.yml
│ └── publish.yml
├── package.json
├── tsconfig.base.json
└── README.md
贡献
欢迎投稿!
许可证
MIT 许可证 - 请参阅 许可证 详情见下文。
致谢
- 模型上下文协议 由Anthropic开发
- Ably Realtime(可译为“Ably 实时服务”或根据具体语境简化为“Ably 实时”) 用于发布/订阅基础设施
- 受到……的启发 语言服务器协议
为MCP社区倾心打造