MCP Go SDK中的会话管理提供了一个框架,用于跟踪客户端连接、维护每个客户端的状态以及传递通知。该系统使服务器能够为单个客户端定制行为并管理客户端-服务器关系的生命周期。
有关服务器配置和功能的信息,请参阅 服务器配置。有关特定传输实现的详细信息,请参阅 传输机制。
会话管理系统围绕定义不同功能的接口层次结构构建。
来源: server/session.go10-65 server/sse.go22-116
ClientSession 接口定义了会话管理的基本操作
| 方法 | 目的 |
|---|---|
SessionID() | 返回唯一的会话标识符 |
NotificationChannel() | 提供用于发送通知的通道 |
Initialize() | 标记会话为已准备好接收通知 |
Initialized() | 检查会话是否已初始化 |
其他接口扩展了基础会话以提供特定功能
| 接口 | 目的 | 关键方法 |
|---|---|---|
SessionWithLogging | 日志级别管理 | SetLogLevel(), GetLogLevel() |
SessionWithTools | 每个会话的工具 | GetSessionTools(), SetSessionTools() |
SessionWithClientInfo | 客户端元数据 | GetClientInfo(), SetClientInfo() |
SessionWithStreamableHTTPConfig | HTTP流 | UpgradeToSSEWhenReceiveNotification() |
来源: server/session.go86-111 server/sse.go350-369
会话在建立连接时与服务器注册
注册过程
当客户端断开连接时,会话将被移除
注销过程
会话管理系统与 Go 的上下文系统集成,用于请求范围的访问
| 功能 | 目的 |
|---|---|
WithContext(ctx, session) | 将会话存储在上下文中 |
ClientSessionFromContext(ctx) | 从上下文中检索会话 |
这些函数使处理程序无需显式传递参数即可访问当前会话。
会话管理系统提供了多种通知传递模式
| 方法 | 目标 | 需要上下文 |
|---|---|---|
SendNotificationToAllClients | 所有已初始化的会话 | 否 |
SendNotificationToClient | 来自上下文的当前会话 | 是 |
SendNotificationToSpecificClient | 通过 ID 指定的会话 | 否 |
每个会话都提供一个具有以下特征的通知通道
来源: server/session.go130-148 server/session.go180-198
会话可以维护自己的工具集,这些工具集可以覆盖或扩展全局工具
| 操作 | 方法 | 已发送通知 |
|---|---|---|
| 添加单个工具 | AddSessionTool(sessionID, tool, handler) | 是(如果启用了 tools.listChanged) |
| 添加多个工具 | AddSessionTools(sessionID, ...tools) | 是(如果启用了 tools.listChanged) |
| 删除工具 | DeleteSessionTools(sessionID, ...names) | 是(如果启用了 tools.listChanged) |
会话工具遵循这些优先规则
来源: server/session_test.go249-301
SSE 传输提供了会话接口的具体实现
sseSession 实现提供了
sync.Map 进行特定于会话的工具存储会话存储在并发安全的映射结构中
来源: server/sse.go128 server/session.go92
会话管理系统包括全面的错误处理
来源: server/errors.go15-24 server/session.go134-147 server/session.go184-197
| 错误 | 发生时间 | 处理 |
|---|---|---|
ErrSessionNotFound | 找不到会话 | 向调用者返回错误 |
ErrSessionExists | 重复注册 | 拒绝注册 |
ErrSessionNotInitialized | 会话未准备好 | 跳过操作 |
ErrNotificationChannelBlocked | 通道已满 | 通过错误钩子记录 |
当通知通道被阻塞时