Skip to main content

a11y-computer-use

CI PyPI Python 3.11+ Apache-2.0 Release v0.2.1

Computer use for AI agents that clicks real UI elements instead of guessed pixels. The model reads a pruned accessibility tree and says click e14. Works on macOS, Windows, Linux, and Chromium, through one MCP server.

0.2.0 adds OCR refs for apps with no accessibility tree, a mission runner for long multi-app jobs, and macOS menu and file-dialog tools. Live-verified on this release: OCR of the real screen (about 0.5 s), TextEdit menus through the accessibility menu bar, and Figma's tree through the Electron fix. The full agency mission in docs/missions/ has not been run end to end yet.

Driving TextEdit through accessibility refs

Install

uvx a11y-computer-use doctor            # try it, no install
pip install a11y-computer-use           # extras: [browser] [windows] [linux]

Add it to Claude Code, Claude Desktop, Cursor, or any MCP host:

claude mcp add a11y-computer-use -- uvx a11y-computer-use mcp
{ "mcpServers": { "a11y-computer-use": { "command": "uvx", "args": ["a11y-computer-use", "mcp"] } } }

For a browser tab instead of the desktop, start Chrome with --remote-debugging-port=9222 and set A11Y_COMPUTER_USE_DRIVER=browser.

What the model sees

[snap-7] com.apple.TextEdit (window)
  e1 window "Untitled"
    e2 textarea ="Hello" (edit,focus)
    e3 button "Save" (click)

Then it acts: click(ref="e3"), type("hello"), set_value(ref="e2", value="..."). Ref clicks go through the accessibility API and leave your pointer alone. A stale ref comes back as stale_ref with the nearest live candidates. Re-observing as a diff costs about 10 tokens. Apps with no accessibility tree (Telegram, canvases) get OCR refs o1..oN from on-device text recognition, and click(ref="o7") works the same way (docs/ocr-refs.md).

21 tools: desktop_snapshot, find, screen_text, screenshot, zoom, click, type, key, scroll, drag (with waypoint paths for strokes), wait_for, wait_until, act, set_value, scroll_to_find, notes, menu, file_dialog, app, window, clipboard, plus console and network on the browser. Menus and file dialogs stay reachable even in custom-drawn apps (docs/macos-primitives.md). Details: docs/agent-loop.md and the tool docstrings.

Why not the alternatives

Comparison with other computer-use approaches

Approach Native desktop Any model Embeddable
Claude Desktop built-in pixel loop
browser-use, Playwright MCP a11y tree ❌ browser only
UI-TARS-desktop pixel / vision partial app
Windows-MCP, Terminator a11y (UIA) Windows only
a11y-computer-use a11y tree + vision fallback ✅ macOS, Linux, Windows*, Chromium ✅ local too ✅ MCP, CLI, Python

Same planner, 13 browser tasks, one round: refs finished 13/13 with 0 misclicks for $7.04; screenshot coordinates finished 7/13 with 27 misclicks for $11.74 (full results). Run it yourself with a11y-computer-use bench h2h.

Platforms

Four drivers under one core

Observe Ref actions Type, keys Coordinates, screenshot Verified
macOS (AX) live on a granted Mac
Linux (AT-SPI2) ✅ X11, ❌ Wayland CI + real desktop VM
Browser (CDP) CI, headless Chrome
Windows (UIA)* ◐ press only CI, Notepad

*Windows is partial: ref re-resolution, capture, and coordinate input are not implemented yet. Exact gates per platform: docs/ci.md, docs/windows-port.md, docs/linux-port.md.

Safety

Permission tier, confirmation gate, same-window recheck, execute, audit log

  • Per-app grants (read, click, full) in ~/.a11y-computer-use/permissions.json. No tool can grant itself access.
  • Clicks on destructive labels ask the host to confirm. No confirmation channel means the click is blocked.
  • Password fields are never read, typed into, or clicked. Every action is checked against the frontmost window right before it fires.
  • Everything is logged to ~/.a11y-computer-use/audit/ as JSONL, with secrets redacted.

Report security issues privately: SECURITY.md.

Embed it

from a11y_computer_use import safety, server

store = safety.PermissionStore()
store.set_tier("com.apple.TextEdit", safety.Tier.FULL)
rt = server.Runtime(store=store)
print(rt.desktop_snapshot("com.apple.TextEdit", mode="interactive"))
rt.click(ref="e3", verify=True)

Existing Anthropic or OpenAI computer-use loops can run through it unchanged via a11y_computer_use.adapters (docs/provider-adapters.md). A reference agent loop ships as a11y-computer-use agent --task "..." and works with Anthropic, OpenAI-compatible endpoints (Ollama included), or the Claude Code CLI.

Long jobs across several apps run as missions: phases with their own app grants, step budgets, runner-side checks (a file exists, a URL answers, text is on screen), retries, and a wall-clock timeline for video cuts.

a11y-computer-use mission run examples/missions/agency-demo.toml --provider claude-cli

Format and checks: docs/missions.md. The example mission is the design-agency reel described in docs/missions/agency-demo.md.

Docs

Agent loop · Missions · OCR refs · macOS menus and dialogs · Adapters · Observation cost · Benchmark · Browser backend · Linux · Windows · Real-desktop test bed · CI · Decision records · Changelog · Contributing

Apache-2.0. Copyright 2026 Perception Dynamics, Inc.

Release files for a11y-computer-use 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for a11y-computer-use 0.2.1
File Size Uploaded
a11y_computer_use-0.2.1.tar.gz 582.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for a11y-computer-use 0.2.1
File Interpreter ABI Platform
a11y_computer_use-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 874.3 kB

Release files / a11y_computer_use-0.2.1.tar.gz

Download URL a11y_computer_use-0.2.1.tar.gz
Size 582.0 kB
Tags Source
SHA-256 checksum
How to use checksums
aae4c20dfa43e193f8a3d772e159c5793b76556fc9d598a5dd7c56de6e245c06
BLAKE2b-256 checksum
How to use checksums
de2a812e3b1966224831a472a4f12453506d288fbfd5f339c76ae38b3d799406
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / a11y_computer_use-0.2.1-py3-none-any.whl

Download URL a11y_computer_use-0.2.1-py3-none-any.whl
Size 292.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c89f2de5cd06445c7d895f1b19cab3f7f60a332847b2bd26997234160da6d42b
BLAKE2b-256 checksum
How to use checksums
3e6d601dc373c5c74e3cc4ac51e8b395b987d330a49fdfcaaa87672c5884d231
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.1

2 release files

0.3.0

2 release files

This release

0.2.1 This release

2 release files

0.2.0

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page