| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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
- }
|