这个文件 src/mcp/shared/session.py 主要实现了一个基于异步流的“会话”机制,常用于客户端与服务端之间的高效异步通信。它大量使用了 Python 的类型注解、泛型、异步编程(async/await)和上下文管理器。下面是主要内容的分解和解释:
1. 主要依赖和类型定义
- anyio:异步并发库,提供流、任务组、取消作用域等。
- httpx:HTTP 客户端库,用于处理 HTTP 错误码。
- pydantic:数据验证和序列化库。
- MemoryObjectReceiveStream / MemoryObjectSendStream:anyio 提供的内存流,用于在内存中异步传递消息。
- 各种类型注解:如
SendRequestT、SendResultT等,用于泛型支持。
2. ProgressFnT 协议
定义了一个异步回调协议,用于进度通知:
class ProgressFnT(Protocol):
async def __call__(self, progress: float, total: float | None, message: str | None) -> None: ...
3. RequestResponder 类
用于处理单个请求的响应和生命周期管理,必须作为上下文管理器使用。
- **enter / exit**:进入/退出上下文时,设置和清理取消作用域。
- respond:发送响应。
- cancel:取消请求并发送取消响应。
- in_flight / cancelled:属性,判断请求是否还在处理中或已被取消。
4. BaseSession 类
这是核心类,实现了基于流的异步会话机制,支持请求/响应、通知、进度回调等。
主要成员变量
_read_stream/_write_stream:用于收发消息的内存流。_response_streams:保存每个请求的响应流。_in_flight:保存正在处理的请求。_progress_callbacks:保存进度回调。_task_group:anyio 的任务组,用于并发处理消息。
主要方法
- **aenter / aexit**:异步上下文管理器,自动启动消息接收循环。
- send_request:发送请求并等待响应,支持超时和进度回调。
- send_notification:发送通知(不需要响应的消息)。
- _send_response:内部方法,发送响应或错误。
- _receive_loop:核心消息循环,异步接收和分发消息,处理请求、通知、响应等。
- _received_request / _received_notification:可被子类重写,用于自定义请求/通知的处理逻辑。
- send_progress_notification:发送进度通知。
- _handle_incoming:通用的消息处理钩子,通常由子类实现。
5. 工作流程简述
- 会话启动:进入
BaseSession的异步上下文,启动_receive_loop。 - 消息接收:不断从
_read_stream读取消息,根据类型分发给不同的处理逻辑。 - 请求处理:收到请求后,创建
RequestResponder,并调用_received_request。 - 响应发送:通过
respond或cancel方法发送响应。 - 通知处理:收到通知后,调用
_received_notification,如有进度回调则执行。 - 异常和关闭:处理流关闭、超时、参数错误等异常情况。
6. 适用场景
- 适用于需要高并发、异步、双向通信的场景,如 RPC 框架、微服务通信、异步 API 网关等。
总结
本文件实现了一个强大、灵活的异步会话框架,支持请求/响应、通知、进度回调、超时、取消等高级特性,适合构建高性能的异步通信系统。
这个文件 [session.py](<javascript:void(0)>) 实现了 MCP(Model Control Protocol)协议的核心会话层功能。它封装了基于异步流的消息通信,支持请求/响应、通知、进度报告等机制,并且提供了上下文管理、超时控制和取消操作的能力。
















