v0.3.0
computer-use-mcp v0.3.0
This release turns computer-use-mcp from a per-action driver into a system that can
learn a task once and replay it at engine speed — the agent (or the user, via a
recorder) demonstrates a task, and it is saved as a named, self-healing skill. Around
that, the release hardens reliability (stable element ids with state diffs, a batch
tool, fresher app/display enumeration, a newest-build-wins daemon handover), tightens
safety and coexistence (interference yield, browser URL policy, screen-lock pause,
sleep assertion), and improves what the agent can see and what the user can watch.
Teach / replay skills
- Save, run, list, get, delete. New
save_skill/run_skill/list_skills/
get_skill/delete_skilltools capture a task once and replay it as a named,
parameterized skill. Element anchors are frozen into durable locators (role + label +
tree path) that re-resolve on each run, so a skill survives app restarts and replays
at engine speed with no model in the loop. - Recorder teach mode.
record_skill_start/record_skill_stopcapture a task the
agent performs or that the user demonstrates with the recorder, then save it as a
skill draft. - Self-healing locators. A resolved-but-moved element self-heals its saved path on
replay, so ordinary UI drift doesn't break a skill. - Resume. A run can restart from a given step (
start_at_step) after a failing step
is fixed and re-saved, instead of re-running from the top. - Extract steps.
read_textsteps return their text in the run result, so a skill
can pull data out as it replays. - Per-step safety and assertions. Each replayed step passes the same per-step safety
gates as a live action, and steps can assert their effect (expect, inwait_for
terms). - Repair reports. A step that no longer resolves stops the run with a report naming
the nearest candidate elements, so the failing step can be fixed and re-saved.
Reliability
- Element-id stability + state diffs. Actions return state diffs; elements that
survive a UI change keep their ids, so ids the agent already holds stay valid instead
of being invalidated on every action. - Batch tool.
batchruns a short, predictable action sequence in one round-trip,
stopping at the first failure. - Fresh enumeration fixes. Running apps are enumerated freshly rather than from an
NSWorkspacesnapshot; the frontmost app is read from the window server (with an
lsappinfopath in live eval) rather thanNSWorkspace; and display scale is derived
from CoreGraphics rather thanNSScreen. - Newest-build-wins daemon handover. The daemon retires on binary change, not just on
a version-string change, so a freshly built engine takes over cleanly. - Chronic CI build fix. Daemon wire types were marked
Sendableto fix the recurring
CI build failure, a strong actor reference is bound before reader-threadTasks, and
the full build error is now surfaced in CI.
Safety & coexistence
- Interference yield. The server yields to real hardware input: when the user is
working in the target app (or an action uses the global cursor) and hardware input was
seen recently, the call returns a recoverable error instead of interleaving with the
user (interference_idle_seconds). - Browser URL policy. Browser actions are gated server-side on the current page URL —
url_denypatterns block outright (confirm does not override) andurl_confirm
patterns (plus payment-page defaults) requireconfirm. - Screen-lock pause. Mutating tools pause with a recoverable error while the screen is
locked, resuming when the user unlocks. - Sleep assertion. The Mac is kept from idle-sleeping while tool calls are flowing.
- Focus give-back on cold launch. After a cold app launch steals focus, focus is
returned to the app the user was in.
Visibility
- Click pulse. The overlay shows a pulse at each click location.
- Agent-working chip on all displays. The "Agent working" status chip is shown on
every display, not just the primary one. - Recording indicator. Teach-mode recording surfaces an on-screen indicator.
Perception
- Opaque-canvas OCR hint. Rich-shell windows that draw their own opaque canvas are
detected and hinted for OCR (ocr: true). - Unlabeled-control identifiers. Unlabeled native controls get a richer identity in
the outline so the agent can address them. - Inactive-Space capture. Screenshots can capture windows on inactive Spaces.
include_screenshotonget_app_state.get_app_statehonors
include_screenshot, with a documented compatibility matrix and detail-selection unit
tests.
Ops
- One-command deploy.
scripts/deploy_app_bundle.pydoes a release build, bundles the
.app, installs to~/Applications, and performs the daemon handover;
--checkexits non-zero when the installed bundle is stale.
build_app_bundle.pygained--configuration,--identity, and--installso release
binaries can be wrapped and signed. - Telemetry in
health_report. Per-tool funnel counters are surfaced via
health_report. - CI. A duplicate bare build step was dropped, and regression coverage was added for
the pid-scan count fix.
Upgrading
Run python3 scripts/deploy_app_bundle.py to build the release, wrap and install the
.app bundle, and hand the daemon over to the new build. Already-running MCP sessions
keep the old tool list until they are restarted — restart your MCP client (or its
serve shims) to pick up the new tools.