package server import ( "context" "fmt" "log/slog" "os" "os/signal" "syscall" "ops-mcp/internal/tool" "github.com/mark3labs/mcp-go/server" ) const version = "0.1.0" // Run 启动 MCP Server。 func Run(transport string, tools ...tool.Tool) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) go func() { sig := <-sigCh slog.Info("received signal, shutting down", "signal", sig) cancel() }() registry := NewRegistry() for _, t := range tools { if err := registry.Register(t); err != nil { return fmt.Errorf("register: %w", err) } } sysTool := tool.NewSystemTool(version, registry) if err := registry.Register(sysTool); err != nil { return fmt.Errorf("register system: %w", err) } if err := registry.InitializeAll(ctx); err != nil { return fmt.Errorf("initialize: %w", err) } defer func() { for _, err := range registry.ShutdownAll(ctx) { slog.Error("shutdown error", "err", err) } }() mcpServer := server.NewMCPServer("ops-mcp", version, server.WithLogging()) if err := registry.RegisterAll(mcpServer); err != nil { return fmt.Errorf("register all: %w", err) } switch transport { case "stdio": slog.Info("starting MCP server", "transport", "stdio") return server.ServeStdio(mcpServer) case "sse": slog.Info("starting MCP server", "transport", "sse", "addr", ":8080") return server.NewSSEServer(mcpServer).Start(":8080") default: return fmt.Errorf("unknown transport: %s", transport) } }