handler.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package mcp
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/mark3labs/mcp-go/mcp"
  6. "github.com/mindoc-org/mindoc/conf"
  7. "github.com/mindoc-org/mindoc/models"
  8. "github.com/mindoc-org/mindoc/utils/sqltil"
  9. )
  10. // GetGlobalSearchMcpTool 获取全局搜索的mcp工具
  11. func GetGlobalSearchMcpTool() mcp.Tool {
  12. return mcp.NewTool("MinDocGlobalSearch",
  13. mcp.WithDescription("MinDoc全局文档内容搜索"),
  14. mcp.WithString("keyword",
  15. mcp.Required(),
  16. mcp.Description("要执行全局搜索的关键词,多个搜索关键词请用空格分割,请使用最少的关键词来检索,结果中只会出现包含全部关键词的结果,过多的无关词会导致更少的检索结果"),
  17. ),
  18. mcp.WithNumber("pageIndex",
  19. mcp.Required(),
  20. mcp.Description("全局搜索时指定分页的顺序下标,每页最多有10条结果,建议只查看1-10页文档内容的搜索结果"),
  21. mcp.Enum("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"),
  22. ),
  23. )
  24. }
  25. // GlobalSearchMcpHandler 全局搜索的mcp处理函数
  26. func GlobalSearchMcpHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  27. paramMap := request.Params.Arguments.(map[string]any)
  28. pageIndex := 1
  29. if v, ok := paramMap["pageIndex"].(float64); ok {
  30. pageIndex = int(v)
  31. }
  32. totalCount, result := globalSearchFunction(paramMap["keyword"].(string), pageIndex)
  33. jsonContent, err := json.Marshal(result)
  34. if err != nil {
  35. return mcp.NewToolResultStructuredOnly(map[string]any{
  36. "totalCount": 0,
  37. "result": make([]map[string]any, 0),
  38. }), err
  39. }
  40. structContent := make([]map[string]any, 0)
  41. err = json.Unmarshal(jsonContent, &structContent)
  42. if err != nil {
  43. return mcp.NewToolResultStructuredOnly(map[string]any{
  44. "totalCount": 0,
  45. "result": make([]map[string]any, 0),
  46. }), err
  47. }
  48. return mcp.NewToolResultStructuredOnly(map[string]any{
  49. "totalCount": totalCount,
  50. "result": structContent,
  51. }), nil
  52. }
  53. func globalSearchFunction(keyword string, pageIndex int) (int, []*models.DocumentSearchResult) {
  54. memberId := 0
  55. searchResult, totalCount, err := models.NewDocumentSearchResult().FindToPager(sqltil.EscapeLike(keyword),
  56. pageIndex, conf.PageSize, memberId)
  57. if err != nil {
  58. return 0, make([]*models.DocumentSearchResult, 0)
  59. }
  60. return totalCount, searchResult
  61. }