| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- package service
- import (
- "context"
- "encoding/json"
- "github.com/mark3labs/mcp-go/mcp"
- "github.com/mark3labs/mcp-go/server"
- "go.mongodb.org/mongo-driver/bson/primitive"
- "fwh-toolbox-server/cmd/mcp/tools/helper"
- "fwh-toolbox-server/domain"
- "fwh-toolbox-server/services"
- )
- func registerSiteAnalysisTools(s *server.MCPServer) {
- s.AddTool(
- mcp.NewTool("service_site_analysis_list",
- mcp.WithDescription("查询站点分析任务列表,支持按 SN 和进度筛选"),
- mcp.WithNumber("page", mcp.Description("页码,从1开始,默认1")),
- mcp.WithNumber("size", mcp.Description("每页数量,默认10")),
- mcp.WithString("sn", mcp.Description("按 SN 过滤")),
- mcp.WithString("progress", mcp.Description("按进度过滤:pending, running, success, failed")),
- ),
- handleSiteAnalysisList,
- )
- s.AddTool(
- mcp.NewTool("service_site_analysis_get_config",
- mcp.WithDescription("查询指定站点分析任务的配置详情"),
- mcp.WithString("id", mcp.Required(), mcp.Description("任务 ID(MongoDB ObjectID hex 字符串)")),
- ),
- handleSiteAnalysisGetConfig,
- )
- s.AddTool(
- mcp.NewTool("service_site_analysis_create",
- mcp.WithDescription("创建站点分析任务(自动入队执行)[写操作]"),
- mcp.WithString("sn", mcp.Required(), mcp.Description("站点 SN")),
- mcp.WithString("time_period", mcp.Required(), mcp.Description("时间范围 [\"start\",\"end\"],格式 yyyy-MM-dd")),
- mcp.WithBoolean("enable_timeline", mcp.Description("是否分析时间线,默认true")),
- mcp.WithBoolean("enable_runtime", mcp.Description("是否分析运行时数据,默认true")),
- mcp.WithString("description", mcp.Description("任务描述")),
- ),
- handleSiteAnalysisCreate,
- )
- s.AddTool(
- mcp.NewTool("service_site_analysis_update_desc",
- mcp.WithDescription("更新站点分析任务的描述 [写操作]"),
- mcp.WithString("id", mcp.Required(), mcp.Description("任务 ID")),
- mcp.WithString("description", mcp.Required(), mcp.Description("新的描述")),
- ),
- handleSiteAnalysisUpdateDesc,
- )
- s.AddTool(
- mcp.NewTool("service_site_analysis_delete",
- mcp.WithDescription("删除站点分析任务 [写操作]"),
- mcp.WithString("id", mcp.Required(), mcp.Description("任务 ID")),
- ),
- handleSiteAnalysisDelete,
- )
- s.AddTool(
- mcp.NewTool("service_site_analysis_data",
- mcp.WithDescription("查询站点分析任务的结果数据(timeline + runtime)"),
- mcp.WithString("id", mcp.Required(), mcp.Description("任务 ID")),
- ),
- handleSiteAnalysisData,
- )
- }
- func handleSiteAnalysisList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- page := uint(req.GetFloat("page", 1))
- size := uint(req.GetFloat("size", 10))
- var snPtr *string
- if sn := req.GetString("sn", ""); sn != "" {
- snPtr = &sn
- }
- var progressPtr *string
- if progress := req.GetString("progress", ""); progress != "" {
- progressPtr = &progress
- }
- data, err := services.GetSiteAnalysisManageList(page, size, snPtr, nil, progressPtr, nil)
- if err != nil {
- return helper.ServiceError("查询站点分析列表", err), nil
- }
- return helper.PageResult(data.Total, data.PageSize, data.PageNum, data.Data, "site_analysis_list"), nil
- }
- func handleSiteAnalysisGetConfig(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- idStr, err := req.RequireString("id")
- if err != nil {
- return helper.ParamError("id"), nil
- }
- id, err := primitive.ObjectIDFromHex(idStr)
- if err != nil {
- return helper.ParamInvalidError("id", "无效的 ObjectID"), nil
- }
- data, err := services.GetSiteAnalysisConfig(id)
- if err != nil {
- return helper.ServiceError("查询分析配置", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
- func handleSiteAnalysisCreate(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- sn, err := req.RequireString("sn")
- if err != nil {
- return helper.ParamError("sn"), nil
- }
- timePeriodStr, err := req.RequireString("time_period")
- if err != nil {
- return helper.ParamError("time_period"), nil
- }
- var timePeriod [2]string
- if err := json.Unmarshal([]byte(timePeriodStr), &timePeriod); err != nil {
- return helper.ParamInvalidError("time_period", "需要 [\"start\",\"end\"] 格式"), nil
- }
- enableTimeline := req.GetBool("enable_timeline", true)
- enableRuntime := req.GetBool("enable_runtime", true)
- description := req.GetString("description", "")
- config := domain.SiteAnalysisConfigWrite{
- Sn: sn,
- Description: description,
- TimePeriod: timePeriod,
- Options: domain.SiteAnalysisOptions{
- EnableTimeline: enableTimeline,
- EnableRuntime: enableRuntime,
- },
- User: "MCP-Agent",
- }
- if err := services.InsertSiteAnalysisConfig(config); err != nil {
- return helper.ServiceError("创建站点分析任务", err), nil
- }
- return helper.TextResult("站点分析任务创建成功,已加入队列"), nil
- }
- func handleSiteAnalysisUpdateDesc(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- idStr, err := req.RequireString("id")
- if err != nil {
- return helper.ParamError("id"), nil
- }
- desc, err := req.RequireString("description")
- if err != nil {
- return helper.ParamError("description"), nil
- }
- id, err := primitive.ObjectIDFromHex(idStr)
- if err != nil {
- return helper.ParamInvalidError("id", "无效的 ObjectID"), nil
- }
- if err := services.UpdateSiteAnalysisDescription(id, desc); err != nil {
- return helper.ServiceError("更新描述", err), nil
- }
- return helper.TextResult("描述更新成功"), nil
- }
- func handleSiteAnalysisDelete(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- idStr, err := req.RequireString("id")
- if err != nil {
- return helper.ParamError("id"), nil
- }
- id, err := primitive.ObjectIDFromHex(idStr)
- if err != nil {
- return helper.ParamInvalidError("id", "无效的 ObjectID"), nil
- }
- if err := services.DeleteSiteAnalysisConfig(id); err != nil {
- return helper.ServiceError("删除站点分析任务", err), nil
- }
- return helper.TextResult("删除成功"), nil
- }
- func handleSiteAnalysisData(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- idStr, err := req.RequireString("id")
- if err != nil {
- return helper.ParamError("id"), nil
- }
- id, err := primitive.ObjectIDFromHex(idStr)
- if err != nil {
- return helper.ParamInvalidError("id", "无效的 ObjectID"), nil
- }
- data, err := services.GetSiteAnalysisData(id)
- if err != nil {
- return helper.ServiceError("查询分析数据", err), nil
- }
- return helper.JSONResultOrFileAuto(data), nil
- }
|