feat: add network mode with combined HTTP and SSE endpoints

- Add new 'network' transport mode that serves both HTTP and SSE endpoints simultaneously
- HTTP endpoint available on specified port (/mcp)
- SSE endpoint available on port+1 (/sse)
- Maintain backward compatibility with stdio, http, sse modes
- Update documentation and examples for new network mode
- Default to network mode for improved user experience

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
b3nw
2025-07-13 17:26:12 +00:00
parent da08718e24
commit e3f7405cd8
4 changed files with 64 additions and 23 deletions

View File

@@ -42,25 +42,53 @@ func RegisterTool(s *server.MCPServer) {
func Run() error {
mcpServer = newMCPServer(flag.Version)
RegisterTool(mcpServer)
switch flag.Mode {
case "stdio":
if err := server.ServeStdio(mcpServer); err != nil {
return err
}
case "sse":
sseServer := server.NewSSEServer(mcpServer)
log.Infof("Gitea MCP SSE server listening on :%d", flag.Port)
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)
if err := httpServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil {
return err
}
case "sse":
sseServer := server.NewSSEServer(mcpServer)
log.Infof("Gitea MCP SSE server listening on :%d", flag.Port)
if err := sseServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil {
return err
}
case "network":
// Network mode: start both HTTP and SSE servers concurrently
log.Infof("Starting Gitea MCP server in network mode")
errChan := make(chan error, 2)
// Start HTTP server on port
go func() {
httpServer := server.NewStreamableHTTPServer(mcpServer)
log.Infof("Gitea MCP HTTP server listening on :%d", flag.Port)
if err := httpServer.Start(fmt.Sprintf(":%d", flag.Port)); err != nil {
errChan <- fmt.Errorf("HTTP server error: %w", err)
}
}()
// Start SSE server on port+1
go func() {
sseServer := server.NewSSEServer(mcpServer)
ssePort := flag.Port + 1
log.Infof("Gitea MCP SSE server listening on :%d", ssePort)
if err := sseServer.Start(fmt.Sprintf(":%d", ssePort)); err != nil {
errChan <- fmt.Errorf("SSE server error: %w", err)
}
}()
// Wait for first error
return <-errChan
default:
return fmt.Errorf("invalid transport type: %s. Must be 'stdio', 'sse' or 'http'", flag.Mode)
return fmt.Errorf("invalid transport type: %s. Must be 'stdio', 'http', 'sse' or 'network'", flag.Mode)
}
return nil
}