微信扫码
添加专属顾问
我要投稿
利用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+中大型企业
2026-02-03
OpenAI成立百人团队训练机械臂做家务,今年是否能迎来机器人管家
2026-01-31
AI硬件的宿命:要么“在场”,要么“进抽屉”
2026-01-31
我们测了十几款AI硬件,发现它们死于同一个问题
2026-01-29
LiteRT | 释放极致潜能,构建下一代高性能端侧 AI
2026-01-29
在树莓派CM0上部署 Clawdbot 真的有那么神奇吗?
2026-01-22
英伟达让机器人闪念决策:Fast-ThinkAct如何让AI思考速度快9倍还更聪明?
2026-01-20
AI手机的终极猜想:超级Agent入口|产业深度
2026-01-19
吃灰 AI 眼镜爆改“交警 Copilot”,函数计算AgentRun 实操记录
2025-12-05
2025-12-09
2025-11-09
2025-12-01
2025-12-08
2025-11-17
2025-12-15
2025-12-01
2025-12-03
2026-01-29
2026-01-29
2026-01-22
2026-01-06
2026-01-04
2026-01-02
2025-11-08
2025-10-27
2025-10-24