package tools import ( "context" "encoding/json" "fmt" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" "fwh-toolbox-server/utils/filestore" ) // mcpFileStore MCP 专用的文件存储实例 var mcpFileStore *filestore.FileStore // InitFileStore 初始化 MCP FileStore func InitFileStore(fs *filestore.FileStore) { mcpFileStore = fs } // GetFileStore 获取 MCP FileStore 实例(供外部使用) func GetFileStore() *filestore.FileStore { return mcpFileStore } func RegisterFileTools(s *server.MCPServer) { // Tool: 读取用户上传的文件 s.AddTool( mcp.NewTool("read_uploaded_file", mcp.WithDescription("读取用户上传的文件内容。用户通过前端上传的文件会存储在 /uploads/ 路径下,使用此工具读取文件内容进行分析。"), mcp.WithString("path", mcp.Required(), mcp.Description("文件路径,格式为 /uploads/{filename}")), ), handleReadUploadedFile, ) // Tool: 列出用户上传的文件 s.AddTool( mcp.NewTool("list_uploaded_files", mcp.WithDescription("列出当前会话中用户上传的所有文件,返回文件名、路径、大小等信息。"), ), handleListUploadedFiles, ) } func handleReadUploadedFile(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { path, err := req.RequireString("path") if err != nil { return mcp.NewToolResultError("参数 path 必填"), nil } if mcpFileStore == nil { return mcp.NewToolResultError("文件存储未初始化"), nil } if !mcpFileStore.HasFile(path) { return mcp.NewToolResultError(fmt.Sprintf("文件不存在: %s", path)), nil } content, err := mcpFileStore.ReadFile(path) if err != nil { return mcp.NewToolResultError(fmt.Sprintf("读取文件失败: %v", err)), nil } return mcp.NewToolResultText(content), nil } func handleListUploadedFiles(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { if mcpFileStore == nil { return mcp.NewToolResultError("文件存储未初始化"), nil } files := mcpFileStore.GetFiles() if len(files) == 0 { return mcp.NewToolResultText("当前没有上传的文件"), nil } jsonBytes, _ := json.MarshalIndent(files, "", " ") return mcp.NewToolResultText(string(jsonBytes)), nil }