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 有不同的功能支持:
| 功能 | v1 | v2 | v3 | v4 |
|---|---|---|---|---|
| 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,所有人共享。
← 上一节:高级特性 | 目录 | 下一节:协议大比拼 →