// fwh-agent-mcp:新 AI 助手的业务数据 MCP 服务(Streamable HTTP)。 // // fwh-agent-mcp -set=readonly -listen=127.0.0.1:8091 # 只读工具集 // fwh-agent-mcp -set=ops -listen=127.0.0.1:8092 # 写工具集 // // 配置读取工作目录下的 .env(与主服务相同),AGENT_MCP_TOKEN 必填。 package main import ( "context" "flag" "fmt" "os" "os/signal" "syscall" "go.uber.org/zap" "fwh-toolbox-server/agentmcp" ) func main() { set := flag.String("set", agentmcp.SetReadOnly, "工具集:readonly | ops") listen := flag.String("listen", "", "监听地址,默认取 AGENT_MCP_LISTEN(127.0.0.1:8091)") flag.Parse() settings := agentmcp.LoadSettings() if settings.Token == "" { fmt.Fprintln(os.Stderr, "[fwh-agent-mcp] AGENT_MCP_TOKEN 未配置,拒绝启动") os.Exit(1) } addr := settings.Listen if *listen != "" { addr = *listen } log := agentmcp.InitLogger(settings.LogPath) defer func() { _ = log.Sync() }() if err := agentmcp.InitInfra(); err != nil { log.Fatal("[agent-mcp] 初始化失败", zap.Error(err)) } s, err := agentmcp.NewServer(*set, log, settings.MaxConcurrency) if err != nil { log.Fatal("[agent-mcp] 创建 MCP Server 失败", zap.Error(err)) } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() log.Info("[agent-mcp] 启动", zap.String("set", *set), zap.String("version", agentmcp.ServerVersion), zap.Int("maxConcurrency", settings.MaxConcurrency)) if err := agentmcp.Serve(ctx, addr, agentmcp.Handler(s, settings.Token), log); err != nil { log.Fatal("[agent-mcp] HTTP 服务异常退出", zap.Error(err)) } log.Info("[agent-mcp] 已退出") }