Keincheck.Protocol 0.10.1

dotnet add package Keincheck.Protocol --version 0.10.1
                    
NuGet\Install-Package Keincheck.Protocol -Version 0.10.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Keincheck.Protocol" Version="0.10.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Keincheck.Protocol" Version="0.10.1" />
                    
Directory.Packages.props
<PackageReference Include="Keincheck.Protocol" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Keincheck.Protocol --version 0.10.1
                    
#r "nuget: Keincheck.Protocol, 0.10.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Keincheck.Protocol@0.10.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Keincheck.Protocol&version=0.10.1
                    
Install as a Cake Addin
#tool nuget:?package=Keincheck.Protocol&version=0.10.1
                    
Install as a Cake Tool

Keincheck

License: MIT Release .NET Avalonia

Let an AI see and drive any Avalonia app. Keincheck exposes a Model Context Protocol (MCP) server over your running Avalonia 12 UI — list windows, walk the visual/logical tree, read and write control properties, invoke controls through UI Automation, send synthetic input, capture screenshots, and read binding errors.

Supported UI frameworks: Avalonia 12 today; WPF in progress. The introspection engine is framework-free and reaches the UI through a single neutral seam (IUiAdapter), so new toolkits plug in as adapter packages without touching the engine.

Two deployment models share one introspection engine:

Broker (recommended) Embedded
Server A standalone Hub daemon — one MCP server for many apps One MCP server inside your app
Your app pulls in an adapter pkg, e.g. Keincheck.Avalonia (named-pipe, no ASP.NET) Keincheck (Kestrel in-process)
Transport to the AI stdio shim → hub (auto-starts the hub) loopback HTTP http://127.0.0.1:3001
Extras launch/restart apps, multi-app routing, tray + audit + read-only toggle none — zero infrastructure
Use when you want a clean, reusable, multi-app setup you want a single app wired in one line

Quick start — broker

  1. Install the Hub from the latest release (a self-updating Velopack app).
  2. Add the client to your Avalonia app and give it a stable id:
    using Keincheck.Avalonia;   // Avalonia adapter package — supplies UseMcpClient
    
    AppBuilder.Configure<App>()
        .UsePlatformDetect()
        .UseMcpClient(o => o.AppId = "myapp");   // connects to the hub over a named pipe
    
  3. Point your MCP client at the stdio shim — e.g. a project .mcp.json:
    { "mcpServers": { "keincheck-hub": { "type": "stdio", "command": "keincheck-connect" } } }
    
    The shim ensures the hub is running and bridges stdio ↔ hub.
  4. Drive it: hub_list_clientshub_select_client("myapp#1") → then the per-app tools (list_windows, screenshot_window, set_property, …) operate on your app.

Quick start — embedded

AppBuilder.Configure<App>()
    .UsePlatformDetect()
    .UseMcpServer();          // MCP server on http://127.0.0.1:3001

Point any MCP-capable client at http://127.0.0.1:3001.

Architecture (broker)

   AI client (Claude Code / Desktop)
        │ stdio (MCP)
   ┌────▼──────────────┐  ensures-up / launches
   │ keincheck-connect │  (stdio shim)
   └────┬──────────────┘
        │ MCP over a named pipe
   ┌────▼────────────────────────────────────────────┐
   │ Keincheck.Hub  (Velopack daemon, tray)          │
   │  • MCP server: meta-tools + proxy of active app │
   │  • named-pipe broker  • registry + launcher     │
   │  • audit log • per-app read-only toggle         │
   └────┬────────────────────────┬───────────────────┘
        │ named pipe             │ named pipe
   ┌────▼──────────┐        ┌────▼──────────┐
   │ Your app      │        │ Another app   │   apps embed an adapter pkg
   │ +UseMcpClient │        │ +UseMcpClient │   (e.g. Keincheck.Avalonia)
   └───────────────┘        └───────────────┘

Tools execute inside each app (where the UI toolkit lives, reached through that app's IUiAdapter); the hub is a framework-agnostic multiplexer that advertises the active client's tools and forwards calls over the pipe.

Tools

Per-app UI tools (run in the app, proxied by the hub): list_windows, get_logical_tree, get_visual_tree, query_controls, get_properties, get_property, get_data_context, get_text, get_binding_errors, hit_test, get_focused_element, screenshot_window, screenshot_control, set_property, automation_action, set_focus, wait_for, pointer / click_at, scroll_at, type_text, send_keys.

Hub meta-tools: hub_list_clients, hub_list_known_clients, hub_launch_client, hub_restart_client, hub_select_client, hub_client_status.

Addressing: stable per-session handles (ctl-1a) plus a CSS-ish selector engine (Button[Name=Save], #Save, .toolGroup, Button.primary, StackPanel > TextBox). The .class selector matches author style-class membership (Avalonia Classes="…"); frameworks without style classes match nothing.

Projects

Project TFM Role
Keincheck.Protocol net8.0 Zero-dependency wire: named-pipe transport, chunked framing, message DTOs
Keincheck.Core net8.0 Framework-free introspection engine: registry, selectors, serializer, the 22 tools, and the neutral IUiAdapter / IUiDispatcher seam (no UI-toolkit reference)
Keincheck.Avalonia net8.0 Avalonia 12 adapter: AvaloniaUiAdapter + AvaloniaUiDispatcher behind the seam, plus the Avalonia UseMcpClient
Keincheck.Wpf net8.0-windows WPF adapter — in progress (scaffolded WpfUiAdapter, real WpfUiDispatcher, UseKeincheckClient)
Keincheck.Client net8.0 Framework-free broker client (BrokerClientHost.Start) — named-pipe, no ASP.NET
Keincheck.Hub net10.0 The broker daemon: pipe server, registry, launcher/restart, MCP proxy, tray (Velopack)
Keincheck.Connect net8.0 The stdio shim an MCP client spawns
Keincheck net8.0 Embedded all-in-one server (UseMcpServer) — Core + the Avalonia adapter
samples/Keincheck.Demo net10.0 Demo Avalonia app wired as a client
tests/* net8.0 / net10.0 xUnit + Avalonia.Headless

The engine is framework-free: Keincheck.Core knows nothing about any UI toolkit and talks to the live UI only through the neutral IUiAdapter / IUiDispatcher seam. A new framework plugs in by implementing that seam in its own adapter package (as Keincheck.Avalonia does for Avalonia and Keincheck.Wpf is doing for WPF) — no engine changes required.

Libraries target net8.0 for broad compatibility; the desktop/test apps target net10.0 with <RollForward>Major</RollForward>. Design notes live in docs/.

Build & test

dotnet build Keincheck.sln
dotnet test  Keincheck.sln

Releasing

Pushing a semver tag triggers the release workflow, which publishes the Hub as a Velopack release on GitHub (installer + update + delta packages):

git tag v0.2.0
git push origin v0.2.0

Locally, the same flow is:

dotnet publish Keincheck.Hub/Keincheck.Hub.csproj -c Release -r win-x64 --self-contained true -o publish
vpk pack -u Keincheck.Hub -v 0.2.0 -p publish -e Keincheck.Hub.exe --packTitle "Keincheck Hub"
vpk upload github --repoUrl https://github.com/DVSProductions/Keincheck --publish --releaseName "Keincheck Hub 0.2.0" --tag v0.2.0 --token <gh-token>

Security

Keincheck grants full programmatic control of an app's UI. It is designed for local, trusted development and automation:

  • Broker: the control pipe is current-user only; the hub's MCP endpoint is bound to loopback only. The hub shows an "AI is driving X" indicator and offers a per-app read-only toggle (mutating tools are refused) and an audit log of every call.
  • Embedded: the listener is loopback only (never 0.0.0.0), but there is no auth token — any local process can drive the app. Enable it only in development / trusted contexts, ideally behind a debug-only flag.

License

MIT © 2026 Valentino Saitz

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Keincheck.Protocol:

Package Downloads
Keincheck.Core

The framework-FREE UI introspection engine for Keincheck: control registry, CSS-ish selectors, property serialization, the MCP tool set, and the neutral IUiAdapter / IUiDispatcher seam. Framework adapters (Avalonia, WPF) live in sibling packages.

Keincheck.Client

The thin in-app broker client for Keincheck. Connects an Avalonia app to the standalone hub over a named pipe (no ASP.NET in the app), registers its Core tools, and runs invocations on the UI thread.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.10.1 166 7/20/2026
0.10.0 168 7/20/2026
0.9.2 190 7/8/2026
0.9.1 312 6/29/2026
0.9.0 191 6/16/2026
0.8.1 181 6/16/2026
0.8.0 178 6/16/2026
0.7.0 259 6/16/2026
0.6.0 253 6/15/2026
0.5.1 181 6/15/2026
0.5.0 184 6/15/2026
0.4.0 180 6/15/2026
0.3.0 176 6/15/2026
0.2.0 177 6/15/2026
0.1.0 165 6/15/2026