Skip to content

4.3 从本地到远程——部署模式与版本演进

小周的 MCP Server 在本地开发环境跑通了,安全方案也通过了团队评审。现在他要把它部署到公司的测试服务器上——这意味着从 stdio 切换到 HTTP 传输,还需要考虑性能问题。


两种部署模式

本地部署(stdio)
传输:stdin/stdout
启动:Host 作为子进程启动 Server
授权:不需要(本机信任)
安全:最安全——网络不可达
配置:command + args
适合:个人工具、开发调试、IDE 集成
远程部署(Streamable HTTP)
传输:HTTP POST + SSE 流
启动:Server 作为独立 HTTP 服务运行
授权:OAuth 2.1
安全:需要 TLS + 防护措施
配置:URL
适合:团队共享、SaaS 集成、企业部署

从 stdio 切换到 HTTP

Python

python
# stdio 模式(默认)
mcp = FastMCP("my-server")
mcp.run()  # 默认 stdio

# Streamable HTTP 模式
mcp.run(transport="streamable-http", host="0.0.0.0", port=8000)

TypeScript

typescript
// stdio 模式
const transport = new StdioServerTransport();
await server.connect(transport);

// Streamable HTTP 模式
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";

const httpTransport = new StreamableHTTPServerTransport({
  sessionIdGenerator: undefined  // 无状态模式
});
await server.connect(httpTransport);

// 或者用 Express/NestJS 包装

版本演进

MCP 经历了四个主要版本。理解版本差异有助于选择正确的功能:

v12024.11 —— 初始发布
  • 基础协议定义:Client-Host-Server 三层架构
  • stdio 传输 + SSE(旧版 HTTP 传输)
  • 三大原语:Resources、Prompts、Tools
  • JSON-RPC 2.0 消息格式
v22025.03 —— HTTP 升级
  • Streamable HTTP 传输——替代 SSE,支持可恢复性和会话管理
  • Elicitation——Server 向用户请求信息
  • 结构化工具输出(outputSchema)
  • Completions(参数自动补全)
  • 资源订阅(subscribe/updated)
  • SSE 传输废弃
v32025.06 —— 注解与链接
  • Tool Annotations——readOnlyHint、destructiveHint 等工具注解
  • Resource Links——工具结果中可包含资源链接
  • JSON-RPC 批处理改进
v42025.11 —— 授权与扩展(当前版本)
  • OAuth 2.1 授权流程——完整的远程授权框架
  • Tasks——有状态的任务管理
  • MCP Apps——工具可返回 HTML 渲染
  • 扩展系统——可扩展协议
  • Tool Execution Error 规范化

版本兼容性

不同版本的 MCP 有不同的功能支持:

功能v1v2v3v4
stdio 传输
SSE 传输废弃废弃废弃
Streamable HTTP
Tools / Resources / Prompts
Elicitation
Completions
Tool Annotations
OAuth 2.1
Tasks

Client 和 Server 在初始化时协商 protocolVersion,确保双方使用兼容的版本。


部署最佳实践

本地开发

json
// claude_desktop_config.json
{
  "mcpServers": {
    "my-tool": {
      "command": "python",
      "args": ["my_server.py"]
    }
  }
}

生产部署

启用 TLS(必须)
配置 OAuth 2.1 授权
验证 Origin 头防止 CSRF
绑定域名或验证 localhost
实施速率限制
启用审计日志
监控 Server 健康状态

性能与规模化

小周的 Server 上线后,团队规模从 5 人扩大到 50 人。他开始遇到性能问题:

📊工具数量过多(100+)
拆分 Server——每个 Server 不超过 20 个工具,否则 LLM 上下文窗口被占满,选择准确率下降
并发请求(50 人同时查询)
连接池 + 并发限制——Server 独占连接数耗尽,考虑无状态设计
🌐远程延迟(500ms+)
Keep-alive + session 复用——减少 OAuth 握手和不必要的工具发现
📦大量结果(10000 行)
限制返回行数——默认 100 行,超出 LLM 上下文,使用分页

本节核心要点

  • 本地用 stdio(最安全、最简单),远程用 Streamable HTTP(需 TLS + OAuth)
  • MCP 四个版本逐步引入:HTTP 传输 → Elicitation/Completions → Tool Annotations → OAuth 2.1/Tasks
  • 版本在初始化时协商,Client 和 Server 需要兼容
  • 生产部署必须启用 TLS、OAuth、Origin 验证

思考题:如果你要为团队部署一个共享的 MCP Server(比如数据库查询工具),你会选择 stdio 还是 HTTP 传输?为什么?

参考思路

如果团队成员各自在本地使用各自的 AI 工具,stdio 更简单更安全——每人启动自己的 Server 实例。如果需要集中管理(统一的数据权限、审计日志、减少数据库连接数),HTTP 传输 + OAuth 更合适——部署一个远程 Server,所有人共享。


← 上一节:高级特性 | 目录 | 下一节:协议大比拼 →