Extensible desktop-control MCP server for Linux-first agentic automation, with pluggable backends for windows, input, screenshots, OCR, app launching, and policy-aware computer interaction.
Strong foundation with 36 well-named tools using consistent verb_noun patterns (get_, list_, focus_, move_, etc.). All tools have descriptions (avg 85 chars, within 10-1024 baseline). Input schemas present and mostly complete with Zod validation. Key gaps: output schemas undocumented (no return type specs visible), parameter descriptions sparse in some tools (e.g., mouse_down region object lacks field docs), and error handling guidance minimal. Policy checks present (requireToolEnabled, assertLaunchAllowed) but recovery paths not documented. Composition is strong, tools are single-responsibility and chainable (e.g., list_windows → focus_window → click_in_window).
List generated artifacts stored in the configured artifact directory.
Click inside a target window using window coordinates or window-relative ratios.
Request a polite close for the specified window.
Double click inside a target window using window coordinates or window-relative ratios.
Drag within a target window using window coordinates or window-relative ratios for start and end points.
Find accessibility nodes matching a semantic query when accessibility support is available.
Capture the screen, OCR it, and report whether the query text is present.
Output schemas not documented. No return type specifications visible for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., window_id from list_windows). Baseline: 100% of A+ tools document return types.
Coordinate parameter objects (region, monitorId/relativeX/relativeY in mouse_down, mouse_up, mouse_move) lack field-level descriptions. LLMs cannot infer whether to use absolute vs relative coords or what region object structure is expected.
Error handling and recovery guidance absent. No documented error cases, retryability classification, or actionable recovery paths (e.g., 'If window not found, call list_windows first'). Agents cannot self-correct on failures.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Focus a window by id, exact title, or best-match title.
Return an accessibility snapshot when AT-SPI support is available.
Return metadata for the currently focused window.
Return a cheap structured desktop snapshot without taking a screenshot.
Return OS, session, hostname, version, backend availability, and detected binaries.
Return readiness, session details, and backend diagnostics.
Capture a screenshot and optionally run OCR when available.
Press and hold a single key.
Release a previously held key.
Launch an application from a command and argument list.
Return detected capability status for each backend and integration.
List detected monitors and their geometry.
List visible top-level windows with metadata and geometry when available.
Click the left, middle, or right mouse button, optionally after moving.
Press and hold a mouse button, optionally after moving.
Move the pointer to absolute coordinates.
Release a mouse button, optionally after moving.
Move the pointer to a point inside a target window using window coordinates or window-relative ratios.
Move a window to absolute x and y coordinates and/or another workspace.
Move a window to the origin of the primary monitor.
Open a URL through the system URL handler.
Read the current clipboard contents if supported.
Resize a window to the specified width and height.
Move and resize a window in one operation.
Switch the visible desktop/workspace.
Capture a full screen, active window, or explicit region screenshot.
Poll until a matching window appears or the timeout expires.
Capture the active window to an artifact file.
Write text to the clipboard if supported.
Policy checks present (requireToolEnabled, assertLaunchAllowed) but not documented in tool descriptions. LLMs unaware that launch_app may be gated by policy or what constraints apply.
Coordinate tools (mouse_down, mouse_up, mouse_move) accept both absolute (x, y) and relative (monitorId, relativeX, relativeY) but validation logic not visible. Unclear if both can be passed simultaneously or if they are truly mutually exclusive.