这个文件 src/mcp/shared/session.py 主要实现了一个基于异步流的“会话”机制,常用于客户端与服务端之间的高效异步通信。它大量使用了 Python 的类型注解、泛型、异步编程(async/await)和上下文管理器。下面是主要内容的分解和解释:


1. 主要依赖和类型定义

  • anyio:异步并发库,提供流、任务组、取消作用域等。
  • httpx:HTTP 客户端库,用于处理 HTTP 错误码。
  • pydantic:数据验证和序列化库。
  • MemoryObjectReceiveStream / MemoryObjectSendStream:anyio 提供的内存流,用于在内存中异步传递消息。
  • 各种类型注解:如 SendRequestTSendResultT 等,用于泛型支持。

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. 工作流程简述

  1. 会话启动:进入 BaseSession 的异步上下文,启动 _receive_loop
  2. 消息接收:不断从 _read_stream 读取消息,根据类型分发给不同的处理逻辑。
  3. 请求处理:收到请求后,创建 RequestResponder,并调用 _received_request
  4. 响应发送:通过 respondcancel 方法发送响应。
  5. 通知处理:收到通知后,调用 _received_notification,如有进度回调则执行。
  6. 异常和关闭:处理流关闭、超时、参数错误等异常情况。

6. 适用场景

  • 适用于需要高并发、异步、双向通信的场景,如 RPC 框架、微服务通信、异步 API 网关等。

总结

本文件实现了一个强大、灵活的异步会话框架,支持请求/响应、通知、进度回调、超时、取消等高级特性,适合构建高性能的异步通信系统。

这个文件 [session.py](<javascript:void(0)>) 实现了 MCP(Model Control Protocol)协议的核心会话层功能。它封装了基于异步流的消息通信,支持请求/响应、通知、进度报告等机制,并且提供了上下文管理、超时控制和取消操作的能力。