桌面控制MCP
MCP服务器,使LLM能够通过屏幕截图、鼠标、键盘和UI元素检测来查看和控制Windows桌面。
运作原理
服务器提供工具——LLM客户端负责所有推理:
- 截图 桌面查看屏幕上的内容
- 识别 通过视觉或Windows UI自动化实现UI元素
- 法案 使用鼠标点击、键盘输入或热键
- 验证 每次操作后再截图
三层元素检测
| 图层 | 方法 | 最适合 |
|---|---|---|
| 客户数据平台 | 通过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并加入通用语音频道”
法学硕士将:
open_application("Discord")或单击任务栏图标screenshot()查看“Discord”窗口mouse_click()在正确的服务器图标上screenshot()验证导航mouse_click()在语音频道上screenshot()确认已加入
