本页面详细介绍了如何在客户端应用程序中注册处理程序并处理来自MCP服务器的通知。MCP(模型控制协议)客户端可以从服务器接收各种类型的异步通知,本文档解释了正确处理它们的机制。
有关客户端本身的信息,请参阅MCP客户端;有关服务器会话管理的信息,请参阅会话管理。
在MCP协议中,通知是服务器发送给客户端的单向消息,不需要响应。它们提供了一种机制,使服务器能够异步通知客户端诸如资源更改、系统状态更新或其他重要事件。
来源: client/client.go51-58 client/sse_test.go122-167
MCP客户端提供了一种直接的方法来注册通知处理程序,这些处理程序是每当从服务器接收到通知时就会被调用的回调函数。
来源: client/client.go16-24 client/client.go66-74
注册通知处理程序步骤
mcp.JSONRPCNotification 参数的处理程序函数OnNotification 方法,并传入此处理程序函数示例
可以注册多个处理程序,它们将按照添加的顺序被调用。
来源: client/client.go66-74 client/sse_test.go129-132
当接收到通知时
请注意,处理程序在通知处理程序切片上持有读锁时被调用,因此您不应在通知处理程序内部注册新的处理程序。
通知遵循具有特定结构的JSON-RPC格式
| 字段 | 类型 | 描述 |
|---|---|---|
| jsonrpc | 字符串 | 始终设置为JSON-RPC版本(例如,“2.0”) |
| notification | 对象 | 包含通知详情 |
| notification.method | 字符串 | 标识通知的类型 |
| notification.params | 对象 | 包含通知特定数据 |
notifications/initialized: 客户端初始化后发送resources/changed: 当订阅的资源发生变化时发送server/status: 发送以更新客户端的服务器状态变化params 字段的结构取决于通知方法。
订阅资源后,当资源发生变化时,您将收到 resources/changed 通知
对于需要在单独的goroutine(协程)中响应通知的应用程序
MCP客户端支持多种传输机制,每种机制的通知处理特性略有不同
Server-Sent Events (SSE) 传输通过HTTP连接接收服务器发送事件形式的通知。通知在到达时即被处理。
Standard I/O 传输从服务器进程的标准输出读取通知。它持续从输出流中读取并处理JSON-RPC消息,将通知分派给已注册的处理程序。
来源: client/stdio_test.go32-281
在启动客户端之前注册处理程序:确保在调用 client.Start() 之前注册所有通知处理程序,以避免遗漏通知。
保持处理程序轻量:由于处理程序是同步调用的,请在单独的goroutine(协程)中执行繁重的处理。
类型断言通知参数:处理不同通知类型时,请将 params 字段类型断言为该通知的预期结构。
优雅地处理错误:通知处理程序不应发生恐慌(panic);始终包含适当的错误处理。
清理订阅:当不再需要时,取消订阅资源以停止接收通知。
来源: client/client.go66-74 client/client.go248-262
以下是设置和处理通知的完整示例