跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

MCP 协议层详解:深入分析 Python SDK 中的实现机制

MCP 协议层负责消息封装与请求响应关联。BaseSession 类提供通用逻辑,屏蔽底层读写细节。ClientSession 和 ServerSession 继承 BaseSession,分别处理客户端与服务端握手及业务逻辑。通过泛型参数确保类型安全,利用异步流管理并发通信。开发者只需关注高层接口,无需重复造轮子。

1739658202发布于 2026/3/27更新于 2026/10/2185 浏览
MCP 协议层详解:深入分析 Python SDK 中的实现机制

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 消息。收到请求后校验参数并返回结果或错误响应。

交互流程分为三个阶段:

  1. 握手初始化:Client 发起 initialize 请求,交换协议版本与能力列表,Server 用 initialized 通知确认。
  2. 正常通信:双向发起 Request-Response 或单向 Notification,大模型应用按需调用 Client 接口。
  3. 优雅收尾:通信完成后任意一端可调用 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]) -> :
        
        

      () -> :
        
        
None
"""处理对方发来的请求。"""
pass
async
def
_received_notification
self, notification: ReceiveNotificationT
None
"""处理对方发来的通知。"""
pass

核心属性与上下文管理

BaseSession 的核心属性包括:

  • _read_stream / _write_stream:AnyIO 内存流,用于异步收发 SessionMessage。
  • _request_id:内部自增计数器,为每个发出的请求分配唯一 ID。
  • _response_streams:字典结构,每发一个请求就开一个答案流,收到对应 ID 的响应或错误时写入,send_request 在此流上等待结果。
  • _in_flight:跟踪当前正在处理但尚未完成的对端请求,便于取消通知时的清理或超时管理。
  • _exit_stack:AnyIO 的异步上下文管理栈,统一关闭流和任务。

通过 __aenter__ / __aexit__ 进行上下文管理。进入时创建 TaskGroup 并启动 _receive_loop,并行监听对端消息;退出时依次关闭所有资源、取消接收循环任务。

三、BaseSession 类中的基本方法

BaseSession 提供了一系列协议实现方法,控制 MCP 基本交互流程。

发送请求:send_request()

该方法将高层 Pydantic 请求模型打包成 JSON-RPC 消息并发出,同时管理'谁发的请求'和'等待谁的回应'。具体过程如下:

  1. 分配请求 ID:使用 _request_id 自增获取新 ID。
  2. 创建响应流:在 _response_streams 中为该 ID 注册缓冲大小为 1 的内存流。
  3. 构造 JSONRPCRequest:序列化 Pydantic 模型,附带 ID。
  4. 写入流并等待:发往对端,在对应的响应流上阻塞读取,设置超时。
  5. 错误处理:若拿到 JSONRPCError 则抛 McpError;若超时则抛带有 HTTP 408 码的 McpError;否则反序列化 result 部分并返回。
  6. 清理:无论成功或失败,删除流和注册记录。

发送响应:_send_response()

当收到对端请求需回复时,根据成功或失败结果生成正确的 JSON-RPC 响应或错误。若是正常结果则构造 JSONRPCResponse(含 ID + result 字段),若是错误则构造 JSONRPCError,最后写入 _write_stream。

发送通知:send_notification()

对于只需单向推送的事件(如日志、进度、资源变化),该方法构造 JSONRPCNotification(无 ID),部分传输层可携带 related_request_id,直接写入 _write_stream 而不等待响应。

消息接收循环:_receive_loop()

此方法不断从底层流读取 JSON-RPC 消息,按类型分流到正确管道:

  1. JSONRPCRequest:校验后包装成 RequestResponder 放入 _in_flight,调用 _received_request 钩子。若未完成响应,传给 _handle_incoming。
  2. JSONRPCNotification:校验后调用 _received_notification 钩子,然后 _handle_incoming。若是取消通知,查找并取消对应的 in-flight 请求。
  3. JSONRPCResponse / JSONRPCError:根据 ID 查找 _response_streams,将结果写入流供 send_request 读取。若找不到对应流,转交 _handle_incoming 处理。

可重写的钩子方法

BaseSession 定义了可重用钩子方法,将处理逻辑留给子类实现。ClientSession 和 ServerSession 重写这些方法注入初始化握手、工具调用分发等行为,无需触及底层 JSON-RPC 和并发细节。

四、ClientSession 和 ServerSession 的上层实现

BaseSession 做好了消息帧化、ID 跟踪、并发读写、超时与错误处理。上层只需继承并重写少数钩子即可快速实现会话逻辑。

客户端 (ClientSession)

初始化阶段通过构造函数注入下游读写流、超时设置及各类回调。调用 initialize() 时,向服务端发送 initialize 请求,收到 InitializeResult 后发送 InitializedNotification 完成握手。

在消息接收方面,ClientSession 重写 _received_request 钩子。当服务端发来 sampling/createMessage、roots/list 或 ping 等请求时,提取请求类型和参数,调用相应回调并将返回值传给 responder.respond() 完成响应。

对于通知,目前仅对日志消息作出处理,其他未处理的消息委托给构造时提供的 message_handler,以便上层监控或自定义处理。

服务端 (ServerSession)

握手逻辑内嵌在 _received_request 和 _received_notification 钩子里。首次碰到 InitializeRequest 时保存参数并返回 IncludeResult。接收到 InitializedNotification 时状态机进入 Initialized 阶段,此前到来的其他请求会触发 RuntimeError。

握手完成后,check_client_capability 方法读取客户端声明的能力集,判断功能可用性。ServerSession 提供了一系列高层接口,如 send_log_message、send_resource_updated 等,转换为对应的 ServerNotification 发送;create_message、list_roots 等方法封装了对 JSON-RPC 请求的构建与发送。

上行消息分发中,ServerSession 在 _handle_incoming 中将未处理的 RequestResponder 或 Notification 推送到内存队列,这是框架层面通过装饰器将请求自动路由到用户业务函数的基础。

从通用到可用的核心流程

典型部署中,Host 应用实例化 ClientSession 和 ServerSession,对接底层读写流。本地场景通常将标准输出连向标准输入,远程场景通过 HTTP 与 SSE 通道互联。

客户端调用 initialize() 发出请求,ServerSession 捕获并返回 InitializeResult,客户端再发送 InitializedNotification 完成握手。交互过程中,任何一方像调用本地函数一样发起高层 API 调用。例如客户端执行 await session.list_tools(),ClientSession 构造 JSON-RPC 请求发出,ServerSession 接收后封装成 RequestResponder 交给工具实现函数处理,执行完成后调用 responder.respond(),结果打包回传并在客户端被捕获反序列化。

同样地,服务端可直接调用 await server_session.create_message() 来触发大模型,支持上下文生成。上层只需注册回调,就能无缝插入新工具或扩展消息类型,BaseSession 的改动不影响业务逻辑。

client/session.py 和 server/session.py 在 BaseSession 底座上完成了握手、能力协商、消息分发、工具调用及高层接口封装,真正将 MCP 从协议文档变成了可扩展的 SDK。

总结

Session 类是 MCP SDK 在底层对 JSON-RPC 消息收发的统一封装,由框架内部创建和管理。编写 Server 代码时,只需关注声明工具函数、调用 mcp.run() 启动即可,无需看到 Session 的具体实现。只有在需要定制化底层消息拦截、自定义请求路由或替换 JSON-RPC 实现时,才需要考虑继承或修改 Session。

目录

  1. 一、MCP 架构中的 Host、Client 和 Server
  2. 二、BaseSession 类实现底层协议层
  3. 泛型参数设计
  4. 核心属性与上下文管理
  5. 三、BaseSession 类中的基本方法
  6. 发送请求:send_request()
  7. 发送响应:sendresponse()
  8. 发送通知:send_notification()
  9. 消息接收循环:receiveloop()
  10. 可重写的钩子方法
  11. 四、ClientSession 和 ServerSession 的上层实现
  12. 客户端 (ClientSession)
  13. 服务端 (ServerSession)
  14. 从通用到可用的核心流程
  15. 总结

更多推荐文章

查看全部
  • Vibe Coding 时代后端程序员开发前端最佳实践
  • 无人机路径规划算法详解
  • FPGA 高速通信实战:Aurora 64B/66B IP 核配置与回环测试
  • 腾讯云服务器部署 OpenClaw 对接飞书实战指南
  • 云边端一体化解析:概念、原理与AI基础设施实践
  • AIGC 如何改变金融业?不是所有智能化问题都要用大模型解决
  • AI 四大核心技术详解:LLM、Agent、RAG 与 Skill
  • GitHub 启用双因素身份验证(2FA)配置指南:TOTP.app 动态验证码设置
  • Spring Web 项目核心配置:web.xml 关键组件解析
  • OpenClaw 多 Agent 对接飞书机器人架构与配置
  • Web3.0 开发实践
  • 基于 LangChain 实现的知识库问答工具
  • Stable Diffusion 训练实战:损失函数调优指南
  • 前端文件下载实战:从原理到最佳实践
  • Vivado 安装指南:从官网下载到环境配置
  • 深入解析 Transformer 内部运作原理:基于 Sakana AI 最新研究
  • Windows 本地部署 Ollama 与 OpenClaw,构建 AI 生产力系统
  • 链表在内存管理与缓存淘汰中的应用
  • 基于 DeepSeek V3.2 构建企业级 Text-to-SQL 专家系统
  • 大模型应用开发:RAG 入门与实战

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online