Desktop Test MCP
基于 VLM(视觉语言模型)的 UI 自动化测试 MCP 服务器。
通过 MCP (Model Context Protocol) 协议,让 AI Coding Agent 像人眼一样从截图理解界面,用坐标完成交互,并用 VLM 做视觉断言。元素定位与交互全程不依赖无障碍树,纯视觉驱动。
核心特性
- 纯 VLM 元素定位 —
vlm_snapshot从截图识别全部 UI 元素,vlm_click用自然语言描述目标后由 VLM 定位并点击,无需 ref、无需坐标猜测 - 坐标式后台交互 —
coord_click/coord_type经 PostMessage 投递,不抢焦点、不移动光标,可对后台窗口操作 - VLM 视觉断言 —
vision_assert/vlm_assert用自然语言描述预期视觉状态,由 VLM 判定 PASS/FAIL - OODA 自动探索 —
vlm_navigate以观察-决策-执行-验证循环自动完成多步场景,并记忆 Playbook 复用 - 多后端截图 — PrintWindow 后台截取 → 屏幕区域回退,支持窗口/全屏
- 沙箱环境 — Linux(Docker + Xvfb)/ Android(Redroid)/ iOS(Simctl)隔离运行环境,配套点击/输入/截图/按键
- 测试报告 — OODA 结果一键导出 JSON / JUnit XML
快速开始
安装
pip install -e .
要求:Python 3.10+,Windows 10/11(桌面端);沙箱需要 Docker。
配置 MCP 客户端
以 Claude Desktop 为例,编辑 claude_desktop_config.json:
{
"mcpServers": {
"desktop-test": {
"command": "python",
"args": ["-m", "desktop_test_mcp"],
"env": {
"VLM_BASE_URL": "http://localhost:11434/v1",
"VLM_MODEL": "qwen3-vl:8b"
}
}
}
}
环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
VLM_BASE_URL |
http://localhost:11434/v1 |
OpenAI 兼容 API 地址 |
VLM_MODEL |
smolvlm |
视觉模型名称(需为支持图像的 VLM) |
VLM_API_KEY |
ollama |
API Key(ollama 不需要真实 key) |
VLM_TIMEOUT |
120 |
VLM 请求超时秒数 |
VLM_MAX_TOKENS |
1024 |
最大生成 token 数 |
VLM_PROVIDER |
ollama |
VLM 后端:ollama 或 openai |
工具一览(39 个)
截图与窗口
| 工具 | 说明 |
|---|---|
desktop_list_windows |
列出所有可见顶层窗口及句柄 |
desktop_screenshot |
截取窗口/全屏截图,返回 base64 JPEG |
desktop_launch |
启动应用,可选等待窗口出现 |
desktop_switch_window |
将窗口切换到前台 |
desktop_resize_window |
移动和调整窗口大小 |
desktop_maximize_window / desktop_minimize_window / desktop_close_window |
窗口最大化/最小化/关闭 |
交互
| 工具 | 说明 |
|---|---|
desktop_shortcut |
发送键盘快捷键({Ctrl}c, {Alt}{F4}),PostMessage 后台投递 |
VLM 视觉(核心)
| 工具 | 说明 |
|---|---|
vlm_snapshot |
VLM 从截图识别全部 UI 元素及坐标 |
vlm_click |
用自然语言描述目标,VLM 定位后在坐标处点击 |
vlm_assert |
VLM 视觉断言,返回 PASS/FAIL |
vlm_navigate |
OODA 循环自动探索,完成多步场景 |
desktop_vision_ask |
向 VLM 提问关于当前屏幕的问题 |
desktop_vision_assert |
用自然语言描述视觉断言,VLM 返回 PASS/FAIL |
desktop_vision_compare |
对比参考截图与当前屏幕的差异 |
沙箱
| 工具 | 说明 |
|---|---|
sandbox_create / sandbox_destroy / sandbox_list |
创建/销毁/列出沙箱容器 |
sandbox_install_app / sandbox_launch_app |
沙箱内安装/启动应用 |
sandbox_screenshot / sandbox_click / sandbox_type / sandbox_scroll / sandbox_key |
沙箱内截图/点击/输入/滚动/按键 |
sandbox_build_image / sandbox_cleanup |
构建 Linux 镜像 / 清理过期容器 |
Playbook 与报告
| 工具 | 说明 |
|---|---|
playbook_list / playbook_show / playbook_delete |
列出/查看/删除记忆的 Playbook |
test_report |
生成 JSON / JUnit XML 测试报告 |
辅助工具
| 工具 | 说明 |
|---|---|
desktop_shell |
执行 shell 命令 |
desktop_list_processes / desktop_kill_process |
列出/终止进程 |
desktop_clipboard_get / desktop_clipboard_set |
读写剪贴板 |
desktop_wait_for_window / desktop_wait |
等待窗口出现 / 等待指定时长 |
典型工作流
1. desktop_list_windows → 找到目标窗口
2. vlm_snapshot → VLM 从截图识别界面元素与坐标
3. vlm_click("登录按钮") → VLM 定位并在坐标处点击
4. vlm_navigate("输入用户名并登录") → OODA 循环:自动定位输入框、输入文本、提交
5. vlm_assert("已进入主界面") → VLM 视觉断言验证
项目结构
src/desktop_test_mcp/
├── __init__.py / __main__.py / config.py / server.py
├── providers/ # 平台抽象层
│ ├── base.py # PlatformProvider Protocol
│ └── windows.py # Windows 实现(截图/坐标交互/窗口管理)
├── core/ # 核心引擎
│ ├── screenshot.py # 多后端截图
│ ├── bg_capture.py # 后台窗口截取(PrintWindow)
│ ├── bg_interact.py # 后台坐标交互(PostMessage)
│ ├── annotation.py # 截图标注覆盖
│ ├── wait.py / window_manager.py
├── tools/ # MCP 工具注册
│ ├── snapshot.py / interact.py / app.py
│ ├── vision.py / vlm_tools.py / sandbox.py
│ ├── shell.py / process.py / clipboard.py / wait_tools.py
├── vision/ # VLM 视觉模块
│ ├── vlm_client.py # OpenAI 兼容 HTTP 客户端(带自动拉起/恢复)
│ ├── vlm_elements.py # VLM 元素定位 + 点击坐标计算
│ ├── ooda_engine.py # OODA 自动探索引擎
│ ├── vision_ask.py / vision_assert.py / vision_compare.py
│ ├── vlm_base.py / vlm_factory.py / vlm_openai.py
├── sandbox/ # 跨平台沙箱
│ ├── docker_manager.py # Linux 沙箱(Docker + Xvfb)
│ ├── xvfb_provider.py # Linux 交互
│ ├── redroid_provider.py / simctl_provider.py # Android / iOS
│ ├── registry.py / junit_reporter.py / test_results.py
├── playbook/ # 场景记忆
│ ├── storage.py / extractor.py / models.py
└── uia/ # vendored yinkaisheng UIA 库(Apache 2.0)
致谢
- Windows-MCP — 多后端截图、截图标注、窗口管理思路
- Python-UIAutomation-for-Windows — UIA COM 封装库(Apache 2.0)
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
desktop_test_mcp-0.1.0.tar.gz
(331.0 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file desktop_test_mcp-0.1.0.tar.gz.
File metadata
- Download URL: desktop_test_mcp-0.1.0.tar.gz
- Upload date:
- Size: 331.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
734c359cc7548a01c1b338b183ea5eda399ccba837b88c22666571fd50104bc3
|
|
| MD5 |
b9190d6eccd3230f46c92299209e01de
|
|
| BLAKE2b-256 |
c8e3591fe62bebf719594dc29efb136147d56aa1b5a371e37f80def45e6af18e
|
File details
Details for the file desktop_test_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: desktop_test_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 136.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f8e4c05397473e2a0f4669498d9d27e398cf0a07e91240d08c404fc89f629df5
|
|
| MD5 |
1ad8d0796422dd9bcd4b98814693534d
|
|
| BLAKE2b-256 |
401632b67005525f46e5e3fc990f95d841dbba073163077ceb6a1ce52f6deac6
|