file.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package storage
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/mark3labs/mcp-go/mcp"
  6. "github.com/mark3labs/mcp-go/server"
  7. "fwh-toolbox-server/cmd/mcp/tools/helper"
  8. "fwh-toolbox-server/utils/filestore"
  9. )
  10. // mcpFileStore MCP 专用的文件存储实例
  11. var mcpFileStore *filestore.FileStore
  12. // InitFileStore 初始化 MCP FileStore(由 main.go 调用)
  13. func InitFileStore(fs *filestore.FileStore) {
  14. mcpFileStore = fs
  15. }
  16. // GetFileStore 获取 MCP FileStore 实例
  17. func GetFileStore() *filestore.FileStore {
  18. return mcpFileStore
  19. }
  20. func registerFileTools(s *server.MCPServer) {
  21. s.AddTool(
  22. mcp.NewTool("storage_file_read",
  23. mcp.WithDescription("读取用户上传的文件内容。用户通过前端上传的文件存储在 /uploads/ 路径下。"),
  24. mcp.WithString("path", mcp.Required(), mcp.Description("文件路径,格式为 /uploads/{filename}")),
  25. ),
  26. handleFileRead,
  27. )
  28. s.AddTool(
  29. mcp.NewTool("storage_file_list",
  30. mcp.WithDescription("列出当前会话中用户上传的所有文件,返回文件名、路径、大小等信息。"),
  31. ),
  32. handleFileList,
  33. )
  34. }
  35. func handleFileRead(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  36. path, err := req.RequireString("path")
  37. if err != nil {
  38. return helper.ParamError("path"), nil
  39. }
  40. if mcpFileStore == nil {
  41. return helper.ServiceError("文件存储", fmt.Errorf("未初始化")), nil
  42. }
  43. if !mcpFileStore.HasFile(path) {
  44. return helper.EmptyResult(fmt.Sprintf("文件不存在: %s", path)), nil
  45. }
  46. content, err := mcpFileStore.ReadFile(path)
  47. if err != nil {
  48. return helper.ServiceError("读取文件", err), nil
  49. }
  50. return helper.TextResult(content), nil
  51. }
  52. func handleFileList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  53. if mcpFileStore == nil {
  54. return helper.ServiceError("文件存储", fmt.Errorf("未初始化")), nil
  55. }
  56. files := mcpFileStore.GetFiles()
  57. if len(files) == 0 {
  58. return helper.EmptyResult("当前没有上传的文件"), nil
  59. }
  60. return helper.JSONResult(files), nil
  61. }