From c2fac7754ccf4a733a8e610907de6ba8abae5004 Mon Sep 17 00:00:00 2001 From: b3nw Date: Mon, 14 Jul 2025 02:01:29 +0000 Subject: [PATCH] fix: resolve network mode SSE and logging issues - Fixes 404 errors on /sse and /message endpoints in network mode. - Updates dev container and go.mod to use a compatible Go version. - Restores and improves startup logging for all transport modes. --- go.mod | 4 +++- operation/operation.go | 34 ++++++++++++++++++++++++++-------- pkg/log/log.go | 2 +- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 1570a9a..3f68ade 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module gitea.com/gitea/gitea-mcp -go 1.24.0 +go 1.23.0 + +toolchain go1.23.11 require ( code.gitea.io/sdk/gitea v0.21.0 diff --git a/operation/operation.go b/operation/operation.go index 9a5be72..ea12912 100644 --- a/operation/operation.go +++ b/operation/operation.go @@ -43,6 +43,8 @@ func RegisterTool(s *server.MCPServer) { func Run() error { mcpServer = newMCPServer(flag.Version) RegisterTool(mcpServer) + addr := fmt.Sprintf("127.0.0.1:%d", flag.Port) + switch flag.Mode { case "stdio": if err := server.ServeStdio(mcpServer); err != nil { @@ -50,29 +52,45 @@ func Run() error { } case "sse": sseServer := server.NewSSEServer(mcpServer) - log.Infof("Gitea MCP SSE server listening on :%d", flag.Port) + log.Infof("Gitea MCP Server running:") + log.Infof(" sse: http://%s/", addr) if err := sseServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil { return err } case "http": httpServer := server.NewStreamableHTTPServer(mcpServer) - log.Infof("Gitea MCP HTTP server listening on :%d", flag.Port) + log.Infof("Gitea MCP Server running:") + log.Infof(" http: http://%s/", addr) if err := httpServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil { return err } case "network": // Network mode: serve both HTTP and SSE on same port with different URLs + log.Infof("Network mode: Creating streamable HTTP server...") streamableServer := server.NewStreamableHTTPServer(mcpServer) - sseServer := server.NewSSEServer(mcpServer) - + log.Infof("Network mode: Created streamable HTTP server") + + log.Infof("Network mode: Creating SSE server...") + sseServer := server.NewSSEServer(mcpServer, + server.WithSSEEndpoint("/sse"), + server.WithMessageEndpoint("/message"), + ) + log.Infof("Network mode: Created SSE server") + // Create custom HTTP mux + log.Infof("Network mode: Creating HTTP mux...") mux := http.NewServeMux() mux.Handle("/mcp", streamableServer) - mux.Handle("/sse", sseServer) - + mux.Handle("/", sseServer) + log.Infof("Network mode: Configured HTTP routes") + // Start single HTTP server - log.Infof("Gitea MCP server listening on :%d (/mcp, /sse)", flag.Port) - return http.ListenAndServe(fmt.Sprintf(":%d", flag.Port), mux) + log.Infof("Gitea MCP Server running in network mode:") + log.Infof(" http: http://%s/mcp", addr) + log.Infof(" sse: http://%s/sse", addr) + err := http.ListenAndServe(fmt.Sprintf(":%d", flag.Port), mux) + log.Errorf("Network mode: ListenAndServe returned with error: %v", err) + return err default: return fmt.Errorf("invalid transport type: %s. Must be 'stdio', 'sse', 'http' or 'network'", flag.Mode) } diff --git a/pkg/log/log.go b/pkg/log/log.go index 1f2abe1..e907001 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -45,7 +45,7 @@ func Default() *zap.Logger { MaxAge: 30, })) - if flag.Mode == "http" || flag.Mode == "sse" { + if flag.Mode == "http" || flag.Mode == "sse" || flag.Mode == "network" { wss = append(wss, zapcore.AddSync(os.Stdout)) }