SSE (Server-Sent Events) 传输通过 Server-Sent Events 协议,在 HTTP 上提供 MCP 客户端和服务器之间的实时双向通信。此传输支持持久连接和服务器发起的通信能力,非常适合需要实时更新和通知的应用。
有关其他传输机制的信息,请参阅 传输机制。有关基于 stdio 的通信,请参阅 Stdio 传输。有关基于 HTTP 会话的传输,请参阅 HTTP 传输。
SSE 传输实现了双端点架构,其中客户端建立持久的 SSE 连接以接收消息,并使用单独的 HTTP 端点发送请求。
来源:server/sse.go118-137 client/sse.go24-33 client/transport/sse.go
SSEServer 提供了一个基于 HTTP 的 MCP 服务器,具备实时功能。
服务器可以通过最少的配置进行创建和启动。
来源:server/sse.go260-277 server/sse.go288-308
SSE 服务器公开两个主要端点:
| 端点 | 目的 | 方法 | 描述 |
|---|---|---|---|
/sse | 事件流 | GET | 建立持久的 SSE 连接 |
/message | 请求处理 | POST | 处理 JSON-RPC 请求 |
服务器通过 GetMessageEndpointForClient() 自动处理端点路径解析。
来源:server/sse.go449-464 server/sse.go331-447 server/sse.go466-537
每个 SSE 连接都会创建一个 sseSession,它实现了多个会话接口。
会话会被自动注册和管理。
来源:server/sse.go22-116 server/sse.go350-369 server/sse.go77-96
SSE 客户端使用 NewSSEMCPClient() 函数创建。
客户端会自动处理 SSE 连接生命周期和消息路由。
SSE 传输支持各种配置选项。
可以静态或动态设置自定义标头。
来源:client/sse.go11-22 client/sse_test.go283-292
SSE 服务器支持通过函数选项进行广泛配置。
| 选项 | 目的 | 示例 |
|---|---|---|
WithBaseURL | 设置服务器的基本 URL | WithBaseURL("https://api.example.com") |
WithStaticBasePath | 设置静态路径前缀 | WithStaticBasePath("/mcp") |
WithDynamicBasePath | 动态路径生成 | WithDynamicBasePath(func(r *http.Request, sessionID string) string {...}) |
WithMessageEndpoint | 自定义消息端点路径 | WithMessageEndpoint("/api/message") |
WithSSEEndpoint | 自定义 SSE 端点路径 | WithSSEEndpoint("/api/events") |
WithKeepAlive | 启用心跳 ping | WithKeepAlive(true) |
WithKeepAliveInterval | 心跳频率 | WithKeepAliveInterval(30*time.Second) |
对于多租户应用等高级场景,可以配置动态基本路径。
来源:server/sse.go181-194 server/sse_test.go884-996
SSE 传输包含一个可选的心跳系统,它会发送周期性的 ping 消息。
心跳在服务器创建时配置。
来源:server/sse.go393-423 server/sse.go239-250
服务器发起的通知通过 SSE 连接传递。
来源:server/sse.go371-391 server/sse.go559-585
对于复杂的路由场景,SSE 服务器提供了独立的处理程序。
自定义上下文函数允许注入与请求相关的数据。
来源:server/sse.go252-258 server/sse_test.go555-710
SSE 传输提供强大的错误处理,并附带适当的 JSON-RPC 错误响应。