关于 XamlMcp
XamlMcp 是开源的 XAML MCP 服务与 AI 检查工具包,面向 Avalonia、WPF、WinUI 3 和 .NET MAUI 应用。它让 MCP 客户端检查并操作正在运行的应用,适合需要自动化调试或界面探查的开发者。
主要功能
- 01遍历可视树与逻辑树
- 02读写属性并检查样式与资源
- 03截取窗口或节点的 PNG 截图
- 04合成点击、按键、文本与滚轮输入
- 05通过认证的本地传输观察变化
适用场景
- 01让 AI 助手检查正在运行的 WPF 或 Avalonia 界面结构
- 02调试绑定错误与调度器失败
- 03在 Android 设备上检查 .NET MAUI 应用
MCP 相关
XamlMcp 是本地 stdio MCP 服务,向 Claude Code、Codex 等 MCP 客户端暴露 list-apps、tree、props、input、action 等工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
XamlMcp
XamlMcp 是一款开源的 XAML MCP 服务和 AI 检查工具包,适用于 Avalonia、WPF、WinUI 3 和 .NET MAUI。它让 Claude Code、Codex、GitHub Copilot 和其他 MCP 客户端能够检查并驱动正在运行的应用:遍历视觉树或逻辑树,读取和写入属性,检查样式和资源,捕获屏幕截图,发送输入,调用命令和自动化模式,并通过经过身份验证的本地传输观察变化。
请参阅 XamlMcp 安装与配置指南,了解适用于受支持框架和 AI 客户端的精简设置流程。
当前版本为 1.0.0-preview.3。它支持 Avalonia、现代 .NET WPF、独立部署且未打包的 WinUI 3,以及运行于 Windows 和 Android 的 .NET MAUI。协议版本 2 已稳定。原生 MAUI 节点、iOS 和 Mac Catalyst 暂不支持。
请参阅更新日志,了解面向用户的版本历史;参阅框架功能与工具矩阵,了解各工具的支持情况和能力限制。预览版发布指南介绍了各个包的用途、安装选项和验证命令。
软件包
| 软件包 | 说明 |
|---|---|
XamlMcp.Avalonia | 用于 Avalonia 应用的进程内 Agent(net8.0,Avalonia 11.3.18+ 和 12.x) |
XamlMcp.Wpf | 用于现代 .NET WPF 应用的进程内 Agent(net8.0-windows) |
XamlMcp.WinUI | 用于未打包 WinUI 3 应用的进程内 Agent(Windows App SDK 2.3.1) |
XamlMcp.Maui | 用于 .NET MAUI 10.0.80 的逻辑 Agent(net10.0、Windows 和 Android API 24+;屏幕截图需要 API 26+) |
XamlMcp.Windows.Input | Windows 框架 Agent 使用的共享防护型 Win32 原始输入核心 |
XamlMcp.Agent.Hosting | 与框架无关的桌面发现、身份验证和命名管道主机 |
XamlMcp.Protocol | 共享 JSON-RPC 协议契约——DTO 和帧处理;不依赖 UI 框架 |
XamlMcp.Server | Stdio MCP 服务:名为 xamlmcp 的 dotnet tool,用于将 AI 客户端连接到正在运行的 Agent |
安装
前提条件:你检查的应用可以面向 .NET 8 或更高版本,但 xamlmcp 工具(以及从源代码构建此仓库或示例)需要 .NET 10 SDK/runtime。
为你的 UI 框架添加 Agent 软件包:
dotnet add package XamlMcp.Avalonia --version 1.0.0-preview.3
dotnet add package XamlMcp.Wpf --version 1.0.0-preview.3
dotnet add package XamlMcp.WinUI --version 1.0.0-preview.3
dotnet add package XamlMcp.Maui --version 1.0.0-preview.3
Agent 要求的最低版本是 Avalonia 11.3.18。如果项目锁定了较旧的引用(当前的 avalonia.app 模板锁定为 11.3.0),还原会因 NU1605 软件包降级错误而失败——请将 Avalonia.* 软件包引用升级到至少 11.3.18。
安装 MCP 服务工具:
dotnet tool install --global XamlMcp.Server --version 1.0.0-preview.3
你也可以不进行全局安装,直接运行服务:
dnx [email protected]
附加 Avalonia Agent
有两种入口可显式选择启用诊断。只有按构建启用 Agent(选项 B)或按启动启用 Agent(选项 A)时,才会开始监听:
using XamlMcp.Avalonia;
// Option A - fluent, in BuildAvaloniaApp. Compiled in, but INERT unless the
// XAML_MCP=1 environment variable is set when the app launches.
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.AttachXamlMcp();
// Option B - on the Application instance (e.g. in OnFrameworkInitializationCompleted).
// Marked [Conditional("DEBUG")]: the CALL SITE disappears from YOUR Release builds.
public override void OnFrameworkInitializationCompleted()
{
this.AttachXamlMcp();
base.OnFrameworkInitializationCompleted();
}
为什么有两种形式?[Conditional] 要求方法返回 void,因此流畅式 AppBuilder 重载无法使用它,而是通过环境变量进行门控。为什么不在软件包中直接使用 #if DEBUG?这样会根据此软件包打包时的编译方式进行门控,完全无法获知你的应用配置。两种重载分别根据你的构建配置或启动环境进行门控。
请注意两者的区别:选项 B 的调用会从 Release 二进制文件中完全移除;选项 A 的代码会包含在 Release 中,但除非启动时存在 XAML_MCP=1,否则不会生效——任何能够控制启动环境的人都可以启用它。如果你使用流畅式写法,但需要彻底排除它,请用你自己的 #if DEBUG 包裹 .AttachXamlMcp() 这一行。
附加 WPF Agent
在 OnStartup 中对 WPF Application 调用扩展方法:
using System.Windows;
using XamlMcp.Wpf;
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
this.AttachXamlMcp();
base.OnStartup(e);
}
}
WPF 方法使用 [Conditional("DEBUG")],因此调用点会从使用该方法的应用的 Release 构建中消失。没有可通过环境变量启用的 WPF 重载。Agent 使用执行附加操作的 Application.Dispatcher。由 WPF 次要 UI 线程拥有的窗口和控件不在支持范围内。
附加 WinUI Agent
在 WinUI UI 线程上附加,显式注册每个 Window,并将调用放在应用的诊断构建门控内:
using Microsoft.UI.Xaml;
using XamlMcp.WinUI;
public partial class App : Application
{
private WinUiXamlMcpSession? _xamlMcp;
private IDisposable? _windowRegistration;
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
var window = new MainWindow();
#if DEBUG
var session = WinUiXamlMcp.Attach();
_xamlMcp = session;
_windowRegistration = session.RegisterWindow(window);
window.Closed += async (_, _) =>
{
_windowRegistration?.Dispose();
await session.DisposeAsync();
};
#endif
window.Activate();
}
}
Attach() 不会被条件编译:调用方负责设置 #if DEBUG 或等效的诊断门控。一个会话支持一个 DispatcherQueue,以及该队列上显式注册的窗口。最低支持版本为 Windows App SDK 2.3.1、目标框架
net8.0-windows10.0.19041.0、Windows 10 1809(10.0.17763.0)和 win-x64。
WinUI 支持非打包模式。使用 WindowsPackageType=None、
WindowsAppSDKSelfContained=true,并发布到一个全新的目录:
dotnet publish MyWinUiApp.csproj -c Release -r win-x64 --self-contained true -o artifacts/winui
发布输出必须保留生成的 .xbf 和 .pri 资源。不支持 MSIX/包身份、证书、Store 分发、XAML Islands 和多个 UI 线程。
附加 .NET MAUI Agent
在构建 MAUI 应用时,于应用的诊断构建门控内调用 UseXamlMcp():
using XamlMcp.Maui;
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder()
.UseMauiApp<App>();
#if DEBUG
builder.UseXamlMcp();
#endif
return builder.Build();
}
同一软件包和 UseXamlMcp() 调用适用于非打包的 Windows 应用,以及运行 MAUI 10.0.80 的可调试 Android 应用。该软件包不会检查使用方的配置,因此调用方必须设置 #if DEBUG 或等效的诊断门控。Android 项目必须将 SupportedOSPlatformVersion 设为 24.0 或更高版本。截图需要 API 26 或更高版本。
在 Windows 上,Agent 会在 %LOCALAPPDATA%/XamlMcp/instances/ 下写入发现文件(使用 XAML_MCP_DIR 可覆盖该目录),并通过当前用户的命名管道提供 JSON-RPC 2.0 服务。在 Android 上,它只监听设备环回地址,并在应用私有存储中保存每次启动的描述符。服务通过可调试的 run-as 访问读取该描述符,并且仅在连接期间创建由其管理的 adb forward。两种传输方式都要求在任何检查调用之前提供每次启动的令牌。
要发现 Android 应用,请将其应用 ID 传递给 MCP 服务。授权设备在线数量超过一个时,请明确选择设备:
claude mcp add xamlmcp -- xamlmcp --android-package dev.example.app --android-device emulator-5554
Windows 构建所需的前置条件是 .NET 10 SDK 和 MAUI Windows 工作负载。Android 还需要 .NET Android 工作负载和 Android SDK 平台工具(adb)。不支持 iOS 和 Mac Catalyst。
连接 AI 客户端
XamlMcp 是本地 stdio MCP 服务。Claude Code 或 Codex 会在客户端会话需要时启动它;无需运行持久服务进程。
此代码库包含适用于这两个客户端的可移植项目配置:
.mcp.json配置 Claude Code。.codex/config.toml在受信任的检出目录中配置 Codex。
这两种配置都通过 dnx 直接运行固定版本的预览版 NuGet 软件包,因此需要 .NET 10 SDK,但无需全局安装工具。克隆代码库后,打开新的客户端会话并验证注册:
claude mcp get xamlmcp
codex mcp get xamlmcp
若要为你的用户帐户或从其他项目注册固定版本的预览版,请运行:
claude mcp add --scope user xamlmcp -- dnx [email protected]
codex mcp add xamlmcp -- dnx [email protected]
或者,全局安装该工具并注册其 xamlmcp 命令:
dotnet tool install --global XamlMcp.Server --version 1.0.0-preview.3
claude mcp add --scope user xamlmcp -- xamlmcp
codex mcp add xamlmcp -- xamlmcp
如果客户端已有名为 xamlmcp 的服务,请先移除或更新该条目,再添加新的服务。根据需要使用 claude mcp remove xamlmcp --scope <local|user|project> 或
codex mcp remove xamlmcp。
接下来启动经过插桩的应用。使用 Avalonia 的 fluent 附加形式时,请设置 XAML_MCP=1。然后让客户端依次调用 list-apps → attach(instanceId) → 下方任意工具。
整数 PID 附加仍是 Windows 桌面的兼容方式。
| 工具 | 用途 |
|---|---|
list-apps | 正在运行的已插桩应用(不透明实例 ID、平台和已清理的元数据;桌面条目还包含 pid) |
attach | 连接到一个应用;报告其各工具的能力标志 |
detach | 释放当前应用连接及其传输资源 |
tree | 视觉/逻辑树快照;节点 ID 的来源 |
search | 按自动化 ID/类型/名称/样式类/伪类/文本查找节点 |
ancestors | 节点的祖先链 |
props | 属性及其值、来源/优先级、自动化模式和命令槽 |
set-prop | 写入属性,或清除本地值(unset) |
styles | 已应用的样式选择器和设置器(受能力限制) |
bindings | 活动绑定、来源/路径/状态/错误、DataContext 来源和模板标识 |
failures | 在可选的操作关联游标之后,获取有界的绑定/调度器故障证据 |
resources | 获取节点或应用作用域中可见的已解析资源 |
pseudo-class | 切换 :pointerover、:pressed 等状态 |
screenshot | 窗口或节点的 PNG 图像,可选包含同次捕获的节点映射 — 以真正的 MCP 图像形式返回 |
wait-for | 有界轮询节点是否存在、可见、已启用/已聚焦,或是否满足属性谓词 |
hit-test | 按深度优先顺序返回逻辑坐标处的视觉堆栈,并包含节点引用和缩放信息 |
input | 合成点击、按键、文本和滚轮操作 |
action | 自动化模式(invoke/toggle/select/…)和绑定的 ICommand |
assets | 列出不透明的框架资源标识符(avares://、WPF pack、xamlmcp-asset:/// 或 maui-asset:///) |
open-asset | 读取资源(图像以图像形式返回,文本以文本形式返回) |
dialog-wait | 驱动程序,可选启用:等待应用打开的原生对话框(文件选择器、消息框) |
dialog-act | 驱动程序,可选启用:对其执行操作 — set-file-name、accept、cancel、select-button |
window-list | 驱动程序,可选启用:列出应用的顶层窗口及其状态和边界 |
window-act | 驱动程序,可选启用:对窗口执行 activate/move/resize/close 操作 |
AI 客户端作者需要了解以下三点:
-
定位: 节点工具接受精确的
{snapshotId, nodeId}目标,或使用automationId、name、type、text或styleClass的定位器,还可选择通过within限定范围。定位器 必须唯一匹配,除非明确指定nth;如果存在歧义,工具会返回带类型的候选项,而不会 静默选择节点。 -
观察: 每个会改变状态的工具(
set-prop、pseudo-class、input、action) 都会等待一个稳定窗口(默认为 250 ms),并返回变更摘要。对于快速操作序列,可传入settleMs: 0或observe: false。在 Avalonia 和 WPF 上,同一结果还包含failureCursor;将其传给failures,即可仅检索该操作之后观察到的绑定或调度器故障。可选的精确categories参数可筛选结果页。当truncated为 true 时,将nextCursor传回以获取下一页,避免跳过证据。 游标会在分离或替换连接时过期。 -
快照: 只要节点仍然有效,精确节点引用在当前快照及之前的三个快照中均可使用。对于必须经重新查询仍能继续的工作流,请使用定位器;遇到
stale-snapshot或stale-node错误时,表示需要重新解析目标。
WPF 功能说明
- 已启用并经实时验证的功能包括
tree、按类型/名称/文本search、ancestors、属性、资源、屏幕截图、路由输入、 操作、观察和打包资源。 - WPF 没有类似 Avalonia 的类或伪类集合。样式类/伪类搜索和
pseudo-class修改会返回unsupported-capability。 - 已启用
styles,但功能有意受限:WPF 提供已声明的样式、setter、触发器和值来源,而非完整的已应用选择器级联。请读取结果中的degraded和degradationReason。 - 已启用
bindings。它会报告简单和复合绑定声明、当前状态和验证错误、DataContext 继承、模板化父级,以及命名的控件/内容/项目/标题模板槽。WPF 不会保留直接逸出到应用代码中的转换器异常;绑定表达式中体现的转换器失败会报告为converter-error。 - 已启用
failures,可捕获有界的绑定跟踪和调度程序异常证据。它只会在首次修改或查询failures之前开始捕获,会保留现有的 WPF 跟踪侦听器,也不会将调度程序异常标记为已处理。WPF 要求进行进程级跟踪刷新,而公共 API 无法撤销此操作;分离时会移除 XamlMcp 的侦听器并恢复其源级别,但框架的内部跟踪基础设施在该进程中仍保持初始化状态。 - 路由输入会引发 WPF 事件,并报告机制
routed;它不声称等同于物理鼠标、焦点、捕获或Mouse.DirectlyOver。非空的modifiers会返回unsupported-capability,因为路由事件构造无法注入修饰键状态。input-raw为 false,因为公共的InputManager.ProcessInput验证也未能满足这些要求。 - WPF 屏幕截图通过
RenderTargetBitmap渲染。单独的弹出窗口必须通过其自身的 tree ref 捕获;原生子 HWND 和 GPU/空域内容不在此渲染范围内。 assets会枚举 SDK 生成的*.g.resources,并且只打开由其自身提供的标识符。这是编译器约定——WPF 没有公共的包资源枚举 API——普通复制的Content文件不会被列出。
WinUI 功能说明
- 已启用并通过实时验证的功能包括可视化
tree、类型/名称/文本search、祖先节点、资源、屏幕截图、语义操作、 命令槽、未打包资源和有界观测。 tree.logical=false和props.complete=false。属性枚举使用文档中列出的已知依赖属性目录;目录之外的读取和写入会返回类型化错误,而不会声称属性枚举完整。styles已启用,但处于降级状态,因为 WinUI 不会公开完整的已应用选择器级联。屏幕截图使用RenderTargetBitmap;原生 HWND、空域/GPU 内容和独立顶层界面仍受文档所述渲染限制。input仅在mechanism: "raw"时启用;路由注入会返回unsupported-capability。原始点击、移动、滚轮、按键和输入文本使用受保护的SendInput:已注册的所有者必须恰好是前台根窗口,指针坐标必须仍解析到该 HWND,显式指定的键盘目标必须能够接收焦点。这些检查和注入并非原子操作,因此原始输入仅适用于明确启用的诊断会话。- 伪类修改以及按样式类/伪类搜索仍处于禁用状态。视觉状态不会被呈现为伪类。
bindings处于禁用状态并会返回unsupported-capability;WinUI 不会通过完整的公共检查 API 公开所需的绑定表达式图。failures处于禁用状态,直至在 M38 中实现等效的公共框架证据。- 资源以未打包应用程序目录为根目录,使用不透明的
xamlmcp-asset:///标识符,强制执行路径包含限制和字节数限制,并拒绝路径遍历和重解析点路径。 - 观测采用有界采样差异,并记录 Window/Popup 日志。请求范围快照时会生成新的快照,并使较早的节点引用失效,与其他桌面 Agent 的行为一致。
.NET MAUI 能力说明
tree必须使用scope: "logical"。节点引用仅标识 MAUIIVisualTreeElement对象; 永远不会返回原生处理程序PlatformView对象。- 类型/名称/文本/样式类搜索、祖先、可绑定属性、资源、降级样式、 截图、平台操作、打包资源和有界观测已在 Windows 和 Android 模拟器上实时验证。
- 属性枚举使用公共静态
BindableProperty字段,按设计并不完整。 在目标类型允许的情况下,支持写入标量、枚举、颜色、厚度、矩形和点;复杂对象写入会返回类型化错误。 - Windows 输入使用操作系统级原始注入,并报告
raw;不提供路由输入。 Android 通过 Activity/视图堆栈分发触摸、滚轮、按键和文本,并报告routed;绝不提供原始输入。 - 操作模式因节点和平台而异。公共
ICommand插槽在两个平台上均可用。Windows 映射 WinUI 自动化提供程序;Android 映射无障碍操作。 Android 仅提供具有可验证节点本地后置条件的操作;通用click/invoke和绝对百分比scroll会被有意拒绝。读取props.patterns可查看单个节点确切接受的动词。 styles有意采用降级实现。MAUI 视觉状态会报告为样式帧,而非协议伪类。伪类变更/搜索和原生树范围会返回unsupported-capability。bindings已禁用,并会返回unsupported-capability;MAUI 不会公开此契约所需的活动绑定表达式和源图。- 在 M38 实现等效的公共框架证据之前,
failures处于禁用状态。 - 截图在 Windows 上使用 WinUI 渲染,在 Android 上使用 PixelCopy,并在普通视图上回退到 Canvas。原生/空域内容和未附加的处理程序仍受平台限制。
MauiAsset项通过包的清单目标生成的不透明maui-asset:///标识符公开。只有由assets签发的标识符才能打开。- 观测使用有界逻辑指纹和平台生命周期日志。限定范围的快照会生成新的引用;可选像素哈希受平台截图限制。
- Android 支持 API 24+。截图需要 API 26+。iOS 和 Mac Catalyst 不受支持。
原生对话框和窗口管理(Windows,可选启用)
原生文件选择器和消息框是独立的 Win32 窗口——tree 无法看到它们,input 也无法访问它们。驱动程序在 XamlMcp.Server 内运行,以处理这一边界。默认关闭,且仅支持 Windows。在注册到 MCP 客户端的命令中启用它:
claude mcp add --scope user xamlmcp -- dnx [email protected] --enable-driver
codex mcp add xamlmcp -- dnx [email protected] --enable-driver
如果你安装了全局工具,请将 dnx [email protected] 替换为 xamlmcp。注册启用了 Driver 的命令之前,请移除或更新现有的 xamlmcp 客户端条目。
操作流程:点击打开对话框的按钮(input/action),然后
dialog-wait 会返回对话框引用及其结构(按钮自动化 ID、是否存在文件名编辑框——绝不包含控件值),接着由 dialog-act 以语义方式操作。
window-list/window-act 用于管理应用自身的顶层窗口(close 需要
confirm: true)。
范围与安全性:
- 仅匹配归属于已附加应用进程的对话框,并且只匹配上次变更调用之后出现的对话框——绝不会触碰预先存在的窗口。
set-file-name路径会根据--driver-file-roots <p1;p2;…>进行验证(默认值:你的 用户配置文件);任何不在范围内的路径都会导致类型化的path-not-allowed错误。- 不支持提权(UAC)应用和非交互式会话,并会报告类型化错误。
- 对话框引用会在分离、对话框关闭或应用退出时失效——请重新运行
dialog-wait。
安全模型
- 明确选择启用诊断 — 每个框架部分都会展示由调用方负责的构建或启动门控;只有应用选择启用后,才会开始监听。
- 令牌优先握手。 每种 Agent 传输方式都必须先使用其每次启动时生成的令牌进行身份验证,然后才能分发任何检查方法。未经身份验证的调用会收到类型化错误,连接随即关闭。
- 桌面端发现和管道。 Windows 命名管道使用
PipeOptions.CurrentUserOnly。在 Unix 上,发现文件仅对所有者可读写(目录权限为 0700,文件权限为 0600),并会在正常关闭时删除;服务端会清理 PID 已失效或已被复用的条目。 - Android 私有发现。 描述符保存在应用私有存储中,服务端只能通过可调试的
run-as读取。Agent 绑定到设备环回地址,服务端则创建并移除其拥有的确切 ADB 转发。令牌、私有路径、设备端口、主机端口和原始 ADB 输出都不会进入 MCP 结果或错误。 - 令牌和桌面管道名称绝不会出现在 MCP 输出或错误消息中。
- 一次仅允许一个经过身份验证的会话;后续客户端会在操作系统层面排队,直到当前会话结束。
示例
samples/SampleApp
是一个小型 Avalonia 应用,通过
.AttachXamlMcp() 接入,并提供每种工具都能操作的内容:一个菜单栏,以及涵盖选择、树、切换、文本、选择器和滚动/虚拟化控件的选项卡页面 — 这些也是控件交互矩阵测试套件端到端驱动的页面。运行并操作它:
XAML_MCP=1 dotnet run --project samples/SampleApp
samples/MauiSampleApp 是 Windows/Android MAUI 测试应用。Debug 构建中会启用 Agent 接入,Windows 目标则以未打包方式运行:
dotnet run --project samples/MauiSampleApp -f net10.0-windows10.0.19041.0
使用已安装的 SDK 工具构建其 Android 目标:
dotnet build samples/MauiSampleApp/MauiSampleApp.csproj -f net10.0-android -c Debug
(PowerShell:$env:XAML_MCP="1"; dotnet run --project samples/SampleApp。)
samples/WpfSampleApp
是 WPF 测试应用。其 Debug 构建会自动接入:
dotnet run --project samples/WpfSampleApp
samples/WinUiSampleApp 是独立的未打包 WinUI 控件实验室。它提供稳定名称以供检查,并涵盖样式和资源、所有受支持的操作模式、观察摘要、屏幕截图、弹出窗口和次级窗口根、文本和二进制资源,以及供 Driver 使用的原生文件对话框。Agent 接入仍限定在 #if DEBUG 内。
dotnet run --project samples/WinUiSampleApp -c Debug -p:Platform=x64
如需无人值守检查,请传入示例应用的屏幕外启动开关:
dotnet run --project samples/WinUiSampleApp -c Debug -p:Platform=x64 -- --hidden
使用以下命令运行其真实进程 MCP 覆盖测试:
dotnet test tests/XamlMcp.WinUI.Tests/XamlMcp.WinUI.Tests.csproj -c Debug --filter FullyQualifiedName~LiveWinUiSampleTests
交互式 Driver 功能默认不启用,因为它会打开原生桌面对话框:
$env:XAMLMCP_DESKTOP_TESTS = "1"
dotnet test tests/XamlMcp.WinUI.Tests/XamlMcp.WinUI.Tests.csproj -c Debug --filter FullyQualifiedName~WinUiDriverLiveTests
受保护的原始输入验证同样默认不启用,因为它会移动真实指针,并要求测试主机获得前台所有权:
$env:XAMLMCP_DESKTOP_TESTS = "1"
dotnet test tests/XamlMcp.WinUI.Tests/XamlMcp.WinUI.Tests.csproj -c Debug --filter FullyQualifiedName~LiveWinUiInputTests
如需验证可部署的未打包输出,请将 Release 发布到一个全新目录:
$publishDir = "artifacts/winui-sample/$([Guid]::NewGuid().ToString('N'))"
dotnet publish samples/WinUiSampleApp/WinUiSampleApp.csproj -c Release -r win-x64 `
--self-contained true -p:Platform=x64 -p:WindowsPackageType=None -o $publishDir
输出必须包含 WinUiSampleApp.exe、WinUiSampleApp.pri、生成的 .xbf 文件,以及 Assets/fixture.txt 和 Assets/fixture.bin。
从源代码构建
dotnet build # XamlMcp.slnx
dotnet test # suite on Avalonia 11.3.x
dotnet test -p:AvaloniaTestVersion=12.1.0 # same suite on the 12.x line
解决方案包含 net10.0-android,因此完整还原/构建需要 .NET Android 工作负载。设备测试默认不启用:模拟器测试通道需设置 XAMLMCP_ANDROID_LIVE=1,实体设备测试通道还需设置 XAMLMCP_ANDROID_PHYSICAL=1。如果 ADB 报告了多个已授权设备,请设置 XAMLMCP_ANDROID_DEVICE。
许可证
Apache-2.0 — 请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。