桌面控制服务

一个允许LLM通过截图、鼠标、键盘和UI元素检测来查看和控制Windows桌面的服务器。

  • by acarioti4
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 acarioti4/Desktop-Control-MCP

使用说明

桌面控制MCP

MCP服务器,使LLM能够通过屏幕截图、鼠标、键盘和UI元素检测来查看和控制Windows桌面。

运作原理

服务器提供工具——LLM客户端负责所有推理:

  1. 截图 桌面查看屏幕上的内容
  2. 识别 通过视觉或Windows UI自动化实现UI元素
  3. 法案 使用鼠标点击、键盘输入或热键
  4. 验证 每次操作后再截图

三层元素检测

图层 方法 最适合
客户数据平台 通过WebSocket的Chrome DevTools协议 电子应用程序(Discord、VS Code、Slack)-需要 method="path" 发射
国际建筑师协会 Windows UI Automation COM API 本机应用程序(记事本、资源管理器、设置、Office)
视觉 截图+LLM视觉 其他一切——LLM根据图像估计坐标

安装

cd Desktop-Control-MCP
pip install -e .

向MCP客户端注册

将服务器添加到MCP客户端的配置中。热门客户示例:

克劳德桌面 — %APPDATA%\Claude\claude_desktop_config.json:

{
  "mcpServers": {
    "desktop-control": {
      "command": "python",
      "args": ["-m", "desktop_control.server"],
      "cwd": "C:\\path\\to\\Desktop-Control-MCP"
    }
  }
}

克劳德代码 — .claude/settings.json 或通过 claude mcp add:

claude mcp add desktop-control -- python -m desktop_control.server

光标 — .cursor/mcp.json:

{
  "mcpServers": {
    "desktop-control": {
      "command": "python",
      "args": ["-m", "desktop_control.server"]
    }
  }
}

OpenAI代理SDK --通过Python:

from agents import Agent
from agents.mcp import MCPServerStdio

server = MCPServerStdio(command="python", args=["-m", "desktop_control.server"])
agent = Agent(name="desktop", tools=server.tools())

任何兼容MCP的客户端(Windsurf、Cline、Continue等)都可以使用标准的stdio传输与以下设备连接 python -m desktop_control.server.

然后重新启动您的客户端。

工具(12)

愿景与意识

工具 说明
screenshot 将桌面捕获为JPEG格式。返回图像+屏幕尺寸。坐标映射1:1到鼠标坐标。
get_elements 获取具有精确边界框的交互式UI元素。根据应用程序自动选择CDP或UIA。
get_screen_info 监控几何形状、光标位置、DPI比例。
list_open_windows 所有带有标题、进程名称和位置的可见窗口。

老鼠

工具 说明
mouse_click 单击(x,y)。支持左/右/中、双击、修改键。
mouse_drag 从一个点拖动到另一个点。
mouse_scroll 在某个位置垂直或水平滚动。

键盘

工具 说明
keyboard_type 键入文本。通过剪贴板粘贴处理Unicode。
keyboard_hotkey 按键组合如下 ["ctrl", "c"], ["alt", "tab"], ["win"].

便利

工具 说明
open_application 通过“开始”菜单搜索、Win+R或直接路径按名称打开应用程序。
click_element 按名称查找UI元素并单击其中心——无需猜测坐标。
wait 暂停加载屏幕(最多30秒)。

项目结构

src/desktop_control/
  server.py           # FastMCP server, all tool definitions, entry point
  screen.py           # DPI awareness init, screenshot capture via mss
  mouse.py            # Click, drag, scroll via pyautogui
  keyboard.py         # Text typing with Unicode clipboard fallback, hotkeys
  ui_automation.py    # Windows UI Automation (native app element detection)
  cdp.py              # Chrome DevTools Protocol (Electron app element detection)
  element_detection.py # Unified facade — auto-selects CDP or UIA
  windows.py          # App launching, window enumeration, Electron app registry

依赖项

  • mcp --MCP Python SDK(FastMCP)
  • pyautogui --鼠标/键盘控制
  • Pillow --图像处理
  • mss --快速多显示器屏幕截图
  • comtypes --Windows UI自动化COM访问
  • websockets + aiohttp --Electron应用程序的CDP通信

关键技术细节

DPI意识

screen.py 电话 SetProcessDpiAwareness(2) 在模块级别 之前 任何GUI库导入。这确保了 mss 以物理像素分辨率捕获 pyautogui 坐标与屏幕像素匹配。中的服务器导入顺序 server.py 强制执行这一点。

屏幕截图坐标

屏幕截图默认为 monitor_index=1 (主监视器)。使用 monitor_index=0 捕获具有不同维度的虚拟组合监视器,这导致在虚拟监视器和主监视器大小不同的系统上出现约40%的坐标不匹配。

区域屏幕截图包括偏移指令,因此LLM可以将像素位置映射回屏幕坐标。

电子应用支持

电子应用程序(Discord、VS Code、Slack等)暴露了有限的UIA元素。要获得完整的DOM访问权限,请使用以下命令启动它们 open_application(name, method="path") 这增加了 --remote-debugging-port。已知应用程序及其调试端口已在中注册 windows.py:ELECTRON_APPS.

安全

  • pyautogui.FAILSAFE = True --将鼠标移动到左上角(0,0)以中止
  • wait 上限为30秒,以防止挂起
  • 无法与UAC提示交互(安全桌面)

示例用法

从任何MCP客户端(注册服务器后):

“打开Discord并加入通用语音频道”

法学硕士将:

  1. open_application("Discord") 或单击任务栏图标
  2. screenshot() 查看“Discord”窗口
  3. mouse_click() 在正确的服务器图标上
  4. screenshot() 验证导航
  5. mouse_click() 在语音频道上
  6. screenshot() 确认已加入