MCP协议 进阶 MCP Streamable HTTP OAuth 远程MCP

MCP 远程化:Streamable HTTP + OAuth 让 MCP Server 从本地走向云端

AIEng Hub
阅读约 15 分钟

引言

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 模式的三个硬约束:

  1. 环境依赖:Server 依赖的 SDK、数据库驱动、凭据都要装在客户端机器上,团队协作时每人配一次环境。
  2. 无法服务多租户:一个”查公司订单”的 MCP Server 无法部署在中心,被多个客户端共享。
  3. 无法接入 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 的价值主张会再上一个台阶。