微信扫码
添加专属顾问
我要投稿
利用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 main
import (
"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 int
if daysVal, ok := req.Params.Arguments["days"]; ok {
days, _ = daysVal.(int)
}
desktopPath := getDesktopPath()
fmt.Printf("扫描目录: %s,后缀: %s,天数: %d\n", desktopPath, suffix, days)
var files []string
err := 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 main
import (
"context"
"encoding/json"
"fmt"
"github.com/mark3labs/mcp-go/client"
"github.com/mark3labs/mcp-go/mcp"
"strings"
"time"
)
func main() {
// 连接本地Server
mcpClient, err := client.NewStdioMCPClient("./desktop_cleaner", nil)
if err != nil {
panic(err)
}
defer mcpClient.Close()
// Create context with timeout
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
// 初始化握手
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)
}
// 执行工具链
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 results
func 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))
}
}
}
// 解析calltoolresult
func 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-04-28
EdgeLLM:数据并行、端到端编译器与混合精度的 CPU-FPGA 加速架构
2025-04-28
Nacos 3.0 正式发布:MCP Registry、安全零信任、链接更多生态
2025-04-28
理想汽车AI新技术曝光,人工智能企业真不是李想说说而已。
2025-04-28
我见过最聪明的浏览器 Dia,别争论什么是AI Native产品了,这个就是!
2025-04-28
实测通过!这款云电脑 MCP,真的可以平替 Manus
2025-04-27
小白也能秒懂:趣解GPU各种核心参数规格!
2025-04-27
【技术全攻略】Dify + 高德地图MCP Server,解锁智能生活新姿势!
2025-04-27
AI第一线观察:智能体(AI Agents)的美好未来
2024-03-30
2024-05-09
2024-07-23
2024-07-07
2025-02-12
2024-07-01
2024-06-24
2024-06-23
2024-10-20
2024-06-08
2025-04-26
2025-04-25
2025-04-25
2025-04-21
2025-04-13
2025-04-11
2025-04-03
2025-03-30