MCP Python SDK · 第 8 章 传输层:stdio、流式 HTTP 与 SSE 章节摘要:前几章我们一直用内存连接( )验证代码,没碰过「消息怎么从客户端传到服务端」这个问题。但真实部署里,传输是绕不开的——本地工具跑成子进程、生产服务跑成 HTTP 服务、旧系统还在用 SSE。本章讲透 MCP 的传输层。核心洞见是传输与业务完全解耦:同一套服务端逻辑( 与你写的工具/资源/提示词)可以原样跑在 stdio、流式 HTTP、SSE 三种传输上,因为传输层只负责搬运 JSON-RPC 消息(以读写流的形式),不关心业务。
章节摘要:前几章我们一直用内存连接(
Client(mcp))验证代码,没碰过「消息怎么从客户端传到服务端」这个问题。但真实部署里,传输是绕不开的——本地工具跑成子进程、生产服务跑成 HTTP 服务、旧系统还在用 SSE。本章讲透 MCP 的传输层。核心洞见是传输与业务完全解耦:同一套服务端逻辑(MCPServer与你写的工具/资源/提示词)可以原样跑在 stdio、流式 HTTP、SSE 三种传输上,因为传输层只负责搬运 JSON-RPC 消息(以读写流的形式),不关心业务。我们会逐个讲清三种传输的工作机制——stdio(子进程,标准输入输出当线缆)、流式 HTTP(生产级,2025-03-26 引入,取代 SSE)、SSE(旧版,已弃用但仍可用),以及内存传输(测试/嵌入,无 JSON-RPC 帧);然后讲传输安全(DNS 重绑定防护)与选型取舍。读完本章,你能为不同部署场景选对传输。
阅读完本章,你应当能够:
read / write),业务逻辑对传输无感。mcp.run("streamable-http") 或 mcp.streamable_http_app() 启动一个流式 HTTP 服务,理解它为何是生产级传输、如何取代 SSE。整章逻辑可浓缩为一句话:传输层是 MCP 的「线缆抽象」——它把 stdio、HTTP、SSE、内存这些截然不同的底层机制,统一成一对读写流,让你的服务端代码对「跑在哪」毫无感知,这是整个 SDK 工程设计的精华所在。
开宗明义。讲清 Transport 的本质——一个异步上下文管理器,进入时产出一对 (read, write) 流,业务逻辑通过它收发消息。用一张图说明「同一套服务端代码 + 不同传输 = 不同部署形态」,这是本章的总纲。
stdio 是本地工具的默认传输。讲清它的工作机制:宿主用命令行启动你的服务端文件作为子进程,子进程的标准输入输出就是 MCP 消息的线缆;子进程拿到的是「白名单环境变量」而非你的完整环境(用 env= 注入)。说明它为何适合 Claude Desktop、IDE 这类本地宿主。
流式 HTTP(Streamable HTTP)是 2025-03-26 协议引入、取代 SSE 的生产级传输。讲清服务端两种启动方式(mcp.run("streamable-http") 一行启动、mcp.streamable_http_app() 拿 ASGI app 嵌入现有服务),以及关键选项:路径(默认 /mcp)、host/port、json_response、stateless_http、请求体大小上限、事件存储。
SSE(Server-Sent Events)是更早的 HTTP 传输,在 2025-03-26 被流式 HTTP 取代。讲清它的现状——仍能工作但官方不推荐新代码使用,以及为什么流式 HTTP 更好(更简单、更适配现代基础设施)。用一张对比表收尾。
内存传输用于测试与进程内嵌入(直接分发,无 JSON-RPC 帧,这是 Client(mcp) 的底层)。然后讲传输安全——DNS 重绑定防护机制如何默认只允许 localhost、要暴露到网络时如何正确配置,这是把服务端公开前必须搞懂的安全底线。
本章遵循「总纲 → 本地 → 生产 → 遗留 → 安全」的递进,既讲机制也讲选型:
传输抽象 (01) ── 读写流模型,业务与传输解耦 │ ▼ stdio (02) ── 子进程,本地默认 │ ▼ 流式 HTTP (03) ── 生产级,2025-03-26 主力 │ ▼ SSE (04) ── 旧版遗留,不推荐新代码 │ ▼ 内存与安全 (05) ── 测试传输 + DNS 重绑定防护 │ ▼ 第 9 章:转向客户端——Client 如何在这套传输上连接
传输抽象是总纲,理解了「读写流」就看懂了为什么三种传输名字不同却业务通用;stdio 与流式 HTTP 是你必须掌握的两个主力(本地与生产);SSE 是历史包袱,知道即可;内存与安全则补全测试与公网部署两端。本章是全书最硬核的三章之一,与第 9 章(客户端传输接入)直接呼应。
前置知识:
Client(mcp) 不涉及网络)本章为后续章节奠定的基础: