package mcp import ( "context" "yunyan/lego/core" "yunyan/lego/core/cbase" "yunyan/lego/sys/log" "yunyan/sys/websearch/bochasearch" "yunyan/utils" "fmt" "github.com/mark3labs/mcp-go/mcp" ) // 搜索卡片 结构统一化输出 type SearchCard struct { Items []SearchItem `json:"items"` } // 搜索条目 type SearchItem struct { Title string `json:"title"` Context string `json:"context"` SiteName string `json:"site_name"` PublishDate string `json:"publish_date"` } // 天气查询 type tool_bocha_search struct { cbase.ModuleCompBase module *Mcp } // 组件初始化接口 func (this *tool_bocha_search) Init(service core.IService, module core.IModule, comp core.IModuleComp, opt core.IModuleOptions) (err error) { this.ModuleCompBase.Init(service, module, comp, opt) this.module = module.(*Mcp) return } func (this *tool_bocha_search) Start() (err error) { err = this.ModuleCompBase.Start() if this.module.AddTool(ToolGroup_CHINA, this.Tool(), this.Handl) { if err := bochasearch.OnInit(this.module.service.GetSettings().Sys["bochasearch"]); err != nil { panic(fmt.Sprintf("init sys.bochasearch err: %s", err.Error())) } else { log.Infof("init sys.bochasearch success!") } } return } func (this *tool_bocha_search) Tool() (tool mcp.Tool) { return mcp.NewTool("bocha_web_search", mcp.WithDescription("根据用户的搜索关键字,获取网络搜索结果"), mcp.WithString("query", mcp.Description("搜索内容 例如:今日热点新闻"), mcp.Required(), ), mcp.WithNumber("count", mcp.Description("返回结果数量"), mcp.DefaultNumber(5), mcp.Min(1), mcp.Max(10), ), ) } // Handl 工具处理接口 // 参数: // - ctx: 上下文 // - request: MCP 工具调用请求 // // 返回值: // - result: MCP 工具调用结果 // - err: 处理过程中的错误 // // 异常: // - 无(不主动 panic) func (this *tool_bocha_search) Handl(ctx context.Context, request mcp.CallToolRequest) (result *mcp.CallToolResult, err error) { var ( query string count int results *bochasearch.BochaResponse context string ) this.module.Debug("tool_bocha_search", log.Field{Key: "request.Params.Arguments", Value: request.GetRawArguments()}, ) count = request.GetInt("count", 10) if query, err = request.RequireString("query"); err != nil { return } results, err = bochasearch.Search(ctx, query, "noLimit", count) if err != nil { context = "网络搜索失败" this.module.Debug("tool_bocha_search fail", log.Field{Key: "query", Value: query}, log.Field{Key: "count", Value: count}, log.Field{Key: "err", Value: err}, ) return } else { context = utils.ToString(results) this.module.Debug("tool_bocha_search success", log.Field{Key: "query", Value: query}, log.Field{Key: "count", Value: count}, log.Field{Key: "results size", Value: len(results.Messages)}, ) } result = &mcp.CallToolResult{ Content: []mcp.Content{ mcp.TextContent{ Type: "text", Text: context, }, }, } return }