使用 curl 建立 SSE(Server-Sent Events)连接,其实就是发起一个普通的 HTTP GET 请求,并保持连接不断开。SSE 的本质是服务端持续不断地向客户端推送文本流(Content-Type: text/event-stream)。
典型 curl 命令如下:
bash
curl -N http://MCP_SERVER地址/sse参数说明:
-N或--no-buffer:让 curl 立即输出服务端推送的每一行内容,不做缓冲(SSE 场景下很重要)。http://MCP_SERVER地址/sse:替换为实际的 SSE 订阅地址(具体路径根据你的 MCP Server 配置而定)。
如果需要带认证头:
bash
curl -N -H "Authorization: Bearer <token>" http://MCP_SERVER地址/sse连接建立后
- 只要服务端有事件推送,curl 会实时输出到终端。
- 你可以看到形如:
event: notifications/tools/list_changed data: {"message":"工具列表已更新"}
注意:
- curl 只能“看见”推送内容,不能主动发消息给服务端(SSE 是单向的)。
- 如果你需要双向通信,请用 WebSocket。
SSE(Server-Sent Events)连接的请求头和普通的 HTTP POST/GET 请求相比,确实有一些区别,主要体现在以下几点:
1. SSE 连接的请求头
最基本的 SSE 请求头(浏览器或 curl 默认):
Accept: text/event-stream这个头告诉服务端,客户端希望接收 SSE 流。
常见的完整请求头(部分服务端会校验):
Accept: text/event-stream Cache-Control: no-cache Connection: keep-alive如果需要认证,还会加上认证头:
Authorization: Bearer <token>curl 默认不会自动加 Accept: text/event-stream,但大多数服务端会自动识别 SSE 路径,也可以手动加上:
bashcurl -N -H "Accept: text/event-stream" http://MCP_SERVER地址/sse
2. 普通 HTTP POST/GET 请求头
- 常见的 POST/GET 请求头:
Content-Type: application/json Accept: application/json- POST 请求还会有请求体(body),如调用 tools/call。
3. 总结对比
| 场景 | 典型请求头 | 说明 |
|---|---|---|
| SSE 连接 | Accept: text/event-stream | 必须,表明是 SSE 客户端 |
| Cache-Control: no-cache | 建议,防止缓存 | |
| Connection: keep-alive | 建议,保持长连接 | |
| Authorization: Bearer token(如需认证) | 可选,鉴权 | |
| 普通 POST | Content-Type: application/json | 必须,表明是 JSON 请求体 |
| Accept: application/json | 建议,期望返回 JSON | |
| Authorization: Bearer token(如需认证) | 可选,鉴权 |
结论:
SSE 连接和普通 HTTP 请求的请求头确实不同,最关键的是 SSE 需要 Accept: text/event-stream,而普通 API 请求通常用 Content-Type: application/json。