MCP 会话管理#
概述#
McpSessionController 类用于管理与 MCP(Model Context Protocol)服务器的完整连接生命周期。它负责连接建立、会话管理、异常安全断开,以及通过异步上下文管理器确保资源正确释放。该组件能够在需要时保持持久连接状态。
核心功能#
连接生命周期管理 - 通过异步上下文器自动处理MCP服务器的连接/断开
会话状态监控 - 提供 is_connect 属性实时监控连接状态
持久连接支持 - 通过 persistent_link 参数控制退出时是否断开连接
后台任务管理 - 维护异步会话线程实现非阻塞通信
异常安全断开 - 处理通信错误时自动执行清理操作
创建会话控制器#
以下示例展示了创建McpSession控制器的基础用法:
from mcp import McpServerLink
from evofabric.core.tool import McpSessionController
from evofabric.core.typing import StdioLink
# Create MCP server link
server_link = StdioLink(
command="python",
args=[str(current_dir / "your_mcp_server.py")],
)
# Initialize the session controller
session_controller = McpSessionController(
server_link=server_link,
server_name="math_service",
persistent_link=False # Disconnect when exiting context
)
# Establish connection using async context manager
async with session_controller:
print(f"Connected: {session_controller.is_connect}")
await session_controller.session.list_tools()
# Connection automatically closed when persistent_link=False
属性说明#
session(只读): 返回当前活动的客户端会话对象is_connect(只读): 布尔值指示当前是否处于连接状态persistent_link: 布尔标志,控制是否在上下文退出时保持连接server_name: 只读字符串,标识连接的MCP服务器名称
异步方法详解#
connect()#
建立MCP服务器的异步连接: - 安全可重复调用(重复调用会被忽略) - 创建后台维护任务等待连接就绪 - 完全建立连接后设置 _connected 标志
await session_controller.connect()
assert session_controller.is_connect == True
disconnect()#
断开 MCP 连接并重置内部状态。包含:
取消后台维护任务
清除连接相关属性
自动处理取消和关闭异常
await session_controller.disconnect()
assert session_controller.is_connect == False
异步上下文管理器#
控制器实现了Python的异步上下文管理器协议,确保资源自动管理:
# Standard usage: auto connect & auto disconnect
async with McpSessionController(...) as controller:
print(f"Connected: {controller.is_connect}")
# Perform operations...
# Persistent mode: connection stays open after exiting context
controller = McpSessionController(..., persistent_link=True)
async with controller:
# Perform operations...
# Connection remains active here
备注
当设置 persistent_link=True 时,会话在退出异步上下文管理器后不会自动断开。 在这种模式下,用户必须显式调用 disconnect() 来释放网络连接与后台任务。 否则可能导致 资源泄露(例如挂起的会话协程、未释放的 socket 连接等)。