HTTP隧道服务

MCP Tunnel通过Ably Pub/Sub实现防火墙后服务的HTTP请求隧道传输,使MCP服务器无需暴露内部API即可安全访问。

  • by bugzy-ai
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 mslavov/mcp-tunnel

使用说明

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账户

  1. 注册免费账号 熟练地处理(或管理)账户
  2. 在 Ably 控制面板中创建一个新应用
  3. 创建一个具有作用域权限的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 许可证 - 请参阅 许可证 详情见下文。

致谢


为MCP社区倾心打造