package main import ( "flag" "fmt" "log/slog" "os" "ops-mcp/internal/server" "ops-mcp/internal/tool" "ops-mcp/config" ) func main() { env := flag.String("env", "dev", "运行环境:dev | staging | prod") flag.Parse() // 结构化日志 slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: slog.LevelInfo, }))) if err := run(*env); err != nil { slog.Error("fatal", "err", err) os.Exit(1) } } func run(env string) error { // 1. 加载配置 cfg, err := config.Load(env) if err != nil { fmt.Fprintf(os.Stderr, "Warning: could not load config file, using env vars only: %v\n", err) cfg = &config.Config{ Env: env, Server: config.ServerConfig{Transport: "stdio", Addr: ":8080"}, } } slog.Info("config loaded", "env", cfg.Env, "transport", cfg.Server.Transport) // 2. 收集工具 var tools []tool.Tool // database 工具 if len(cfg.Databases) > 0 { dbConfigs := make([]tool.DatabaseConf, 0, len(cfg.Databases)) for alias, db := range cfg.Databases { dbConfigs = append(dbConfigs, tool.DatabaseConf{ Alias: alias, Driver: db.Driver, DSN: db.DSN, }) } tools = append(tools, tool.NewDatabaseTool(dbConfigs)) } // docker 工具 if cfg.Docker.Enabled { dockerTool, err := tool.NewDockerTool(tool.DockerOpts{ ContainerPattern: cfg.Docker.ContainerPattern, MaxLogBytes: cfg.Docker.MaxLogBytes, MaxLogLines: cfg.Docker.MaxLogLines, MaxLogSince: cfg.Docker.MaxLogSince, }) if err != nil { slog.Error("create docker tool", "err", err) } else { tools = append(tools, dockerTool) } } // 3. 映射 server 配置 srvCfg := &server.Config{} srvCfg.Server.Transport = cfg.Server.Transport srvCfg.Server.Addr = cfg.Server.Addr // 4. 启动 return server.Run(srvCfg, tools...) }