使用说明
WinApp MCP
Website · GitHub · npm · VS Code Marketplace
Playwright for Windows Desktop Apps
A Model Context Protocol (MCP) server that gives AI assistants full control over native Windows applications — launch, inspect, click, type, screenshot, and test any WinUI3, WPF, WinForms, UWP, or Win32 app.
为什么存在
浏览器自动化有Playwright。Mobile有Appium。但是 AI代理的Windows桌面自动化? 现有的选择不够深入。
GitHub Copilot、Claude和ChatGPT等人工智能助手可以浏览网页、运行终端命令和编辑文件。但他们 无法与本机Windows应用程序交互。他们无法单击WinUI3应用程序中的按钮,无法从WPF窗体读取值,也无法测试WinForms对话框。
WinApp MCP弥合了这一差距。 它通过以下方式公开了55个UI自动化工具 模型上下文协议,让任何兼容MCP的人工智能助手控制Windows桌面应用程序,就像Playwright控制浏览器一样。
问题
| AI今天能做什么 | AI不能做什么 |
|---|---|
| ✅ 编辑源代码 | ❌ 启动并与编译后的应用程序交互 |
| ✅ 运行终端命令 | ❌ 点击按钮、填写表单、读取UI状态 |
| ✅ 通过Playwright浏览网站 | ❌ 自动化桌面应用程序 |
| ✅ 编写测试 | ❌ 在桌面应用程序上运行可视化/E2E测试 |
| ✅ 运行长自主管道 | ❌ 在应用程序最小化或屏幕锁定时继续工作 |
解决方案
WinApp MCP提供人工智能助手 眼睛和手 对于任何Windows桌面应用程序:
┌─────────────────────┐ MCP (stdio) ┌──────────────────────┐
│ AI Assistant │◄─────────────────────►│ WinApp MCP Server │
│ (Copilot, Claude) │ JSON-RPC over stdio │ (.NET 10 + FlaUI) │
└─────────────────────┘ └──────────┬───────────┘
│ UI Automation
▼
┌──────────────────────┐
│ Windows Application │
│ WinUI3/WPF/WinForms│
└──────────────────────┘
主要特点
🔍 深度UI检查
- 类似DOM的快照 整个UI元素树的深度可配置
- 筛选的搜索 按控件类型、Automation Id或名称
- 模糊匹配 Levenshtein距离——允许拼写错误和部分名称
- 元素存在检查 --无需读取完整属性的快速布尔查询
🖱️ 完全互动
- 单击、双击、右键单击、调用(通过UIA模式)
- 键入文本、按键、组合键(Ctrl+S、Alt+F4等)
- 填写完整表格 在一次调用中--无顺序键入
- 在一个原子操作中选择下拉选项
- 在元素之间拖放
- 展开/折叠树项目、菜单和手风琴
🪟 多窗口HWND瞄准
- 通过本机句柄(HWND)定位特定窗口
- 单击、设置值并拍摄弹出窗口、对话框和辅助窗口的快照
- 对于多窗口应用程序和系统对话框至关重要
⚡ 性能优化
- 后代缓存 (2s TTL)——避免重复
FindAllDescendants复杂应用程序上需要200-800毫秒的通话 - 窗口缓存 (30s TTL)--消除了昂贵的窗口查找
- 智能缓存失效 --突变后缓存会自动清除(单击、键入、导航)
- 令牌感知截图 --自动调整图像大小以适应LLM上下文限制
📊 高级UIA模式
- 网格图案 --DataGrid中按行/列直接访问单元格
- 滚动ItemPattern --滚动屏幕元素进入视图
- 虚拟化项目模式 --实现WinUI3虚拟化列表(ListView、GridView)中的项目
- 展开折叠模式 --树项目和菜单的程序化展开/折叠
- 数据容器模式 --大型/虚拟化容器中的高效搜索
📡 事件监控
- 监视器 焦点变化, 结构变化 (添加/删除元素),以及 属性变化 实时的
- 基于会话的500事件环形缓冲区
- 调试异步UI更新、动画和后台数据加载
📸 目视验证
- 带有LLM代币预算自动调整大小的屏幕截图
- 带注释的屏幕截图 --在指定图元周围绘制红色边界框
- 像素差异比较 --比较两个屏幕截图并突出显示更改
- HWND针对特定窗口的截图
🪟 最小化和锁定会话支持
- 应用程序最小化时有效 --在鼠标/键盘操作之前自动恢复窗口,使用
PrintWindowAPI用于屏幕截图而无需恢复 - 桌面锁定时工作 --通过UIA模式(调用模式、切换模式、选择项模式)而不是鼠标模拟进行点击;通过ValuePattern读取/写入值;通过以下方式捕获屏幕截图
PrintWindow - 智能回退链 --尝试UIA模式→ 自动恢复+鼠标模拟→ 信息性错误
- 会话状态检测 —
check_session_status报告会话是否已锁定、应用程序是否已最小化以及哪些操作可用 - 手动恢复 —
restore_window按需将最小化的应用程序带回前台
为什么重要: 运行长自治管道的AI代理不应该因为屏幕保护程序启动或用户最小化应用程序而崩溃。WinApp MCP会优雅地降级——即使鼠标/键盘模拟无法正常工作,基于UIA模式的操作也会继续工作。
🛡️ 安全
- 紧急释放 --通过一次调用松开所有修改键和鼠标按钮
- 等待图元 --等待元素、条件和输入空闲状态
- 超时控制 关于所有封锁行动
用例
🤖 AI驱动的E2E测试
让AI助手以QA工程师的方式测试您的Windows应用程序——导航页面、填写表单、验证数据、测试状态转换、捕获证据。
"Navigate to Invoices → Create New → Fill all fields → Save → Verify detail page → Test status change to Sent"
🔄 自动UI验证
在代码生成或重构之后,让AI启动应用程序,并验证UI是否正确呈现,按钮是否正常工作,表单是否正确验证。
🧪 视觉回归测试
拍摄基线截图,进行更改,拍摄新截图,并使用 screenshot_diff 以检测意外的视觉变化。
📋 表单自动化和数据输入
在单个表单中填写复杂的多字段表单 fill_form 电话。自动化跨桌面应用程序的重复数据输入。
🏗️ CI/CD桌面测试
集成到构建管道中,以便在每次构建后自动测试桌面应用程序。MCP服务器通过stdio传输运行无头兼容。
🔍 可访问性审计
检查UI自动化树,以验证所有控件是否具有正确的Automation ID、名称和模式——这对屏幕阅读器的兼容性至关重要。
安装
适用于 任何MCP客户端 --VS Code、Claude Desktop、Cursor、Windsurf、Cline等。
选项1:npm(随处可用)⭐
使用任何MCP客户端运行WinApp MCP的通用方法。不。需要NET SDK。
npm install -g winapp-mcp
或者直接运行而不安装:
npx -y winapp-mcp
然后添加到MCP客户端配置中(请参阅 客户端特定配置 在......下面
选项2:VS代码扩展(VSIX)
VS Code/GitHub Copilot用户最简单的方法。捆绑MCP服务器并在安装时自动注册。
- 下载最新
.vsix文件来自 发布 - 在VS代码中:
Ctrl+Shift+P→ “扩展:从VSIX安装…” → 选择文件 - 重新加载VS代码——MCP服务器自动注册
注: 也可从 VS代码扩展市场 --在扩展中搜索“WinApp MCP”。
选项3:从源代码构建
git clone https://github.com/floatingbrij/desktop-pilot-mcp.git
cd desktop-pilot-mcp/src
dotnet build
dotnet run
发布为自包含的可执行文件(目标上不需要.NET SDK):
dotnet publish -c Release -r win-x64 --self-contained
# Output: bin/Release/net10.0-windows10.0.19041.0/win-x64/publish/WinAppMCP.exe
客户端配置
VS代码/GitHub副本
选项A --安装VSIX(自动注册,无需配置)。
选项B --添加到 .vscode/mcp.json 在您的工作空间中:
{
"servers": {
"winapp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "winapp-mcp"]
}
}
}
克劳德桌面
添加 %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"winapp": {
"command": "npx",
"args": ["-y", "winapp-mcp"]
}
}
}
光标
添加到光标设置→ MCP服务器,或 .cursor/mcp.json:
{
"mcpServers": {
"winapp": {
"command": "npx",
"args": ["-y", "winapp-mcp"]
}
}
}
帆板运动
添加 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"winapp": {
"command": "npx",
"args": ["-y", "winapp-mcp"]
}
}
}
Cline(VS代码扩展)
通过临床MCP设置或 cline_mcp_settings.json:
{
"mcpServers": {
"winapp": {
"command": "npx",
"args": ["-y", "winapp-mcp"]
}
}
}
任何其他MCP客户端
WinApp MCP使用 stdio传输 (JSON-RPC通过标准输入/标准输出)。为您的客户指出:
npx -y winapp-mcp
或者直接在可执行文件上:
path/to/WinAppMCP.exe
⚠️ 注意事项
此工具控制您的鼠标和键盘。 当自动化运行时,它将移动光标、单击按钮并键入文本。在测试执行期间,不要与计算机交互——这可能会干扰自动化并产生意外结果。
最小化/锁定模式: 当应用程序最小化或会话锁定时,WinApp MCP会自动回退到UIA模式(调用模式、值模式)
PrintWindow对于屏幕截图,在此模式下不使用鼠标或键盘模拟。
开始之前
- 关闭敏感应用程序 --该工具可以列出所有可见的窗口及其标题。在自动化会话期间关闭私人应用程序。
- 保存您的工作 --自动化与实时应用程序交互。不正确的单击可能会关闭其他应用程序中未保存的工作。
- 单次会话 --一次运行一个自动化会话。并发会话可能会导致鼠标/键盘冲突。
自动化过程中
- 请勿触摸鼠标/键盘 --让自动化完成。在操作过程中移动鼠标可能会导致点击错过目标。
- 使用
release_all--如果自动化意外停止,并且您的Ctrl/Shift/Alt键感觉“卡住”,请致电release_all重置。 - 观察超时 --所有阻塞操作都有超时。如果一个元素没有出现,调用将优雅地失败,而不是挂起。
已知限制
- 仅限Windows --需要Windows 10版本1903+或Windows 11
- UI自动化依赖关系 --目标应用程序必须公开UIA树。完全自定义绘制的应用程序(DirectX/OpenGL游戏、具有自定义渲染的Electron)可能对UIA支持有限或没有支持。
- 无跨进程剪贴板写入 —
get_clipboard读取剪贴板内容,但不写入 - 流程范围 --服务器每次为每个应用ID连接一个应用。为多应用工作流使用多个应用ID。
- 屏幕分辨率 --屏幕截图坐标是绝对的。远程办公桌上的自动化或不同的DPI可能需要调整。
- 管理员应用程序 --如果目标应用程序以管理员身份运行,则MCP服务器也必须以提升权限运行。
- 单显示器优化 --多显示器坐标转换不自动处理
- 锁定会话限制 --当桌面锁定(Win+L)时,使用UIA模式的操作(通过Invoke点击、读/写值、通过PrintWindow截图)可以工作,但原始鼠标/键盘模拟则不能。服务器会自动检测到这一点,并在可能的情况下使用基于模式的回退。
工具概述
WinApp MCP公开 55工具 分为10类:
应用程序生命周期(5个工具)
| 工具 | 说明 |
|---|---|
launch_app |
按可执行路径启动Windows应用程序 |
attach_to_app |
按名称附加到正在运行的进程 |
attach_to_pid |
通过PID附加到正在运行的进程 |
close_app |
关闭被跟踪的应用程序 |
list_apps |
列出当前跟踪的所有应用程序 |
窗口和元素发现(7个工具)
| 工具 | 说明 |
|---|---|
list_windows |
列出被跟踪应用程序的所有窗口 |
list_desktop_windows |
列出所有可见的桌面窗口 |
get_snapshot |
获取UI树快照(如浏览器DOM检查) |
get_focused_element |
获取当前关注元素的信息 |
find_elements |
使用筛选器(类型、id、名称)搜索元素 |
find_all_elements |
列出所有带索引的匹配元素 |
find_elements_fuzzy |
模糊搜索——容忍拼写错误和部分名称 |
读取和检查(5个工具)
| 工具 | 说明 |
|---|---|
read_element |
读取UI元素的详细属性 |
read_element_by_index |
按索引读取属性(从 find_all_elements) |
get_element_bounds |
获取边界矩形(屏幕坐标) |
element_exists |
快速布尔检查——此元素是否存在? |
get_all_values |
一次读取所有可编辑的字段值 |
点击与互动(8个工具)
| 工具 | 说明 |
|---|---|
click_element |
按Automation Id或名称单击UI元素 |
double_click_element |
双击UI元素 |
right_click_element |
右键单击(打开上下文菜单) |
click_at_coordinates |
点击屏幕绝对坐标 |
invoke_element |
通过UIA调用模式/切换模式调用 |
select_option |
在一次调用中选择组合框/下拉选项 |
expand_collapse_element |
展开、折叠或切换树/菜单项 |
drag_element |
从一个元素拖动到另一个元素 |
输入(4个工具)
| 工具 | 说明 |
|---|---|
type_text |
在文本字段中键入文本 |
press_key |
按一个键(回车、制表、退出等) |
press_key_combo |
按组合键(Ctrl+S、Alt+F4) |
fill_form |
在一次调用中填写多个表单字段 |
等待与同步(4个工具)
| 工具 | 说明 |
|---|---|
wait_for_element |
等待元素出现 |
wait_for_condition |
等待属性达到值 |
wait_for_input_idle |
等待窗口准备好输入 |
release_all |
紧急情况:松开所有卡住的修改键 |
屏幕截图和可视化(5个工具)
| 工具 | 说明 |
|---|---|
take_screenshot |
将应用程序窗口捕获为PNG格式 |
take_screenshot_optimized |
LLM代币预算自动调整大小的屏幕截图 |
annotate_screenshot |
在图元周围绘制红色边界框 |
screenshot_diff |
像素差异两张截图,突出显示变化 |
get_tree_hash |
哈希UI树以检测更改 |
HWND多窗口(3个工具)
| 工具 | 说明 |
|---|---|
click_element_hwnd |
按控制柄在特定窗口中单击 |
set_value_hwnd |
通过句柄在特定窗口中设置文本 |
get_snapshot_hwnd |
按句柄显示特定窗口的UI快照 |
高级模式(6个工具)
| 工具 | 说明 |
|---|---|
get_grid_item |
按行/列访问DataGrid单元格 |
find_item_by_property |
在容器中搜索(HKEY_containerPattern) |
scroll_into_view |
将元素滚动到可见区域 |
realize_virtualized_item |
将虚拟化项目加载到UI树中 |
scroll_element |
在可滚动的容器内滚动 |
invalidate_cache |
强制刷新缓存的窗口引用 |
事件监控(3个工具)
| 工具 | 说明 |
|---|---|
start_event_monitor |
开始监视UI事件(焦点/结构/属性) |
stop_event_monitor |
停止监视会话或所有会话 |
get_event_log |
从监控会话中读取捕获的事件 |
会话和窗口管理(2个工具)
| 工具 | 说明 |
|---|---|
restore_window |
还原最小化的窗口并将其置于前台 |
check_session_status |
检查桌面是否已锁定,应用程序是否已最小化,并报告可用操作 |
📖 包含参数、示例和提示的完整工具文档: 看 文件.md
快速开始
示例1:启动并检查应用程序
User: "Open Notepad and show me the UI tree"
AI calls:
1. launch_app(exePath: "C:\\Windows\\notepad.exe") → "app_1234"
2. get_snapshot(appId: "app_1234", maxDepth: 3) → UI tree
示例2:填写表格并保存
User: "Create a new invoice in the app"
AI calls:
1. attach_to_app(processName: "MyApp") → "app_5678"
2. click_element(appId: "app_5678", name: "Invoices") → navigates
3. wait_for_element(appId: "app_5678", name: "New") → page loaded
4. click_element(appId: "app_5678", name: "New") → opens form
5. fill_form(appId: "app_5678", fieldsJson: { → fills all fields
"CustomerComboBox": "Acme Corp",
"ItemName": "Widget",
"Quantity": "10"
})
6. click_element(appId: "app_5678", name: "Save") → saves
7. take_screenshot(appId: "app_5678", outputPath: "...") → evidence
示例3:测试状态转换
User: "Test the invoice lifecycle"
AI calls:
1. click_element(appId: "app_5678", name: "Mark as Sent")
2. wait_for_condition(appId: "app_5678", property: "name",
expectedValue: "Sent", automationId: "StatusBadge")
3. element_exists(appId: "app_5678", name: "Record Payment") → "true"
4. click_element(appId: "app_5678", name: "Record Payment")
5. take_screenshot_optimized(appId: "app_5678", outputPath: "...", maxTokens: 1000)
演出
WinApp MCP针对快速连续多次检查同一UI的AI代理工作流程进行了优化:
| 操作 | 无缓存 | 有缓存 | 改进 |
|---|---|---|---|
get_snapshot (复杂应用程序) |
400-800ms | 50-100ms | 快8倍 |
find_elements (50个结果) |
300-600ms | 20-50ms | 快12倍 |
click_element (按名称) |
200-500ms | 30-80ms | 快6倍 |
| 窗口查找 | 100-300ms | <1ms | 快300倍 |
这 后代缓存 是最大的胜利-- FindAllDescendants() 是最昂贵的UIA操作,AI代理通常在每个UI状态下调用它3-5次。2秒TTL确保数据新鲜,同时避免冗余遍历。
缓存是 自动失效 在任何突变(点击、键入、设置值)之后,你总是能得到准确的结果。
建筑
src/
├── Program.cs # Entry point — .NET Generic Host + MCP server registration
├── WinAppTools.cs # 55 MCP tool definitions (thin wrappers)
├── WinAppAutomation.cs # Core automation engine (~2800 lines)
└── WinAppMCP.csproj # .NET 10, FlaUI.UIA3 5.0.0, MCP 1.1.0
设计原则:
- 薄刀具层 —
WinAppTools.cs仅包含[McpServerTool]包装纸。零商业逻辑。 - 单台自动化引擎 —
WinAppAutomation.cs处理所有UIA交互、缓存和状态管理。 - 静态单例 --一个
WinAppAutomation实例在所有工具调用中共享。 - 标准运输 --通过stdin/stdout清理JSON-RPC。日志记录仅转到stderr。
- FlaUI之外没有外部依赖 --没有Selenium,没有WebDriver,没有COM互操作包装器。
技术栈
| 组件 | 技术 | 版本 |
|---|---|---|
| 运行时 | 。净值 | 10.0 |
| UI自动化 | FlaUI。UIA3 | 5.0.0 |
| MCP协议 | 模型上下文协议 | 1.1.0 |
| 托管 | 微软。扩展。主机 | 10.0.3 |
| 目标操作系统 | Windows | 10(1903年以上)/11 |
| 体系结构 | x64 | win-x64 |
与备选方案的比较
| 功能 | WinApp MCP | CursorTouch/Windows MCP | 机车/ui自动化mcp |
|---|---|---|---|
| 工具 | 55 | ~15 | 39 |
| UIA图书馆 | FlaUI(托管) | FlaUI(管理) | 原始COM互操作 |
| 运行时 | .净10 | 。网8 | 。NET 9(原生AOT) |
| 建筑 | 单流程 | 单流程 | 6个项目,多流程 |
| 缓存 | ✅ 后代+窗口 | ❌ | ❌ |
| 模糊搜索 | ✅ Levenstein距离 | ❌ | ❌ |
| HWND瞄准 | ✅ 完整(单击、值、快照) | ❌ | ✅ 部分 |
| 事件监控 | ✅ 焦点、结构、属性 | ❌ | ✅ 只专注 |
| 网格图案 | ✅ | ❌ | ✅ |
| 虚拟化 | ✅ | ❌ | ❌ |
| 屏幕截图差异 | ✅ | ❌ | ❌ |
| 表格填写 | ✅ 批次 | ❌ | ❌ |
| 令牌感知屏幕截图 | ✅ | ❌ | ❌ |
| 拖放 | ✅ | ❌ | ❌ |
| 最小化应用程序支持 | ✅ 自动还原+打印窗口 | ❌ | ❌ |
| 锁定会话支持 | ✅ UIA模式回退 | ❌ | ❌ |
| VS代码扩展 | ✅ VSIX+市场 | ❌ | ❌ |
| npm包 | ✅ npx winapp-mcp |
❌ | ❌ |
| 多客户端 | ✅ 复制品,克劳德,光标,风帆 | ❌ 仅VS代码 | ❌ |
文档
需求
- 操作系统: Windows 10(版本1903/内部版本18362)或更高版本,或Windows 11
- 运行时间: .NET 10.0 SDK(用于从源代码构建)-如果使用VSIX或预构建的二进制文件,则不需要
- 编辑: VS代码1.99+,带GitHub复制副本(用于VSIX扩展)
- 目标应用程序: 必须公开UI自动化树(WinUI3、WPF、WinForms、UWP、大多数Win32应用程序)
贡献
欢迎投稿!拜托:
- 分叉存储库
- 创建要素分支(
git checkout -b feature/amazing-tool) - 提交您的更改(
git commit -m 'Add amazing-tool') - 推到分支(
git push origin feature/amazing-tool) - 打开拉取请求
开发设置
git clone https://github.com/floatingbrij/desktop-pilot-mcp.git
cd desktop-pilot-mcp/src
dotnet restore
dotnet build
dotnet run # Starts the MCP server on stdio
许可证
该项目根据 MIT许可证 --看看 许可证 文件以获取详细信息。
Built entirely with GitHub Copilot by Brijesharun G — for AI-powered Windows app testing.
If this helps your workflow, give it a ⭐