site_monitor.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/mark3labs/mcp-go/mcp"
  6. "github.com/mark3labs/mcp-go/server"
  7. "fwh-toolbox-server/cmd/mcp/tools/helper"
  8. "fwh-toolbox-server/domain"
  9. "fwh-toolbox-server/dto"
  10. "fwh-toolbox-server/services"
  11. )
  12. func registerSiteMonitorTools(s *server.MCPServer) {
  13. s.AddTool(
  14. mcp.NewTool("service_site_monitor_config_list",
  15. mcp.WithDescription("查询所有站点监控配置列表"),
  16. ),
  17. handleSiteMonitorConfigList,
  18. )
  19. s.AddTool(
  20. mcp.NewTool("service_site_monitor_name_list",
  21. mcp.WithDescription("查询所有站点监控配置的名称列表"),
  22. ),
  23. handleSiteMonitorNameList,
  24. )
  25. s.AddTool(
  26. mcp.NewTool("service_site_monitor_config_get",
  27. mcp.WithDescription("查询指定名称的站点监控配置"),
  28. mcp.WithString("name", mcp.Required(), mcp.Description("监控配置名称")),
  29. ),
  30. handleSiteMonitorConfigGet,
  31. )
  32. s.AddTool(
  33. mcp.NewTool("service_site_monitor_config_create",
  34. mcp.WithDescription("创建站点监控配置(包含监控名、描述、站点SN列表)[写操作]"),
  35. mcp.WithString("name", mcp.Required(), mcp.Description("监控配置名称")),
  36. mcp.WithString("description", mcp.Description("配置描述")),
  37. mcp.WithArray("site_list", mcp.WithStringItems(),
  38. mcp.Description("站点SN列表,字符串数组,如 [\"SN1\",\"SN2\"]。与 site_list_file 二选一,大批量建议用 site_list_file。")),
  39. mcp.WithString("site_list_file",
  40. mcp.Description("站点SN列表文件路径(须位于 /tmp/fwh-toolbox-agent/ 下)。.json 为JSON字符串数组,其它按行每行一个SN。提供时优先于 site_list,适合大批量避免占用上下文。")),
  41. ),
  42. handleSiteMonitorConfigCreate,
  43. )
  44. s.AddTool(
  45. mcp.NewTool("service_site_monitor_config_update",
  46. mcp.WithDescription("更新指定名称的站点监控配置 [写操作]"),
  47. mcp.WithString("name", mcp.Required(), mcp.Description("监控配置名称")),
  48. mcp.WithString("description", mcp.Description("配置描述")),
  49. mcp.WithString("site_list", mcp.Description("站点SN列表,JSON数组格式。与 site_list_file 二选一。")),
  50. mcp.WithString("site_list_file",
  51. mcp.Description("站点SN列表文件路径(须位于 /tmp/fwh-toolbox-agent/ 下)。.json 为JSON字符串数组,其它按行每行一个SN。提供时优先于 site_list。")),
  52. ),
  53. handleSiteMonitorConfigUpdate,
  54. )
  55. s.AddTool(
  56. mcp.NewTool("service_site_monitor_config_delete",
  57. mcp.WithDescription("删除指定名称的站点监控配置 [写操作]"),
  58. mcp.WithString("name", mcp.Required(), mcp.Description("监控配置名称")),
  59. ),
  60. handleSiteMonitorConfigDelete,
  61. )
  62. s.AddTool(
  63. mcp.NewTool("service_site_monitor_base_info",
  64. mcp.WithDescription("查询指定站点列表的基本信息(激活状态、国家、版本等)"),
  65. mcp.WithString("site_list", mcp.Description("站点SN列表,JSON数组格式。与 site_list_file 二选一。")),
  66. mcp.WithString("site_list_file",
  67. mcp.Description("站点SN列表文件路径(须位于 /tmp/fwh-toolbox-agent/ 下)。.json 为JSON字符串数组,其它按行每行一个SN。提供时优先于 site_list,适合大批量避免占用上下文。")),
  68. mcp.WithNumber("page", mcp.Description("页码,默认1")),
  69. mcp.WithNumber("size", mcp.Description("每页数量,默认10")),
  70. ),
  71. handleSiteMonitorBaseInfo,
  72. )
  73. s.AddTool(
  74. mcp.NewTool("service_site_monitor_mode_info",
  75. mcp.WithDescription("查询站点工作模式信息"),
  76. mcp.WithString("sn", mcp.Required(), mcp.Description("站点 SN 序列号")),
  77. ),
  78. handleSiteMonitorModeInfo,
  79. )
  80. s.AddTool(
  81. mcp.NewTool("service_site_monitor_alarm_list",
  82. mcp.WithDescription("查询站点告警列表"),
  83. mcp.WithString("sn", mcp.Required(), mcp.Description("站点 SN 序列号")),
  84. ),
  85. handleSiteMonitorAlarmList,
  86. )
  87. }
  88. func handleSiteMonitorConfigList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  89. data, err := services.GetSiteMonitorConfig()
  90. if err != nil {
  91. return helper.ServiceError("查询监控配置列表", err), nil
  92. }
  93. return helper.JSONResultOrFileAuto(data), nil
  94. }
  95. func handleSiteMonitorNameList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  96. data, err := services.GetSiteMonitorNameList()
  97. if err != nil {
  98. return helper.ServiceError("查询监控名称列表", err), nil
  99. }
  100. return helper.JSONResultOrFileAuto(data), nil
  101. }
  102. func handleSiteMonitorConfigGet(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  103. name, err := req.RequireString("name")
  104. if err != nil {
  105. return helper.ParamError("name"), nil
  106. }
  107. data, err := services.GetOneSiteMonitorConfig(name)
  108. if err != nil {
  109. return helper.ServiceError("查询监控配置", err), nil
  110. }
  111. return helper.JSONResultOrFileAuto(data), nil
  112. }
  113. func handleSiteMonitorConfigCreate(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  114. name, err := req.RequireString("name")
  115. if err != nil {
  116. return helper.ParamError("name"), nil
  117. }
  118. description := req.GetString("description", "")
  119. src, errRes := helper.ResolveStringListOrFile(req, "site_list", "site_list_file")
  120. if errRes != nil {
  121. return errRes, nil
  122. }
  123. if len(src.Items) == 0 {
  124. return helper.ParamInvalidError("site_list", "站点SN列表为空"), nil
  125. }
  126. config := domain.SitesMonitorConfig{
  127. Name: name,
  128. Description: description,
  129. SiteList: src.Items,
  130. }
  131. if err := services.InsertSiteMonitorConfig(config); err != nil {
  132. return helper.ServiceError("创建监控配置", err), nil
  133. }
  134. return helper.TextResult("创建成功"), nil
  135. }
  136. func handleSiteMonitorConfigUpdate(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  137. name, err := req.RequireString("name")
  138. if err != nil {
  139. return helper.ParamError("name"), nil
  140. }
  141. // 先查现有配置
  142. existing, err := services.GetOneSiteMonitorConfig(name)
  143. if err != nil {
  144. return helper.ServiceError("查询现有配置", err), nil
  145. }
  146. if len(existing) == 0 {
  147. return helper.ServiceError("查询现有配置", fmt.Errorf("配置 %s 不存在", name)), nil
  148. }
  149. config := existing[0]
  150. if desc := req.GetString("description", ""); desc != "" {
  151. config.Description = desc
  152. }
  153. // site_list / site_list_file 均为可选:仅当提供了其一时才更新站点列表。
  154. if req.GetString("site_list", "") != "" || req.GetString("site_list_file", "") != "" {
  155. src, errRes := helper.ResolveStringListOrFile(req, "site_list", "site_list_file")
  156. if errRes != nil {
  157. return errRes, nil
  158. }
  159. config.SiteList = src.Items
  160. }
  161. if err := services.UpdateSiteMonitorConfig(name, config); err != nil {
  162. return helper.ServiceError("更新监控配置", err), nil
  163. }
  164. return helper.TextResult("更新成功"), nil
  165. }
  166. func handleSiteMonitorConfigDelete(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  167. name, err := req.RequireString("name")
  168. if err != nil {
  169. return helper.ParamError("name"), nil
  170. }
  171. if err := services.DeleteSiteMonitorConfig(name); err != nil {
  172. return helper.ServiceError("删除监控配置", err), nil
  173. }
  174. return helper.TextResult("删除成功"), nil
  175. }
  176. func handleSiteMonitorBaseInfo(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  177. src, errRes := helper.ResolveStringListOrFile(req, "site_list", "site_list_file")
  178. if errRes != nil {
  179. return errRes, nil
  180. }
  181. if len(src.Items) == 0 {
  182. return helper.ParamInvalidError("site_list", "站点SN列表为空"), nil
  183. }
  184. page := uint(req.GetFloat("page", 1))
  185. size := uint(req.GetFloat("size", 10))
  186. para := dto.SiteBaseInfoPara{
  187. SiteList: src.Items,
  188. PageSize: size,
  189. PageNum: page,
  190. }
  191. data, err := services.QuerySiteBaseInfoList(para)
  192. if err != nil {
  193. return helper.ServiceError("查询站点基本信息", err), nil
  194. }
  195. return helper.JSONResultOrFileAuto(data), nil
  196. }
  197. func handleSiteMonitorModeInfo(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  198. sn, err := req.RequireString("sn")
  199. if err != nil {
  200. return helper.ParamError("sn"), nil
  201. }
  202. data, err := services.QuerySiteModeInfo(sn)
  203. if err != nil {
  204. return helper.ServiceError("查询站点工作模式", err), nil
  205. }
  206. return helper.JSONResultOrFileAuto(data), nil
  207. }
  208. func handleSiteMonitorAlarmList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  209. sn, err := req.RequireString("sn")
  210. if err != nil {
  211. return helper.ParamError("sn"), nil
  212. }
  213. data, err := services.QuerySiteAlarmList(sn)
  214. if err != nil {
  215. return helper.ServiceError("查询站点告警列表", err), nil
  216. }
  217. return helper.JSONResultOrFileAuto(data), nil
  218. }