This repository has been archived on 2025-12-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
gitea-mcp/operation/operation.go
b3nw e3f7405cd8 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>
2025-07-13 17:26:12 +00:00

105 lines
2.6 KiB
Go

package operation
import (
"fmt"
"gitea.com/gitea/gitea-mcp/operation/issue"
"gitea.com/gitea/gitea-mcp/operation/pull"
"gitea.com/gitea/gitea-mcp/operation/repo"
"gitea.com/gitea/gitea-mcp/operation/search"
"gitea.com/gitea/gitea-mcp/operation/user"
"gitea.com/gitea/gitea-mcp/operation/version"
"gitea.com/gitea/gitea-mcp/pkg/flag"
"gitea.com/gitea/gitea-mcp/pkg/log"
"github.com/mark3labs/mcp-go/server"
)
var mcpServer *server.MCPServer
func RegisterTool(s *server.MCPServer) {
// User Tool
s.AddTools(user.Tool.Tools()...)
// Repo Tool
s.AddTools(repo.Tool.Tools()...)
// Issue Tool
s.AddTools(issue.Tool.Tools()...)
// Pull Tool
s.AddTools(pull.Tool.Tools()...)
// Search Tool
s.AddTools(search.Tool.Tools()...)
// Version Tool
s.AddTools(version.Tool.Tools()...)
s.DeleteTools("")
}
func Run() error {
mcpServer = newMCPServer(flag.Version)
RegisterTool(mcpServer)
switch flag.Mode {
case "stdio":
if err := server.ServeStdio(mcpServer); 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', 'http', 'sse' or 'network'", flag.Mode)
}
return nil
}
func newMCPServer(version string) *server.MCPServer {
return server.NewMCPServer(
"Gitea MCP Server",
version,
server.WithToolCapabilities(true),
server.WithLogging(),
server.WithRecovery(),
)
}