| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- package service
- import (
- "context"
- "fmt"
- "github.com/mark3labs/mcp-go/mcp"
- "github.com/mark3labs/mcp-go/server"
- "fwh-toolbox-server/cmd/mcp/tools/helper"
- "fwh-toolbox-server/domain"
- "fwh-toolbox-server/dto"
- "fwh-toolbox-server/services"
- )
- func registerSiteMonitorTools(s *server.MCPServer) {
- s.AddTool(
- mcp.NewTool("service_site_monitor_config_list",
- mcp.WithDescription("查询所有站点监控配置列表"),
- ),
- handleSiteMonitorConfigList,
- )
- s.AddTool(
- mcp.NewTool("service_site_monitor_name_list",
- mcp.WithDescription("查询所有站点监控配置的名称列表"),
- ),
- handleSiteMonitorNameList,
- )
- s.AddTool(
- mcp.NewTool("service_site_monitor_config_get",
- mcp.WithDescription("查询指定名称的站点监控配置"),
- mcp.WithString("name", mcp.Required(), mcp.Description("监控配置名称")),
- ),
- handleSiteMonitorConfigGet,
- )
- s.AddTool(
- mcp.NewTool("service_site_monitor_config_create",
- mcp.WithDescription("创建站点监控配置(包含监控名、描述、站点SN列表)[写操作]"),
- mcp.WithString("name", mcp.Required(), mcp.Description("监控配置名称")),
- mcp.WithString("description", mcp.Description("配置描述")),
- mcp.WithArray("site_list", mcp.WithStringItems(),
- mcp.Description("站点SN列表,字符串数组,如 [\"SN1\",\"SN2\"]。与 site_list_file 二选一,大批量建议用 site_list_file。")),
- mcp.WithString("site_list_file",
- mcp.Description("站点SN列表文件路径(须位于 /tmp/fwh-toolbox-agent/ 下)。.json 为JSON字符串数组,其它按行每行一个SN。提供时优先于 site_list,适合大批量避免占用上下文。")),
- ),
- handleSiteMonitorConfigCreate,
- )
- s.AddTool(
- mcp.NewTool("service_site_monitor_config_update",
- mcp.WithDescription("更新指定名称的站点监控配置 [写操作]"),
- mcp.WithString("name", mcp.Required(), mcp.Description("监控配置名称")),
- mcp.WithString("description", mcp.Description("配置描述")),
- mcp.WithString("site_list", mcp.Description("站点SN列表,JSON数组格式。与 site_list_file 二选一。")),
- mcp.WithString("site_list_file",
- mcp.Description("站点SN列表文件路径(须位于 /tmp/fwh-toolbox-agent/ 下)。.json 为JSON字符串数组,其它按行每行一个SN。提供时优先于 site_list。")),
- ),
- handleSiteMonitorConfigUpdate,
- )
- s.AddTool(
- mcp.NewTool("service_site_monitor_config_delete",
- mcp.WithDescription("删除指定名称的站点监控配置 [写操作]"),
- mcp.WithString("name", mcp.Required(), mcp.Description("监控配置名称")),
- ),
- handleSiteMonitorConfigDelete,
- )
- s.AddTool(
- mcp.NewTool("service_site_monitor_base_info",
- mcp.WithDescription("查询指定站点列表的基本信息(激活状态、国家、版本等)"),
- mcp.WithString("site_list", mcp.Description("站点SN列表,JSON数组格式。与 site_list_file 二选一。")),
- mcp.WithString("site_list_file",
- mcp.Description("站点SN列表文件路径(须位于 /tmp/fwh-toolbox-agent/ 下)。.json 为JSON字符串数组,其它按行每行一个SN。提供时优先于 site_list,适合大批量避免占用上下文。")),
- mcp.WithNumber("page", mcp.Description("页码,默认1")),
- mcp.WithNumber("size", mcp.Description("每页数量,默认10")),
- ),
- handleSiteMonitorBaseInfo,
- )
- s.AddTool(
- mcp.NewTool("service_site_monitor_mode_info",
- mcp.WithDescription("查询站点工作模式信息"),
- mcp.WithString("sn", mcp.Required(), mcp.Description("站点 SN 序列号")),
- ),
- handleSiteMonitorModeInfo,
- )
- s.AddTool(
- mcp.NewTool("service_site_monitor_alarm_list",
- mcp.WithDescription("查询站点告警列表"),
- mcp.WithString("sn", mcp.Required(), mcp.Description("站点 SN 序列号")),
- ),
- handleSiteMonitorAlarmList,
- )
- }
- func handleSiteMonitorConfigList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- data, err := services.GetSiteMonitorConfig()
- if err != nil {
- return helper.ServiceError("查询监控配置列表", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
- func handleSiteMonitorNameList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- data, err := services.GetSiteMonitorNameList()
- if err != nil {
- return helper.ServiceError("查询监控名称列表", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
- func handleSiteMonitorConfigGet(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- name, err := req.RequireString("name")
- if err != nil {
- return helper.ParamError("name"), nil
- }
- data, err := services.GetOneSiteMonitorConfig(name)
- if err != nil {
- return helper.ServiceError("查询监控配置", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
- func handleSiteMonitorConfigCreate(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- name, err := req.RequireString("name")
- if err != nil {
- return helper.ParamError("name"), nil
- }
- description := req.GetString("description", "")
- src, errRes := helper.ResolveStringListOrFile(req, "site_list", "site_list_file")
- if errRes != nil {
- return errRes, nil
- }
- if len(src.Items) == 0 {
- return helper.ParamInvalidError("site_list", "站点SN列表为空"), nil
- }
- config := domain.SitesMonitorConfig{
- Name: name,
- Description: description,
- SiteList: src.Items,
- }
- if err := services.InsertSiteMonitorConfig(config); err != nil {
- return helper.ServiceError("创建监控配置", err), nil
- }
- return helper.TextResult("创建成功"), nil
- }
- func handleSiteMonitorConfigUpdate(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- name, err := req.RequireString("name")
- if err != nil {
- return helper.ParamError("name"), nil
- }
- // 先查现有配置
- existing, err := services.GetOneSiteMonitorConfig(name)
- if err != nil {
- return helper.ServiceError("查询现有配置", err), nil
- }
- if len(existing) == 0 {
- return helper.ServiceError("查询现有配置", fmt.Errorf("配置 %s 不存在", name)), nil
- }
- config := existing[0]
- if desc := req.GetString("description", ""); desc != "" {
- config.Description = desc
- }
- // site_list / site_list_file 均为可选:仅当提供了其一时才更新站点列表。
- if req.GetString("site_list", "") != "" || req.GetString("site_list_file", "") != "" {
- src, errRes := helper.ResolveStringListOrFile(req, "site_list", "site_list_file")
- if errRes != nil {
- return errRes, nil
- }
- config.SiteList = src.Items
- }
- if err := services.UpdateSiteMonitorConfig(name, config); err != nil {
- return helper.ServiceError("更新监控配置", err), nil
- }
- return helper.TextResult("更新成功"), nil
- }
- func handleSiteMonitorConfigDelete(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- name, err := req.RequireString("name")
- if err != nil {
- return helper.ParamError("name"), nil
- }
- if err := services.DeleteSiteMonitorConfig(name); err != nil {
- return helper.ServiceError("删除监控配置", err), nil
- }
- return helper.TextResult("删除成功"), nil
- }
- func handleSiteMonitorBaseInfo(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- src, errRes := helper.ResolveStringListOrFile(req, "site_list", "site_list_file")
- if errRes != nil {
- return errRes, nil
- }
- if len(src.Items) == 0 {
- return helper.ParamInvalidError("site_list", "站点SN列表为空"), nil
- }
- page := uint(req.GetFloat("page", 1))
- size := uint(req.GetFloat("size", 10))
- para := dto.SiteBaseInfoPara{
- SiteList: src.Items,
- PageSize: size,
- PageNum: page,
- }
- data, err := services.QuerySiteBaseInfoList(para)
- if err != nil {
- return helper.ServiceError("查询站点基本信息", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
- func handleSiteMonitorModeInfo(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- sn, err := req.RequireString("sn")
- if err != nil {
- return helper.ParamError("sn"), nil
- }
- data, err := services.QuerySiteModeInfo(sn)
- if err != nil {
- return helper.ServiceError("查询站点工作模式", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
- func handleSiteMonitorAlarmList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- sn, err := req.RequireString("sn")
- if err != nil {
- return helper.ParamError("sn"), nil
- }
- data, err := services.QuerySiteAlarmList(sn)
- if err != nil {
- return helper.ServiceError("查询站点告警列表", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
|