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