package storage import ( "context" "fmt" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" "fwh-toolbox-server/cmd/mcp/tools/helper" "fwh-toolbox-server/utils/filestore" ) // mcpFileStore MCP 专用的文件存储实例 var mcpFileStore *filestore.FileStore // InitFileStore 初始化 MCP FileStore(由 main.go 调用) func InitFileStore(fs *filestore.FileStore) { mcpFileStore = fs } // GetFileStore 获取 MCP FileStore 实例 func GetFileStore() *filestore.FileStore { return mcpFileStore } func registerFileTools(s *server.MCPServer) { s.AddTool( mcp.NewTool("storage_file_read", mcp.WithDescription("读取用户上传的文件内容。用户通过前端上传的文件存储在 /uploads/ 路径下。"), mcp.WithString("path", mcp.Required(), mcp.Description("文件路径,格式为 /uploads/{filename}")), ), handleFileRead, ) s.AddTool( mcp.NewTool("storage_file_list", mcp.WithDescription("列出当前会话中用户上传的所有文件,返回文件名、路径、大小等信息。"), ), handleFileList, ) } func handleFileRead(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { path, err := req.RequireString("path") if err != nil { return helper.ParamError("path"), nil } if mcpFileStore == nil { return helper.ServiceError("文件存储", fmt.Errorf("未初始化")), nil } if !mcpFileStore.HasFile(path) { return helper.EmptyResult(fmt.Sprintf("文件不存在: %s", path)), nil } content, err := mcpFileStore.ReadFile(path) if err != nil { return helper.ServiceError("读取文件", err), nil } return helper.TextResult(content), nil } func handleFileList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { if mcpFileStore == nil { return helper.ServiceError("文件存储", fmt.Errorf("未初始化")), nil } files := mcpFileStore.GetFiles() if len(files) == 0 { return helper.EmptyResult("当前没有上传的文件"), nil } return helper.JSONResult(files), nil }