AvaloniaMcp
它的作用
在Avalonia应用程序中添加一行,即可获得一个完整的诊断服务器,AI代理(或通过CLI的人类)可以使用该服务器:
- 检查 视觉/逻辑树、控件属性、样式和资源
- 调试 数据绑定、ViewModel和绑定错误
- 互动 --单击按钮、键入文本、在运行时更改属性
- 截图 --将窗口或单个控件捕获为PNG
建筑
┌─────────────────────────┐ Named Pipe ┌──────────────────────┐
│ Your Avalonia App │ ◄──── (avalonia-mcp-{pid}) ──── │ MCP Server │
│ │ │ │
│ ┌───────────────────┐ │ JSON request/response │ ┌────────────────┐ │
│ │ .UseMcpDiagnostics()│ │ ◄───────────────────────── │ │ 15 MCP Tools │ │
│ │ DiagnosticServer │ │ (stdio) │ │ CLI mode │ │
│ └───────────────────┘ │ │ └────────────────┘ │
└─────────────────────────┘ └──────────────────────┘
▲
│ MCP (stdio)
┌────┴────┐
│ VS Code │
│ Copilot │
└─────────┘| 项目 | 描述 |
|---|---|
| AvaloniaMcp。诊断 | 库已添加到您的Avalonia应用程序中。启动命名管道诊断服务器。 |
| AvaloniaMcp。服务器 | MCP服务器(stdio)+CLI。连接到应用程序并显示所有工具。 |
| AvaloniaMcp。演示 | Avalonia应用程序示例,包括数据绑定、列表、样式——用于测试。 |
快速开始
1.将诊断添加到Avalonia应用程序
添加引用 AvaloniaMcp.Diagnostics 还有一行给你 Program.cs:
using AvaloniaMcp.Diagnostics;
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure()
.UsePlatformDetect()
.UseMcpDiagnostics() // ← add this line
.LogToTrace();这将在启动时在应用程序内启动一个命名管道服务器。它对UI没有任何影响——所有的自检都是通过管道按需进行的。
2.将MCP服务器安装为.NET工具
# From the repo root:
dotnet pack src/AvaloniaMcp.Server -o nupkg
dotnet new tool-manifest # if you don't already have one
dotnet tool install AvaloniaMcp --add-source ./nupkg验证:
dotnet avalonia-mcp cli --help3.在VS Code/GitHub Copilot中配置
添加到您的 全球 MCP设置(Settings → MCP 或 ~/.vscode/mcp.json):
{
"servers": {
"avalonia-mcp": {
"type": "stdio",
"command": "dotnet",
"args": ["avalonia-mcp"]
}
}
}或按工作区 .vscode/mcp.json:
{
"servers": {
"avalonia-mcp": {
"type": "stdio",
"command": "dotnet",
"args": ["avalonia-mcp"]
}
}
}服务器会自动发现正在运行的Avalonia应用程序。如果多个应用程序正在运行,请传递PID:
"args": ["avalonia-mcp", "--pid", "12345"]使用CLI
该工具还可以作为独立的CLI进行快速调试:
# Start your Avalonia app first, then:
dotnet avalonia-mcp cli list_windows
dotnet avalonia-mcp cli get_visual_tree --maxDepth 5
dotnet avalonia-mcp cli find_control --typeName Button
dotnet avalonia-mcp cli get_control_properties --controlId "#MyButton"
dotnet avalonia-mcp cli get_data_context
dotnet avalonia-mcp cli get_binding_errors
dotnet avalonia-mcp cli click_control --controlId "#MyButton"
dotnet avalonia-mcp cli input_text --controlId "#MyTextBox" --text "Hello"
dotnet avalonia-mcp cli set_property --controlId "#MyButton" --propertyName IsVisible --value false
dotnet avalonia-mcp cli take_screenshot内置自动发现功能——如果只有一个应用程序在运行,则没有 --pipe 或 --pid 需要。
工具参考
检查
| 工具 | 参数 | 说明 |
|---|---|---|
list_windows | -- | 列出所有打开的窗口,包括标题、大小、位置和状态 |
get_visual_tree | maxDepth? | 具有类型、名称、边界和可见性的完整视觉元素层次结构 |
get_logical_tree | maxDepth? | XAML意图逻辑树(您声明的控件,而不是模板内部) |
find_control | name?, typeName?, text? | 按名称搜索(#MyBtn),类型(Button),或文本内容 |
get_control_properties | controlId | 所有Avalonia属性:值、类型、是否显式设置 |
数据和绑定
| 工具 | 参数 | 说明 |
|---|---|---|
get_data_context | controlId? | ViewModel类型和所有公共属性,序列化为JSON |
get_binding_errors | -- | 所有带有错误消息和时间戳的断开绑定 |
视觉和风格
| 工具 | 参数 | 说明 |
|---|---|---|
take_screenshot | controlId? | 将窗口或特定控件捕获为base64 PNG格式 |
get_applied_styles | controlId | CSS类、伪类(:pointerover, :pressed),风格设定者 |
get_resources | controlId? | 资源字典条目(画笔、模板、转换器) |
get_focused_element | -- | 当前关注的元素信息 |
交互
| 工具 | 参数 | 说明 |
|---|---|---|
click_control | controlId | 模拟点击——对按钮执行绑定命令 |
set_property | controlId, propertyName, value | 在运行时设置任何Avalonia属性 |
input_text | controlId, text | 在TextBox或输入控件中键入文本 |
发现
| 工具 | 参数 | 说明 |
|---|---|---|
discover_apps | -- | 查找启用了MCP诊断的Avalonia应用程序 |
控制标识符
许多工具接受 controlId 参数。支持三种格式:
| 格式 | 示例 | 它匹配什么 |
|---|---|---|
#Name | #MyButton | 控制与 Name="MyButton" |
TypeName | Button | 视觉树中该类型的第一个控件 |
TypeName[n] | Button[2] | 该类型的第N个控件(0索引) |
运作原理
- 初创公司 —
UseMcpDiagnostics()启动命名管道服务器(avalonia-mcp-{pid})并将发现文件写入%TEMP%/avalonia-mcp/{pid}.json - 连接 --MCP服务器(或CLI)读取发现文件以查找管道名称,然后连接
- 请求/响应 --命名管道上以换行符分隔的JSON:
{"method":"list_windows","params":{}} - 界面线程 --为了安全起见,所有可视化树操作都被编组到Avalonia调度线程
- MCP协议 --服务器将管道响应封装到MCP中
tools/call结果超过stdio
需求
- .NET 10 SDK(预览版)
- 阿瓦罗尼亚11.2+
建筑
dotnet build运行演示
# Terminal 1: Start the demo app
dotnet run --project src/AvaloniaMcp.Demo
# Terminal 2: Interact via CLI
dotnet avalonia-mcp cli list_windows
dotnet avalonia-mcp cli find_control --typeName Button
dotnet avalonia-mcp cli click_control --controlId "#IncrementBtn"
dotnet avalonia-mcp cli get_data_context
dotnet avalonia-mcp cli take_screenshot许可证
麻省理工学院
