
Wpf Visual Tree
io.github.faze79Published by GitHub account faze79v0.20.0Updated Oct 25, 2026
Inspect and drive WPF apps: trees, bindings, screenshots, mouse dragging and touch gestures.
Overview
Inspect, debug and drive running WPF desktop apps: visual tree, bindings, screenshots, input gestures and workflow recording.
- What you can do
- List and attach to running WPF processes, including automatic injection into the target app
- Read visual and logical trees, dependency properties, DataContext, resources, styles and bindings, and diagnose binding errors
- Find elements by AutomationId, type, name, text or property values, and capture window or element screenshots
- Drive the app with clicks, text entry, key shortcuts, mouse move, scroll, drag and touch gestures
- Record, replay and export workflows as xUnit tests, snapshot and diff element state, and live-edit or revert dependency properties
- When to use it
- Useful when an assistant should look at a running WPF application to explain why a control is disabled, find binding or trigger problems, verify layout, or reproduce and script UI interactions without changing the app's source.
- Requirements
- Windows 10/11 only, with a .NET 8, 9 or 10 Desktop Runtime (or the .NET SDK for the tool or dnx install). Installed as a NuGet/.NET tool, a release zip, an MCPB bundle or a source build; a WPF application must be running and inspectable, either via auto-injection or a self-hosted Inspector reference. No accounts or API keys are declared.
Installation
In SourceWeft
- Open Wpf Visual Tree in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
WpfVisualTreeMcp
[Build] [Release] [.NET: 8, 9, 10] [WPF on .NET Framework: 4.7.2, 4.8, 4.8.1] [License: MIT] [MCP Compatible]
Let AI agents see, debug and drive running WPF apps. Snoop + Playwright for AI, exposed over the Model Context Protocol — visual tree, bindings, screenshots, mouse dragging, touch gestures, text input and keyboard. Inspect running apps without source changes; touch behavior depends on the application's input support.
[Demo: native WPF drag-and-drop, touch gestures, form automation and binding diagnostics]
Drag-and-drop, move a canvas item, tap, hold, pan, pinch to zoom and rotate — then query controls, fill a form, select an item and diagnose a binding error. The gesture sequence records real WPF input through MCP, targets controls by AutomationId and checks the application's response, just like the automated tests.
Watch the animated demo directly.
New in v0.20.0: Verified support for WPF on .NET 9, .NET 10 and .NET Framework 4.8.1, on both x86 and x64. CI exercises automatic injection and self-hosting across all six supported target frameworks, plus the installed C# SDK from .NET 8, 9 and 10 test projects. The x86 injection helper can also use .NET 9 or 10 when .NET 8 is absent.
The WpfVisualTreeMcp.Automation C# SDK
drives virtualized DataGrids/TreeViews, waits for controls, manages WPF windows and
streams property changes. The 38-tool MCP server and CLI share the inspection and
input engine, including direct AutomationId targeting.
Workflow recording/replay/xUnit export, aggregate diagnostics, full-content screenshots and .NET Framework 4.7.2 support remain available from v0.16.0. Thanks to @miloszkukla for the compatibility and screenshot work in PR #22.
Quickstart (60 seconds)
- Download and extract
WpfVisualTreeMcp-vX.Y.Z-win-x64.zipfrom the latest release (requires a .NET 8, 9 or 10 Desktop Runtime). - Register it in your MCP client — for Claude Code, add to
.mcp.json: - Ask your agent: "Look at my running WPF app and tell me why the Save button is disabled."
Prefer the terminal? The same exe is a full CLI: WpfVisualTreeMcp.Server.exe help.
From v0.14.0, run wpfinspect update (or WpfVisualTreeMcp.Server.exe update)
to update the installation you launched. See updating.
Using Codex? Follow the plugin installation to install the MCP
configuration and skill together.
C# test SDK
WpfVisualTreeMcp.Automation exposes the inspection and input engine as C# objects,
with direct process attachment and AutomationId locators. The package includes the
injection payload and works without starting an MCP server or CLI.
The application and test project can use different frameworks: for example, a
.NET 10 test can automate a .NET Framework 4.8.1 application. The SDK's net8.0
library works in .NET 9/10 test projects; it is not a .NET Framework test library.
The compatibility matrix is exercised before
release, including actual runtime-version checks. Framework 4.x target builds run
on the installed 4.8.1 runtime, since those runtimes update in place.
Text waits compare the exact property value: not loaded does not match loaded.
Timeouts throw with the expected and last observed values. Property predicates,
cancellation, drag, touch, assertions, inspection and recording/replay are also
available. Attached sessions leave the app running on disposal; launched sessions
own and clean up their process by default.
The SDK is a separate package from the MCP tool WpfVisualTreeMcp.
See installation, API examples and requirements.
Overview
WpfVisualTreeMcp is a Model Context Protocol (MCP) server that allows AI coding agents (Codex, Claude Code, Cursor, GitHub Copilot) to inspect and interact with running WPF applications. Think of it as giving your AI assistant the same capabilities as tools like Snoop WPF or Visual Studio's Live Visual Tree.
Why This Matters
Debugging WPF UI issues traditionally requires manual inspection with specialized tools. This project bridges that gap by exposing WPF inspection capabilities through MCP, enabling AI agents to:
- Understand UI structure during code reviews
- Diagnose binding errors automatically
- Suggest fixes for layout issues
- Assist with UI refactoring tasks
- Analyze visual tree hierarchies in real-time
Features
Core Inspection
- Process Discovery - List all running WPF applications available for inspection
- Visual Tree Navigation - Traverse the complete visual tree hierarchy
- Logical Tree Access - Navigate the logical tree structure
- Property Inspection - Read all dependency properties of any UI element
Binding & Resources
- Binding Analysis - Inspect bindings with converter, StringFormat, FallbackValue, MultiBinding support
- DataContext Inspection - View DataContext type, properties, INPC status, and inheritance chain
- Binding Error Detection - Automatically capture and report binding errors with classification
- Resource Enumeration - Browse resource dictionaries at any scope
- Style Inspection - View applied styles and templates
Search & Monitoring
- Element Search - Find elements by type, name, or property values
- Deep Search - Search entire tree including AdornerLayer and Popup elements
- Property Watching - Monitor property changes in real-time
Interaction & Export
- Touch Gestures (v0.13.0) -
wpf_touch_gesture/ CLItouch: native tap, long press, swipe, pinch and rotation with one or two contacts. Includes an interactive demo and WPF compatibility guidance. - Mouse Drag -
wpf_drag/ CLIdrag: drag between visual-tree elements or by a local displacement, with left/right/middle buttons, configurable duration and local start/end points. Supports slider thumbs, splitters and drag-and-drop. See the parameters and examples. - Screenshot Capture - Current source uses
autocapture for native hosted content and reports the selected mode; explicit render rejects unsupported native areas. Capture window/element screenshots visible to AI agents;full_content=true/ CLI--full-contentcaptures scrollable content, including virtualized lists, and restores the original scroll position - Element Highlighting - Visually highlight elements in the running app
- Control Click (v0.4.0) - Click elements via UI Automation (
Invoke/Toggle/Select/ExpandCollapse) or a real OS mouse click - Set Text (new in v0.5.0) - Fill a TextBox/ComboBox/PasswordBox via UI Automation
IValueProvider.SetValue, with aTextBox.Text/PasswordBox.Password/ reflected-Textfallback, orphysical=trueto type via OS keyboard input (full Unicode BMP) - Send Keys (new in v0.5.0) - Send keyboard shortcuts (
Ctrl+S,Alt+F4,F5,Enter,Ctrl+Shift+F, ...) to an element or the focused window via OS keyboard input - Layout Information - Get detailed layout metrics
- Tree Export - Export visual tree to XAML or JSON format
- Auto-Injection - Inject Inspector into running WPF processes (no source changes needed); multi-architecture since v0.6.0 — a 64-bit server can inject into 32-bit WPF apps via a bundled
WpfInjectorHelper.exe
Dual-Mode CLI (new in v0.4.0)
The same WpfVisualTreeMcp.Server.exe runs as either an MCP stdio server
(no arguments, default) or as a one-shot CLI (any recognised subcommand).
Useful when the MCP server isn't connected, for scripting, and for verifying
the pipeline manually. Run WpfVisualTreeMcp.Server.exe help for the full
command list. Output is JSON on stdout; diagnostics go to stderr.
How it compares
vs. the general tool categories:
vs. other WPF MCP servers. Most WPF MCP servers are built on UI Automation (FlaUI): they read the accessibility tree, and can only reach WPF internals — bindings, DataContext, ViewModel state — if you install their in-process probe into the app you want to inspect. This server takes the Snoop route instead: it injects at runtime, so it reads the real visual tree and diagnoses binding errors and DataContext with zero changes to the target app — nothing to add to your build, nothing to ship into production.
In short: UIA-based tools see what accessibility exposes, and computer-use agents see pixels. This project gives the agent the same insider view a WPF developer has in Snoop — with no probe to install in the target app — plus the widest set of hands to act on it, over a protocol every AI coding tool speaks.
Installation
Prerequisites
- Windows 10/11
- .NET 8.0 SDK or later
- A WPF application to inspect
Building and running the complete compatibility suite requires the .NET 10 SDK, .NET 8/9/10 Desktop runtimes for x64 and x86, and .NET Framework 4.8.1.
Installation
Option 1: .NET tool / NuGet (Recommended)
The package is also published as an MCP server package (PackageType: McpServer),
so MCP clients that support NuGet-hosted servers can launch it directly:
Option 2: Download Release
Download the latest release from GitHub Releases:
- Download
WpfVisualTreeMcp-vX.X.X-win-x64.zip - Extract to a folder (e.g.,
C:\Tools\WpfVisualTreeMcp) - The MCP server executable is
server/WpfVisualTreeMcp.Server.exe
Desktop extension (MCPB)
Clients that support MCP bundles can import
WpfVisualTreeMcp-v0.20.0-win-x64.mcpb.
This Windows x64 bundle includes the server runtime and a self-contained x86
injection helper. A smaller
compact bundle
provides the same tools with a reduced runtime for catalogs with upload limits.
Update either bundle through the client's extension UI. See the
MCPB guide for requirements, packaging and verification.
Option 3: Build from Source
For injection build requirements, package layout, and troubleshooting, see the Injector README. Injecting into x86 apps requires the x86 .NET 8 runtime for the helper.
Updating
update is available from v0.14.0. For an older global tool, bootstrap it once:
For an older portable copy, extract the latest release and use its server folder.
The command updates only the installation it was launched from. Global and
custom --tool-path tools download the exact official NuGet package, then use
dotnet tool update from that staged package (a .NET SDK is required). Temporary
NuGet download failures and publication delays receive up to four attempts, with
10, 20 and 30 seconds between attempts. If preparation fails, installed files are
unchanged; retry later. Portable folders receive the latest stable GitHub release's complete
server payload, verified against its SHA-256 digest. A source build under bin
is left to the source/build workflow; local manifest tools and dnx caches are
left to their package manager. --check explains which installation was detected.
On Windows, installation starts in a hidden worker after the CLI exits so its
executable is unlocked. A scheduled result means the worker was launched, not
that installation finished. Run update --status until it reports updated or
failed; a failed status returns exit code 1. JSON output includes the log path.
Status, logs and portable backups are stored under
%LOCALAPPDATA%\WpfVisualTreeMcp\updates, separately for each installation.
Close other MCP instances using the same files before updating. The updater does not stop applications: occupied files cause an error, and portable replacement failures trigger restoration from backup. Unrelated files and MCP configuration are preserved. After success, restart the MCP client and previously inspected WPF apps so both server and injected Inspector use the new version. Other installed copies and any separately copied self-hosted Inspector require their own update.
Configuration
The server uses the official Microsoft/Anthropic MCP SDK for .NET, providing guaranteed compatibility with Claude Code and other MCP clients.
Claude Code
Option 1: Command Line (Recommended)
Use the claude mcp add command to add the server directly:
You can verify the server was added:
Option 2: Project-level JSON Configuration
Create or edit .mcp.json in your project root:
Option 3: Global JSON Configuration
Add to ~/.claude/settings.json:
Important Notes:
- Use absolute paths to the built
.exefile - Use forward slashes (
/) in paths on Windows - Build in Release mode for production:
dotnet build -c Release - Restart Claude Code after configuration changes
Cursor
Add to your Cursor settings (.cursor/mcp.json):
Codex plugin
The repository includes a WPFVisualTreeMcp Codex plugin that installs the MCP
configuration and a wpfvisualtreemcp skill together. It runs the latest stable NuGet package,
not a build of the checked-out source. No machine-specific executable path is
required.
Prerequisites for this installation method:
- Windows 10/11 and a local Codex client with plugin support.
- .NET 10 SDK, version 10.0.300 or newer within .NET 10 for
dotnet dnx, plus the .NET 8 runtime. - Internet access to nuget.org on each MCP launch to resolve the latest stable version. Downloaded packages are cached by .NET. For x86 injection, install the x86 .NET 8 runtime as well.
From the repository root, register the local marketplace and install the plugin.
You can also download WpfVisualTreeMcp-v0.20.0-codex-plugin.zip from
GitHub Releases,
extract it, and run these commands from the extracted root:
Restart Codex or open a new session, then ask it to inspect your running WPF app.
The skill can also be invoked explicitly as $wpfvisualtreemcp.
Alternatively, install directly from the upstream Git repository without cloning it manually:
Use codex plugin list --marketplace WPFVisualTreeMcp to check the installation. This is
a repository marketplace; it does not imply publication in OpenAI's public
plugin directory. If your client lacks codex plugin add, use a plugin-capable
client or the direct MCP configuration below.
To use your own build, or to avoid the .NET 10 SDK requirement, register the published executable directly instead of installing the plugin:
Replace the example with the actual executable path. Avoid enabling both this manual entry and the plugin at the same time, which would start two servers.
Plugin files are under plugins/wpfvisualtreemcp/; the marketplace entry is
.agents/plugins/marketplace.json. The plugin uses Codex's supported
.codex-plugin/plugin.json compatibility format. Its manifest version identifies
the plugin configuration and skill, independently of the NuGet server version.
The MCP launch omits a package version and uses --no-http-cache to resolve the
latest stable release from nuget.org on each start. Prereleases are excluded.
Restart the MCP server or Codex to pick up a new server release; a running server
does not update in place. Never add CLI subcommands
such as list to the MCP launch arguments: no subcommand selects stdio mode.
The plugin starts in its own directory and includes a global.json selecting
SDK 10.0.300 or a newer stable .NET 10 SDK. This keeps a target project's older SDK pin
from disabling dotnet dnx. The noninteractive launch and x64/x86 Inspector
injection were verified with SDK 10.0.402 and Codex CLI 0.162.1. The SDK pin keeps
the launch on the tested .NET 10 command-line behavior.
The compatibility MCP configuration uses "cwd": ".", which Codex resolves
relative to the installed plugin root. This resolution was verified through
codex mcp list --json after installation in an isolated profile.
After editing local plugin files, rerun codex plugin add wpfvisualtreemcp@WPFVisualTreeMcp
to refresh the installed copy, then open a new Codex session.
For a Git-backed marketplace, update the plugin configuration and companion skill with:
For a local marketplace, update its source checkout before reinstalling the plugin.
The companion skill covers mouse dragging, touch gestures and update behavior.
wpfinspect update updates a separately installed CLI or portable copy; it does
not refresh a plugin or its skill, and should not be used to modify the plugin's
shared dnx package cache. See Updating for standalone installations.
Self-Hosted Mode (Recommended)
For your WPF application to be inspectable, add a reference to the Inspector DLL and initialize it on startup:
-
Add a project reference to
WpfVisualTreeMcp.Inspector -
In your
App.xaml.cs:
This enables the MCP server to connect to your application via named pipes for real-time inspection.
Usage Examples
List Running WPF Applications
Attach and Inspect Visual Tree
Find Binding Errors
Search for Elements
Export Visual Tree
Architecture
For detailed architecture documentation, see docs/ARCHITECTURE.md.
Available Tools
For complete tool documentation, see docs/TOOLS_REFERENCE.md.
All input actions accept automation_id instead of element_handle, including
click, mouse movement, scrolling, drag, every touch gesture, selection, text and
keyboard input. Assertions and property edits accept it too. IDs match
AutomationProperties.AutomationId exactly and case-sensitively; duplicates fail.
Use root_handle to scope lookup. Drag destinations accept target_automation_id
and an independent target_root_handle. The same selectors work in recordings
and exported tests.
CLI equivalents use --automation-id, --root, --target-automation-id and
--target-root. Touch pan uses swipe, zoom uses pinch; the app must support
touch/manipulations to react to those gestures.
Roadmap
Phase 1: Core Inspection ✅
- Project structure and architecture
- Process discovery and enumeration
- Basic process attachment
- Visual tree navigation
- Property inspection
- Element search
Phase 2: Advanced Features ✅
- IPC communication via named pipes
- Binding analysis and error detection
- Resource dictionary enumeration
- Style and template inspection
- Property change monitoring (with notifications)
Phase 3: Interaction & Diagnostics ✅
- Element highlighting overlay
- XAML/JSON export
- Screenshot capture (returns MCP
ImageContentBlock) - DLL auto-injection into running WPF processes (x64/x86)
- AdornerLayer and Popup visual tree traversal
Phase 4: CLI + Driving the App ✅ (v0.4.0 / v0.5.0)
- Dual-mode executable (MCP stdio + one-shot CLI) (v0.4.0)
- Control click via UI Automation patterns (v0.4.0)
- Physical OS mouse click as opt-in fallback (v0.4.0)
- User-level Claude Code skill bundling the CLI (v0.4.0)
- Set text/value via UI Automation
IValueProvider+ fallbacks (v0.5.0) - Physical keyboard typing with Unicode BMP support (v0.5.0)
- Keyboard shortcuts (
Ctrl+S,Alt+F4,F5, ...) via OS input (v0.5.0)
Phase 5: Multi-architecture ✅ (v0.6.0)
- Cross-bitness auto-injection (64-bit server → 32-bit target)
- Architecture-matching
WpfInjectorHelper.exe(32-bit .NET 8) - Removes v0.5.0 known limitation; both x86 and x64 WPF apps drivable
Phase 6: Query engine & full driving ✅ (v0.7.0)
- Query elements by visible text, property values, visibility
- Enriched results: text, automation id, enabled/visible state, screen bounds
-
wpf_select_item— select in ComboBox/ListBox/TabControl by text or index - Double / right click; scroll-into-view before physical input
- Screen-mode screenshots (popups, dropdowns, context menus visible)
- Set-text read-back verification; weak element-handle cache
- Critical IPC serialization fix (request parameters were silently dropped)
Phase 7: Distribution & agent ergonomics ✅ (v0.7.1 / v0.8.0)
- NuGet package, installable via
dnx/dotnet tool install(MCP server package type) - Published to nuget.org (trusted publishing / OIDC) and the official MCP registry
- Binding-error capture fixed (was never wired up), IPC parameter-drop fix
-
wpf_wait_for— wait for an element/condition, no sleep-and-retry loops - Concurrent IPC connections (a long wait no longer blocks other commands)
Next up
Shipped in v0.13.0: mouse dragging and native touch gestures, with MCP/CLI parity, sample demos, input cleanup, and real desktop validation across net48 x86/x64 and net8 x64. Shipped in v0.14.0: CLI self-update with version checks and installation status. Shipped in v0.15.0: Codex plugin marketplace, companion skill and plugin ZIP. Shipped in v0.16.0: workflow recording/replay/xUnit export, aggregate diagnostics, full-content screenshots and .NET Framework 4.7.2 compatibility.
The "change → measure → is it effective?" loop is complete: live-edit a property, then diff a before/after snapshot to see exactly what moved.
-
wpf_set_property/wpf_revert_property— live-edit a dependency property, then undo (v0.9.0) -
wpf_snapshot/wpf_diff— before/after snapshot to verify a change's effect (v0.10.0) -
wpf_evaluate_binding— explain why a property has its value; resolve a binding path hop-by-hop (v0.11.0) -
wpf_record→wpf_export_test— stable-selector replay and fresh-process xUnit tests, including drag/touch (v0.16.0) -
wpf_report— bounded aggregate diagnostics with explicit coverage (v0.16.0) - .NET Framework 4.7.2 and full-content scroll screenshots (v0.16.0)
- Inspector-only NuGet package for self-hosted mode (reference instead of injection)
- Streaming binding-error / property-change notifications to the MCP client
- WinUI 3 support
See docs/ROADMAP.md for the full prioritized plan (rationale, design notes, effort, and suggested sequencing).
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Development Setup
-
Clone the repository:
-
Open in Visual Studio 2022 or VS Code:
-
Build and run tests:
-
Run the sample WPF app for testing:
Project Structure
Technical Details
- MCP SDK: Built with the official C# MCP SDK from Microsoft/Anthropic
- Protocol: JSON-RPC 2.0 over stdio transport
- Target Framework: .NET 8.0 (Server) / .NET Framework 4.7.2, 4.8 and .NET 8.0-windows (Inspector)
- IPC: Named Pipes for server-to-application communication
- Tools: 38 tools auto-discovered via
[McpServerTool]attributes, covering inspection, diagnostics, interaction and workflow recording/testing. Replay performs recorded actions; full-content screenshots may temporarily scroll controls. - CLI: same executable runs as one-shot CLI when given a subcommand (
Program.csroutes viaCliRunner.IsCliCommand)
Acknowledgments
- Inspired by Snoop WPF - the original WPF spy utility
- Built on the Model Context Protocol by Anthropic
- Thanks to the .NET and WPF community
License
This project is licensed under the MIT License - see the LICENSE file for details.
Source: README.md at commit 8183220
Tools
0Version history
7- v0.20.0LatestOct 25, 2026
- v0.18.0Oct 25, 2026
- v0.17.0Oct 22, 2026
- v0.16.0Oct 19, 2026
- v0.15.0Oct 19, 2026
- v0.13.0Oct 18, 2026
- v0.12.0Sep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts