mcpField
N
Netwright

Netwright

本地服务
github.com/ricfanin开发工具202 天前更新

关于 Netwright

Netwright 是供 AI Agent 自动化操作 WPF、WinForms 和 WinUI 桌面应用的 MCP 服务,提供精简界面快照和后台操作,并可将验证过的流程导出为 C# 回归测试。

主要功能

  1. 01自动化 WPF、WinForms 和 WinUI
  2. 02查看精简界面快照
  3. 03在后台操作,不占用前台
  4. 04验证状态并等待界面变化
  5. 05将操作流程导出为 C# 测试

适用场景

  1. 01测试 .NET 应用中的表单和表格
  2. 02让 AI Agent 探索桌面界面
  3. 03根据验证过的流程创建回归测试

MCP 相关

Netwright 向 MCP 客户端提供启动桌面应用、检查和操作界面、验证状态及导出测试的工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
nugetNetwright2.1.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Netwright

面向 .NET 桌面应用的 Playwright 风格自动化。 Netwright 是一个 MCP 服务,可让 AI Agent 查看和操作 WPF、WinForms 和 WinUI 应用:它们启动你的项目,以精简文本读取 UI,在不抢占鼠标的情况下执行操作,验证结果,并将已验证的流程转化为回归测试。

CI NuGet License: MIT

Netwright 演示:Agent 在隐藏运行的 WPF 应用中填写并提交订单,然后导出回归测试

▶ 观看带声音的演示

前身为 WPF-MCP。2.0 版进行了重写;请参阅 从 WPF-MCP 1.x 迁移。

> desktop_app action=launch project=src/Orders/Orders.csproj
Launched Orders.exe (pid 9120, WPF, launched by Netwright)
- window "Orders" [e1]

> desktop_snapshot
- window "Orders" [e1]
  - textbox "Customer" [e4] #txtCustomer
  - combobox "Country" [e5] #cmbCountry collapsed
  - checkbox "Accept terms" [e6] #chkTerms unchecked
  - button "Save" [e7] #btnSave disabled

> desktop_set_state target=#chkTerms checked=true
checked checkbox "Accept terms" [e6] #chkTerms
~ checkbox "Accept terms" [e6] #chkTerms checked
~ button "Save" [e7] #btnSave

> desktop_click target=#btnSave
clicked button "Save" [e7] #btnSave
+ window "Confirm" [e9] modal
  + text "Save order 42?"
  + button "Yes" [e10]

为什么选择 Netwright

  • 专为 .NET 应用打造。 通过 UI Automation 支持 WPF、WinForms(.NET 和 .NET Framework 4.x)以及 WinUI/MAUI。它直接从 .csproj 启动应用,捕获 stdout/stderr 和 Trace 输出,并报告包含异常和堆栈跟踪的崩溃信息。
  • 节省 token。
    • 快照经过筛选,只保留 Agent 所需内容:折叠未命名的布局窗格,并按行汇总网格。
    • 操作会返回变更报告,说明哪些内容出现、消失或发生变化,因此 Agent 很少需要再次获取快照。
    • 引用(e12)在不同快照之间仍然有效。
  • 不打扰你的工作。 操作在后台运行:对于由 Netwright 启动的应用,一个小型伴随程序会在应用内部执行操作,因此应用不会进入前台,绑定字段也会像真实编辑一样提交。你可以继续工作,同时让 Agent 进行测试。按键和右键操作会明确执行,短暂获取焦点后再将焦点还给你。
  • 默认可靠。
    • 每项操作都会等待目标启用并显示在屏幕上。
    • 随后会等待 UI 稳定下来,因此异步屏幕无需使用休眠等待。
    • 失败会以错误代码返回,并附带下一步操作提示。
  • 从探索到回归测试。 desktop_expect 用于验证状态,desktop_export_test 可将会话转化为基于 Netwright.Testing 的 C# 测试(xUnit、NUnit 或 MSTest)。

基准测试

所有 MCP 服务使用相同场景、相同 Fixture App 和相同 token 编码(完整方法和所有数据见 benchmarks/results):

WPF Fixture App,5 次运行的中位数WPF-MCP 1.0FlaUI-MCPWindows-MCPNetwright 2.0
每轮发送的工具定义(tokens)2,023(24 个工具)1,418(12 个)3,984(20 个)1,387(15 个)
表单快照(tokens)1,0237851,956¹385
1000 行网格快照(tokens)3,9886,2341,897¹627
填写并提交表单:调用次数 / tokens10 / 2,46310 / 3,469–²6 / 549
同一表单在 WinForms 上的成功次数0/50/5–²5/5
等待异步加载:调用次数 / tokens5 / 3,3375 / 2,484–²3 / 405
屏幕截图(tokens)25,0731,0001,9441,020
含 1000 行未虚拟化数据的 WinForms 网格:快照耗时9.2 s12.9 s0.3 s¹1.5 s

¹ Windows-MCP 汇总的是整个桌面,而不是应用的 UI 树;其网格快照不包含网格行。² 它通过真实鼠标在屏幕坐标处执行操作,因此未运行脚本化流程。

tokens 使用 o200k_base 计算,作为 Claude 分词器的近似值。Netwright 每次调用的操作速度较慢:表单流程耗时约 1.8 s,而其他方案约为 0.6 s,因为每项操作都会等待 UI 稳定下来。作为交换,响应中已包含操作结果,因此 Agent 需要的调用更少,消耗的 tokens 也大幅减少。

安装

需要 Windows 10/11 和 .NET 10 SDK。你的应用可以面向任何 .NET 或 .NET Framework 版本。

Claude Code

claude mcp add netwright -- dnx Netwright --yes

任何 MCP 客户端(Claude Desktop、Cursor、VS Code、Copilot……)

{
  "mcpServers": {
    "netwright": {
      "command": "dnx",
      "args": ["Netwright", "--yes"]
    }
  }
}

想使用全局工具?运行 dotnet tool install -g Netwright,并使用 "command": "netwright"。若要限制 Agent 可以操作的应用,请在参数中添加 "--", "--allow", "MyApp*"。所有选项请参阅集成指南。

工具

工具功能
desktop_app启动 .exe 或构建并启动项目、附加、关闭、查看状态
desktop_snapshot将 UI 转换为带有 Refs 的精简文本
desktop_find查找与 Selector 匹配的元素(#id、role "name"、a >> b)
desktop_inspect查看单个元素的属性、模式和稳定的 Selector
desktop_click点击(后台;使用 foreground 可右键或双击)
desktop_type设置文本(后台)或输入实际按键
desktop_set_state勾选、选择、展开、设置值或按名称选取项目
desktop_press_key按下按键和快捷键(前台)
desktop_scroll按方向滚动、滚动到边缘或滚动到视图范围内
desktop_window列出、激活、最小化、最大化、还原、关闭窗口
desktop_screenshot获取窗口或元素的图像,即使被遮挡也可以
desktop_wait等待元素状态或文本;报告发生的更改
desktop_expect重试断言:文本、值、启用状态、勾选状态、数量……
desktop_logs应用输出:stdout、stderr、debug/trace
desktop_export_test将会话转换为 C# 回归测试

完整参考:docs/TOOLS_REFERENCE.md。

支持的 UI 技术

级别技术说明
1WPF、WinForms(.NET 6+ 和 .NET Framework 4.x)提供 Fixture App,每次更改都会运行集成测试,并经过基准测试
2WinUI 3、Windows 上的 .NET MAUI提供 Fixture App 和集成测试
3Avalonia、Uno Platform通过 UI Automation 尽力支持

其他 Windows 应用(Win32、Qt、Electron……)通常也能运行,因为 Netwright 使用标准的 UI Automation,但不提供支持。

如果你的应用在需要操作的控件上设置了 AutomationProperties.AutomationId(WPF/WinUI)或 Name(WinForms),自动化效果会更好。请参阅让应用更适合自动化操作。

无需 Agent 的回归测试

[Fact]
public async Task Saving_an_order_asks_for_confirmation()
{
    await using var app = await DesktopApp.LaunchProjectAsync(@"..\..\..\..\src\Orders\Orders.csproj");

    await app.TypeAsync("#txtCustomer", "Rossi");
    await app.CheckAsync("#chkTerms");
    await app.ClickAsync("#btnSave");

    await app.Expect("window \"Confirm\"").ToBeVisibleAsync();
}

dotnet add package Netwright.Testing。这是 desktop_export_test 为你编写的代码。

工作原理

Netwright 使用一次缓存的 UI Automation 查询捕获每个窗口。窗口通过 Win32 查找,只请求约 20 个属性,并在提供程序内部过滤屏幕外的元素。随后,它会根据捕获结果生成过滤后的文本,在内存中解析 Selectors,并通过 RuntimeId 比较树以生成更改报告。详情和测量数据:docs/ARCHITECTURE.md。术语:CONTEXT.md。设计决策:docs/adr。

从 WPF-MCP 1.x 迁移

1.x2.0
wpf_launch_application、wpf_attach_application、wpf_close_applicationdesktop_app action=launch|attach|close
wpf_snapshot(每次快照都会重置 refs)desktop_snapshot(refs 保持稳定)
wpf_find_element、wpf_get_element_propertiesdesktop_find、desktop_inspect
wpf_click、wpf_typedesktop_click、desktop_type;两者都接受 Ref 或 Selector
wpf_set_value、wpf_toggle、wpf_select、wpf_expand_collapsedesktop_set_state(value、checked、item、expanded)
wpf_press_keydesktop_press_key foreground=true
wpf_scroll、wpf_scroll_into_view、wpf_focusdesktop_scroll(direction、to、into_view)
wpf_list_windows、wpf_switch_window、wpf_window_actiondesktop_window
wpf_take_screenshot(base64 文本)desktop_screenshot(图像内容)
wpf_wait_fordesktop_wait(也可等待文本)
wpf_console_messagesdesktop_logs
wpf_set_background_mode后台模式为默认值;需要时可在每次调用中传入 foreground=true
JSON 信封(success、data、metadata)精简文本;错误以包含 code 和 hint 的 isError 结果返回

软件包现已更名为 Netwright(命令为 netwright),取代 WpfMcp.Server(wpf-mcp)。

贡献

欢迎提交问题和 PR。请参阅 CONTRIBUTING.md。使用 .\scripts\build.ps1 -Integration 进行构建和测试,并使用 .\scripts\benchmark.ps1 进行测量。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。