An MCP server exposing Windows UI Automation. Instead of screenshots and pixel coordinates it reads the real control tree of an application and operates controls through their accessibility actions.
Strong tool coverage with 22 well-named, action-verb tools (describe_, list_, read_, find_, get_, invoke_, toggle_, set_, expand_, select_, scroll_, window_, capture_, clipboard_, wait_for_, batch_, self_test_). All tools have descriptions (avg ~120 chars, within 10-1024 baseline). Input schemas present for all tools with typed parameters. However, output schemas are not documented, LLMs cannot predict response structure for chaining. Error handling guidance is absent; tools return state before/after but lack recovery hints. No tool annotations (readOnlyHint/destructiveHint). Parameter descriptions are present but some lack format/constraint details (e.g., 'rect' array format [left,top,right,bottom] is documented in description but not in schema). Risk classification (READ_ONLY vs WRITE) is declared but not exposed in tool metadata.
Execute multiple tools in sequence. Each step can use the ref from a previous step. Stops on the first error unless continue_on_error is true.
Capture a screenshot of the screen, a window, or a single element as a PNG image. Returns the image as base64-encoded data.
Read or write the system clipboard. Mode 'read' returns the current clipboard text, 'write' sets it.
Describe every open window on the screen: title, class, position, size, and how many nodes are in its control tree. Use this to find the window you want to work with.
Get the element at a specific screen coordinate. Returns its ref, name, role, and available actions.
Expand or collapse a tree item, menu, or other expandable element. Returns the element state before and after.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting) for downstream tool chaining. E.g., read_ui_tree returns 'tree of elements' but structure is opaque.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Risk classification (READ_ONLY vs WRITE) is declared in metadata but not exposed in MCP tool definitions, preventing agents from reasoning about safety and retry logic.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Search for elements by name or role in a window. Returns a flat list of matching elements with their refs, names, roles, and available actions.
Get the element that currently has keyboard focus. Returns its ref, name, role, and available actions.
Read the text content of an element. Returns the text before and after the read (they are the same unless the element is a live region).
Invoke an element (click a button, activate a menu item, etc.). Returns the element state before and after the action.
List all open windows by title and class. Faster than describe_screen if you only need titles and classes, not the full tree.
Read a table or grid from a window. Returns rows and columns with their text content.
Read all text from an element and its children using the TextPattern. Returns the full text content.
Read the control tree of a window. Returns a tree of elements with their names, roles, rectangles, and available actions. Use window_handle from describe_screen or list_windows. Set only_actionable to true to skip read-only elements.
Scroll a scrollable element (window, list, etc.) in a direction. Returns the element state before and after.
Select an item in a list, tree, or other selection container. Returns the element state before and after.
Run internal diagnostics and return the results. Checks that dependencies are installed and the server is working correctly.
Set the text content of an element (text box, input field, etc.). Returns the element state before and after.
Set the numeric value of a slider, spinner, or other range control. Returns the element state before and after.
Toggle an element (check/uncheck a checkbox, turn on/off a switch, etc.). Returns the element state before and after.
Wait for an element to appear or disappear. Polls the screen until the condition is met or timeout expires.
Manipulate a window: move, resize, minimize, maximize, close, etc. Returns the window state before and after.
Error handling lacks recovery guidance. Tools return state before/after but do not guide LLMs on what to do if an action fails (retry, ask user, abort). E.g., invoke() may fail silently if element is disabled.
Parameter constraints not fully formalized in schema. E.g., 'rect' parameter in window() is documented as [left,top,right,bottom] in description but schema shows only 'array of integers' with no minItems/maxItems/description per item.
batch() tool combines multiple concerns (sequencing, error handling, ref passing). No clear guidance on when to use batch vs sequential calls, or how refs propagate between steps.