noracu
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NORACU_PYTHON | No | python3 used for the bundled iPhone driver; must import pyobjc (Quartz, Vision, AppKit). Unset means auto-probe: first working of /opt/homebrew/bin/python3, /usr/local/bin/python3, python3, /usr/bin/python3. | |
| NORACU_CLICLICK | No | Path to the cliclick binary. | /opt/homebrew/bin/cliclick |
| NORACU_IMCTL_DIR | No | Override the iPhone driver location (development only). | bundled imctl/ |
| NORACU_READ_ONLY | No | Set to `1` for observation-only mode: a default-deny allowlist of 12 observe + browser-lifecycle tools; every click/type/paste/key/eval tool is refused. | |
| NORACU_DISABLE_EVAL | No | Set to `1` to make `browser_evaluate` (arbitrary JS) return an error when called (it stays listed in `tools/list`). | |
| NORACU_ALLOW_FILE_URL | No | Set to `1` to let `browser_navigate` open `file://` URLs (blocked by default). | |
| NORACU_DISABLE_AUTO_INSTALL | No | Set to `1` to skip the one-time Chromium auto-install on first `browser_launch`. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| mac_screenshotA | Capture the Mac screen as PNG base64, optionally cropped to region {x,y,w,h}. Returns {scale, logical_size, screen:'main'} for the main display; click coordinates are in points (pixels / scale). |
| mac_ax_stateA | Read the foreground app's accessibility tree (element index/role/title/value/frame; indexes feed mac_click/mac_drag for 30s); menu bar pruned by default (use mac_menu_command); optional app name and depth (default 3, clamped 1-10). Returns ax_empty if the app has no AX-visible window (not frontmost / another Space). |
| mac_clickA | Click at {x,y} or on a UI element, with optional button (left|right|middle) and count. Use element_index from the latest mac_ax_state (valid 30s); returns element_no_longer_valid when stale. |
| mac_dragA | Drag from one UI element to another (move windows, sliders, selections). Use from_index/to_index from the latest mac_ax_state (valid 30s); returns element_no_longer_valid when stale. |
| mac_scrollA | Scroll the frontmost window up/down/left/right by a number of pages (default 1); moves the pointer over that window first. |
| mac_keyA | Press a key or modifier chord, e.g. 'return', 'esc', 'cmd-c', 'cmd-shift-v', 'arrow-up'. Pass app to refuse input unless that app is frontmost (focus guard). |
| mac_typeA | Type text at the current focus without modifier keys. Pass app to refuse input unless that app is frontmost (focus guard). Not IME-safe: with a CJK input method active, keystrokes may be re-segmented — use mac_paste for reliable text entry. |
| mac_pasteB | Write text to the clipboard and paste it with Cmd+V. Pass app to refuse input unless that app is frontmost (focus guard). |
| mac_menu_commandB | Run an app's menu bar command via accessibility traversal (locale-safe). |
| browser_launchB | Launch the browser with a persistent profile (headed by default; pass headless:true for headless). |
| browser_navigateA | Navigate the current tab to an http(s) URL. file:// is disabled unless NORACU_ALLOW_FILE_URL=1. |
| browser_snapshotB | Return the page's ARIA accessibility snapshot plus a clickable element index list (indexes feed browser_click). |
| browser_screenshotA | Screenshot the page with optional fullPage, format png|jpeg, quality (1-100, jpeg) and clip {x,y,width,height}; returns the image plus DPR/viewport metadata. |
| browser_clickA | Click a page element, preferring element_index; selector is a fallback, xy pixel coordinates not recommended. Use element_index from the latest browser_snapshot (valid 30s); returns element_no_longer_valid when stale. |
| browser_fillA | Fill an input field matched by selector; fill replaces the whole value (browser_type appends keystrokes). |
| browser_press_keyC | Press a key or chord, e.g. 'Enter' or 'Control+A'. |
| browser_typeA | Type text via the keyboard into the focused element; type appends keystrokes (browser_fill replaces the whole value). |
| browser_scrollC | Scroll the page up or down by a number of pages. |
| browser_readC | Read the page's visible text, optionally scoped to a selector. |
| browser_evaluateC | Evaluate JavaScript in the page and return the result. |
| browser_closeB | Close the browser. |
| phone_statusA | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Return the iPhone Mirroring session status as JSON (running, window, onscreen, frontmost, live, overlay, paused). |
| phone_launchB | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Ensure iPhone Mirroring is running, brought to the front, and clicks Resume when the connection is paused. |
| phone_screenshotA | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Screenshot the iPhone screen (the Mirroring window, captured by window id so it works even when covered). |
| phone_ocrA | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. OCR the iPhone screen into text with coordinates. |
| phone_findB | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Locate text on the iPhone screen. |
| phone_tapA | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Tap at {x, y} in normalized 0-1 coordinates. Refused with mirror_not_live when the mirror is paused. |
| phone_longpressB | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Long-press at {x, y} for an optional duration in seconds. |
| phone_swipeA | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Swipe (mouse drag) from [x,y] to [x,y] over an optional duration in ms, for gestures such as Home Screen paging; to move a list use phone_scroll. |
| phone_homeA | EXPERIMENTAL. Go to the iPhone Home Screen via the iPhone Mirroring menu (works without python/pyobjc when the mirror is connected); falls back to an imctl swipe. |
| phone_app_switcherA | EXPERIMENTAL. Open the iPhone App Switcher via the iPhone Mirroring menu (works without python/pyobjc when the mirror is connected); falls back to an imctl gesture. |
| phone_scrollA | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Scroll the list under the mirror up or down by about |
| phone_typeB | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Type text via the clipboard (IME-safe). |
| phone_keyA | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Press a key: return, delete, up, down, left, or right. |
| phone_openA | EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Open an app via the mirroring Spotlight menu command/shortcut, type the name, OCR-pick the matching app row and tap it; returns to the home screen when not found. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 35 tools
Tools are cleanly separated by platform prefixes (mac_, browser_, phone_) and each targets a distinct action. Minor potential confusion exists among text-entry tools (mac_type vs mac_paste vs mac_key) and gesture tools (phone_scroll vs phone_swipe), but descriptions clearly explain when to use each.
All tool names consistently use snake_case with a platform prefix followed by an action or resource, e.g. browser_navigate, mac_click, phone_screenshot. There are no mixed camelCase or inconsistent verb styles.
The server exposes 35 tools, which is a very large surface for an MCP server. Although they are split across three coherent domains (Mac, browser, iPhone), the total volume increases selection burden and exceeds a comfortably scoped toolset.
Coverage is broad across Mac accessibility/input, browser automation, and iPhone mirroring, with lifecycle tools such as launch, screenshot, inspect, interact, and close. Minor gaps remain, such as explicit browser tab/history management and a dedicated Mac app-launch tool, but core workflows are covered.