StockSharp DesktopDriver

Servidor MCP local para automatización de UI en Avalonia, WPF y MAUI, inspección de controles, capturas de pantalla y pruebas.

Documentación

StockSharp DesktopDriver

MCP on NuGet CLI on NuGet

Conduce aplicaciones de escritorio construidas con Avalonia, WPF o MAUI desde pruebas, desde una línea de comandos, o desde un agente de IA a través de MCP.

DesktopDriver lee la interfaz, no la pantalla. Una tabla responde con sus columnas y filas, un árbol con sus elementos, un espacio de trabajo con sus paneles, en palabras que no cambian con un tema, una fuente o un idioma. La entrada pasa por el propio pipeline del toolkit, y solo hacia una ejecución que no puede alcanzar nada real. Las imágenes están ahí para que una persona las mire; las pruebas verifican lo que dicen los controles.

Cómo funciona

  1. Una aplicación que puede ser conducida hace referencia al bootstrap de su toolkit. Iniciada de la manera ordinaria, no abre nada. Iniciada con --ui-automation, abre un endpoint local de named-pipe restringido al usuario actual del sistema operativo, y escribe dónde está el endpoint en el archivo nombrado por --ui-automation-endpoint=<path>.
  2. Un ejecutor (una prueba, la línea de comandos, el servidor MCP) inicia la aplicación de esa manera (o se adjunta a una que alguien más inició), verifica el producto, la instancia y el protocolo en el handshake de la sesión y pregunta: qué ventanas están abiertas, qué hay en esta, qué muestra esta tabla. Luego puede hacer clic, escribir, presionar teclas y desplazarse, y esperar a que la respuesta cambie.
  3. Los adaptadores convierten los controles en lo que el protocolo conoce: cuadrículas, árboles, listas, selectores, espacios de trabajo, gráficos, documentos, diagramas. Una aplicación registra adaptadores para sus propios controles a través de la misma interfaz que usan los estándar.

Paquetes NuGet

Instala la CLI o el servidor MCP con el .NET 10 SDK:

dotnet tool install StockSharp.DesktopDriver.Cli --tool-path tools
dotnet tool install StockSharp.DesktopDriver.Mcp --tool-path tools

Los comandos son tools/desktop-driver y tools/desktop-driver-mcp. Para añadir automatización a una aplicación, haz referencia al paquete bootstrap de su toolkit. Para conducirla desde código, usa los paquetes de cliente, ejecutor y pruebas.

Para la publicación en el Registro MCP y las extensiones de Claude Desktop, consulta Distribución MCP.

PaqueteQué es
StockSharp.DesktopDriver.ContractsEl protocolo: solicitudes, respuestas, estados, direcciones
StockSharp.DesktopDriver.RuntimeLectura, identidad, revisiones y espera, independiente de cualquier toolkit
StockSharp.DesktopDriver.HostEl endpoint dentro de la aplicación, y UiAutomationLaunch para leer cómo se inició
StockSharp.DesktopDriver.ClientEl cliente tipado a través del cual habla todo ejecutor
StockSharp.DesktopDriver.RunnerInicia, encuentra y alcanza aplicaciones; el catálogo de lo que puede iniciarse
StockSharp.DesktopDriver.TestingLo que necesita una suite MSTest además del ejecutor
StockSharp.DesktopDriver.CliLa línea de comandos
StockSharp.DesktopDriver.McpEl servidor MCP, consulta su README
StockSharp.DesktopDriver.AvaloniaAvalonia: lectura, entrada e imágenes de los controles estándar
StockSharp.DesktopDriver.Avalonia.ProDataGridAvalonia: el DataGrid de ProDataGrid, leído como tabla
StockSharp.DesktopDriver.Avalonia.DockAvalonia: un espacio de trabajo Dock.Avalonia, leído como paneles y grupos
StockSharp.DesktopDriver.Avalonia.HeadlessAvalonia: entrada para pruebas headless
StockSharp.DesktopDriver.Bootstrap.AvaloniaAvalonia: una llamada que hace que una aplicación sea conducible
StockSharp.DesktopDriver.WpfWPF: lectura, entrada e imágenes de los controles estándar
StockSharp.DesktopDriver.Bootstrap.WpfWPF: una llamada que hace que una aplicación sea conducible
StockSharp.DesktopDriver.MauiMAUI: lectura, entrada e imágenes de los controles estándar
StockSharp.DesktopDriver.Bootstrap.MauiMAUI en Windows: una llamada que hace que una aplicación sea conducible

Haz que una aplicación sea conducible

Avalonia, una vez que existe la ventana principal (el ejemplo hace lo mismo solo con el módulo de cuadrícula):

public override void OnFrameworkInitializationCompleted()
{
	if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
	{
		desktop.MainWindow = new MainWindow();

		if (UiAutomationLaunch.TryRead(desktop.Args) is { } launch)
		{
			_automation = AvaloniaAutomationBootstrap.Start(
				UiAutomationStartup.For("my.app", version, fixtureId: null, hasLiveOutsideWorld: false, isTestProfile: false),
				launch.EndpointFile,
				[binder => new DataGridAutomationModule(binder), binder => new DockAutomationModule(binder)]);
		}
	}

	base.OnFrameworkInitializationCompleted();
}

Desecha el runtime devuelto cuando la aplicación salga. WpfAutomationBootstrap y MauiAutomationBootstrap toman los mismos argumentos.

Las aplicaciones de ejemplo muestran el inicio y el cierre para los tres toolkits. Los ejemplos de Windows con WPF y MAUI también tienen pruebas que inician sus ejecutables, se conectan a través del pipe local, leen sus controles, envían entrada y recuperan capturas de pantalla.

UiAutomationStartup.For decide si la entrada está permitida. Una aplicación que no habla con nada fuera de su propio proceso siempre es segura para hacer clic. Una que se conecta a algo real (un bróker, una tienda, un servicio) es segura solo cuando se inició con un perfil de prueba que lo reemplaza; de lo contrario, el endpoint aún lee, pero cada entrada es rechazada.

Muchas aplicaciones envían dos builds: uno ordinario sin driver, y uno hecho para ser conducido. El driver solo es referenciado por el segundo, por lo que el primero no tiene nada escuchando por construcción.

Conducirla

Desde una prueba:

await using var app = await DrivenApplication.StartAsync(executable, extraArguments: null, TimeSpan.FromSeconds(60), cancellationToken);
await using var client = await app.ConnectAsync("my.app", cancellationToken);

var windows = await client.GetSurfacesAsync(cancellationToken);

Desde una línea de comandos, contra una aplicación que alguien inició con --ui-automation:

tools/desktop-driver find --endpoint endpoint.json --kind grid
tools/desktop-driver grid-rows --endpoint endpoint.json --node window:MainWindow/Instruments --limit 5

desktop-driver sin argumentos imprime cada operación.

Desde un agente: registra el servidor MCP, consulta DesktopDriver.Mcp.

Su nombre MCP es StockSharp.DesktopDriver, y su título de visualización es StockSharp DesktopDriver.

Documentos

Build y prueba

dotnet build DesktopDriver.slnx
dotnet test DesktopDriver.Runtime.Tests --filter "FullyQualifiedName~Revision"

Los proyectos MAUI necesitan la carga de trabajo MAUI Windows. Las pruebas de aplicación MCP, las pruebas de captura de pantalla WPF y DesktopDriver.Windows.Tests necesitan una sesión de escritorio de Windows interactiva. Ejecuta las suites filtradas con tiempos de espera de cuelgue y sesión usando ./.github/scripts/Test.ps1 -Suite Headless o -Suite Desktop después de un build Release.

Paquetes desde el código fuente

dotnet pack DesktopDriver.slnx -c Release -o artifacts/packages

Fuentes en lugar de paquetes

Un producto verificado junto a este repositorio puede referenciar los propios proyectos:

<ProjectReference Include="..\DesktopDriver.Mcp\DesktopDriver.Bootstrap.Avalonia\DesktopDriver.Bootstrap.Avalonia.csproj" />

Un producto que construye una segunda copia conducible de sí mismo pasando una propiedad en la línea de comandos añade GlobalPropertiesToRemove="<that property>" a la referencia: el driver no tiene un build propio para ello, y de lo contrario se construiría dos veces en la misma carpeta.

Licencia

Consulta LICENSE.