with one click
cua-driver
// Drive real macOS applications through the CUA Driver MCP server when the user asks to inspect, operate, or automate visible desktop UI.
// Drive real macOS applications through the CUA Driver MCP server when the user asks to inspect, operate, or automate visible desktop UI.
| name | cua-driver |
| description | Drive real macOS applications through the CUA Driver MCP server when the user asks to inspect, operate, or automate visible desktop UI. |
| platforms | ["darwin"] |
Use the CUA Driver MCP tools as the only action surface for desktop automation. Do not use shell, AppleScript, open, cliclick, screenshots outside CUA, or raw cursor/key APIs to drive macOS UI.
arkloop.plugins.cua.CuaDriver.app.CuaDriver.app/Contents/MacOS/cua-driver.list_apps. Match localized names, English names, romanized names, bundle identifiers, and common abbreviations. Prefer bundle_id as the stable identity.launch_app({ bundle_id }). Use the returned pid when available.list_windows({ pid }) when the launch result lacks a usable window.get_window_state({ pid, window_id }).click, right_click, double_click, drag, scroll, type_text, type_text_chars, press_key, hotkey, set_value, page, or launch_app with urls.Element indices are valid only for the latest get_window_state result from the same pid and window_id. Re-snapshot when an index is missing, stale, or from another window.
Call check_permissions before the first desktop task. If Accessibility or Screen Recording is missing, tell the user to grant both permissions to CuaDriver.app, then stop until the permission state changes.
Some media, browser, and Electron apps expose shallow accessibility trees while still showing actionable pixels. Use this order:
get_window_state({ pid, window_id }) once.page or relaunch with launch_app({ bundle_id, electron_debugging_port: 9222 }) when DOM access is more reliable than pixels.screenshot({ window_id }) for broad visual confirmation when the current overlay or window content is unclear.zoom({ pid, window_id, x1, y1, x2, y2 }) for dense text or icons.Ask the user only when visible candidates are ambiguous, the requested action is destructive, or the target is outside the visible window.
launch_app({ bundle_id }).launch_app({ bundle_id, urls: [...] }).launch_app({ bundle_id, urls: [...] }) so each target has a stable window_id.cmd+l for navigation. Use launch_app with urls.Use get_agent_cursor_state to inspect the cursor overlay. Use set_agent_cursor_enabled, set_agent_cursor_motion, or set_agent_cursor_style only when the user asks to show, hide, animate, or restyle the agent cursor.