很多人的桌面常被快捷方式、临时文件、测试日志、
调试截图等等占据,手动清理费时费力。
本文将基于MCP协议,用Golang构建一个智能
清理系统:
MCP Server提供文件管理工具,
MCPClient通过自然语言指令触发自动化操作。
生活在AI时代,我们要学会使用AI工具。
MCP Server:驻留后台,提供scan_temp_files(扫描)、delete_files(删除)、organize_desktop(整理)三个工具。
MCP Client:解析自然语言指令(如"搜索桌面以.log结尾的文件"),调用Server工具链。
packagemainimport("context""fmt""github.com/mark3labs/mcp-go/mcp""github.com/mark3labs/mcp-go/server""os""path/filepath""strings""time")// 获取桌面路径(跨平台兼容)funcgetDesktopPath()string{home, _ := os.UserHomeDir()// 创建工作目录如果不存在path := filepath.Join(home,"Desktop")if_, err := os.Stat(path); os.IsNotExist(err) {os.MkdirAll(path,0755)}returnpath}funcmain(){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)iferr := server.ServeStdio(s); err !=nil{fmt.Printf("Server error: %v\n", err)}}
// 扫描处理器funcscanHandler(ctx context.Context, req mcp.CallToolRequest)(*mcp.CallToolResult,error) {suffix := req.Params.Arguments["suffix"].(string)// 获取days参数,如果不存在则默认为0,不做日期过滤vardaysintifdaysVal, ok := req.Params.Arguments["days"]; ok {days, _ = daysVal.(int)}desktopPath := getDesktopPath()fmt.Printf("扫描目录: %s,后缀: %s,天数: %d\n", desktopPath, suffix, days)varfiles []stringerr := filepath.Walk(desktopPath,func(pathstring, info os.FileInfo, errerror)error{// 处理错误情况,防止空指针iferr !=nil{fmt.Printf("访问路径出错: %s, 错误: %v\n", path, err)returnnil// 继续扫描其他文件}ifinfo ==nil{fmt.Printf("文件信息为空: %s\n", path)returnnil}// 检查文件后缀名,忽略大小写ifinfo.IsDir() {returnnil}ext := filepath.Ext(path)ifstrings.ToLower(ext) != strings.ToLower(suffix) {returnnil}// 如果指定了天数,检查文件修改时间ifdays >0{iftime.Since(info.ModTime()) > time.Duration(days)*24*time.Hour {returnnil// 文件太老,跳过}}// 文件符合条件,添加到结果中files =append(files, path)fmt.Printf("找到文件: %s\n", path)returnnil})iferr !=nil{fmt.Printf("扫描出错: %v\n", err)returnmcp.NewToolResultErrorFromErr("扫描失败", err),nil}result :="找到"+ fmt.Sprintf("%d",len(files)) +"个文件:\n"for_, f :=rangefiles {result += f +"\n"}returnmcp.NewToolResultText(result),nil}// 删除处理器funcdeleteHandler(ctx context.Context, req mcp.CallToolRequest)(*mcp.CallToolResult,error) {paths := req.Params.Arguments["paths"].([]interface{})results :=make(map[string]string)for_, p :=rangepaths {path := p.(string)if!isUnderDesktop(path) {// 安全校验returnmcp.NewToolResultError("非法路径: "+ path),nil}err := os.Remove(path)iferr !=nil{results[path] ="删除失败: "+ err.Error()}else{results[path] ="删除成功"}}result :="删除结果:\n"forpath, status :=rangeresults {result += path +": "+ status +"\n"}returnmcp.NewToolResultText(result),nil}// 整理桌面处理器funcorganizeHandler(ctx context.Context, req mcp.CallToolRequest)(*mcp.CallToolResult,error) {strategy, _ := req.Params.Arguments["strategy"].(string)// 实际的整理逻辑可以在这里实现returnmcp.NewToolResultText("桌面文件已按"+ strategy +"整理完成"),nil}// 路径合法性校验funcisUnderDesktop(pathstring)bool{rel, err := filepath.Rel(getDesktopPath(), path)returnerr ==nil&& !strings.HasPrefix(rel,"..")}
packagemainimport("context""encoding/json""fmt""github.com/mark3labs/mcp-go/client""github.com/mark3labs/mcp-go/mcp""strings""time")funcmain(){// 连接本地ServermcpClient, err := client.NewStdioMCPClient("./desktop_cleaner",nil)iferr !=nil{panic(err)}defermcpClient.Close()// Create context with timeoutctx, cancel := context.WithTimeout(context.Background(),30*time.Second)defercancel()// 初始化握手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)}// 执行工具链iferr := cleanTempFiles(ctx, mcpClient); err !=nil{fmt.Printf("清理失败: %v\n", err)}}
funccleanTempFiles(ctxcontext.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)iferr!=nil{returnerr}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{returnerr}fmt.Printf("成功清理%d个文件\n",len(files))returnnil}//HelperfunctiontoprinttoolresultsfuncprintToolResult(result*mcp.CallToolResult){for_,content:=rangeresult.Content{iftextContent,ok:=content.(mcp.TextContent);ok{fmt.Println(textContent.Text)}else{jsonBytes,_:=json.MarshalIndent(content,"","")fmt.Println(string(jsonBytes))}}}//解析calltoolresultfuncparseFiles(result*mcp.CallToolResult)(files[]string){for_,content:=rangeresult.Content{iftextContent,ok:=content.(mcp.TextContent);ok{for_,line:=rangestrings.Split(textContent.Text,"\n"){ifstrings.HasPrefix(line,"/"){files=append(files,line)}}}else{jsonBytes,_:=json.MarshalIndent(content,"","")//解析成[]stringvarresult[]stringiferr:=json.Unmarshal(jsonBytes,&result);err!=nil{fmt.Println("解析失败:",err)}files=append(files,result...)}}return}#安装mcphost工具goinstallgithub.com/mark3labs/mcphost@latest
#启动AI协调模式mcphost--configmcp-systemfile/clean_config.json--modelollama:qwen2.5:3b
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |