server.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Package agentmcp 是新 AI 助手使用的业务数据 MCP 服务(fwh-agent-mcp)。
  2. //
  3. // 无用户状态:工具不接收、不推断调用者;由 AgentServer 后台登记为远程 HTTP 服务,经 MCP Gateway 转接给 Agent。
  4. // 设计见 docs/ai-assistant-agentserver/agent-mcp.md。与旧助手的 cmd/mcp 相互独立。
  5. package agentmcp
  6. import (
  7. "fmt"
  8. "github.com/mark3labs/mcp-go/server"
  9. "go.uber.org/zap"
  10. "fwh-toolbox-server/agentmcp/kit"
  11. "fwh-toolbox-server/agentmcp/tools"
  12. )
  13. const (
  14. ServerName = "fwh-agent-mcp"
  15. ServerVersion = "1.0.0"
  16. SetReadOnly = "readonly"
  17. SetOps = "ops"
  18. )
  19. // Tools 返回指定工具集。
  20. func Tools(set string) ([]kit.Registrar, error) {
  21. switch set {
  22. case SetReadOnly:
  23. return tools.ReadOnly(), nil
  24. case SetOps:
  25. return tools.Ops(), nil
  26. }
  27. return nil, fmt.Errorf("未知的工具集:%s(可选 readonly / ops)", set)
  28. }
  29. // NewServer 创建 MCPServer 并注册工具集;同时返回其中的持久化长任务工具(交给 Handler 的 TaskRouter 处理任务协议)。
  30. func NewServer(set string, log *zap.Logger, maxConcurrency int) (*server.MCPServer, []kit.TaskTool, error) {
  31. list, err := Tools(set)
  32. if err != nil {
  33. return nil, nil, err
  34. }
  35. var tasks []kit.TaskTool
  36. for _, t := range list {
  37. if tt, ok := t.(kit.TaskTool); ok {
  38. tasks = append(tasks, tt)
  39. }
  40. }
  41. opts := []server.ServerOption{
  42. server.WithToolCapabilities(false),
  43. server.WithInputSchemaValidation(),
  44. server.WithToolHandlerMiddleware(kit.Middleware(log, maxConcurrency)),
  45. }
  46. if len(tasks) > 0 {
  47. // 声明支持以任务方式调用工具与取消(tasks.requests.tools.call、tasks.cancel);任务协议由 kit.TaskRouter 处理
  48. opts = append(opts, server.WithTaskCapabilities(false, true, true))
  49. }
  50. s := server.NewMCPServer(ServerName+"-"+set, ServerVersion, opts...)
  51. for _, t := range list {
  52. t.Register(s)
  53. }
  54. return s, tasks, nil
  55. }