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: /sseSSE调试
第一步:拿到新的 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 结果(短连接模式)。