From 0ef992cd9c787f902517642f6528ade1282e6c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Thu, 13 Aug 2026 16:37:29 +0800 Subject: [PATCH] fix: mcp streamable (#25311) --- pkg/mcp-server/server/server.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/pkg/mcp-server/server/server.go b/pkg/mcp-server/server/server.go index eb72d31688..eaa0c21b86 100644 --- a/pkg/mcp-server/server/server.go +++ b/pkg/mcp-server/server/server.go @@ -204,6 +204,13 @@ func (s *CloudpodsMCPServer) Start() error { server.WithKeepAlive(true), server.WithKeepAliveInterval(15*time.Second), ) + // PicoClaw 把 url=/sse 当成 Streamable HTTP(POST JSON-RPC、DELETE 结束会话)。 + // Cursor 等旧客户端仍是 GET /sse + POST /message。按 method 分流,避免 POST /sse 405。 + streamable := server.NewStreamableHTTPServer( + s.mcpServer, + server.WithHTTPContextFunc(contextFunc), + server.WithHeartbeatInterval(15*time.Second), + ) mux.HandleFunc("/version", func(w http.ResponseWriter, r *http.Request) { appsrv.VersionHandler(context.Background(), w, r) }) @@ -219,7 +226,21 @@ func (s *CloudpodsMCPServer) Start() error { mux.HandleFunc("/process_stats", func(w http.ResponseWriter, r *http.Request) { appsrv.ProcessStatsHandler(context.Background(), w, r) }) - mux.Handle(sseServer.CompleteSsePath(), sseServer.SSEHandler()) + sseHandler := sseServer.SSEHandler() + mux.Handle(sseServer.CompleteSsePath(), http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodPost, http.MethodDelete: + streamable.ServeHTTP(w, r) + case http.MethodGet: + if r.Header.Get("Mcp-Session-Id") != "" { + streamable.ServeHTTP(w, r) + return + } + sseHandler.ServeHTTP(w, r) + default: + sseHandler.ServeHTTP(w, r) + } + })) mux.Handle(sseServer.CompleteMessagePath(), sseServer.MessageHandler()) addr := fmt.Sprintf("%s:%d", options.Options.Address, options.Options.Port)