fileUpload.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package tools
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/mark3labs/mcp-go/mcp"
  7. "github.com/mark3labs/mcp-go/server"
  8. "fwh-toolbox-server/utils/filestore"
  9. )
  10. // mcpFileStore MCP 专用的文件存储实例
  11. var mcpFileStore *filestore.FileStore
  12. // InitFileStore 初始化 MCP FileStore
  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. // Tool: 读取用户上传的文件
  22. s.AddTool(
  23. mcp.NewTool("read_uploaded_file",
  24. mcp.WithDescription("读取用户上传的文件内容。用户通过前端上传的文件会存储在 /uploads/ 路径下,使用此工具读取文件内容进行分析。"),
  25. mcp.WithString("path", mcp.Required(), mcp.Description("文件路径,格式为 /uploads/{filename}")),
  26. ),
  27. handleReadUploadedFile,
  28. )
  29. // Tool: 列出用户上传的文件
  30. s.AddTool(
  31. mcp.NewTool("list_uploaded_files",
  32. mcp.WithDescription("列出当前会话中用户上传的所有文件,返回文件名、路径、大小等信息。"),
  33. ),
  34. handleListUploadedFiles,
  35. )
  36. }
  37. func handleReadUploadedFile(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  38. path, err := req.RequireString("path")
  39. if err != nil {
  40. return mcp.NewToolResultError("参数 path 必填"), nil
  41. }
  42. if mcpFileStore == nil {
  43. return mcp.NewToolResultError("文件存储未初始化"), nil
  44. }
  45. if !mcpFileStore.HasFile(path) {
  46. return mcp.NewToolResultError(fmt.Sprintf("文件不存在: %s", path)), nil
  47. }
  48. content, err := mcpFileStore.ReadFile(path)
  49. if err != nil {
  50. return mcp.NewToolResultError(fmt.Sprintf("读取文件失败: %v", err)), nil
  51. }
  52. return mcp.NewToolResultText(content), nil
  53. }
  54. func handleListUploadedFiles(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  55. if mcpFileStore == nil {
  56. return mcp.NewToolResultError("文件存储未初始化"), nil
  57. }
  58. files := mcpFileStore.GetFiles()
  59. if len(files) == 0 {
  60. return mcp.NewToolResultText("当前没有上传的文件"), nil
  61. }
  62. jsonBytes, _ := json.MarshalIndent(files, "", " ")
  63. return mcp.NewToolResultText(string(jsonBytes)), nil
  64. }