使用说明
MCP网关实验室
目标
用于实验室的 MCP 网关,重点是:
- 桥接HTTP/SSE↔ 标准输入输出
- 统一端点MCP (
/mcp/<tool>) - MCP 工具编排
- auth + 安全发布到互联网 (Cloudflare隧道+接入)
- 工作区沙箱
- Windows+WSL2+Docker
- Core 在 Go 中实现
这个项目是什么
- 交通网关
- MCP 工具路由器
- 进程管理器(启动器+守护进程)
- MCP 运行时抽象层
建筑
Client
|
HTTPS + Auth
|
Cloudflare Tunnel
|
Caddy (proxy)
|
mcp-router (Go)
|
HTTP/SSE <-> STDIO Bridge
|
Tool Runtime
| \
Native Container
(process) (docker run)
|
Workspace
特性
- 桥接HTTP/SSE⇄ STDIO(JSONL)
- 通用罗塔门托
/mcp/<tool> - 启动器模式(生成por请求)
- 守护程序模式(持续进程 + 闲置超时)
- 本机工具运行时
- 容器工具运行时
- 工作区沙盒
- 基本可见性( stderr + MCP 标头)
- 通过 YAML 进行外部配置
堆栈
- Go(mcp路由器)
- Caddy(反向代理)
- Cloudflare隧道+接入
- Docker Compose
- WSL2(Windows 10)
初始安装-TLS证书
此项目使用 TLS(包括在本地环境中)运行,因此首次运行前需要生成本地证书。
第一次(每台机器一次):
make rsa-gen
Windows - 安装根证书:
安装根证书需要管理员权限, 因为证书必须安装在仓库中 受信任的根证书颁发机构(本地计算机).
打开或 PowerShell作为管理员 e执行:
certutil -addstore -f "Root" "<caminho>\certs\root.crt"
替换 <caminho> 到存储库的绝对或相对路径,例如: C:\Users\seu-usuario\Projects\mcp-gateway\certs\root.crt
验证安装 :
在 PowerShell 中运行以确认证书已正确安装:
certutil -store Root | findstr /i "MCP Caddy"
如果命令返回 MCP Caddy Local Authority RSA Root安装成功 。否则,检查文件路径并重复命令 certutil -addstore.
注: 安装证书后,关闭并重新打开浏览器以应用信任。
设置完成后,启动项目:
make up
工具运行时
该网关支持两种运行模式:
本机运行时
- 通过 STDIO 作为本地进程运行的工具
- 以卷装载( Volume mounted)
/tools) - 非常适合开发和原型设计
- 不需要重建网关
容器运行时
- 通过运行的工具
docker run -i - 强大的工具隔离
- 允许直接使用 MCP/Docker Hub 映像
- 非常适合沙盒和更逼真的环境
工作区沙盒
- 唯一根 :
/workspaces - 每个工具在子文件夹中工作
- 网关有效路径(类似chroot)
- 避免沙箱外访问
安全:Sandbox Package
O包装 router/internal/sandbox/ 实施安全验证层。它包含:
sandbox.go
实现核心验证功能:
-
ValidateToolName(name string) error- 在安全字符允许列表中校验工具名称
- 拒绝 :
/,\、空间、,..,%2f,%5c,%25非字母数字字符(除-e_) - 例如:
git,fs,my-tool✓ |../../bin,tool;whoami✗ - 用于
main.go验证段<tool>da rota/mcp/<tool>
-
ValidatePath(workspaceRoot, requestedPath string) (string, error)- 验证和解决工作区内的路径
- 检测并阻止多个编码级别的横向路径
- 安全处理 symlinks :
- 拒绝绝对符号链接(例如:
→ /etc/passwd) - 验证符号链接相关性(例如:
../../outside被封锁) - 检测恶意symlink的cades(例如:
link1 → link2 → ../outside)
- 拒绝绝对符号链接(例如:
- 如果有效则返回已解决的绝对路径,否则返回错误
- 在执行任何文件操作之前使用 MCP 处理器
-
checkPathTraversal(path string) error- 检测危险模式的助手:
..,//,/.,/./等等。
- 检测危险模式的助手:
安全
有关安全验证、沙箱软件包和测试的所有详细信息都记录在 路由器/安全_TESTS.md.
涵盖的主题:
- 工具名称校验
- 路径验证 (path traversal, symlinks)
- 命令注入保护
- DoS防护
- 测试去流式SSE
桥接HTTP/SSE↔ 标准输入输出
饲料:
HTTP/SSE Client
|
mcp-router
|
spawn tool
|
STDIN / STDOUT
- 输入: JSON → STDIN
- 输出: JSONL → SSE
- 流式扫描电镜缓冲区
- 每个进程的队列/mutex
配置 (config.yaml)
workspace_root: /workspaces
tools_root: /tools
tools:
fs:
runtime: container
mode: launcher
image: mcp/filesystem
args: ["/workspaces"]
git:
runtime: native
mode: launcher
cmd: "npx"
args: ["-y", "@modelcontextprotocol/server-git", "/workspaces"]
my-script:
runtime: native
mode: daemon
cmd: "/tools/meu-script.sh"
反向代理(Caddyfile)
mcp.seudominio.com {
handle_path /mcp/* {
reverse_proxy mcp-router:8080 {
transport http {
versions 1.1
}
flush_interval -1
}
}
}
快速开始
启动之前,请按照本节所述执行 TLS 证书设置 初始安装-TLS证书.
设置完成后,启动项目:
make up
安全说明——Docker Socket(容器运行时)
⚠️ 重要通知
使用时 容器运行时,o mcp-router 需要使用 Docker 守护进程(例如: /var/run/docker.sock通过运行工具 docker run.
这意味着:
- Gateway 将 主机上的 root 权限
- 恶意工具可以创建任意容器或挂载敏感卷
实验室(Lab)
- 仅在受控环境中使用 Container Runtime
- 首选 Native Runtime 进行快速开发
- 不要在没有以下情况下公开显示网关 :
- Cloudflare Access 活动
- 适当的防火墙
- 身份访问控制
未来的替代方案
- Docker无根/Podman无根
- 转轮侧车isolado
- 敬业的工人
- MicroVM(鞭炮)
相关项目
Docker MCP网关
https://github.com/docker/mcp-gateway
IBM ContextForge
https://ibm.github.io/mcp-context-forge/
aarora79 MCP网关
https://github.com/aarora79/mcp-gateway
LobeHub MCP网关
https://lobehub.com/mcp/common-creation-mcp-gateway
WunderGraph MCP网关(实验)
https://www.infracloud.io/blogs/mcp-gateway/
技术路线图(Lab)
- 热重新加载config.yaml
- 工作区范围界定工具
- 守护进程池
- 限速工具
- 指标端点
- 健康检查