reactive-resume
reactive-resume
A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today!
Sur-Cai/macos-computer-use-kit
AX-first computer use for AI agents on macOS with optional Jev (TypeSafe System One) semantic guards: calibrated target/input judgments before an irreversible action, decisions kept in code. Accessibility-tree targeting, window-scoped input, clipboard-safe paste, read-back verification. Ships a pip CLI, a pi package and a DeepSeek Harness plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:Sur-Cai/macos-computer-use-kit
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
AX-first macOS computer use for AI agents: an MCP server and a CLI. Agents read the accessibility tree instead of guessing coordinates from screenshots. Input is posted to the target app in the background, so your cursor never moves, and every action is verified.
English · 简体中文
screenshot → guess coordinates → click → hope ✗ slow, fragile, moves your mouse
snapshot → act on #ref → verify the diff ✓ what this kit does
#ref, its
role, its label and exact screen geometry. Re-observing returns only the
diff. Electron and Chromium apps get their full tree turned on
automatically.action_sent from
verified. Failures say whether it is safe to retry, whether to
reobserve, or whether to never retry.macos-cu doctor tells you exactly which app
is missing which permission.Pick one of these:
# A. As a plugin: MCP server, skill and /macos-doctor command
/plugin marketplace add Sur-Cai/macos-computer-use-kit
/plugin install macos-computer-use@macos-computer-use-kit
# B. As a plain MCP server
claude mcp add --scope user macos-computer-use -- uvx macos-computer-use-kit mcp
The plugin finds macos-cu on your PATH and otherwise falls back to uvx
or pipx run. Nothing has to be pre-installed except uv
or pipx.
pipx install macos-computer-use-kit # or: pip install / uv tool install
macos-cu setup claude-code # also: claude-desktop, codex, cursor, gemini, opencode
macos-cu setup skill # copy the agent skill to Claude, Codex and opencode
macos-cu doctor # permissions, displays, OCR, policy
setup is idempotent and supports --dry-run. JSON configs are merged, so
your other servers are preserved, and a .bak copy is written before the
first change. --read-only registers only the observation tools.
{
"mcpServers": {
"macos-computer-use": {
"command": "uvx",
"args": ["macos-computer-use-kit", "mcp"]
}
}
}
Codex (~/.codex/config.toml):
[mcp_servers.macos-computer-use]
command = "uvx"
args = ["macos-computer-use-kit", "mcp"]
GUI apps do not inherit your shell's PATH. Use absolute paths
(which uvx) if the client cannot find the command. macos-cu setup print
prints the exact argv for your machine.
The MCP server exposes 18 tools. Observation tools carry readOnlyHint, so
clients can auto-approve them. To trim the list, use mcp --read-only,
--tools a,b or --exclude-tools c.
| Tool | What it does |
|---|---|
macos_doctor |
Permissions, display layout (points, Retina scale, negative origins), OCR, policy |
macos_snapshot |
Interactive elements as #ref role size @screen[x,y] label, trimmed to a character budget; diff_against returns only the changes |
macos_find / macos_element_at |
Find by role or title with exact geometry / hit-test a screen point |
macos_act |
Act on an element by ref: press, set_value, focus, or any action it advertises (AXShowMenu, AXIncrement, …), with read-back verification |
macos_click |
Background click: left, right or middle, double or triple, with modifiers; expect refuses if the window moved |
macos_type / macos_key |
Unicode typing (CJK- and emoji-safe) or clipboard-safe paste / keys and chords (cmd+shift+t, mod+s) |
macos_scroll / macos_drag / macos_hover |
Pointer gestures posted to the target process |
macos_app / macos_window / macos_menu |
Launch, activate, quit or open a URL or file / move, resize, minimize, raise or close windows / menu bar by path (File > Export…) |
macos_screenshot |
App, window, region or display capture with blank-frame detection; annotate=true adds set-of-mark labels |
macos_ocr |
Apple Vision OCR with screen rects; text= returns only the matches, ready to click |
macos_wait |
Wait for an element to appear, disappear or hold a value, instead of sleeping |
macos_jev_guard |
Optional semantic check before an irreversible step (see Jev) |
macos_doctor once: permissions + display layout
macos_snapshot app="Notes" → #a1b2c3d4 AXButton 28x28 @screen[812,64] New Note …
macos_act ref="a1b2c3d4" → {"ok":true,"action_sent":true,"verified":true}
macos_type app="Notes" text="周会纪要 ✅" → Unicode events, clipboard untouched
macos_snapshot app="Notes" diff_against=<path> → only what changed
The rules behind the loop, which the bundled skill teaches:
center_screen, then keyboard shortcuts.macos_wait.action_sent is true, re-observe before
repeating anything that can't safely run twice. A second "Send" is a
second message.stale_ref means re-observe. It never means "pick the nearest element".| Space | Meaning | Used by |
|---|---|---|
screen[x, y] |
Global points, origin at the primary display's top-left (same as AX and CGEvent) | macos_click, input --x --y, overlay |
| window-relative | element point minus window origin | macos_click window_id=… |
| image pixels | screenshot pixels = points × backing_scale (Retina: 2) |
only when reading a PNG yourself |
Displays placed left of or above the primary have negative coordinates.
That is normal, and macos_doctor prints the layout.
Everything runs locally. The kit makes no network calls, except the optional Jev guard, which only runs when you configure a key and call it.
| Guard | Behaviour | Override |
|---|---|---|
| Sensitive apps | Password managers, Keychain Access, Passwords, SecurityAgent, the login window and system auth prompts refuse input | MACOS_CU_ALLOW_SENSITIVE=1 |
| Secure input | Refuses to type into an app whose password field holds Secure Event Input; secure field values are redacted in every tree and result | — |
| Locked screen | Refuses all input while the screen is locked | — |
| System chords | Lock screen, log out and force quit are refused | MACOS_CU_ALLOW_SYSTEM_CHORDS=1 |
| App allow/deny | Only / never these bundle ids or names | MACOS_CU_ALLOW_APPS, MACOS_CU_DENY_APPS |
| Dry run | Resolve targets and report, but post no events | MACOS_CU_DRY_RUN=1 |
| Audit log | One JSON line per mutating action; typed text is logged as its length only | MACOS_CU_AUDIT=1 |
Local files stay private to your account:
~/.cache/macos-computer-use/,
or wherever MACOS_CU_CACHE_DIR points.0700/0600 permissions.MACOS_CU_SNAPSHOT_KEEP).out=).
Temporary OCR captures are deleted.Every command prints JSON (or compact text for ax tree/find/snapshot), so an
agent can drive the kit from any shell. Exit codes are stable: 0 ok,
2 usage or permission, 3 not found / stale ref, 4 capture failed,
5 target changed, 6 refused by policy, 7 timeout.
| Group | Commands |
|---|---|
macos-cu ax |
snapshot (--interactive, --budget, --diff), find, tree, at, actions, press, setvalue, focus, action --name, wait, resolve |
macos-cu input |
click (--button, --count, --flags), type, key (chords), scroll, drag, hover, move, windows, cursor, pid |
macos-cu paste |
Clipboard-safe paste that proves the app consumed it and restores the clipboard |
macos-cu app |
list, launch, activate, hide, quit, open --target URL/file |
macos-cu window |
list, move, resize, minimize, restore, raise, focus, close, fullscreen |
macos-cu menu |
list, select --path "File > Export…" |
macos-cu shot |
capture, annotate, check, windows, displays |
macos-cu ocr |
Vision OCR of an app, window, region or file (--text, --lang zh-Hans,en-US) |
macos-cu mcp / setup / doctor |
Serve MCP / register with a client / diagnose |
macos-cu overlay / jev |
Visual feedback ring / optional semantic guards |
macos-cu ax snapshot --app Finder --interactive
macos-cu ax press --app Finder --ref 9d2261d7
macos-cu menu select --app Safari --path "File > New Private Window"
macos-cu input type --app Notes --text "你好, world 👋"
macos-cu input click --window-id 12345 --x 171 --y 28 --expect "<pid:wid:x:y:w:h>"
macos-cu shot annotate --app "System Settings" --out /tmp/marks.png
macos-cu ocr --app Preview --text "Total"
The MCP server covers most clients. There are native bridges for two
harnesses that prefer their own tool format. Both are thin wrappers over the
same CLI and call it with argv arrays (shell: false).
| Harness | Package | Install |
|---|---|---|
| pi | pi-macos-computer-use: skill + 16 tools |
pi install npm:pi-macos-computer-use |
| DeepSeek Harness | dsh-macos-computer-use: Cordis bundle, 11 tools |
dsh plugin --profile <name> add dsh-macos-computer-use |
| opencode | skill + MCP entry | macos-cu setup opencode (or ./install.sh from a checkout) |
Install the CLI first (pipx install macos-computer-use-kit). If an app
launched from the Dock can't find it, set MACOS_CU_BIN=/abs/path/to/macos-cu.
All artifacts share one version number and are released together. See
packages/pi and packages/dsh
for details.
This is the only feature that needs a key. Right before an irreversible step, a small model gives calibrated judgments: is this still the intended recipient? does the field hold the intended text? what blocks the action? Code decides whether to proceed, and the model may only suggest the two recoveries that cannot send anything.
echo '{"task":"send the report to Alice",
"expected":{"recipient":"Alice","message":"Q3 numbers"},
"observed":{"chat_title":"Bob","input_text":"Q3 numbers"}}' | macos-cu jev guard
# {"answers":{"right_target":0.02,"input_ok":0.98,"blocker":"wrong_target"},"decision":"switch_target"}
The key is read from TYPESAFE_API_KEY or ~/.config/typesafe/api_key
(https://console.typesafe.ai/keys). Question design is covered in
skill/reference/jev-best-practices.md.
Computer use is a busy space. These are the projects worth knowing, with star counts as of September 2026. Pick the one that fits.
| Project | Platform · language | Pick it when you want… |
|---|---|---|
| trycua/cua ★26k | macOS/Linux/Windows · Swift/Rust/Py | VM sandboxes (Lume), a driver + benchmarks, cross-platform agents |
| bytedance/UI-TARS-desktop ★39k | cross-platform · TS | a vision-model-driven desktop agent app |
| microsoft/OmniParser ★25k | any · Py | screenshot → UI elements, for pure-vision agents |
| microsoft/UFO ★10k | Windows · Py | a Windows UI Automation agent OS |
| CursorTouch/Windows-MCP ★7k | Windows · Py | the Windows counterpart of this kit |
| openclaw/Peekaboo ★5k | macOS · Swift | a native Swift CLI and menu-bar app with annotated screenshots |
| iFurySt/open-codex-computer-use ★2k | macOS/Linux/Windows · Swift | an open clone of Codex's computer-use tool surface |
| ghostwright/ghost-os ★2k | macOS · Swift | AX-first MCP with a learn-by-demonstration recorder |
| lahfir/agent-desktop ★2k | macOS · Rust | an AX CLI with skeleton-then-drill traversal |
Where this kit fits. It is pure Python on pyobjc, so there's no binary to
notarize: uvx runs it anywhere. Its focus is agent-loop reliability. That
means verified results with retry semantics, stale-ref detection, snapshot
diffs, and a deterministic safety policy. The optional Jev guard adds a
calibrated check before irreversible steps. The design follows the patterns
mature computer-use agents converged on, reimplemented from scratch.
annotate, ocr and coordinate clicks there, and
verify visually.macos_app action=activate first.src/macos_computer_use/ the CLI + MCP server (single source of truth)
skill/ the agent skill (canonical; synced by scripts/sync-skill.sh)
plugins/claude-code/ Claude Code plugin (MCP launcher, skill, /macos-doctor)
.claude-plugin/ marketplace manifest for `/plugin marketplace add`
packages/pi/ pi package (skill + native tools)
packages/dsh/ DeepSeek Harness bundle
tests/ unit tests: policy, chords, diffs, OCR geometry, MCP protocol
tools/*.py legacy script shims over the same modules
See CONTRIBUTING.md for conventions, PUBLISHING.md for release steps and CHANGELOG.md for the changelog.
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: agent-skills、claude-code、llm-guardrails、mcp、mcp-server、ocr。