open-computer-use

Desktop app control over MCP on macOS, Linux and Windows through each system's accessibility APIs

By Qwen Go Local · stdio Developer tools

54 popularity score ★ 304 ↓ 988/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

FirstTerminal
npm install -g @qwen-code/open-computer-use
Claude CodeTerminal
claude mcp add open-computer-use -- open-computer-use mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "open-computer-use": {
      "command": "open-computer-use",
      "args": [
        "mcp"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "open-computer-use": {
      "command": "open-computer-use",
      "args": [
        "mcp"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "open-computer-use": {
      "type": "stdio",
      "command": "open-computer-use",
      "args": [
        "mcp"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.open-computer-use]
command = "open-computer-use"
args = ["mcp"]
Gemini CLITerminal
gemini mcp add --scope user open-computer-use open-computer-use -- mcp

Settings 5

Set together: screenshots
OPEN_COMPUTER_USE_IMAGE_MAX_DIMENSION Optional: macOS: long-edge pixel cap for screenshots. Default 1280. For get_app_state.
OPEN_COMPUTER_USE_IMAGE_MAX_BYTES Optional: macOS: byte budget for the encoded PNG. Default 900000. For get_app_state.
OPEN_COMPUTER_USE_IMAGE_MIN_SCALE Optional: macOS: lowest downsample ratio, between 0 and 1. Default 0.25. For get_app_state.
OPEN_COMPUTER_USE_IMAGE_CAPTURE_TIMEOUT Optional: macOS: seconds to wait for a screenshot. Default 5. For get_app_state.
OPEN_COMPUTER_USE_ALLOW_GLOBAL_POINTER_FALLBACKS Optional: macOS: set to 1 to let clicks move the real pointer when accessibility cannot handle them. Off when unset. For click.

What it does

open-computer-use is a local stdio MCP server that drives the apps on your own desktop. It reads a running app's window as an accessibility tree plus a screenshot, then acts on it: clicking elements by index or by pixel position, typing, pressing key combinations, scrolling, dragging, setting field values and invoking secondary accessibility actions. The Qwen team maintains it for their Qwen Code agent, but any MCP client can use it.

The npm package (version 0.2.3 is what you get) is a Node launcher that picks a bundled native runtime for your platform: Swift on macOS, Go with PowerShell UI Automation on Windows, and Go calling a Python AT-SPI2 helper on Linux. The same command doubles as a CLI with doctor, call, snapshot and list-apps, and it can register itself with Claude Code, Gemini CLI and opencode.

The published package is a fork of iFurySt/open-codex-computer-use, which we also list. Be aware that the repository's main branch has since been replaced by a different, unreleased 0.28 development snapshot. There the MCP server is a Node REPL built from source that exposes only js and js_reset. None of that is on npm yet, and its README warns of an open macOS crash investigation. This page describes the npm release.

On macOS, a click the accessibility layer cannot handle fails instead of moving the real pointer, unless OPEN_COMPUTER_USE_ALLOW_GLOBAL_POINTER_FALLBACKS is set to 1 (ComputerUseService.swift at v0.2.3). The README never mentions this switch.

What it needs

RuntimeNode.js
Runs onmacOS, Windows, Linux
Also
  • A signed-in desktop session (x64 or arm64)
  • Linux: AT-SPI2 over D-Bus, python3 with PyGObject and Atspi 2.0 bindings
  • macOS: Accessibility and Screen Recording permission

Node.js and npm for the global install. On macOS, run open-computer-use once and grant Accessibility and Screen Recording. On Linux, install python3 with PyGObject (gi) and the Atspi 2.0 bindings from your distribution yourself, because the npm install does not bring them.

Limits

  • Platform Screenshot size settings (OPEN_COMPUTER_USE_IMAGE_*) apply on macOS only. Windows and Linux return full-size PNGs.
  • Limit Action tools need a get_app_state call for that app first and fail otherwise.
  • Platform On Linux, coordinate clicks and synthetic key input are best-effort fallbacks and unreliable under Wayland. Element-based actions work best.
  • Size cap The Linux helper reads at most 500 elements and 64 levels of a window's tree (runtime.py), so very large windows come back partial.
  • Limit On macOS, clicks fall back to the physical pointer only when OPEN_COMPUTER_USE_ALLOW_GLOBAL_POINTER_FALLBACKS=1 is set.
  • Not covered Works only on apps that are already running. It has no tool to launch apps or run commands.
  • Early release The repository's main branch now holds an unreleased 0.28 snapshot with a different server (js, js_reset) that is not on npm.

Screenshot size tuning (the OPEN_COMPUTER_USE_IMAGE_* settings) applies on macOS only; Windows and Linux return full-size PNGs. Action tools need a get_app_state call for that app first and fail otherwise. On Linux, coordinate clicks and synthetic key input are best-effort fallbacks and not reliable under Wayland; element-based actions work best. The Linux helper reads at most 500 elements and 64 levels of a window's tree. It works only on apps already running; it has no tool to launch apps or run commands.

Who it suits

Suits someone who wants an assistant to operate ordinary desktop apps on their own machine, especially on Windows or Linux, or who uses Qwen Code. It runs locally and needs no account or key, but it acts with the user's full desktop session, so it fits a machine where that is acceptable. The upstream open-codex-computer-use, which we also list, is the project this one was forked from. For web pages alone, a browser automation server is a narrower choice. Anyone following the current README on the main branch will build a different, unreleased server, so install the npm package if you want the tools listed here.

Tools 9

2 only read, 7 change things. A ? marks an optional parameter.

list_apps
Lists running apps plus those used in the last 14 days, with usage details.
get_app_state
Returns a running app's key window as a screenshot and accessibility tree. Needed before acting.app: string
click changes
Clicks an element by its index or at screenshot pixel coordinates.app: stringelement_index?: stringx?: numbery?: numberclick_count?: integermouse_button?: enum
perform_secondary_action changes
Triggers another accessibility action an element exposes.app: stringelement_index: stringaction: string
scroll changes
Scrolls an element a number of pages in a direction.app: stringelement_index: stringdirection: stringpages?: number
drag changes
Drags between two pixel coordinates.app: stringfrom_x: numberfrom_y: numberto_x: numberto_y: number
type_text changes
Types literal text through keyboard input.app: stringtext: string
press_key changes
Presses a key or combination, in xdotool key syntax.app: stringkey: string
set_value changes
Sets the value of an element that accepts one.app: stringelement_index: stringvalue: string

Similar servers