MCP Python SDK 的核心目标是提供开箱即用的客户端与服务端实现,避免开发者从零构建协议。本文基于源码解析 MCP 协议层的运行机制。
一、MCP 架构中的 Host、Client 和 Server
在 MCP 架构中,Host 指承载大模型和用户界面的应用,如桌面客户端或 IDE 插件。Host 启动时内部创建 MCP Client 实例,负责与外部 MCP Server 建立连接(通常通过 stdio、HTTP+SSE 等传输层)。
接入层面的 Client 将上层业务请求打包成符合 JSON-RPC 2.0 的消息发送给 Server,同时接收 Server 的通知并回传数据。Server 则是提供上下文内容和工具执行能力的进程,注册资源列表、工具调用等接口,监听 JSON-RPC 消息。收到请求后校验参数并返回结果或错误响应。
交互流程分为三个阶段:
- 握手初始化:Client 发起 initialize 请求,交换协议版本与能力列表,Server 用 initialized 通知确认。
- 正常通信:双向发起 Request-Response 或单向 Notification,大模型应用按需调用 Client 接口。
- 优雅收尾:通信完成后任意一端可调用 close() 或因通道断开触发关闭。
在此生命周期中,Client 和 Server 传递的消息类型包括:Request(期待响应)、Result(成功响应)、Error(失败响应)、Notification(无需响应的单向消息)。这种分层设计将业务逻辑与上下文管理解耦,Host 关注需求,Server 负责实现。
![MCP 交互流程图]
二、BaseSession 类实现底层协议层
协议层负责消息封装、请求响应关联及高级通信模式。核心逻辑位于 BaseSession 类(定义于 mcp/shared/session.py),提供 JSON-RPC 消息的读写、帧解析、请求响应关联及通知分发的通用逻辑。
BaseSession 统一管理 JSON-RPC 消息的生命周期,通过核心属性和方法维护读写流、请求 ID、响应管道和后台任务栈,确保异步收发有序进行。
它将发送请求等待响应、发出单向通知、接收分发对端消息等通用逻辑封装,派生类只需关注收到请求后的处理或发送高层类型化消息。
泛型参数设计
类中包含一系列泛型参数,让方法签名更严谨,并在收到消息时将原始 JSONRPC 转为具体的 Pydantic 模型,方便上层直接获取结构化数据。
class Session(BaseSession[RequestT, NotificationT, ResultT]):
async def send_request(self, request: RequestT, result_type: type[Result]) -> Result:
"""发送请求并等待响应。若响应包含错误,则抛出 McpError。"""
# 请求发送和响应处理逻辑
pass
async def send_notification(self, notification: NotificationT) -> None:
"""发送无需响应的单向通知。"""
pass
async def _received_request(self, responder: RequestResponder[ReceiveRequestT, ResultT]) -> :
() -> :


