一、MCP 架构中的 Host、Client 和 Server
在 MCP 架构中,"Host"指的是最终承载大模型和用户界面的应用,比如桌面端的 Claude 客户端、IDE 插件或自研的聊天机器人后台。一个 Host 启动时,会在内部创建一个 MCP Client 实例,这个 Client 负责与外部的 MCP Server 建立一对一的连接(通常通过 stdio、HTTP+SSE 或其他支持的传输层)。
"接入层面的 Client"正是这个 MCP 客户端,它把上层业务或大模型交互中产生的"请求"(例如"列出可用工具""执行代码分析")打包成符合 JSON-RPC 2.0 的消息,再通过底层传输通道发给 Server;同时,它也能接收来自 Server 的 Notification(如"工具状态更新"),并把所得数据交回给 Host,以便拼接到模型的 Prompt 中或做二次处理。
而 MCP"Server"则是真正提供上下文内容和工具执行能力的进程或服务。它在启动时会注册一系列接口(Resource 列表、工具调用、文件系统访问、外部 API 调用等),并监听来自 Client 的 JSON-RPC 消息。当收到"调用某个工具"这样的请求时,Server 会校验参数、调用相应逻辑,将结果封装成 Result 消息回传;如果出现异常,则返回带有标准错误码(如 ParseError、InvalidParams、MethodNotFound)的 Error 响应。
整个交互流程可以分为三个阶段。
- 握手初始化:Host 的 MCP Client 向 Server 发起 initialize 请求,双方交换协议版本与能力列表,并用 initialized 通知确认;
- 正常通信:Client/Server 可双向发起 Request–Response(同步调用)或单向 Notification(异步事件),大模型应用只需按需调用 Client 的接口;
- 优雅收尾:通信完成后,任意一端可调用 close() 或因底层通道断开而触发连接关闭。
在上面的 MCP 连接生命周期中,Client 和 Server 之间可以传递下列类型的 MCP 消息类型:
- Request:期待收到响应。
- Result:请求成功的响应。
- Error:请求失败时返回。
- Notification:单向消息,无需响应。
通过这种分层设计,MCP 将"业务逻辑"与"上下文 / 工具管理"解耦:Host 只管"我需要哪些信息 / 能力";Server 负责"我怎样取到或实现这些能力"。最终,在 Host 内部,大模型得到的不再是死板的 API 返回值,而是经过精心组织的上下文提示,能够更灵活、更安全地调用外部工具、访问数据源。
二、BaseSession 类实现底层协议层
(Protocol layer) 协议层负责消息的封装、请求 / 响应关联,以及高级通信模式的实现。其中的核心逻辑位于 BaseSession(定义在 mcp/shared/session.py)类,这里提供了所有 JSON-RPC 消息的读写、帧解析、请求–响应关联、通知分发的通用逻辑,是 MCP 协议层的通用实现,屏蔽了 JSON-RPC 消息的底层读写、请求–响应关联和通知分发细节。
BaseSession 类承担了对所有 JSON-RPC 消息的统一管理与生命周期控制。它通过一系列核心属性和方法来维护读写流、请求 ID、响应管道和后台任务栈,确保异步收发、请求–响应关联以及资源清理都井然有序。
它将"发送请求、等待响应""发出单向通知""接收并分发对端消息"这些通用逻辑全部封装,派生类(客户端或服务端的 Session)只需关注「收到请求/通知后如何处理」或「要发送哪些高层类型化消息」。
BaseSession 类的代码如下:
class Session(BaseSession[RequestT, NotificationT, ResultT]):
async def send_request(self, request: RequestT, result_type: type[Result]) -> Result:
"""发送请求并等待响应。若响应包含错误,则抛出 McpError。"""
# 请求发送和响应处理逻辑
pass
async def send_notification() -> :
() -> :
() -> :


