微信扫码
添加专属顾问
我要投稿
利用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-12-15
豆包“撕裂”AI手机
2025-12-15
树莓派AI产品,现已全面支持最新发布的树莓派操作系统Trixie版本!
2025-12-14
AI终端用户洞察:认知、行为与价值演进
2025-12-12
手机AI智能体助手的四大风险与五层防护
2025-12-12
趋境科技×智谱AI联手,把千亿大模型装进桌面小盒子:「灵启AI小盒子」开启个人超级AI Lab时代
2025-12-11
2000元搞定企业级AI算力!DellR730XD+双P100+ESXi8.0+AlmaLinux9直通部署终极指南
2025-12-10
出门问问发布全球首款4G AI录音耳机TicNote Pods,迈向“独立AI终端”
2025-12-09
豆包AI手机遭全网抵制,深度解析!
2025-09-19
2025-12-05
2025-11-09
2025-10-13
2025-10-24
2025-10-27
2025-12-01
2025-11-17
2025-12-09
2025-09-20