Connect background desktop control to your agent.
Pick your operating system, install the open-source driver, then connect Claude Code, Codex, Hermes, or any MCP client to the same stdio server.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/cua-driver/scripts/install.sh)"Start with your machine.
We preselect the OS your browser reports. Switch lanes whenever you are installing on a different host.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/libs/cua-driver/scripts/install.sh)"open -n -g -a CuaDriver --args serve
cua-driver statuscua-driver call check_permissions
cua-driver statusChoose the agent surface you already use.
After installing on macOS, every lane points at cua-driver mcp. The wrapper changes; the desktop control surface stays the same.
claude mcp add --transport stdio cua-driver -- cua-driver mcpclaude mcp add --transport stdio cua-computer-use -- cua-driver mcp --claude-code-computer-use-compatcodex mcp add cua-driver -- cua-driver mcpcua-driver mcp-config --client hermes
# paste into ~/.hermes/config.yamlcua-driver mcp-config --client cursor
cua-driver mcp-config --client opencodecua-driver mcp-configThe loop is launch, inspect, act, verify.
Element indexes are refreshed on every snapshot, so the pre-action and post-action window state are part of the contract.
Persistent sessions keep element indexes and per-run state alive across tool calls.
open -n -g -a CuaDriver --args serve
cua-driver statusLaunch returns a pid and windows. The snapshot gives your agent element indexes plus a screenshot.
cua-driver call launch_app '{"bundle_id":"com.apple.calculator"}'
cua-driver call get_window_state '{"pid":844,"window_id":10725}'Click or type by element_index, then snapshot again before claiming the action worked.
cua-driver call click '{"pid":844,"window_id":10725,"element_index":14}'
cua-driver call get_window_state '{"pid":844,"window_id":10725}'If you are wrapping Cua Driver in Hermes or another broker, let cua-driver mcp own daemon startup, treat stdio MCP as the contract, and reconnect the MCP transport if the daemon becomes unreachable.