这一年 MCP 协议在智能体圈子里火得很快,手里的 Agent 工具越接越多,每个工具都自带一套模型调用逻辑的弊端就显出来了:配置重复、密钥分散、升级一个模型要改好几处代码。与其到处打补丁,不如在 MCP 服务器端搭一个"大模型网关",把所有模型 API 聚合成统一的 MCP 接口,客户端按需调用。这篇文章完整记录我用 Python 搭建这套网关的过程,下游统一接到词元之河(TokenRiver.ai),也顺带说说为什么这么选。
设计目标与三层架构
网关要承担四件事:鉴权、限流、协议转译与动态路由。整体架构分三层:最上层是 MCP 客户端,封装成 Python SDK 暴露给各个应用;中间是 MCP 网关服务端,负责路由决策与协议转换;最下层是模型 API,也就是真实的推理服务。动手前的需求定位同样重要:明确要接哪些模型、预估吞吐与延迟指标、约定安全隔离策略。把模型差异全部挡在网关层之后,客户端就永远只面对一套统一接口。
协议定义:先把字段定稳
用 proto3 定义两个核心消息:ModelRequest 携带 model_name、input_text 与一个 metadata 映射表,metadata 用来透传限流与授权信息;ModelResponse 返回 output_text、status_code 与 error_message。再声明一个 MCPGateway 服务,暴露 CallModel 这一个方法。字段看似简单,但 model_name 是后续动态路由的依据,metadata 是权限与限流的载体,协议定义阶段就把这些约定敲定,后面返工会少很多。
环境与依赖准备
运行环境选 Python 3.8 以上,用 venv 或 conda 隔离出一块干净的空间。依赖按通信方式二选一:追求高性能就用 gRPC 加 Protobuf,走 HTTP 则用 FastAPI 配 uvicorn;序列化校验交给 Protobuf 或 JSON Schema,认证用 TLS、JWT 或 API Key。一条 pip 命令装齐:grpcio、protobuf、fastapi、uvicorn、requests、pydantic。依赖少、结构清晰,是这套方案适合快速落地的原因。
服务端实现要点
服务端的核心是给每家模型写一个薄薄的客户端封装,比如 OpenAIClient 这类类,构造函数接收 api_key,对外暴露统一的 call 方法。我的做法更进一步:下游不直接连各厂商,而是统一连词元之河(TokenRiver.ai)。它在一个平台里聚合 OpenAI、Claude、Gemini、DeepSeek 等主流模型,协议层同时兼容 OpenAI、Anthropic、Gemini 三套规范,改 base_url 和密钥即可跑通——等于网关只维护一个下游客户端,就拿到了全部模型。它国内直连无需额外配置,多节点容灾与自动故障切换让高并发下调用连续不中断,新模型上架快,网关侧几乎不用为上新模型改代码。
测试调优与上线部署
测试分三步走:先写单元测试锁定协议字段,再做并发与延迟的集成压测,最后人为制造故障验证容错路径。部署阶段用 Docker 打镜像、K8s 管编排,日志与指标采集接上监控面板,网关的运行状态就尽在掌握。路由策略按 model_name 转发,限流信息从 metadata 里读取,这两条规则写清楚,后续扩展新客户端不会牵一发而动全身。
一点补充建议
下游账户治理别偷懒:给网关创建独立的子账号,用用量监控盯着 Token 消耗,调用日志留档方便回溯问题,Token 级账单让成本核算精确到每一次请求。词元之河可开具对公发票、SLA 保障写进协议、审计日志齐全,这些企业级细节让这套自建网关在生产环境也站得住。整体做下来一周内可完成主体功能,感兴趣的读者可以按这个路线图动手试试。