微信扫码
添加专属顾问
 
                        我要投稿
利用AI技术简化桌面管理,释放双手从繁琐的文件整理中。 核心内容: 1. MCP协议与Golang结合实现桌面智能清理系统 2. MCP Server与Client的架构设计与通信流程 3. 代码示例:实现桌面路径获取与文件管理工具定义
 
                                
很多人的桌面常被快捷方式、临时文件、测试日志、
调试截图等等占据,手动清理费时费力。
本文将基于MCP协议,用Golang构建一个智能
清理系统:
MCP Server提供文件管理工具,
MCP Client通过自然语言指令触发自动化操作。
生活在AI时代,我们要学会使用AI工具。
MCP Server:驻留后台,提供scan_temp_files(扫描)、delete_files(删除)、organize_desktop(整理)三个工具。
MCP Client:解析自然语言指令(如"搜索桌面以.log结尾的文件"),调用Server工具链。
package mainimport ("context""fmt""github.com/mark3labs/mcp-go/mcp""github.com/mark3labs/mcp-go/server""os""path/filepath""strings""time")// 获取桌面路径(跨平台兼容)func getDesktopPath() string {home, _ := os.UserHomeDir()// 创建工作目录如果不存在path := filepath.Join(home, "Desktop")if _, err := os.Stat(path); os.IsNotExist(err) {os.MkdirAll(path, 0755)}return path}func main() {s := server.NewMCPServer("DesktopCleaner", "1.0",server.WithLogging(),server.WithRecovery(),)// 工具1:扫描临时文件scanTool := mcp.NewTool("scan_temp_files",mcp.WithDescription("扫描桌面指定后缀的临时文件"),mcp.WithString("suffix", mcp.Required(),mcp.Description("文件后缀如.log/.tmp"),mcp.Pattern(`^\.[a-zA-Z0-9]+$`)),mcp.WithNumber("days", mcp.Description("查找最近N天内的文件")),)s.AddTool(scanTool, scanHandler)// 工具2:批量删除delTool := mcp.NewTool("delete_files",mcp.WithDescription("删除指定路径的文件"),mcp.WithArray("paths", mcp.Required(),mcp.Description("文件路径数组")),)s.AddTool(delTool, deleteHandler)// 工具3:桌面整理orgTool := mcp.NewTool("organize_desktop",mcp.WithDescription("按类型整理文件"),mcp.WithString("strategy",mcp.Enum("type", "date"), // 按类型/日期分类mcp.Description("整理策略")),)s.AddTool(orgTool, organizeHandler)if err := server.ServeStdio(s); err != nil {fmt.Printf("Server error: %v\n", err)}}
// 扫描处理器func scanHandler(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {suffix := req.Params.Arguments["suffix"].(string)// 获取days参数,如果不存在则默认为0,不做日期过滤var days intif daysVal, ok := req.Params.Arguments["days"]; ok {days, _ = daysVal.(int)}desktopPath := getDesktopPath()fmt.Printf("扫描目录: %s,后缀: %s,天数: %d\n", desktopPath, suffix, days)var files []stringerr := filepath.Walk(desktopPath, func(path string, info os.FileInfo, err error) error {// 处理错误情况,防止空指针if err != nil {fmt.Printf("访问路径出错: %s, 错误: %v\n", path, err)return nil // 继续扫描其他文件}if info == nil {fmt.Printf("文件信息为空: %s\n", path)return nil}// 检查文件后缀名,忽略大小写if info.IsDir() {return nil}ext := filepath.Ext(path)if strings.ToLower(ext) != strings.ToLower(suffix) {return nil}// 如果指定了天数,检查文件修改时间if days > 0 {if time.Since(info.ModTime()) > time.Duration(days)*24*time.Hour {return nil // 文件太老,跳过}}// 文件符合条件,添加到结果中files = append(files, path)fmt.Printf("找到文件: %s\n", path)return nil})if err != nil {fmt.Printf("扫描出错: %v\n", err)return mcp.NewToolResultErrorFromErr("扫描失败", err), nil}result := "找到" + fmt.Sprintf("%d", len(files)) + "个文件:\n"for _, f := range files {result += f + "\n"}return mcp.NewToolResultText(result), nil}// 删除处理器func deleteHandler(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {paths := req.Params.Arguments["paths"].([]interface{})results := make(map[string]string)for _, p := range paths {path := p.(string)if !isUnderDesktop(path) { // 安全校验return mcp.NewToolResultError("非法路径: " + path), nil}err := os.Remove(path)if err != nil {results[path] = "删除失败: " + err.Error()} else {results[path] = "删除成功"}}result := "删除结果:\n"for path, status := range results {result += path + ": " + status + "\n"}return mcp.NewToolResultText(result), nil}// 整理桌面处理器func organizeHandler(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {strategy, _ := req.Params.Arguments["strategy"].(string)// 实际的整理逻辑可以在这里实现return mcp.NewToolResultText("桌面文件已按" + strategy + "整理完成"), nil}// 路径合法性校验func isUnderDesktop(path string) bool {rel, err := filepath.Rel(getDesktopPath(), path)return err == nil && !strings.HasPrefix(rel, "..")}
package mainimport ("context""encoding/json""fmt""github.com/mark3labs/mcp-go/client""github.com/mark3labs/mcp-go/mcp""strings""time")func main() {// 连接本地ServermcpClient, err := client.NewStdioMCPClient("./desktop_cleaner", nil)if err != nil {panic(err)}defer mcpClient.Close()// Create context with timeoutctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)defer cancel()// 初始化握手fmt.Println("Initializing client...")initRequest := mcp.InitializeRequest{}initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSIONinitRequest.Params.ClientInfo = mcp.Implementation{Name: "CleanBot",Version: "1.0",}if _, err := mcpClient.Initialize(ctx, initRequest); err != nil {panic(err)}// 执行工具链if err := cleanTempFiles(ctx, mcpClient); err != nil {fmt.Printf("清理失败: %v\n", err)}}
func cleanTempFiles(ctx context.Context, client *client.Client) error {    // 步骤1:扫描.log文件    scanReq := mcp.CallToolRequest{        Request: mcp.Request{            Method: "tools/call",        },    }    scanReq.Params.Name = "scan_temp_files"    scanReq.Params.Arguments = map[string]interface{}{        "suffix": ".log",        "days":   7,    }    scanRes, err := client.CallTool(ctx, scanReq)    if err != nil {        return err    }    printToolResult(scanRes)    fmt.Println()    // 解析扫描结果    files := parseFiles(scanRes)    // 步骤2:删除文件    delReq := mcp.CallToolRequest{        Request: mcp.Request{            Method: "tools/call",        },    }    delReq.Params.Name = "delete_files"    delReq.Params.Arguments = map[string]interface{}{        "paths": files,    }    if _, err := client.CallTool(ctx, delReq); err != nil {        return err    }    fmt.Printf("成功清理%d个文件\n", len(files))    return nil}// Helper function to print tool resultsfunc printToolResult(result *mcp.CallToolResult) {    for _, content := range result.Content {        if textContent, ok := content.(mcp.TextContent); ok {            fmt.Println(textContent.Text)        } else {            jsonBytes, _ := json.MarshalIndent(content, "", "  ")            fmt.Println(string(jsonBytes))        }    }}// 解析calltoolresultfunc parseFiles(result *mcp.CallToolResult) (files []string) {    for _, content := range result.Content {        if textContent, ok := content.(mcp.TextContent); ok {            for _, line := range strings.Split(textContent.Text, "\n") {                if strings.HasPrefix(line, "/") {                    files = append(files, line)                }            }        } else {            jsonBytes, _ := json.MarshalIndent(content, "", "  ")            // 解析成[]string            var result []string            if err := json.Unmarshal(jsonBytes, &result); err != nil {                fmt.Println("解析失败:", err)            }            files = append(files, result...)        }    }    return}# 安装mcphost工具go install github.com/mark3labs/mcphost@latest
# 启动AI协调模式 mcphost --config mcp-systemfile/clean_config.json --model ollama:qwen2.5:3b
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-10-29
KnowFlow 无缝衔接 Dify,分块支持添加父标题、Title 切块支持自定义标题层级切割、图片理解新增支持上下文
2025-10-28
邪修榨干元宝AI录音笔:白天工作,晚上陪聊
2025-10-27
免费又好用的AI录音笔都出来了,这下哪还有理由不学习?
2025-10-24
Aiops探索:我用Dify结合k8s的api做了一个非常简单的Aiops智能体
2025-10-24
阿里夸克AI眼镜开售:叠加补贴后3699元,它能打破AI眼镜的魔咒吗?
2025-10-23
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
2025-10-13
Dify + 飞书组合拳:企业级 AI 安全大脑落地全指南,助力安管效率提升 300%
2025-09-23
专访Plaud中国区CEO:我们只做“必须做”和“不做要死”的事
 
            2025-09-19
2025-09-02
2025-10-13
2025-09-02
2025-10-24
2025-09-05
2025-08-25
2025-09-02
2025-08-22
2025-08-28