site_analysis.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/mark3labs/mcp-go/mcp"
  6. "github.com/mark3labs/mcp-go/server"
  7. "go.mongodb.org/mongo-driver/bson/primitive"
  8. "fwh-toolbox-server/cmd/mcp/tools/helper"
  9. "fwh-toolbox-server/domain"
  10. "fwh-toolbox-server/services"
  11. )
  12. func registerSiteAnalysisTools(s *server.MCPServer) {
  13. s.AddTool(
  14. mcp.NewTool("service_site_analysis_list",
  15. mcp.WithDescription("查询站点分析任务列表,支持按 SN 和进度筛选"),
  16. mcp.WithNumber("page", mcp.Description("页码,从1开始,默认1")),
  17. mcp.WithNumber("size", mcp.Description("每页数量,默认10")),
  18. mcp.WithString("sn", mcp.Description("按 SN 过滤")),
  19. mcp.WithString("progress", mcp.Description("按进度过滤:pending, running, success, failed")),
  20. ),
  21. handleSiteAnalysisList,
  22. )
  23. s.AddTool(
  24. mcp.NewTool("service_site_analysis_get_config",
  25. mcp.WithDescription("查询指定站点分析任务的配置详情"),
  26. mcp.WithString("id", mcp.Required(), mcp.Description("任务 ID(MongoDB ObjectID hex 字符串)")),
  27. ),
  28. handleSiteAnalysisGetConfig,
  29. )
  30. s.AddTool(
  31. mcp.NewTool("service_site_analysis_create",
  32. mcp.WithDescription("创建站点分析任务(自动入队执行)[写操作]"),
  33. mcp.WithString("sn", mcp.Required(), mcp.Description("站点 SN")),
  34. mcp.WithString("time_period", mcp.Required(), mcp.Description("时间范围 [\"start\",\"end\"],格式 yyyy-MM-dd")),
  35. mcp.WithBoolean("enable_timeline", mcp.Description("是否分析时间线,默认true")),
  36. mcp.WithBoolean("enable_runtime", mcp.Description("是否分析运行时数据,默认true")),
  37. mcp.WithString("description", mcp.Description("任务描述")),
  38. ),
  39. handleSiteAnalysisCreate,
  40. )
  41. s.AddTool(
  42. mcp.NewTool("service_site_analysis_update_desc",
  43. mcp.WithDescription("更新站点分析任务的描述 [写操作]"),
  44. mcp.WithString("id", mcp.Required(), mcp.Description("任务 ID")),
  45. mcp.WithString("description", mcp.Required(), mcp.Description("新的描述")),
  46. ),
  47. handleSiteAnalysisUpdateDesc,
  48. )
  49. s.AddTool(
  50. mcp.NewTool("service_site_analysis_delete",
  51. mcp.WithDescription("删除站点分析任务 [写操作]"),
  52. mcp.WithString("id", mcp.Required(), mcp.Description("任务 ID")),
  53. ),
  54. handleSiteAnalysisDelete,
  55. )
  56. s.AddTool(
  57. mcp.NewTool("service_site_analysis_data",
  58. mcp.WithDescription("查询站点分析任务的结果数据(timeline + runtime)"),
  59. mcp.WithString("id", mcp.Required(), mcp.Description("任务 ID")),
  60. ),
  61. handleSiteAnalysisData,
  62. )
  63. }
  64. func handleSiteAnalysisList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  65. page := uint(req.GetFloat("page", 1))
  66. size := uint(req.GetFloat("size", 10))
  67. var snPtr *string
  68. if sn := req.GetString("sn", ""); sn != "" {
  69. snPtr = &sn
  70. }
  71. var progressPtr *string
  72. if progress := req.GetString("progress", ""); progress != "" {
  73. progressPtr = &progress
  74. }
  75. data, err := services.GetSiteAnalysisManageList(page, size, snPtr, nil, progressPtr, nil)
  76. if err != nil {
  77. return helper.ServiceError("查询站点分析列表", err), nil
  78. }
  79. return helper.PageResult(data.Total, data.PageSize, data.PageNum, data.Data, "site_analysis_list"), nil
  80. }
  81. func handleSiteAnalysisGetConfig(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  82. idStr, err := req.RequireString("id")
  83. if err != nil {
  84. return helper.ParamError("id"), nil
  85. }
  86. id, err := primitive.ObjectIDFromHex(idStr)
  87. if err != nil {
  88. return helper.ParamInvalidError("id", "无效的 ObjectID"), nil
  89. }
  90. data, err := services.GetSiteAnalysisConfig(id)
  91. if err != nil {
  92. return helper.ServiceError("查询分析配置", err), nil
  93. }
  94. return helper.JSONResultOrFileAuto(data), nil
  95. }
  96. func handleSiteAnalysisCreate(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  97. sn, err := req.RequireString("sn")
  98. if err != nil {
  99. return helper.ParamError("sn"), nil
  100. }
  101. timePeriodStr, err := req.RequireString("time_period")
  102. if err != nil {
  103. return helper.ParamError("time_period"), nil
  104. }
  105. var timePeriod [2]string
  106. if err := json.Unmarshal([]byte(timePeriodStr), &timePeriod); err != nil {
  107. return helper.ParamInvalidError("time_period", "需要 [\"start\",\"end\"] 格式"), nil
  108. }
  109. enableTimeline := req.GetBool("enable_timeline", true)
  110. enableRuntime := req.GetBool("enable_runtime", true)
  111. description := req.GetString("description", "")
  112. config := domain.SiteAnalysisConfigWrite{
  113. Sn: sn,
  114. Description: description,
  115. TimePeriod: timePeriod,
  116. Options: domain.SiteAnalysisOptions{
  117. EnableTimeline: enableTimeline,
  118. EnableRuntime: enableRuntime,
  119. },
  120. User: "MCP-Agent",
  121. }
  122. if err := services.InsertSiteAnalysisConfig(config); err != nil {
  123. return helper.ServiceError("创建站点分析任务", err), nil
  124. }
  125. return helper.TextResult("站点分析任务创建成功,已加入队列"), nil
  126. }
  127. func handleSiteAnalysisUpdateDesc(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  128. idStr, err := req.RequireString("id")
  129. if err != nil {
  130. return helper.ParamError("id"), nil
  131. }
  132. desc, err := req.RequireString("description")
  133. if err != nil {
  134. return helper.ParamError("description"), nil
  135. }
  136. id, err := primitive.ObjectIDFromHex(idStr)
  137. if err != nil {
  138. return helper.ParamInvalidError("id", "无效的 ObjectID"), nil
  139. }
  140. if err := services.UpdateSiteAnalysisDescription(id, desc); err != nil {
  141. return helper.ServiceError("更新描述", err), nil
  142. }
  143. return helper.TextResult("描述更新成功"), nil
  144. }
  145. func handleSiteAnalysisDelete(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  146. idStr, err := req.RequireString("id")
  147. if err != nil {
  148. return helper.ParamError("id"), nil
  149. }
  150. id, err := primitive.ObjectIDFromHex(idStr)
  151. if err != nil {
  152. return helper.ParamInvalidError("id", "无效的 ObjectID"), nil
  153. }
  154. if err := services.DeleteSiteAnalysisConfig(id); err != nil {
  155. return helper.ServiceError("删除站点分析任务", err), nil
  156. }
  157. return helper.TextResult("删除成功"), nil
  158. }
  159. func handleSiteAnalysisData(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  160. idStr, err := req.RequireString("id")
  161. if err != nil {
  162. return helper.ParamError("id"), nil
  163. }
  164. id, err := primitive.ObjectIDFromHex(idStr)
  165. if err != nil {
  166. return helper.ParamInvalidError("id", "无效的 ObjectID"), nil
  167. }
  168. data, err := services.GetSiteAnalysisData(id)
  169. if err != nil {
  170. return helper.ServiceError("查询分析数据", err), nil
  171. }
  172. return helper.JSONResultOrFileAuto(data), nil
  173. }