main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // fwh-agent-mcp:新 AI 助手的业务数据 MCP 服务(Streamable HTTP)。
  2. //
  3. // fwh-agent-mcp -set=readonly -listen=127.0.0.1:8091 # 只读工具集
  4. // fwh-agent-mcp -set=ops -listen=127.0.0.1:8092 # 写工具集
  5. //
  6. // 配置读取独立的 ./config.agent-mcp.env(-config 可指定),不读主服务的 config.env;AGENT_MCP_TOKEN 必填。
  7. package main
  8. import (
  9. "context"
  10. "flag"
  11. "fmt"
  12. "os"
  13. "os/signal"
  14. "syscall"
  15. "go.uber.org/zap"
  16. "fwh-toolbox-server/agentmcp"
  17. )
  18. func main() {
  19. set := flag.String("set", agentmcp.SetReadOnly, "工具集:readonly | ops")
  20. listen := flag.String("listen", "", "监听地址,默认取 AGENT_MCP_LISTEN(127.0.0.1:8091)")
  21. configFile := flag.String("config", agentmcp.DefaultConfigFile, "配置文件路径")
  22. flag.Parse()
  23. // 配置文件缺失时直接退出:config.LoadConfig 读不到文件会静默使用默认值,连错库也不易察觉
  24. settings, err := agentmcp.LoadSettings(*configFile)
  25. if err != nil {
  26. fmt.Fprintf(os.Stderr, "[fwh-agent-mcp] %v,拒绝启动(示例见 deploy/config.agent-mcp.env.example)\n", err)
  27. os.Exit(1)
  28. }
  29. if settings.Token == "" {
  30. fmt.Fprintln(os.Stderr, "[fwh-agent-mcp] AGENT_MCP_TOKEN 未配置,拒绝启动")
  31. os.Exit(1)
  32. }
  33. addr := settings.Listen
  34. if *listen != "" {
  35. addr = *listen
  36. }
  37. log := agentmcp.InitLogger(settings.LogPath)
  38. defer func() { _ = log.Sync() }()
  39. if err := agentmcp.InitInfra(*configFile); err != nil {
  40. log.Fatal("[agent-mcp] 初始化失败", zap.Error(err))
  41. }
  42. s, err := agentmcp.NewServer(*set, log, settings.MaxConcurrency)
  43. if err != nil {
  44. log.Fatal("[agent-mcp] 创建 MCP Server 失败", zap.Error(err))
  45. }
  46. ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
  47. defer stop()
  48. log.Info("[agent-mcp] 启动", zap.String("set", *set), zap.String("version", agentmcp.ServerVersion), zap.Int("maxConcurrency", settings.MaxConcurrency))
  49. if err := agentmcp.Serve(ctx, addr, agentmcp.Handler(s, settings.Token), log); err != nil {
  50. log.Fatal("[agent-mcp] HTTP 服务异常退出", zap.Error(err))
  51. }
  52. log.Info("[agent-mcp] 已退出")
  53. }