ax_read
Reads visible UI elements from macOS Accessibility or Windows UI Automation to enable automation without screenshots. Returns node details, actions, and snapshot IDs.
Instructions
Canonical ax:read capability. target=paired_page selects only the already consented Chrome document, before native targeting; mutually exclusive with window. Page nodes have provider=chrome_extension and no native marks/global bounds; page failures require inspection/re-pairing and never native or pixel fallback. target=native (default) reads visible semantic UI directly from macOS Accessibility or Windows UI Automation without taking a screenshot. Returns an ephemeral snapshot_id, deterministic node ids, role/name/description/value/actions/state, optional global-logical bounds, explicit coverage/fallback status, and actionable marks. mode=all (default) combines controls with labels/static text/headings; interactive or content narrows the view. Call ax_activate(snapshot_id,node_id) on a fresh actionable node. If coverage is absent/partial, use focused OCR for missing rendered text, then screenshot/zoom only for visual-only pixels. permission_denied means grant Accessibility; do not hide it with a screenshot fallback.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Cap on the number of elements returned (default 200, max 400). | |
| mode | No | `interactive` returns actionable controls, `content` returns readable labels/text, and `all` combines both in deterministic tree order. Defaults to `all`. | |
| filter | No | Show only elements whose role, label, or value contains this case-insensitive substring (e.g. "button", "search", "submit"). Omit to list everything. Filtering only narrows the DISPLAY — the hidden elements keep their numbers and stay clickable by click_mark(N). | |
| target | No | `native` (default) reads AX/UIA. `paired_page` reads only the already consented Chrome document; mutually exclusive with `window`. | |
| window | No | Target a single on-screen window: a case-insensitive substring of its title or app name (e.g. "Safari", "Settings"). Omit to read the current target app — the last window-captured or read_ui'd app, otherwise the frontmost. Web-page content is included either way (as long as the app has a window); a window= just narrows and sharpens the listing to that window. | |
| max_chars | No | Unicode-character output budget (default 30000, max 100000). If hit, `truncated=true` and `partial_reason=character_limit` are returned. |