菜单

处理通知

相关源文件

本页面详细介绍了如何在客户端应用程序中注册处理程序并处理来自MCP服务器的通知。MCP(模型控制协议)客户端可以从服务器接收各种类型的异步通知,本文档解释了正确处理它们的机制。

有关客户端本身的信息,请参阅MCP客户端;有关服务器会话管理的信息,请参阅会话管理

通知系统概述

在MCP协议中,通知是服务器发送给客户端的单向消息,不需要响应。它们提供了一种机制,使服务器能够异步通知客户端诸如资源更改、系统状态更新或其他重要事件。

来源: client/client.go51-58 client/sse_test.go122-167

注册通知处理程序

MCP客户端提供了一种直接的方法来注册通知处理程序,这些处理程序是每当从服务器接收到通知时就会被调用的回调函数。

来源: client/client.go16-24 client/client.go66-74

注册处理程序

注册通知处理程序步骤

  1. 创建一个接受 mcp.JSONRPCNotification 参数的处理程序函数
  2. 在您的客户端实例上调用 OnNotification 方法,并传入此处理程序函数

示例

可以注册多个处理程序,它们将按照添加的顺序被调用。

来源: client/client.go66-74 client/sse_test.go129-132

处理程序执行流程

当接收到通知时

  1. 传输层从服务器接收通知
  2. 传输层调用客户端设置的通知处理程序
  3. 客户端遍历所有已注册的处理程序,并用通知调用每一个处理程序
  4. 每个处理程序都在同一个goroutine(协程)中被调用,因此应谨慎处理长时间运行的操作

请注意,处理程序在通知处理程序切片上持有读锁时被调用,因此您不应在通知处理程序内部注册新的处理程序。

来源: client/client.go51-58

通知类型和格式

通知遵循具有特定结构的JSON-RPC格式

字段类型描述
jsonrpc字符串始终设置为JSON-RPC版本(例如,“2.0”)
notification对象包含通知详情
notification.method字符串标识通知的类型
notification.params对象包含通知特定数据

常见通知方法

  • notifications/initialized: 客户端初始化后发送
  • resources/changed: 当订阅的资源发生变化时发送
  • server/status: 发送以更新客户端的服务器状态变化

params 字段的结构取决于通知方法。

来源: client/client.go138-146

处理特定通知

资源变更通知

订阅资源后,当资源发生变化时,您将收到 resources/changed 通知

异步通知处理模式

对于需要在单独的goroutine(协程)中响应通知的应用程序

来源: client/sse_test.go129-133

特定传输层注意事项

MCP客户端支持多种传输机制,每种机制的通知处理特性略有不同

SSE 传输

Server-Sent Events (SSE) 传输通过HTTP连接接收服务器发送事件形式的通知。通知在到达时即被处理。

来源: client/sse_test.go13-254

标准输入输出传输

Standard I/O 传输从服务器进程的标准输出读取通知。它持续从输出流中读取并处理JSON-RPC消息,将通知分派给已注册的处理程序。

来源: client/stdio_test.go32-281

最佳实践

  1. 在启动客户端之前注册处理程序:确保在调用 client.Start() 之前注册所有通知处理程序,以避免遗漏通知。

  2. 保持处理程序轻量:由于处理程序是同步调用的,请在单独的goroutine(协程)中执行繁重的处理。

  3. 类型断言通知参数:处理不同通知类型时,请将 params 字段类型断言为该通知的预期结构。

  4. 优雅地处理错误:通知处理程序不应发生恐慌(panic);始终包含适当的错误处理。

  5. 清理订阅:当不再需要时,取消订阅资源以停止接收通知。

来源: client/client.go66-74 client/client.go248-262

示例:完整的通知处理

以下是设置和处理通知的完整示例

来源: client/sse_test.go122-167 client/client.go248-254