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.
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.
18 tools: desktop_snapshot, find, screenshot, zoom, click, type, key, scroll, drag, wait_for, act, set_value, scroll_to_find, app, window, clipboard, plus console and network on the browser. Details: docs/agent-loop.md and the tool docstrings.
Why not the alternatives
| 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
| 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
- 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.
Docs
Agent loop · 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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file a11y_computer_use-0.1.1.tar.gz.
File metadata
- Download URL: a11y_computer_use-0.1.1.tar.gz
- Upload date:
- Size: 499.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
add63439c834c3df8725e0d007ab4412f515fb5cb5c12b8a6976d34053a9251c
|
|
| MD5 |
8cdb0f76498eecec5a28b8179cba88b0
|
|
| BLAKE2b-256 |
7ec86cad6e22cd91cf36576d21399d5b2960ec54b84539f966d4641b26d469ea
|
Provenance
The following attestation bundles were made for a11y_computer_use-0.1.1.tar.gz:
Publisher:
release.yml on Perception-Dynamics-Inc/a11y-computer-use
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a11y_computer_use-0.1.1.tar.gz -
Subject digest:
add63439c834c3df8725e0d007ab4412f515fb5cb5c12b8a6976d34053a9251c - Sigstore transparency entry: 2886691994
- Sigstore integration time:
-
Permalink:
Perception-Dynamics-Inc/a11y-computer-use@230b5f2a7f5f88cd483ffedce07bd40aba31c248 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Perception-Dynamics-Inc
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@230b5f2a7f5f88cd483ffedce07bd40aba31c248 -
Trigger Event:
push
-
Statement type:
File details
Details for the file a11y_computer_use-0.1.1-py3-none-any.whl.
File metadata
- Download URL: a11y_computer_use-0.1.1-py3-none-any.whl
- Upload date:
- Size: 248.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3ede3f38f70fe370add6f1d4c05d87286a4a8ba744e08716b33d4fbe41f140f
|
|
| MD5 |
ba9ee8f4c6b9ac91289600dfab656470
|
|
| BLAKE2b-256 |
33c0ef71b6429b4d1ac7ec2ec298a5b7585b7820d04cf9afb68bb141adf64f15
|
Provenance
The following attestation bundles were made for a11y_computer_use-0.1.1-py3-none-any.whl:
Publisher:
release.yml on Perception-Dynamics-Inc/a11y-computer-use
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a11y_computer_use-0.1.1-py3-none-any.whl -
Subject digest:
e3ede3f38f70fe370add6f1d4c05d87286a4a8ba744e08716b33d4fbe41f140f - Sigstore transparency entry: 2886692001
- Sigstore integration time:
-
Permalink:
Perception-Dynamics-Inc/a11y-computer-use@230b5f2a7f5f88cd483ffedce07bd40aba31c248 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Perception-Dynamics-Inc
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@230b5f2a7f5f88cd483ffedce07bd40aba31c248 -
Trigger Event:
push
-
Statement type: