Skip to main content
Glama

noracu

A local MCP server that lets Claude, Cursor, or any MCP client operate macOS apps and a Playwright browser by element_index — and, experimentally, a real iPhone through Apple's iPhone Mirroring (OCR on the Mac, normalized taps). No API key; no telemetry from the server.

CI npm node license

中文说明见 README.zh-CN.md。

One stdio MCP server. The agent snapshots a tree, gets an indexed element list, then clicks or types by element_index instead of raw pixels — the same observe/act split on the Mac and in the browser. The experimental iPhone layer runs the same observe → act loop over OCR text and normalized coordinates.

browser element_index demo

browser_snapshot returns an indexed ARIA tree; browser_click acts by element_index. The Mac layer runs the same loop (mac_ax_state → mac_click). Highlight boxes are overlays from demo/record-browser.mjs, not a product feature. The iPhone layer is not in this demo.

What it does

One MCP server, three control surfaces:

Layer

Tools

Drives

Status

Mac

9 (mac_*)

cliclick, screencapture, JXA System Events

stable

Browser

12 (browser_*)

Playwright (persistent profile)

stable

iPhone

14 (phone_*)

iPhone Mirroring via the bundled imctl driver (Python + pyobjc)

experimental

The iPhone layer is experimental and ships with its driver (imctl, in imctl/). It needs Apple's iPhone Mirroring with the iPhone locked and near the Mac, and a python3 with pyobjc; it observes with OCR and acts on normalized coordinates rather than element_index. Without pyobjc, phone_* tools return a one-line imctl unavailable error with the install command, and the Mac and browser layers are unaffected. The observe/act vocabulary follows the action/observation split popularized by ChatGPT's computer-use, re-implemented on open local tooling.

Related MCP server: blade-computer-use

Why noracu

noracu is the local hands, not the model. Your MCP client (Claude Desktop, Claude Code, Cursor) decides what to do; this server only observes and acts on this machine.

  • The server runs entirely on your machine. No cloud service, no API key, no telemetry, no postinstall scripts. Sole runtime dependency: Playwright. noracu makes no network calls of its own; the only automatic one is the one-time Chromium download on the first browser_launch (NORACU_DISABLE_AUTO_INSTALL=1 turns that off). The browser still fetches the pages you point it at, and your MCP client still sends tool results — screenshots, OCR text — to whatever model it uses.

  • Acts on semantics, not pixels. Observation returns the accessibility tree (Mac) or ARIA tree (browser) as an indexed list — text, not screenshots. Actions reference element_index; indices expire after 30 s, and clicks re-verify the target (tag/name/href/position in the browser, frontmost app on the Mac) before firing. A stale reference returns element_no_longer_valid instead of clicking the wrong thing. Screenshots are there when the tree is not enough.

  • One loop, three surfaces. Native Mac apps and a persistent-profile browser share the element_index protocol (observe a tree, act by index). The experimental iPhone layer runs the same observe → act loop on Apple's iPhone Mirroring, with OCR text and normalized coordinates, because the phone exposes no accessibility tree to the Mac.

  • Uses your real sessions. Your logged-in browser profile, your Mac apps — not a hosted VM. Compared with cloud computer-use: neither is universally more reliable; they fail differently. noracu keeps the screen on your machine.

  • Off switches that are actually off. NORACU_READ_ONLY=1 (observation-only, default-deny), NORACU_DISABLE_EVAL=1, and file:// blocked by default. See Security.

  • Verifiable. 39 end-to-end checks (npm test), CI on macos-latest, MIT, and the whole server is one file: src/server.mjs.

Not a good fit if you need multiple browser tabs or sessions (single session for now), you're not on macOS (the Mac and iPhone layers are macOS-only; the browser layer is cross-platform), or you need a finished iPhone layer today (it ships, but experimental — and Apple does not offer iPhone Mirroring in the EU). If you only need browser automation, playwright-mcp has tab management and selector APIs that noracu v0.1 lacks; noracu is for when one agent also has to leave the browser and drive Mac apps.

Quickstart

First success is mac_ax_state (or a browser snapshot) — not a click, and not a phone_* tool. The biggest day-one failure is granting macOS permissions to node instead of to the host app; grants apply only after a full quit and reopen.

1. Install (Node ≥ 20; no postinstall script):

npm install noracu          # server at node_modules/noracu/src/server.mjs
brew install cliclick       # required for Mac input (mac_click/type/key/paste)

Or from source: git clone https://github.com/sgInnora/noracu.git && cd noracu && npm install && npm test (add NORACU_CI=1 to skip hardware-gated checks).

2. Add to your MCP client — use an absolute path to src/server.mjs. GUI apps launched from Finder/Dock do not inherit your shell PATH, so give an absolute path to the node binary as well (which node) — a bare node, npx, or noracu needs Node on the GUI PATH and otherwise fails with ENOENT.

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json) / Cursor (~/.cursor/mcp.json):

{
  "mcpServers": {
    "noracu": {
      "command": "/opt/homebrew/bin/node",
      "args": ["/ABSOLUTE/PATH/TO/noracu/src/server.mjs"]
    }
  }
}

Claude Code: claude mcp add noracu -- /ABSOLUTE/PATH/TO/node /ABSOLUTE/PATH/TO/noracu/src/server.mjs

Find your node path with which node (Apple Silicon: /opt/homebrew/bin/node; Intel: /usr/local/bin/node; nvm: the versioned path). Convenience, only if Node is already on the GUI PATH: "command": "npx", "args": ["-y", "noracu"].

Then quit the host app completely (including any menu-bar icon) and reopen it. A loaded tool list means the transport works — it does not need any permission yet.

3. Grant macOS permissions to the host app, not to node. System Settings → Privacy & Security → Accessibility and Screen Recording (macOS 15: "Screen & System Audio Recording") → enable the host (Claude Desktop / Cursor / your terminal). noracu never appears here. Quit and reopen the host after granting.

4. Verify. With Finder in front, call mac_ax_state (no args) — it returns an indexed accessibility tree; indices last 30 s. Browser smoke test (no Accessibility needed): browser_launch (first run downloads Chromium unless NORACU_DISABLE_AUTO_INSTALL=1) → browser_navigate → browser_snapshot → browser_click by index.

Troubleshooting

Symptom

Cause / fix

mac_* fails with error -1719

Accessibility not granted to the host app — grant it, then quit + reopen the host

Screenshots come back all black

Screen Recording not granted to the host — grant it, then quit + reopen

ENOENT mentioning cliclick

brew install cliclick (or set NORACU_CLICLICK)

spawn node / npx ENOENT from a GUI host

use an absolute node path in the config — nvm/volta/homebrew shims are not on the GUI PATH

browser_launch hangs on first use

one-time Chromium download; or auto-install disabled (NORACU_DISABLE_AUTO_INSTALL=1) → run npx playwright install chromium

phone_* says imctl unavailable: no python3 with pyobjc found

install pyobjc for a python3 (python3 -m pip install pyobjc-framework-Quartz pyobjc-framework-Vision pyobjc-framework-AppKit; Homebrew python3 is the usual choice) or set NORACU_PYTHON — see iPhone layer

phone_* refused with mirror_not_live: … ("Connection Paused", "iPhone in Use")

the mirror is paused or the iPhone is unlocked — lock the iPhone, keep it near the Mac, then call phone_launch (it clicks Resume)

Typed text comes out re-spaced (e.g. "no ra cu")

a CJK input method is active — use mac_paste instead of mac_type

element_no_longer_valid

the snapshot is older than 30 s or the UI changed — re-run mac_ax_state / browser_snapshot and use a fresh index

Node 18 is rejected at startup — use Node ≥ 20. Claude Desktop may start one noracu process per surface (e.g. chat and a second surface); they share the browser profile, so launch the browser from only one at a time.

Full worked examples: docs/usage.md.

iPhone layer (experimental)

noracu can operate a real iPhone through Apple's iPhone Mirroring. The agent observes with OCR on the Mac (phone_screenshot, phone_ocr, phone_find), acts at normalized 0–1 coordinates (phone_tap, phone_swipe, phone_scroll), types by pasting (phone_type) and opens apps by name (phone_open). This is not element_index: the phone exposes no accessibility tree to the Mac, so a tap lands where OCR placed the text. The driver (imctl, Python, MIT, about 1,000 lines) ships in imctl/.

Apple's requirements (support.apple.com/120421): a Mac with Apple silicon or a T2 chip on macOS 15 or later; an iPhone on iOS 18 or later with a passcode; both signed in to the same Apple Account with two-factor authentication; Bluetooth and Wi-Fi on; the Mac not sharing its internet connection or using AirPlay or Sidecar. The iPhone must be locked and near the Mac — unlocking it, or quitting iPhone Mirroring, ends the session. iPhone Mirroring is currently unavailable in the EU. One Mac and one iPhone at a time; camera and microphone are not mirrored.

Unattended sessions: in iPhone Mirroring → Settings, "Authenticate automatically" lets a session start without a password prompt. Trade-off: anyone who can use your unlocked Mac can then open your phone.

Python: the driver needs a python3 that imports pyobjc (Quartz, Vision, AppKit). Set NORACU_PYTHON, or noracu probes /opt/homebrew/bin/python3, /usr/local/bin/python3, python3, /usr/bin/python3 once, on the first phone_* call. Apple's /usr/bin/python3 usually lacks pyobjc; Homebrew's python3 plus python3 -m pip install pyobjc-framework-Quartz pyobjc-framework-Vision pyobjc-framework-AppKit is the common working setup.

Mirror state: phone_status reports live (the phone's screen is being streamed), overlay (the text iPhone Mirroring shows instead, e.g. "Connection Paused" or "iPhone in Use") and paused (that overlay offers a Resume button). Detection reads the window's structure, not its text. While the mirror is not live, phone_tap, phone_longpress, phone_swipe, phone_scroll, phone_type, phone_key and phone_open refuse with mirror_not_live instead of tapping the overlay, and phone_ocr / phone_find start their output with a warning. The mirror pauses after inactivity; phone_launch brings it forward and clicks Resume.

Privacy: whatever the phone shows — notifications, messages, mail, one-time codes — becomes tool output that your MCP client sends to its model. Turn on a Focus, open a neutral app before you start, and begin with NORACU_READ_ONLY=1 (phone_status, phone_screenshot, phone_ocr and phone_find stay allowed; all phone input is refused). iPhone notifications also reach the Mac once Mirroring is set up.

First success: phone_status → phone_launch if live is not true → phone_screenshot → phone_ocr → phone_find + phone_tap.

Known limits: a tap goes where OCR saw the text, so repeated or misread labels can be hit wrong; phone_scroll moves lists with trackpad-style scroll events (a vertical phone_swipe drag does not scroll a list — use it for gestures such as Home Screen paging); on one tested setup (iPhone 17 Pro Max on iOS 27.0.1, Mac on macOS 26.6.2) iPhone Mirroring draws the phone about 17% larger than its window at every View size, so the right column and bottom row are cut off and cannot be reached; moving the window between displays, changing the main display and relaunching made no difference, and the iOS 27 / macOS 26 version mismatch is the main suspect — check phone_screenshot if taps near the edges miss; phone_open types the app name into Spotlight and taps an exact match, otherwise returns to the Home Screen; phone_home / phone_app_switcher use the iPhone Mirroring menu (English macOS) and work without python while connected.

Environment variables

Variable

Default

Purpose

NORACU_READ_ONLY

unset

=1 observation-only: a default-deny allowlist of 12 observe + browser-lifecycle tools; every click/type/paste/key/eval tool is refused

NORACU_DISABLE_EVAL

unset

=1 makes browser_evaluate (arbitrary JS) return an error when called (it stays listed)

NORACU_ALLOW_FILE_URL

unset

=1 lets browser_navigate open file:// URLs (blocked by default)

NORACU_DISABLE_AUTO_INSTALL

unset

=1 skips the Chromium auto-install on first browser_launch

NORACU_CLICLICK

/opt/homebrew/bin/cliclick

cliclick binary path

NORACU_PYTHON

auto-probe

python3 used for the bundled iPhone driver; must import pyobjc (Quartz, Vision, AppKit). Unset → first working of /opt/homebrew/bin/python3, /usr/local/bin/python3, python3, /usr/bin/python3

NORACU_IMCTL_DIR

bundled imctl/

override the driver location (development only)

Security

noracu runs with the privileges of your MCP client. It clicks, types, pastes, and drives a real browser on this machine — there is no sandbox and no remote approval prompt. Set these on the server entry, then quit the host completely and reopen it:

"env": { "NORACU_READ_ONLY": "1", "NORACU_DISABLE_EVAL": "1" }
  • NORACU_READ_ONLY=1 is the safe first-run mode. It refuses every tool not on a 12-name allowlist (the observe tools plus browser_launch/browser_navigate/browser_close); every click, type, paste, and eval tool is denied. browser_navigate is on the allowlist, so it can still load a URL.

  • NORACU_DISABLE_EVAL=1 makes browser_evaluate return an error when called (it stays listed in tools/list). Snapshot, click, and type still work.

  • file:// is refused unless NORACU_ALLOW_FILE_URL=1, so a browser agent can't read ~/Documents by navigating to it. (The initial navigation URL is scheme-checked; redirects are not — see SECURITY.md.)

  • Focus guard: pass app to mac_type / mac_paste / mac_key and input is refused unless that app is frontmost. Omit app and the guard is off.

  • Stale-element protection: an element_index is not a coordinate. It expires after 30 s (element_no_longer_valid); a browser click re-checks tag/name/href/position, and a Mac click is refused if the frontmost app changed since the snapshot.

  • iPhone screen is model input: phone_screenshot / phone_ocr / phone_find return whatever the phone shows — notifications, messages, one-time codes. Use a Focus and a neutral app, and start with NORACU_READ_ONLY=1 (phone observation allowed, phone input refused). Phone input is also refused while the mirror is paused (mirror_not_live).

  • Injection-safe JXA: string parameters are passed to osascript as argv data, never built into the script; the one numeric value (AX read depth) is clamped to 1–10 before use. Regression-tested.

These switches do not make observed content trustworthy. Screenshot text, accessibility names, and page content are untrusted input to your model — do not let them override the task. Full threat model and per-threat status: SECURITY.md.

Tools & docs

Roadmap

  • Browser: tab management (list / select / close)

  • Act vocabulary (browser): hover, set_value, wait_for

  • Snapshot diffing to cut token use — pending measurement

  • iPhone: element_index over OCR regions, re-checking the text before a tap

Maintenance

Solo-maintained, no SLA. macOS 15+ for the Mac layer; the iPhone layer also needs Apple silicon or a T2 Mac, iOS 18+ and iPhone Mirroring (not available in the EU); the browser layer runs wherever Playwright does.

License

MIT — see LICENSE.

Available Tools

35 tools
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.

NameRequiredDescriptionDefault
xyNo
buttonNo
selectorNo
element_indexNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the 30-second staleness window and the specific failure mode ('element_no_longer_valid'). It omits whether the click waits for navigation or how the button parameter affects behavior, so it is strong but not complete for a mutation-style interaction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with the preferred path front-loaded before the fallbacks, and the staleness/error caveat last. No filler text at all.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter tool with no annotations and no output schema, this covers the critical decision points and one return/error value. The only real gap is the undocumented 'button' parameter and the absence of any note on what a successful click returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does for three of four parameters: element_index (source and 30s validity), selector (fallback role), and xy (discouraged). The 'button' parameter is never mentioned, leaving its accepted values (left/right/middle) undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Click') and resource ('a page element') and signals its browser scope, which separates it from mac_click and phone_tap. It does not explicitly distinguish itself from browser_fill/browser_type, which also target page elements, so sibling differentiation is only partially achieved.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit preference ordering: element_index first, selector as fallback, xy not recommended. It also names the prerequisite source (latest browser_snapshot) and the validity window, leaving nothing about when/how to choose an input to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_closeB

Close the browser.

NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosure, and it only restates the action. It does not say what is destroyed (open tabs, session/cookies, in-flight downloads), whether the call is idempotent or errors when no browser is running, or what the response contains. For a terminal/cleanup action, these are meaningful gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the action front-loaded and zero filler. It is arguably too terse for a state-destroying operation, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema and annotation structures contribute nothing here (no params, no annotations, no output schema), so the description is the only information source and it explains only the action. It omits lifecycle preconditions, effect on session state, and failure modes, which an agent needs to sequence this against browser_launch and the other browser_* calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No parameter text is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Close the browser") in a form that is unambiguous. Because browsers in this toolset are launched with browser_launch, an agent can infer the pairing without opening the schema. It stops short of the sibling differentiation in the highest band, which would explicitly name the launch/close lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to call this versus leaving the browser open, no mention of prerequisites (must a browser be launched first?), and no warning that closing may invalidate page state needed by other browser_* tools. The agent must infer all of this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_evaluateC

Evaluate JavaScript in the page and return the result.

NameRequiredDescriptionDefault
jsNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does not disclose that arbitrary JavaScript can mutate page state, whether promises are awaited, whether the return value must be JSON-serializable, or what happens on syntax errors/exceptions — all critical for a code-execution tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with no filler and the core action front-loaded. It's efficient, though the terseness leaves no room for the missing behavioral detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-power arbitrary code execution tool with no annotations, no output schema, and an undocumented parameter, the description is far too thin. An agent cannot confidently predict side effects or the shape of the returned result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter with 0% schema description coverage. The name 'js' hints at content, but the description says nothing about expected form (expression vs. function body), whether it is wrapped in an async context, or how the value is captured — details the schema leaves entirely blank.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (evaluate) and resource (JavaScript in the page) plus the return behavior. It is clear enough to distinguish from browser_read or browser_snapshot, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this instead of browser_read, browser_snapshot, or browser_click. An agent gets no signal about what this tool is appropriate for (extracting computed values? triggering page state?) versus other browser tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_fillA

Fill an input field matched by selector; fill replaces the whole value (browser_type appends keystrokes).

NameRequiredDescriptionDefault
valueNo
selectorNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the whole burden. It does disclose one genuinely useful behavioral trait — that the existing value is fully replaced rather than appended — but says nothing about failure behavior, auto-waiting/retries, whether input/change events are dispatched, or what a successful call returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with zero waste: the action and its scoping semantics come first, the sibling differentiation second. Nothing to trim and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and has no output schema or annotations to reconcile, but with 0% schema coverage and no required-parameter marking in the schema, the description should still state the selector format and at least hint at failure behavior. It is adequate for the happy path only.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the two parameters are undocumented structurally; the description only partially compensates by implying selector identifies the target element and value is the replacement text. No detail on selector syntax (CSS vs XPath), whether value is optional, or why 0 params are marked required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Fill an input field matched by selector") and immediately contrasts with the sibling browser_type by semantics (replace vs append). An agent can distinguish browser_fill from browser_type without consulting either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative browser_type and the condition that selects it: fill replaces the whole value, while browser_type appends keystrokes. Missing is any guidance on prerequisites or edge cases (element not found, non-editable elements, whether it waits for the element), so it stops just short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_launchB

Launch the browser with a persistent profile (headed by default; pass headless:true for headless).

NameRequiredDescriptionDefault
headlessNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that the profile is persistent and that the browser is headed by default, but it omits behavior such as what happens if a browser is already running, whether it blocks until ready, or what session handle is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no wasted words. The parenthetical efficiently covers the key default and override.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple launch tool with one parameter and no annotations, the description covers purpose and the headless option. However, it lacks context about launch lifecycle, session identity, and interaction with existing browser sessions, which an agent needs to invoke it reliably.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description compensates by explaining the sole parameter: headless defaults to false and should be passed as true for headless mode. The only gap is that additionalProperties is true, and the description does not mention other accepted options.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'Launch the browser with a persistent profile.' This clearly distinguishes it from browser_navigate, browser_close, and other browser interaction tools, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the headless parameter default but gives no guidance on when to call browser_launch versus browser_navigate or other sibling tools. It implies a launch step is needed but does not state prerequisites or sequencing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_navigateA

Navigate the current tab to an http(s) URL. file:// is disabled unless NORACU_ALLOW_FILE_URL=1.

NameRequiredDescriptionDefault
urlNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does add non-obvious value by disclosing that file:// is rejected unless NORACU_ALLOW_FILE_URL=1. It omits important mutation behavior: whether navigation waits for page load, what happens if no tab exists, and whether it errors or auto-opens a browser.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by the one surprising constraint. Nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter navigation tool with no output schema, the core is covered: action, target, and the notable scheme restriction. Only the preconditions (existing tab/session) and load-completion semantics are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter has 0% schema description coverage, so the description must compensate. It does constrain the value to an http(s) URL, which adds meaning beyond the bare 'string' type, but gives no format, normalization, or relative-URL guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Navigate the current tab to an http(s) URL'), and the phrase 'current tab' implicitly distinguishes it from browser_launch, which creates a session. It stops short of explicitly naming the sibling, but an agent can tell the two apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'current tab' suggests an existing browser session must be open, but the description never says so nor directs the agent to browser_launch if none exists. The file:// restriction is a constraint rather than when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_press_keyC

Press a key or chord, e.g. 'Enter' or 'Control+A'.

NameRequiredDescriptionDefault
keyNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden but says nothing about where the event is dispatched (focused element vs page), whether modifier chords work cross-platform, or what is returned. For a synthetic-input tool whose effect depends entirely on focus state, that is a meaningful gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the essential format hint front-loaded and no filler. It is terse rather than padded, which is appropriate for a one-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-param tool with no output schema, the description covers purpose and input format adequately. It still leaves out the focus/target context that determines whether the press has any effect, which is the one thing an agent could get wrong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; the examples 'Enter' and 'Control+A' do convey the accepted key/chord string format, which is the key semantic. However it never explains that the parameter is optional per the schema, nor any default behavior when omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Press a key or chord') plus concrete examples, so the agent knows this synthesizes keyboard events in the browser. It does not explicitly contrast with browser_type or mac_key, so sibling differentiation is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus browser_type (text entry) or browser_fill, and no preconditions such as requiring a focused element or a prior browser_snapshot. The examples imply the format but not the selection context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_readC

Read the page's visible text, optionally scoped to a selector.

NameRequiredDescriptionDefault
selectorNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It usefully reveals that only *visible* text is returned (excluding hidden nodes, scripts, and styles), but says nothing about behavior on selector mismatch, truncation, whitespace normalization, or whether the call is a no-side-effect read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with zero filler and the core action front-loaded. It is efficient, though the terseness contributes to the gaps in the other dimensions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, no annotations, and no schema descriptions, so the description must explain return shape — and it does not (string vs. list of text nodes, whether element boundaries are preserved). For a content-extraction tool with overlapping siblings, this leaves the agent guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% — the single parameter is an undescribed string. The description only establishes that the selector is optional and scopes the read; it never says whether it is a CSS selector, XPath, or text matcher, nor what the default scope is when omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("Read the page's visible text") plus the optional scoping mechanism, so an agent knows exactly what operation this performs. It stops short of distinguishing itself from close siblings such as browser_snapshot and browser_evaluate, which also surface page content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this instead of browser_snapshot (structured page state) or browser_evaluate (arbitrary JS) when extracting content. The phrase "optionally scoped to a selector" hints at a narrowing use case but gives no explicit conditions or prerequisites such as requiring a page to be loaded first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
clipNo
formatNo
qualityNo
fullPageNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose meaningful traits: it returns the image plus DPR/viewport metadata, quality only applies to jpeg, and the option set is enumerable. It omits the default capture mode (viewport vs full page) and any prerequisite that a page must already be loaded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, then densely packing options and return value. No filler; every clause adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-param tool with a nested object, no output schema and no annotations, the description covers both the option surface and the return payload. It lacks only prerequisites (browser launched/navigated) and default behavior to be fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, yet the description compensates well: it explains fullPage, format values png|jpeg, quality range 1-100 restricted to jpeg, and the clip object's {x,y,width,height} shape. The only gap is that defaults (e.g. fullPage=false, default format) are unstated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Screenshot) and resource (the page), which implicitly distinguishes it from the mac_screenshot and phone_screenshot siblings. It doesn't explicitly name or route against those alternatives, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no conditions, and no mention of the mac_screenshot/phone_screenshot alternatives an agent must choose between. Usage is only inferable from the word 'page'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_scrollC

Scroll the page up or down by a number of pages.

NameRequiredDescriptionDefault
pagesNo
directionNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It says the tool scrolls a page, but does not disclose what constitutes a page, whether scrolling is immediate or smooth, behavior at page boundaries, defaults for omitted parameters, or any return information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with no wasted wording. The action and scope are front-loaded immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple UI-action tool with no annotations, no output schema, and no parameter descriptions in the schema, the one-sentence description leaves important gaps. An agent cannot confidently infer defaults, valid direction strings, or page-size behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clarifies that pages refers to number of pages and direction refers to up or down, but does not specify valid direction values, whether pages accepts negative or fractional values, or what happens when either optional parameter is omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: scroll the page up or down by a number of pages. The browser context is clear from the tool name and page wording, though it does not explicitly differentiate itself from platform-specific siblings such as mac_scroll or phone_swipe.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives such as browser_read, browser_snapshot, or mac_scroll. It also does not mention prerequisites, expected page context, or when scrolling is preferable to navigation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_snapshotB

Return the page's ARIA accessibility snapshot plus a clickable element index list (indexes feed browser_click).

NameRequiredDescriptionDefault
browser_idNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It does disclose the two return components (ARIA tree and index list) and the downstream linkage to browser_click, which is valuable. But it omits whether browser_id defaults to a specific browser, whether the snapshot reflects the current page state, and gives no warning that ARIA snapshots can be very large.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the primary return value, with the actionable linkage to browser_click packed into a short parenthetical. Nothing is wasted or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description has to do more work than it does. It covers what comes back and how to use the result, but leaves the optional/required nature of browser_id and the expected size of the ARIA payload unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one parameter (browser_id) with 0% schema description coverage, and the description never mentions it or explains its role. With a single undocumented parameter and no description compensation, the agent must guess how to target a browser. The stated 'feed browser_click' hint applies to output indexes, not to this input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: return the page's ARIA accessibility snapshot plus a clickable element index list. That clearly distinguishes it from browser_screenshot (visual capture) and browser_read (text extraction). Sibling differentiation is only indirect, achieved through the parenthetical naming browser_click.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(indexes feed browser_click)' implies the intended workflow of snapshotting before clicking, which is genuinely useful guidance. However, it never states when to prefer this over browser_screenshot, browser_read, or browser_evaluate, and gives no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_typeA

Type text via the keyboard into the focused element; type appends keystrokes (browser_fill replaces the whole value).

NameRequiredDescriptionDefault
textNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that typing targets the focused element and appends keystrokes, but it does not state what happens when nothing is focused, whether it triggers normal keyboard events, or what the call returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is one tight sentence with no filler. The core action and the append-versus-replace distinction are both front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter browser action, the description covers the main purpose and the focused-element precondition. However, with no annotations and no output schema, it still leaves error behavior and return semantics unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate. It clarifies that the text parameter is entered as keystrokes and appended rather than replacing existing content, but it does not address the fact that the text field is not marked required or specify any content constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: type text via the keyboard into the focused element. It also explicitly distinguishes this action from browser_fill, so an agent can tell the two typing tools apart without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names the key alternative and the condition that selects it: browser_type appends keystrokes, while browser_fill replaces the whole value. That is exactly the decision an agent needs to make between these sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

NameRequiredDescriptionDefault
appNo
depthNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: 30-second index validity, default menu-bar pruning, depth clamping, and the ax_empty failure mode with its likely causes (not frontmost / another Space). It omits macOS Accessibility permission prerequisites and output volume/size considerations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense, front-loaded paragraph with parenthetical detail rather than wasted sentences. It is slightly over-packed — the return-field list, TTL, pruning rule, and error case all compete in a single run-on — but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers return fields, default behavior, parameter bounds, downstream consumers, and the empty-result case, which is strong for a 2-param read tool with no output schema. The unresolved app-parameter semantics and missing permission note keep it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It fully documents depth (default 3, clamped 1-10), but the app parameter is only called "optional app name" without explaining whether it targets a non-foreground app, which contradicts the "foreground app" framing in the opening clause.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Read the foreground app's accessibility tree") and immediately enumerates the returned fields, so an agent knows exactly what it gets. It also distinguishes itself from mac_screenshot and browser_snapshot by being the AX-tree reader and clarifies its role as the index source for mac_click/mac_drag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the menu-bar exception explicitly and routes it to mac_menu_command, and the "indexes feed mac_click/mac_drag for 30s" clause implies the read-then-act workflow. It lacks an explicit "call this first when you don't know element indexes" statement, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
xNo
yNo
countNo
buttonNo
element_indexNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden, and it does disclose a real behavioral trait: the 30-second staleness window on element_index and the specific failure mode element_no_longer_valid. It omits other useful traits such as whether the click steals focus or what a right-click triggers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler, and the core action plus targeting modes are front-loaded before the staleness caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and five undocumented parameters, the description covers the essentials an agent needs to invoke it correctly, including the cross-tool dependency and error code. Minor gaps remain around coordinate frame and default button/count behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: it enumerates the button values (left|right|middle), explains count as repetition, and ties element_index to mac_ax_state and its validity window. It does not clarify whether x/y are screen-absolute or window-relative, nor default values for count or button.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (click) with two precise targeting modes (coordinates or UI element) plus the optional button and count modifiers. An agent can immediately distinguish this from mac_drag, mac_scroll, and mac_key without inspecting any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite for the element path: use element_index from the latest mac_ax_state, valid for 30s. It does not say when to prefer coordinates over element_index, so the choice between the two modes is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
to_indexYes
from_indexYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden. It discloses a real behavioral trait — a 30s validity window and an element_no_longer_valid error on stale indices — which is valuable beyond the schema. It does not describe what a successful drag returns or any permission needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly-packed sentences with zero waste; the core action is front-loaded and the precondition follows.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param, no-annotation, no-output-schema action tool, the description covers the action, input source, staleness window, and a specific error token. Only success behavior and return details are absent, which is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does clarify where the integers come from (element indices from mac_ax_state) and their freshness requirement, which is genuinely useful, but adds no format, range, or failure behavior for the parameters themselves.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (drag) and resource (UI element to UI element) with concrete use cases (windows, sliders, selections). This implicitly distinguishes from mac_click (a click) and mac_scroll, but never names the alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete precondition and operational constraint: use from_index/to_index from the latest mac_ax_state, valid for 30s. No explicit when-not-to-use or named alternative tool guidance, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

NameRequiredDescriptionDefault
appNo
keyNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose one genuine behavioral trait: the frontmost-app guard that causes the press to be refused. It says nothing about what a refusal looks like (error vs. silent no-op), whether keys auto-repeat, what focus state is needed when `app` is omitted, or what the tool returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, and the core action with format examples is front-loaded ahead of the conditional focus-guard clause. Nothing needs trimming or reordering.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema and no annotations, the description covers both parameters plus a failure-mode guard, which is close to sufficient. It falls short only on outcome reporting — an agent still cannot predict whether a refused press raises an error or returns a status.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and does: `key` is explained by example for both plain keys and modifier chords, and `app` gets a precise meaning (frontmost focus guard). What is still missing is whether `key` values are case-sensitive or platform-specific beyond the 'cmd'/'arrow-up' examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ("Press") plus resource (a key or modifier chord) with concrete examples ('return', 'cmd-shift-v', 'arrow-up') that make the accepted key syntax immediately legible. It does not name the siblings it differs from (mac_type, mac_paste, browser_press_key), so an agent must infer that this is the single-keystroke/shortcut tool rather than text entry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states a real usage condition for `app`: input is refused unless that app is frontmost, framing it as a focus guard. But it gives no guidance on when to choose this over mac_type or mac_paste, nor when the focus guard should be used versus omitted — that choice is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mac_menu_commandB

Run an app's menu bar command via accessibility traversal (locale-safe).

NameRequiredDescriptionDefault
appNo
commandNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses the mechanism (accessibility traversal) and a behavioral trait (locale-safe), but omits key behavior: whether the app must be running/frontmost, accessibility permission requirements, what happens if the command isn't found, and whether this mutates app state with side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with the action front-loaded and no wasted clauses. It is arguably too terse given the undocumented parameters, but as written every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With two undocumented parameters, no annotations, no required-field declaration, and no output schema, the description needs to compensate and does not. It explains the mechanism but not how to construct a valid call or what the result looks like, leaving an agent to guess the menu path syntax.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for both parameters. The description only loosely gestures at 'app' and 'command' without specifying formats: is 'app' a bundle ID, process name, or display name? Is 'command' a menu path like 'File > Save', a single item, or a command ID? This is a critical gap for a traversal-based tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Run') and resource ('an app's menu bar command') plus the mechanism ('accessibility traversal'), which distinguishes it from siblings like mac_click or mac_key. It stops short of naming a sibling or contrasting, but the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: invoke this to trigger a menu bar item rather than clicking a coordinate or sending keystrokes, and 'locale-safe' hints at when to prefer it. However, there is no explicit 'use this when... / use X instead when...' guidance, and no stated prerequisites such as accessibility permissions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

NameRequiredDescriptionDefault
appNo
textNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that the tool overwrites the clipboard, pastes via Cmd+V, and can refuse input unless a specified app is frontmost, but it omits permissions requirements, error behavior, and what happens when no app is supplied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences with no wasted words, and the core action is front-loaded before the focus-guard caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool, the description covers the main action and one important safety behavior. However, gaps around app identifier format, optional parameter defaults, and error/return behavior keep it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains that app acts as a focus guard and implies text is the content to paste, but it does not specify the expected app identifier format, defaults, or requiredness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and mechanism: it writes text to the clipboard and pastes it via Cmd+V. This distinguishes it functionally from typing tools like mac_type, though it does not explicitly name or compare those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool instead of alternatives such as mac_type or mac_key. The only conditional guidance is about the app focus guard, which describes behavior rather than tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

NameRequiredDescriptionDefault
regionNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does meaningful work: it discloses the return shape ({scale, logical_size, screen:'main'}), scopes output to the main display, and explains the pixel-to-point conversion needed for subsequent clicks. It omits that this is a read-only operation and any macOS screen-recording permission requirement, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the core action, then crop behavior, then output shape and coordinate units. No filler, and every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must explain returns — and it does, at least for scale, logical_size and screen. It doesn't say which field carries the base64 image payload or whether multiple displays are supported beyond 'main display', leaving minor ambiguity for a nested-object tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'region' parameter is a nested object with 0% schema description coverage and no properties defined in the schema, so the description's '{x,y,w,h}' breakdown is essential and well-targeted. However it doesn't clarify optionality semantics (partial region? defaults? validation), so it compensates only partially for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Capture the Mac screen as PNG base64') plus an optional crop, and the platform qualifier 'Mac' separates it from sibling screenshots like browser_screenshot and phone_screenshot. It stops short of explicitly naming those siblings, but the domain is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the note that 'click coordinates are in points (pixels / scale)' hints that this tool pairs with mac_click/mac_drag, but no explicit when-to-use or when-to-prefer-an-alternative guidance is given. An agent must infer the screenshot-then-click workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mac_scrollA

Scroll the frontmost window up/down/left/right by a number of pages (default 1); moves the pointer over that window first.

NameRequiredDescriptionDefault
pagesNo
directionNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does add an important side effect: it moves the pointer over the target window first. It does not disclose permission requirements, behavior when no window is frontmost, whether scrolling is smooth or instant, or what the tool returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a single front-loaded sentence with zero waste. It packs the action, target, parameters, default, and pointer side effect into one readable line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with no output schema and no annotations, the description covers the action, target, both parameters, the default, and a notable side effect. It is nearly complete, with only permission and failure-mode details missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it defines the direction domain as up/down/left/right and states the pages parameter defaults to 1. It does not clarify whether fractional or negative page values are valid, but both parameters receive meaningful semantic context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Scroll the frontmost window') and scopes it to Mac frontmost-window scrolling. It implicitly distinguishes from browser_scroll and phone_scroll by naming the frontmost window, but does not name a sibling explicitly as the high-scoring example does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the context of scrolling the frontmost window, and the default page count is stated. However, there is no explicit guidance on when to use this versus mac_key, mac_drag, or other navigation tools, nor any prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
appNo
textNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers real behavioral detail: typing occurs at the current focus, no modifier keys are sent, input is refused unless the named app is frontmost, and keystrokes can be re-segmented under a CJK IME. What's missing is failure behavior when nothing is focused and whether typing is per-character or a single injection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each carrying distinct information (core action, focus-guard parameter, IME warning plus alternative), front-loaded with the primary behavior. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter input tool with no annotations and no output schema, this covers purpose, a safety-relevant parameter, a real hazard with a workaround, and the preferred alternative. Return/error reporting is the only notable omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain both parameters. It defines 'app' precisely (focus guard: refuse input unless that app is frontmost) and makes 'text' clear from the verb. Minor gap: it doesn't state whether app is optional or what happens if omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and target: 'Type text at the current focus without modifier keys.' The 'without modifier keys' clause implicitly separates it from mac_key, and it names mac_paste as the alternative, so an agent can pick between them without reading schemas. It stops short of explicitly naming mac_key as the sibling it differs from.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete use-this-instead rule for the IME case ('use mac_paste for reliable text entry') and explains the app parameter's focus-guard semantics. No guidance for when NOT to use it outside the IME scenario, and no prerequisites such as needing a focused target window.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it flags the tool as EXPERIMENTAL, explains the primary mechanism, notes a dependency condition, and discloses a fallback path. It stops short of describing expected outcomes or failure behavior if both paths fail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with the experimental warning front-loaded and the mechanism plus fallback packed in without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple no-parameter UI action with no output schema, the description is nearly complete: it gives the action, implementation path, fallback, and experimental status. Minor gaps remain around expected outcome and failure handling if both mechanisms fail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are inherently simple. The baseline for 0 params is 4, and no parameter-related information is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Open the iPhone App Switcher." It also names the mechanism (iPhone Mirroring menu) and fallback (imctl gesture), making the action distinct from siblings like phone_home or phone_tap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the action itself, and the description adds a useful condition: it works without python/pyobjc when the mirror is connected. However, it does not explicitly say when to choose this over alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

phone_findB

EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Locate text on the iPhone screen.

NameRequiredDescriptionDefault
textNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose the experimental status and external dependencies, which is genuinely useful behavioral context an agent can act on. It omits what happens when the text is not found, whether it only reads or also interacts, and what the result looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the EXPERIMENTAL caveat front-loaded, which is the right ordering for a warning. Nothing is wasted, though the brevity is partly under-specification rather than economy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description should explain what is returned (coordinates, bounding boxes, match count?) and what failure looks like. For a tool whose whole value is the located result, that gap is material.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'text' parameter has 0% schema description coverage, so the description must compensate and does not: no indication of exact vs. substring vs. regex matching, case sensitivity, or whether the string targets visible UI labels. Only the verb 'locate' hints at intent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Locate text on the iPhone screen.' An agent can distinguish this from the mac_* and browser_* families by platform. It does not differentiate from the sibling phone_ocr, which plausibly overlaps (find text vs. read text), so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real prerequisites (iPhone Mirroring, python3 with pyobjc) and flags EXPERIMENTAL, which tells the agent this may fail and needs setup. But it never says when to choose this over phone_ocr or phone_tap, nor what conditions make it unusable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the preferred path (iPhone Mirroring menu), the dependency (no python/pyobjc needed when mirrored), the fallback (imctl swipe), and the experimental stability caveat. It omits what happens if both paths fail and whether there is any latency or confirmation, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the EXPERIMENTAL risk flag first, then the action, then the fallback. Dense but every clause (menu path, dependency, fallback) carries real information; the parenthetical is slightly heavy but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, annotation-free, output-schema-free action tool, the description covers purpose, precondition, implementation path, and fallback. The remaining gap is failure behavior — what the agent sees if neither the mirror nor imctl succeeds — which matters for an EXPERIMENTAL tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The absence of an input schema is fully consistent with the description, which describes an action requiring no arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and destination: 'Go to the iPhone Home Screen', which is unambiguous. It does not explicitly contrast with phone_app_switcher or phone_launch, but the target (home screen) is distinct enough that an agent can pick it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied rather than stated: the tool is marked EXPERIMENTAL and works 'when the mirror is connected', which hints at a precondition. It never says when to prefer this over phone_swipe, phone_app_switcher, or phone_launch, so routing between siblings is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

phone_keyA

EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Press a key: return, delete, up, down, left, or right.

NameRequiredDescriptionDefault
keyNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the experimental status and the environment requirements, which is real value beyond structured fields, but it doesn't say what state is required (active session, focused app) or what an error or success looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, with the EXPERIMENTAL warning and environment requirement front-loaded before the action. Nothing is redundant, though the sentence fragments could be tightened into a single statement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no annotations or output schema, the description covers prerequisites and valid inputs but leaves out the runtime state needed for it to succeed and any indication of failure modes. Adequate to attempt the call, not to call it reliably.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema types 'key' only as a plain string, so the description's enumeration of the six valid key values is the only source of that constraint. It stops short of saying whether 'key' is required or what the default is when omitted (required is 0).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Press a key') and the exact key set (return, delete, up, down, left, right), and the iPhone Mirroring prerequisite makes clear it targets the mirrored iPhone rather than the Mac. It doesn't explicitly name mac_key or browser_press_key as alternatives, but the phone scope is discernible.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The prerequisites (iPhone Mirroring running, python3 with pyobjc) tell the agent when the tool can work at all, which is genuinely useful context. It never says when to choose this over mac_key or browser_press_key, nor what happens if mirroring is not active, so usage is only implied by the sibling naming.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and adds useful context: EXPERIMENTAL status, python3/pyobjc dependency, need for iPhone Mirroring to be frontmost, and handling of a paused connection. However, it omits success/failure behavior, side effects, and what 'clicks Resume' entails.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with EXPERIMENTAL, and each sentence carries prerequisite information. Slightly awkward phrasing ('and clicks Resume') blurs the actor but does not waste space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param launch tool the description is missing the central outcome—what gets launched and what the agent should expect after invocation. It compensates with environment prerequisites but not enough for full completeness given no annotations or output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4; the description need not explain inputs. Schema coverage is effectively 100% for an empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates dependencies and a Resume interaction but never states the core action in verb+resource terms; an agent must infer from the name that it launches iPhone Mirroring. It does not distinguish phone_launch from siblings such as phone_open or phone_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives prerequisites (iPhone Mirroring running/frontmost) but no when-to-use condition relative to phone_open, phone_status, or other phone tools. No alternatives or exclusions are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

phone_longpressB

EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Long-press at {x, y} for an optional duration in seconds.

NameRequiredDescriptionDefault
xNo
yNo
durationNo

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses experimental status and runtime prerequisites, which is useful, but does not explain side effects, failure behavior, waiting semantics, return values, or permission constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences with no wasted text. The experimental warning is front-loaded, followed by prerequisites and the core action, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter gesture tool with no annotations and no output schema, the description covers the action and dependencies but leaves important gaps: coordinate system, default duration, return/error behavior, and interaction side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It identifies x and y as coordinates and duration as optional seconds, but leaves coordinate origin/units, valid ranges, and the default duration unspecified, and it does not address why no parameters are marked required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and target: 'Long-press at {x, y}' with an optional duration. This clearly identifies a phone gesture action. It does not explicitly contrast with siblings like phone_tap or phone_swipe, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The tool's usage is implied by the gesture name and the prerequisite context ('Needs iPhone Mirroring and a python3 with pyobjc'). However, there is no explicit guidance on when to choose long-press versus phone_tap, phone_swipe, or other alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

phone_ocrA

EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. OCR the iPhone screen into text with coordinates.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the lack of annotations, it provides crucial behavioral context by labeling the tool as 'EXPERIMENTAL' and detailing the execution environment requirements. This manages user expectations regarding stability and setup.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is concise and effective, front-loading the experimental status and environment requirements before stating the core function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has no configurable parameters, detailing the environment and operational constraints (Mirroring, Python version) makes the description maximally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero parameters, meaning the baseline for this dimension is high. The description adds no semantic meaning to non-existent parameters but is entirely appropriate for a zero-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool's function as OCR of the iPhone screen into text with coordinates. This differentiates it from other screen-based interaction siblings like phone_screenshot or phone_type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly outlines critical environmental prerequisites necessary for the tool to function, namely needing iPhone Mirroring and a specific Python setup (python3 with pyobjc).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
appNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden and does well: it flags EXPERIMENTAL, names the runtime dependencies, spells out the Spotlight/type/OCR/tap sequence, and discloses the fallback behavior on non-match. Remaining gaps are latency, whether the device must be unlocked, and what a failure looks like to the caller.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the EXPERIMENTAL warning and prerequisites before the operational detail. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations mean the description must cover both semantics and results. It explains the invocation path and the not-found fallback, but says nothing about what is returned on success, how long the OCR matching takes, or error conditions beyond not-found.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter at 0% schema coverage, and the schema allows arbitrary extra properties. The phrase 'type the name' implies the app param is the app name to search for, which is real added meaning, but it never states matching rules (exact vs partial, case sensitivity, localized names) that OCR row-picking would depend on.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb and resource: 'Open an app' on a mirrored iPhone, plus the actual mechanism (Spotlight command, type name, OCR-pick row, tap). However it never distinguishes itself from the very close sibling phone_launch, which by name appears to do the same job, so an agent cannot pick between them from this text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives prerequisites (iPhone Mirroring, python3 with pyobjc) but no guidance on when to prefer this over phone_launch or the mac_* alternatives. 'Returns to the home screen when not found' hints at a failure path but no selection criteria are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It earns credit for disclosing dependencies and the non-obvious capture-by-window-id behavior that works even when the window is occluded. It does not say what is returned (image payload vs. file path) or what happens on failure, which an agent needs for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with zero filler, and the most decision-relevant token (EXPERIMENTAL) is front-loaded ahead of the prerequisites and the behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool, prerequisites and the occlusion-proof capture quirk are the key unknowns, and both are covered. The remaining gap is the return format, which no output schema compensates for.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4 per calibration; there is nothing for the description to disambiguate and the empty schema is self-evident.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Screenshot the iPhone screen', with the target qualified as the Mirroring window. Among siblings mac_screenshot and browser_screenshot, the device qualifier makes the distinction immediate without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states hard prerequisites (iPhone Mirroring running, python3 with pyobjc) and flags EXPERIMENTAL status, which implies 'use only if you have this setup'. But it never says when to pick it over phone_ocr or mac_screenshot, nor what to do when the prerequisites are unmet.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

phone_scrollA

EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Scroll the list under the mirror up or down by about distance window heights (default 0.5), using trackpad-style scroll events.

NameRequiredDescriptionDefault
distanceNo
directionNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does reasonably well: it discloses experimental status, external runtime dependencies, the underlying mechanism (trackpad-style scroll events), and a concrete default of 0.5 window heights. It omits failure behavior and return values, but for a non-destructive scroll action the disclosed surface is substantially above bare minimum.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no filler, and the most decision-relevant facts (EXPERIMENTAL, prerequisites) are front-loaded before the action description. Every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-parameter tool with no annotations and no output schema, the description covers environment requirements, semantics of the primary parameter, and the default. The remaining gap is the undocumented direction value set, which is the one thing that could cause a failed call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains `distance` well (units = window heights, default 0.5) but says nothing about the accepted values of `direction` beyond 'up or down' in prose, and the schema declares it as an unconstrained string with no enum — an agent cannot know whether 'up'/'down', 'Up'/'Down', or something else is expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: scroll the list under the iPhone mirror by a distance in window heights, using trackpad-style events. This is clearly distinct from mac_scroll and browser_scroll through the 'under the mirror' scoping, though it never explicitly contrasts itself with phone_swipe, the closest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives useful preconditions (iPhone Mirroring must be active, python3 with pyobjc installed, EXPERIMENTAL flag) which implicitly tells the agent when the tool is usable. It does not say when to prefer this over phone_swipe or mac_scroll, nor what to do when the prerequisites are unmet.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose key operational facts: experimental status, the iPhone Mirroring dependency, and the pyobjc/python3 requirement. It does not state that the call is read-only (inferable from 'status'), what happens when mirroring is not running, or what the individual fields ('live', 'overlay', 'paused') mean.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences: the 'EXPERIMENTAL' warning and prerequisites come first, then the return shape. The parenthetical field list is dense but functional; nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, listing the returned JSON fields (running, window, onscreen, frontmost, live, overlay, paused) is the right compensating move, and the prerequisites are stated. The only gap is that the meaning of the less obvious fields is not explained, which matters for interpreting the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing to document and the baseline is 4. The schema is fully described and the description correctly adds no spurious parameter narrative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Return') and resource ('iPhone Mirroring session status') plus the return format (JSON). It is clearly distinguishable from siblings like phone_launch or phone_screenshot, which act on the phone rather than report state, though it never explicitly contrasts itself with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the 'status' framing — check state before or after driving the phone — but there is no explicit 'use this when...' or 'use X instead' guidance. The 'EXPERIMENTAL' and prerequisite notes give context for when it will fail, not when to prefer it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
msNo
toNo
fromNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does real work: it flags the tool as EXPERIMENTAL and discloses host dependencies (iPhone Mirroring, pyobjc) plus the fact that it emulates a mouse drag rather than a native touch. It does not say what happens on failure, whether the call blocks for the duration, or what the return value is, which keeps it below 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence, front-loaded with the EXPERIMENTAL warning and prerequisites before the operational detail. No redundant restatement of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation tool with no annotations and no output schema, the description covers prerequisites, purpose, parameters, and sibling routing. The remaining gaps — coordinate semantics, default duration, and error/return behavior — are real but secondary for a fire-and-forget gesture tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; it does name all three parameters — 'from [x,y] to [x,y]' and 'optional duration in ms' — which is more than the bare schema provides. It omits coordinate-space details (screen vs device points, array length/ordering) and the default value for ms, so it is not fully self-sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: swipe (mouse drag) from an [x,y] point to another over an optional duration, with the target use case (Home Screen paging) named. It also explicitly distinguishes itself from phone_scroll for list movement, so an agent can separate it from the nearest sibling without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the use case ('gestures such as Home Screen paging') and an explicit exclusion routing to phone_scroll 'to move a list'. It also states prerequisites up front (iPhone Mirroring, python3 with pyobjc), which is exactly the when-can-I-use-this information an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
xNo
yNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description still discloses the experimental status, the runtime prerequisites, and the specific error surface ('refused with mirror_not_live when the mirror is paused'), which is the kind of mutation-safety context an agent needs. It stops short of describing what a successful tap returns or any confirmation side-effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the experimental warning, and every clause carries information an agent needs (warning, prerequisites, coordinate convention, failure mode).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-axis pointer tool with no output schema, the description covers the critical unknowns: environment dependency, coordinate convention, and the primary failure mode. Only the coordinate origin and post-tap verification are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and both parameters are undocumented there, so the description must carry the load; it does add the key fact that coordinates are normalized 0-1, but it omits the origin corner and the fact that both are optional per the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb-resource pair ('Tap at {x, y}') and anchors it to iPhone Mirroring, so an agent can tell it apart from mac_click and phone_scroll without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives prerequisites ('Needs iPhone Mirroring and a python3 with pyobjc') and a refusal condition, but never says when to prefer this over phone_find, phone_longpress, or mac_click, nor what to do instead when the mirror is paused.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

phone_typeB

EXPERIMENTAL. Needs iPhone Mirroring and a python3 with pyobjc. Type text via the clipboard (IME-safe).

NameRequiredDescriptionDefault
textNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose useful traits: EXPERIMENTAL status, a hard dependency on iPhone Mirroring and pyobjc, and that input goes through the clipboard with IME-safe semantics. It omits what happens to existing clipboard contents or whether text is required, which matter for a paste-based action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the key caveat (EXPERIMENTAL) front-loaded and no filler. Every clause carries information an agent needs before invoking.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter typing tool, the description covers prerequisites and mechanism but leaves gaps: whether the single parameter is mandatory, what the clipboard side effect is, and what the tool returns. There is no output schema to fill those gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter ('text') at 0% schema description coverage, so the description must compensate. 'Type text via the clipboard' implies the parameter is the string to insert, but it never states this explicitly or whether it is required (schema says required: 0, which is ambiguous).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb ('Type text') plus the delivery mechanism ('via the clipboard') and the target environment ('Needs iPhone Mirroring'), so the agent knows this types into the mirrored iPhone rather than the host. It does not explicitly name how it differs from mac_type or browser_type, leaving that separation implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives prerequisites (iPhone Mirroring, pyobjc) but says nothing about when to choose this over mac_type, browser_type, or phone_key for things like special keys or IME input. No exclusion conditions or alternative routing are offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 35 tool updatesv0.1.2
    • First observedbrowser_click
    • First observedbrowser_close
    • First observedbrowser_evaluate
    • First observedbrowser_fill
    • First observedbrowser_launch
    • First observedbrowser_navigate
    • First observedbrowser_press_key
    • First observedbrowser_read
    • First observedbrowser_screenshot
    • First observedbrowser_scroll
    • First observedbrowser_snapshot
    • First observedbrowser_type
    • First observedmac_ax_state
    • First observedmac_click
    • First observedmac_drag
    • First observedmac_key
    • First observedmac_menu_command
    • First observedmac_paste
    • First observedmac_screenshot
    • First observedmac_scroll
    • First observedmac_type
    • First observedphone_app_switcher
    • First observedphone_find
    • First observedphone_home
    • First observedphone_key
    • First observedphone_launch
    • First observedphone_longpress
    • First observedphone_ocr
    • First observedphone_open
    • First observedphone_screenshot
    • First observedphone_scroll
    • First observedphone_status
    • First observedphone_swipe
    • First observedphone_tap
    • First observedphone_type

TDQS

B3.4/5.0

Scored across 35 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Provides a local MCP bridge for AI assistants to control a Mac by observing screen state and performing actions like mouse movement, clicking, typing, and opening URLs.
    12
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables MCP clients to control macOS via accessibility and screen recording, providing tools to list apps, observe UI, click, type, press keys, and scroll.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Gives AI agents and MCP clients direct control over native desktop apps, Chrome/Electron browsers, and Android devices with screenshots, OCR, accessibility-based element lookup, input simulation, window management, CDP, and ADB in one local server.
    141
    MIT