引言
MCP(Model Context Protocol)的早期普及几乎都发生在本地:Claude Desktop、Claude Code 通过 stdio 启动一个 Python/Node 子进程,MCP Server 与客户端同机运行。这种模式安全、免授权,但也把 MCP 锁死在了”每台机器都要装环境”的边界内。
2025 年末的协议修订(2025-11-25 版规范)与 2026 年的生态动作彻底改变了这一点:Streamable HTTP 取代 HTTP+SSE 成为推荐的远程传输层,OAuth 授权成为云端 MCP Server 的标配,MCP Registry、Cloudflare、Docker 等基础设施厂商纷纷下场。本文梳理这次”远程化”演进的技术细节与工程实践。
一、为什么必须远程化
本地 stdio 模式的三个硬约束:
- 环境依赖:Server 依赖的 SDK、数据库驱动、凭据都要装在客户端机器上,团队协作时每人配一次环境。
- 无法服务多租户:一个”查公司订单”的 MCP Server 无法部署在中心,被多个客户端共享。
- 无法接入 Web 生态:浏览器端、Serverless、边缘环境无法 spawn 子进程。
远程化后,MCP Server 就是一个普通 HTTPS 端点:客户端连过去、授权、调用工具,数据与凭据都留在服务端。
二、传输层演进:从 HTTP+SSE 到 Streamable HTTP
早期远程 MCP 采用 HTTP+SSE 双端点设计:客户端向一个端点 POST 消息、从另一个 SSE 端点接收推送,还需处理会话建立顺序,复杂度高。
Streamable HTTP 的改进是单端点 + 无状态优先:
- 客户端只需连一个 URL,POST 请求发送 JSON-RPC 消息;需要流式响应时,连接可原地升级为 SSE。
- 会话(session)通过
Mcp-Session-Id头维护,服务端空闲时可关闭连接,客户端自动重连即可——不需要专用推送通道常驻。 - 传输层与业务解耦后,MCP Server 可以直接跑在 Cloudflare Workers、Vercel Functions、Docker 容器等任意 HTTP 运行时上。
# Docker Agent 配置远程 MCP Server 示例
toolsets:
- type: mcp
remote:
url: "https://mcp.example.com/mcp"
transport_type: "streamable" # streamable | sse | unix socket
oauth:
clientId: "my-app-client-id"
clientSecret: "my-app-client-secret" # 公开客户端可省略
scopes: ["read", "write"]
三、授权模型:OAuth 成为标配
远程 Server 一旦涉及用户账号数据,“谁可以调用哪些工具”就必须被显式管理。MCP 规范的授权扩展基于 OAuth 2.1:
- 动态客户端注册(DCR):客户端首次连接时向 Server 的注册端点注册自己,换取 client_id,无需人工在 Server 侧预配置。
- 资源指示(Resource Indicators):token 的 audience 绑定到具体 MCP 资源 URL,Server 校验 token 的 audience 是否匹配,防止 token 被跨 Server 滥用。
- Scope 化工具权限:规范建议使用
mcp:tools等 scope 表达”可调用工具”这一资源,Server 可进一步按 scope 裁剪可见工具集。 - Token 校验链路:Server 通过 introspection endpoint 验证 token 活跃状态与 audience,而不是信任客户端自报的 header。
// Cloudflare Workers 上托管 MCP Server 的授权骨架
import OAuthProvider from "@cloudflare/workers-oauth-provider";
import MyMCPServer from "./my-mcp-server";
export default new OAuthProvider({
apiRoute: "/mcp", // MCP 端点
apiHandler: MyMCPServer.mount("/mcp"),
defaultHandler: MyAuthHandler, // 登录页
authorizeEndpoint: "/authorize",
tokenEndpoint: "/token",
clientRegistrationEndpoint: "/register", // DCR
});
四、2026 生态现状
- MCP Registry:官方服务器注册表上线后,远程 Server 有了统一发现与分发渠道,“npm 装依赖”式的 MCP 安装体验正在形成。
- Cloudflare McpAgent:提供开箱即用的远程传输支持(含 OAuth Provider),并与 Streamable HTTP 修订保持同步——一个 Worker 就是一个可授权的 MCP Server。
- Docker Agent:原生支持 Streamable HTTP / SSE / Unix socket 三种远程传输,空闲连接自动重连,OAuth 无需动态注册时也支持手动 clientId/clientSecret 配置。
- 官方路线图:2026 年最值得关注的方向是 “Servers as Agents”——允许 MCP Server 自身作为 Agent 主动发起调用,届时 MCP 将从”工具目录”升级为”Agent 网络”。
五、工程实践清单
| 关注点 | 建议 |
|---|---|
| 传输选型 | 新项目一律 Streamable HTTP;仅内部高吞吐低延迟场景保留本地 stdio |
| 授权 | 涉及用户数据必须 OAuth;内部系统可用共享密钥 + 网络隔离兜底 |
| 会话 | 客户端做好自动重连;Server 侧空闲会话及时回收 |
| 审计 | 记录每次工具调用的调用方、scope、资源 URL,方便追溯越权 |
| 幂等 | 远程调用存在网络不确定性,工具设计上尽量幂等、可重试 |
结语
MCP 远程化不是把 stdio 换成 HTTP 那么简单——它补齐了**发现(Registry)、授权(OAuth)、托管(Cloudflare/Docker)**三块拼图,MCP 才真正从”本地开发者的玩具”变成”企业共享的 Agent 工具基础设施”。接下来盯着官方路线图的 Servers as Agents:当 Server 能主动找 Agent 说话时,MCP 的价值主张会再上一个台阶。