Accessibility-tree MCP server for AI agents on macOS. Provides eyes and hands for Claude and other AI agents to interact with native apps, web apps, and desktop environments.
Ghost OS provides 16 well-structured tools with consistently present descriptions and input schemas. Naming follows verb_noun conventions (ghost_<action>). Descriptions are explicit about what each tool does and when to use it. However, significant gaps in output schema documentation, error handling guidance, and parameter constraints limit this to a C+/B- grade. The tools are well-suited for desktop automation but lack production-grade polish in error recovery and output structure documentation.
Click an element. Tries AX-native first, falls back to synthetic click. Returns post-click context.
Get orientation: focused app, window title, URL (browsers), focused element, and interactive elements. Call this before acting on any app.
Drag from one point to another (left-button only). Find source element by query or specify coordinates. Use for: moving files, adjusting sliders, reordering lists, selecting text, resizing panes.
What element is at this screen position? Bridges screenshots and accessibility tree.
Find elements in any app. Returns matching elements with role, name, position, and available actions.
Bring an app or window to the front.
No documented output schemas for any tool. LLMs cannot infer what fields are returned, complicating downstream tool chaining and field extraction. Required pattern: pattern:response-shaper.
No error handling guidance in tool descriptions. Tools that modify state (ghost_click, ghost_type, ghost_drag) do not document what to do if actions fail, what retries are safe, or how the LLM should recover. Required pattern: pattern:recovery-guide.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 67 | <=2025-11-25 | v2 |
Press a key combination. Modifier keys are auto-cleared afterward. Always include app parameter.
Move cursor to an element or position WITHOUT clicking. Triggers tooltips, CSS :hover, menu navigation. Use ghost_read after to see what appeared.
Full metadata about one element. Call this before acting on something you're unsure about. Returns role, title, position, size, actionable status, supported actions, editable, DOM id, and more.
Press and hold at a position for a duration. Triggers long-press menus, Force Touch previews, and drag-initiation behaviors.
Press a single key. Always include app parameter to ensure correct target.
Read text content from screen. Returns concatenated text from the element subtree.
Take a screenshot for visual debugging. Returns base64 PNG.
Scroll content in a direction.
List all running apps and their windows with titles, positions, and sizes.
Type text into a field. If 'into' is specified, finds the field first. Returns readback verification.
No enum constraints on string parameters that have fixed valid values. 'button' parameter in ghost_click accepts 'left|right|middle' but is declared as free-form string. Same for 'direction' in ghost_scroll (up|down|left|right), 'key' in ghost_press, and 'modifiers' arrays. LLMs will hallucinate invalid values. Required pattern: pattern:constrained-input.
Parameters accept free-form text without range, format, or constraint documentation. 'depth' parameter in ghost_find and ghost_read states 'default: 25, max: 100' in description but lacks formal schema constraints (minimum/maximum). 'count' in ghost_click and 'duration' in ghost_long_press lack documented ranges.
ghost_focus has minimal description (appears incomplete in source, likely truncated). Description does not state what happens if app is not running, or what is returned after focus. Violates pattern:tool-description minimum of 10 - 1024 characters with meaningful content.
No pagination or result limit guidance in discovery tools. ghost_find and ghost_state may return large result sets with no documented cap, limit parameter, or pagination guidance. LLMs may receive unbounded results that exhaust context window. Required pattern: pattern:paginated-result.
No idempotency guarantees documented for write operations. ghost_click, ghost_type, ghost_drag are potentially side-effecting actions. If an LLM retries due to ambiguous failure, duplicate execution may occur (e.g. double-click unintentionally). Required pattern: pattern:idempotent-operation.