1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package mcp
- import (
- "context"
- "encoding/json"
- "github.com/mark3labs/mcp-go/mcp"
- "github.com/mindoc-org/mindoc/conf"
- "github.com/mindoc-org/mindoc/models"
- "github.com/mindoc-org/mindoc/utils/sqltil"
- )
- // GetGlobalSearchMcpTool 获取全局搜索的mcp工具
- func GetGlobalSearchMcpTool() mcp.Tool {
- return mcp.NewTool("MinDocGlobalSearch",
- mcp.WithDescription("MinDoc全局文档内容搜索"),
- mcp.WithString("keyword",
- mcp.Required(),
- mcp.Description("要执行全局搜索的关键词,多个搜索关键词请用空格分割,请使用最少的关键词来检索,结果中只会出现包含全部关键词的结果,过多的无关词会导致更少的检索结果"),
- ),
- mcp.WithNumber("pageIndex",
- mcp.Required(),
- mcp.Description("全局搜索时指定分页的顺序下标,每页最多有10条结果,建议只查看1-10页文档内容的搜索结果"),
- mcp.Enum("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"),
- ),
- )
- }
- // GlobalSearchMcpHandler 全局搜索的mcp处理函数
- func GlobalSearchMcpHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
- paramMap := request.Params.Arguments.(map[string]any)
- pageIndex := 1
- if v, ok := paramMap["pageIndex"].(float64); ok {
- pageIndex = int(v)
- }
- totalCount, result := globalSearchFunction(paramMap["keyword"].(string), pageIndex)
- jsonContent, err := json.Marshal(result)
- if err != nil {
- return mcp.NewToolResultStructuredOnly(map[string]any{
- "totalCount": 0,
- "result": make([]map[string]any, 0),
- }), err
- }
- structContent := make([]map[string]any, 0)
- err = json.Unmarshal(jsonContent, &structContent)
- if err != nil {
- return mcp.NewToolResultStructuredOnly(map[string]any{
- "totalCount": 0,
- "result": make([]map[string]any, 0),
- }), err
- }
- return mcp.NewToolResultStructuredOnly(map[string]any{
- "totalCount": totalCount,
- "result": structContent,
- }), nil
- }
- func globalSearchFunction(keyword string, pageIndex int) (int, []*models.DocumentSearchResult) {
- memberId := 0
- searchResult, totalCount, err := models.NewDocumentSearchResult().FindToPager(sqltil.EscapeLike(keyword),
- pageIndex, conf.PageSize, memberId)
- if err != nil {
- return 0, make([]*models.DocumentSearchResult, 0)
- }
- return totalCount, searchResult
- }
|