链载Ai

标题: 什么?动动嘴就能让大模型帮你整理电脑桌面?! [打印本页]

作者: 链载Ai    时间: 昨天 18:10
标题: 什么?动动嘴就能让大模型帮你整理电脑桌面?!


很多人的桌面常被快捷方式、临时文件、测试日志、
调试截图等等占据,手动清理费时费力。

本文将基于MCP协议,用Golang构建一个智能
清理系统:
MCP Server提供文件管理工具
MCPClient通过自然语言指令触发自动化操作。

生活在AI时代,我们要学会使用AI工具。

一、MCP架构设计

1.1 技术方案

我们通过Golang来实现MCP Client和Server,MCP是Model Context Protocol,用于连接大语言模型和外部工具,它采用客户端-服务器架构。
MCP Server提供工具,Client调用这些工具。所以我们需要设计一个MCP Server,提供清理桌面的工具,比如扫描临时文件、删除文件、整理文件等功能,然后Client部分需要调用这些工具,然后结合LLM(qwen2.5:3b)进行智能清理决策。
传输层我们使用stdio(或HTTP SSE),适合本地进程间通信,本次演示我们直接编译为二进制后运行(或通过Docker运行也可以)。
双进程架构:

1.2 通信流程

二、MCP Server实现

2.1 工具定义

我们通过代码来说明:
packagemain
import("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) }}

2.1 核心处理器实现

// 扫描处理器funcscanHandler(ctx context.Context, req mcp.CallToolRequest)(*mcp.CallToolResult,error) {	suffix := req.Params.Arguments["suffix"].(string)   // 获取days参数,如果不存在则默认为0,不做日期过滤   vardaysint   ifdaysVal, ok := req.Params.Arguments["days"]; ok {		days, _ = daysVal.(int)	}	desktopPath := getDesktopPath()	fmt.Printf("扫描目录: %s,后缀: %s,天数: %d\n", desktopPath, suffix, days)
varfiles []string err := 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,"..")}

三、MCP Client实现

3.1 客户端初始化

packagemainimport("context""encoding/json""fmt""github.com/mark3labs/mcp-go/client""github.com/mark3labs/mcp-go/mcp""strings""time")
funcmain(){// 连接本地Server mcpClient, err := client.NewStdioMCPClient("./desktop_cleaner",nil) iferr !=nil{ panic(err) } defermcpClient.Close()// Create context with timeout ctx, cancel := context.WithTimeout(context.Background(),30*time.Second) defercancel()// 初始化握手 fmt.Println("Initializing client...") initRequest := mcp.InitializeRequest{} initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION initRequest.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) }}

3.2 工具调用

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}

四、场景演示

结合LLM实现智能决策:

首先我们需要先安装mcphost工具和Ollama

#安装mcphost工具goinstallgithub.com/mark3labs/mcphost@latest
#启动AI协调模式mcphost--configmcp-systemfile/clean_config.json--modelollama:qwen2.5:3b

Ollama安装qwen2.5:3b大模型,大小1.9G

最终效果

Thinking...

Assistant:






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5