ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MCP SSE协议发送和Stream Http协议发送

MCP SSE协议发送和Stream Http协议发送

springAI代码

mcp server

@Service public class WeatherService { @Tool(name = "getWeather", description = "根据城市名称获取天气预报信息") public String getWeather(@ToolParam(description = "城市") String cityName) { return cityName + "天气阳光明媚~"; } }

Toolconfig

@Component public class ToolConfig { @Bean public ToolCallbackProvider weatherTools(WeatherService weatherService) { return MethodToolCallbackProvider.builder() .toolObjects(weatherService) .build(); } }

配置

spring: ai: mcp: server: name: my-business-mcp-server version: 1.0.0 # 启用 Streamable HTTP 协议 # streamable-http: # enabled: true # endpoint: /mcp # 如果也想兼容老客户端,可以顺便开启 SSE sse: enabled: true endpoint: /sse

SSE调试

第一步:拿到新的 Session ID

刷新你的浏览器http://localhost:8004/sse,在 EventStream 里复制最新的sessionId(假设是abc-123)。

第二步:发送初始化请求(必须发!)

原接口路径去掉sse,替换成/mcp/message

curl -X POST "http://localhost:8004/mcp/message?sessionId=abc-123" -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"curl-test\",\"version\":\"1.0.0\"}}}"

(这个命令应该很快就会返回一个包含协议版本的 JSON)

第三步:发送确认通知(必须发!)
curl -X POST "http://localhost:8004/mcp/message?sessionId=abc-123" -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\"}"

(这个命令会返回 HTTP 200,但可能没有内容)

第四步:正式调用天气工具
curl -X POST "http://localhost:8004/mcp/message?sessionId=abc-123" -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"id\":\"2\",\"method\":\"tools/call\",\"params\":{\"name\":\"getWeather\",\"arguments\":{\"cityName\":\"北京\"}}}"

就可以收到结果了,这个是针对相同sessionID得

建议使用人家封装好的工具省的自己搞

Stream Http调用

第一步:初始化(获取mcp-session-id)

建立会话,获取后续所有请求必须携带的 Session ID。

curl -i -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2024-11-05", "capabilities": {}, "clientInfo": { "name": "my-client", "version": "1.0.0" } } }'

💡 从返回的响应头中提取mcp-session-id: <你的会话ID>

第二步:选择开启 SSE 长连接(method=message)

通过 GET 请求主动告诉服务端:“我准备好接收流式消息了”。

# ⚠️ 关键分支:开启 SSE 长连接 curl -N -X GET "http://localhost:8080/mcp?method=message" \ -H "Accept: text/event-stream" \ -H "mcp-session-id: <你的会话ID>"

💡说明:这个请求会挂起并保持长连接。服务端后续推送的通知(Notifications)或流式响应都会通过这个通道发过来。选择开启,也可以不使用这一步建立长连接,直接发送post第四步建立短链接

第三步:查询工具列表(tools/list)

在建立好会话后,客户端通常会先拉取一下服务端有哪些可用的工具。

curl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "mcp-session-id: <你的会话ID>" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {} }'

💡说明:如果没有执行第二步(没有开启 SSE 长连接),这个请求以及后续的调用都会直接通过 POST 的响应体返回普通的 JSON 结果(短连接)。

第四步:发送 POST 调用工具(tools/call)

真正发起业务请求。

curl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "mcp-session-id: <你的会话ID>" \ -d '{ "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "your-tool-name", "arguments": { "key": "value" } } }'

第五步:可以ping MCP服务

curl -X POST "https://your-mcp-server-url/mcp" \ -H "Content-Type: application/json" \ -H "Accept: application/json,text/event-stream" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "jsonrpc": "2.0", "method": "ping", "id": 1 }'

*💡说明:

  • 如果执行了第二步,且该工具支持流式输出,服务端会通过第二步建立的 SSE 长连接推送结果,这个 POST 可能只返回202 Accepted。
  • 如果忽略了第二步,服务端会直接在这个 POST 请求的响应体中返回完整的 JSON 结果(短连接模式)。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进