Model Context Protocol (MCP) 正在重塑 LLM 应用与外部系统的交互范式。作为客户端开发者,理解如何高效、稳定地连接 MCP Server 是构建 Agent 的第一步。本文将深入剖析 Python 环境下的连接机制,重点对比 SSE 与 Streamable HTTP 两种传输协议,并提供生产级的代码示例。
1. 传输层协议:SSE vs Streamable HTTP
在 MCP 的架构中,传输层(Transport Layer)负责在 Client 和 Server 之间搬运 JSON-RPC 消息。目前主流的两种远程传输协议各有千秋。
1.1 Server-Sent Events (SSE)
SSE 是 Web 标准中用于服务器向客户端单向推送数据的技术。在 MCP 中,它通常结合 HTTP POST 使用。
- 机制:Client 建立一个长连接(GET /sse)用于接收 Server 的消息(Events)。Client 发送消息则通过另一个独立的 HTTP POST 请求。
- 适用场景:浏览器环境、需要穿越防火墙、标准 Web 服务。
- 连接模型:双通道(一条长读通道,一条短写通道)。
1.2 Streamable HTTP (Chunked Transfer)
这是一种更现代、更纯粹的 HTTP 交互方式,通常基于 HTTP/1.1 的 Chunked Transfer Encoding 或 HTTP/2。
- 机制:Client 和 Server 通过一个双向流(或长轮询变体)进行通信。在 MCP 的 Python SDK 实现中,它往往复用了底层 HTTP 客户端(如
httpx)的流式能力。 - 适用场景:Server-to-Server 通信、高性能后端服务。
- 连接模型:单通道(或复用通道),通常更节省资源,且不需要处理跨域(CORS)的复杂性(如果在同域后端)。
2. Python 客户端实战
我们将使用官方 mcp SDK 来构建客户端。无论使用哪种传输协议,核心的 ClientSession 逻辑是一致的,区别仅在于 Transport 的初始化。
2.1 依赖安装
pip install mcp httpx
2.2 连接建立:协议适配
方案 A:使用 SSE 连接
这是最常见的连接方式。
from mcp.client.sse import sse_client
from mcp.client.session import ClientSession
async def connect_via_sse(url: str, headers: dict = None):
# sse_client 是一个 Async Context Manager
# 它自动处理 EventSource 的连接与重连
async with sse_client(url=url, headers=headers) (read_stream, write_stream):
ClientSession(read_stream, write_stream) session:
session

