Robot Actions — Remote Device Control
Server Details
Drive real Android & iOS devices and web browsers from natural language for mobile + web QA. 290+ tools across device control, app management, automation sessions, browser automation, and flow recording / replay. Bearer-auth — get a token at robotactions.com → Profile → API Tokens.
- Status
- Healthy
- Uptime
- 63.9% over 56 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 391 tools
Many tools across platforms and protocols have overlapping purposes: device_screenshot / android_mjpeg_screenshot / android_vnc_snapshot all see the Android screen; ios_tap vs ios_tap_by_label vs ios_tap (HID) collide; session_* vs web_* vs webpage_* vs device_* vs ios_* duplicate browser/device actions; and mock/interception tools exist in five parallel families (android_devtools_mock_*, android_traffic_mock_*, ios_safari_mock_*, ios_traffic_mock_*, webpage_mock_*). Descriptions are detailed and often explain the distinction, but the sheer number of near-twin tools makes misselection likely.
There is a broad, readable pattern of domain prefixes (android_*, ios_*, device_*, web_*, webpage_*, session_*, testrail_*, jira_*, azdo_*, flow_recording_*, etc.), and within each family the naming is fairly predictable. However, it is not a consistent verb_noun pattern throughout: some are prefix_action (device_tap), some prefix_entity_action (android_traffic_start), and others like visual_* and get_visual_review break prefix discipline. The result is mixed but generally understandable.
391 tools is an extreme mismatch for any single MCP server, far beyond the 50+ threshold. Even accounting for the wide stated purpose of remote device control plus adjacent test-management, visual-review, and issue-tracker integrations, this surface is massively oversized and imposes a severe context and selection burden on an agent.
The surface is exceptionally broad, with lifecycle coverage for devices, iOS/Android automation, WebDriver sessions, TestRail, Jira, Azure DevOps, Figma, Firebase, recordings, replays, and visual reviews. It is difficult to identify any major missing operation, though the depth across so many domains makes perfect completeness unlikely and minor gaps plausible.
Available Tools
403 toolsagent_memory_appendAgent memory appendAInspect
Append a block to the calling user's persistent agent memory. When the user says "remember X", "save this", "save it to your memory", "note for next time" or similar, you MUST call this tool in the same turn, before replying; never tell the user something is saved or remembered unless this tool returned success. Do not auto-update on ordinary messages. A saved note is shown to the agent at the start of each NEW chat (and when its process restarts), not mid-conversation. Cap: 10240 bytes total; over-cap appends return 413. Markdown is encouraged; keep entries terse and factual (preferences, project context, references), not verbose.
| Name | Required | Description | Default |
|---|---|---|---|
| block | Yes | Markdown block to append. Will be separated from existing content by a blank line. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: a 10240-byte total cap, a 413 error on over-cap appends, and the lifecycle detail that saved notes surface at the start of each NEW chat rather than mid-conversation. These are behaviors an agent cannot infer from the readOnly/destructive hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose in the first sentence, then usage triggers, then behavioral constraints and cap. Dense but every sentence carries operational weight; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers return semantics ('unless this tool returned success') and failure signaling (413 on over-cap). Combined with the lifecycle explanation, an agent has everything needed to call and report on this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'block' parameter is fully documented in the schema (100% coverage), setting the baseline at 3. The description adds content-style guidance ('Markdown is encouraged; keep entries terse and factual (preferences, project context, references)'), which meaningfully shapes what to put in the block.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Append a block to the calling user's persistent agent memory.' The additive semantics clearly set it apart from agent_memory_replace by nature, but the description never names or routes against that sibling, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers ('remember X', 'save this', 'note for next time'), a when-not clause ('Do not auto-update on ordinary messages'), and a mandatory same-turn ordering rule. This is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_memory_replaceAgent memory replaceADestructiveIdempotentInspect
Replace the entire memory file for the calling user. USE SPARINGLY — append is the safer primary. Only call replace when memory has drifted wrong, accumulated stale entries, or the user asks for a clean rewrite. Cap: 10240 bytes; over-cap calls return 413.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Full memory content (Markdown). Pass empty string to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new context beyond the annotations: a concrete 10240-byte cap and the resulting 413 error, plus the fact that the whole file is overwritten. It stops short of describing recovery or whether overwrites are reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, followed by the usage warning and the hard limit. No sentence is wasted and the most important constraint (use sparingly) is prominent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with annotations covering the safety profile and a fully documented schema, nothing essential is missing. The cap and error behavior close the remaining operational gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the single 'content' parameter, including the empty-string-to-clear behavior. The description adds no per-parameter syntax beyond the cap constraint, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (replace) and resource (the entire memory file for the calling user), and explicitly contrasts with the sibling agent_memory_append. An agent can distinguish this from the append tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'USE SPARINGLY — append is the safer primary' and names the three conditions that justify replace (drifted memory, stale entries, user-requested clean rewrite). This is textbook when-to-use vs. alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_accessibility_auditAndroid accessibility auditARead-onlyIdempotentInspect
Run an accessibility audit on the CURRENT screen of an Android device. Checks match the rules Google's own Accessibility Scanner applies, so findings line up with what Android developers already act on. Audits whatever is in the foreground right now, so navigate to the screen you care about FIRST (device_tap_by_text / device_launch_app), then call this. Reports tap targets below the recommended minimum, several tappable elements stacked on identical bounds (the screen reader announces the same thing twice), controls that report a button class but expose no click action (the screen reader announces a button the user cannot activate), actionable controls the screen reader cannot name at all (no text, no description, no labelled child — the classic unlabelled icon button), descriptions that redundantly restate the element's type, state or action ("Submit button" — the screen reader says "button" already), and controls reporting a class assistive technology cannot interpret. Each finding carries the element's label, class and pixel rect — the rect centre is directly tappable with device_tap. Pass scroll:true to keep scrolling and re-auditing until nothing new comes into view, so content below the fold is covered too. IMPORTANT LIMITS, so findings are read correctly: tap-target results are a screening signal, not a verdict, because a control can legitimately extend its own tap area in a way this audit cannot observe; only elements actually drawn on screen are examined, so summary.actionableNodes counts the tappable elements (clickable rows included) currently on screen, not the whole list; and an element made tappable purely by an ancestor's touch dispatch is invisible here unless its own class is a control class. Contrast and text-size are NOT checked — that needs data this audit cannot read.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| checks | No | Checks to run; omit for all. "TouchTargetSize" = tap targets below the recommended minimum; "DuplicateClickableBounds" = several tappable elements on identical bounds; "MissingClickAction" = a button-class element exposing no click action; "SpeakableTextPresent" = an actionable control with no text, content description or labelled descendant; "RedundantDescription" = description restates type/state/action; "ClassName" = control reports an uninterpretable class. | |
| scroll | No | Defaults false. When true, audit the screen, scroll down, and audit again — repeating until a pass reveals no new elements or maxScrollSteps is reached — then report the deduplicated union. This CHANGES THE SCREEN: it scrolls the app and does not scroll back, and on a lazily-loaded list it will trigger loading. Leave it off when the app must not be disturbed. | |
| maxScrollSteps | No | Only with scroll:true. Maximum scrolls before stopping regardless (default 6, max 20). | |
| localeIsEnglish | No | Defaults true. The redundant-description check matches English words, so set false on a non-English device to skip it rather than have it compare English words against other-language text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give readOnlyHint/idempotentHint/destructiveHint, but the description adds context they cannot: scroll:true 'CHANGES THE SCREEN: it scrolls the app and does not scroll back' and triggers lazy loading. It also discloses the important non-obvious limits (tap-target screening is a signal not a verdict, only on-screen drawn elements examined, ancestor-driven tappability invisible, contrast/text-size NOT checked).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose first, then fold/scroll guidance, then finding types, then limits. Every sentence carries information (finding semantics, rect-as-tap-point, caveats), though the block is long enough that an agent may need to scan rather than read once.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers the return shape (each finding carries label, class and pixel rect; rect centre is tappable via device_tap) and the aggregate caveat about summary.actionableNodes. Combined with the disclosed limits, an agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds real value, explaining why localeIsEnglish exists (English word matching for the redundant-description check), what maxScrollSteps bounds, and the side effects of scroll:true. It goes beyond restating the schema, though per-parameter coverage is already strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Run an accessibility audit on the CURRENT screen of an Android device'. It also positions itself against the iOS sibling implicitly via platform and explains the rule basis (Google Accessibility Scanner). An agent can distinguish this from ios_accessibility_audit and device_page_source without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing: 'navigate to the screen you care about FIRST (device_tap_by_text / device_launch_app), then call this', plus a named alternative behavior for scroll:true and a when-not-to condition ('Leave it off when the app must not be disturbed'). Nothing 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.
android_app_launch_timeAndroid app launch timeAInspect
Cold app-launch time (ms) via am start -W -S, averaged over N runs. Resolves the launcher activity from the package.
| Name | Required | Description | Default |
|---|---|---|---|
| pkg | Yes | App package (or full component pkg/activity), e.g. com.android.settings | |
| runs | No | Cold launches to average (default 3) | |
| serial | Yes | Android device serial (from `device_list`) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose the safety profile (readOnly=false, idempotent=false, destructive=false). The description adds useful behavioral context: cold launches are used, the command is named, and multiple runs are averaged. It does not detail side effects like force-stopping the app, but the annotations lower the bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences front-load the metric and mechanism with no wasted words. Each phrase adds technical specificity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the purpose, method, and averaging behavior, and the schema fully documents serial and runs. It does not explain failure modes or device prerequisites, but for a simple measurement tool with no output schema, it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning beyond it by explaining that the package input is resolved to a launcher activity and that results are averaged over N runs. This clarifies how pkg and runs are used behaviorally.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise metric ('Cold app-launch time (ms)'), the underlying mechanism ('am start -W -S'), and the averaging behavior. This clearly distinguishes it from siblings like android_fps and android_performance_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for measuring cold launch time, but it does not state when to use it over alternatives such as android_fps or android_performance_record_start. No exclusions or explicit context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_crash_analyticsAndroid crash analyticsARead-onlyIdempotentInspect
Crash / ANR / native-crash analytics (total, per-process, per-type, per-day timeline) plus groups: crashes deduped by signature, count desc, with exampleIds. Use android_crash_detail for one entry.
| Name | Required | Description | Default |
|---|---|---|---|
| serial | Yes | Android device serial (from `device_list`) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuine behavioral value by disclosing the output shape — including that `groups` are deduped by signature, sorted by count descending, and carry exampleIds — which no annotation or output schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler: the first front-loads the data categories, the second handles disambiguation. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the return structure in detail, and annotations cover the safety/idempotency profile. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (serial) and the schema documents it at 100% coverage including its origin (`device_list`). The description adds nothing about the parameter, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (crash/ANR/native-crash analytics) and enumerates exactly what it returns (totals, per-process, per-type, per-day timeline, deduped groups). It also explicitly contrasts itself with android_crash_detail, so an agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes single-entry lookups to android_crash_detail, which is the main alternative an agent would confuse this with. It does not state prerequisites (e.g. that serial comes from device_list or whether the app must have run), so it stops 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.
android_crash_detailAndroid crash detailARead-onlyIdempotentInspect
Full raw content of one crash/ANR/tombstone entry (by id from android_crash_analytics).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Crash id from android_crash_analytics | |
| serial | Yes | Android device serial (from `device_list`) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, non-open-world behavior, so safety is covered. The description adds that the return is the full raw content (as opposed to a summary), which is useful context, but says nothing about size, pagination, or what 'raw' includes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tight sentence with the return nature and the id source front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with full annotation coverage and 100% schema coverage, the description covers what is returned and where the id comes from. It could say more about the raw payload format, but nothing essential to calling it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (id and serial) are already documented, and the schema itself states the id comes from android_crash_analytics. The description reinforces but does not extend the schema's parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (one crash/ANR/tombstone entry) and its scope (full raw content), which clearly distinguishes it from the analytics/list sibling. The retrieval verb is implicit rather than stated, but an agent can tell exactly what it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It points the agent to android_crash_analytics as the source of the id, implying the fetch-after-list workflow. It does not state when to prefer this over the analytics sibling or any prerequisites/exclusions, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_capture_networkAndroid DevTools capture networkARead-onlyIdempotentInspect
Capture network requests made by a page running on the device over a time window via CDP. Enables the Network domain and collects request/response/loadingFinished/loadingFailed events. LIVE-WINDOW collector: only captures requests made AFTER it attaches — to capture a navigation/reload/fetch, pass triggerJs (fired inside the window) rather than triggering it from a separate tool call (which races the attach and returns 0 records). Returns { records, bodiesOmitted? } in summary format, or a HAR 1.2 document when format="har". Each record: { requestId, method, url, requestHeaders?, status?, statusText?, mimeType?, resourceType?, responseHeaders?, encodedDataLength?, state, errorText?, startTimestamp?, endTimestamp?, body?, bodyTruncated?, bodyError? }. Set includeBodies=true to fetch response bodies for completed text-like responses (json|text|xml|javascript|html|css|svg|x-www-form-urlencoded); per-body cap: 10 000 chars (bodyTruncated=true when hit); total cap: 200 000 chars (excess records counted in bodiesOmitted). Body fetch failures set bodyError on that record. Set throttle to emulate network conditions for the capture window only (cleared in a finally block): slow-3g (latency 2000ms, 400kbps down/up), fast-3g (latency 563ms, 1.6Mbps down / 750kbps up), offline. When throttle was active, a top-level throttle field appears in the output. Set blockUrls (URL patterns) to block matching requests, or extraHeaders to inject request headers (e.g. Authorization), for the capture window only — both cleared afterward. Returns at most limit records (default 100, most-recent first) so heavy pages stay within the token budget — filter with urlSubstring / onlyErrors; total/returned appear when records were dropped. Default window: 5 000 ms. Maximum: 30 000 ms. Omit pageId to auto-select the visible/active page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| limit | No | Max records to return, most-recent first (default 100). Heavy pages make hundreds of requests; the default keeps the response within the MCP token budget. total/returned are included when records were dropped. | |
| format | No | Output format: "summary" (default) returns { records, bodiesOmitted? }; "har" returns a HAR 1.2 document | |
| pageId | No | Target page id (auto-picked when omitted) | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) | |
| throttle | No | Emulate network conditions for the capture window only (cleared in a finally block). slow-3g: latency 2000ms, 400kbps down/up. fast-3g: latency 563ms, 1.6Mbps down / 750kbps up. offline: no connectivity. | |
| blockUrls | No | Block requests whose URL matches any of these patterns (wildcards allowed, e.g. "*.doubleclick.net", "*/analytics*") for the capture window ONLY (cleared afterward). Blocked requests surface as failed. Use to capture without third-party/analytics noise. | |
| triggerJs | No | JavaScript run INSIDE the capture window (right after the collector attaches) so the requests it triggers are captured race-free — e.g. "location.reload()", "location.href='https://example.com'", or "fetch('/api/x')". Prefer this over navigating/reloading from a separate tool call, which races the collector attach and yields 0 records. | |
| durationMs | No | Collection window in milliseconds (default: 5000, max: 30000) | |
| onlyErrors | No | Only failed / 5xx records | |
| extraHeaders | No | Extra HTTP headers added to every request for the capture window ONLY (cleared afterward), e.g. { "Authorization": "Bearer …" } to capture authenticated requests. These are session-scoped, which is why they apply only during this capture. | |
| urlSubstring | No | Only records whose URL contains this substring — target the requests you care about | |
| includeBodies | No | Fetch response body for completed text-like responses (default: true). Request bodies (postData) are always captured. Set false to skip response bodies for a lighter payload. Per-body cap: 10 000 chars. Total cap: 200 000 chars. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: the live-window attach semantics, that throttle/blockUrls/extraHeaders are cleared in a finally block and scoped to the capture window only, per-body (10 000) and total (200 000) body caps with bodiesOmitted/bodyTruncated/bodyError signals, and the default/max window bounds.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the critical live-window caveat, then return shape, then options. It is dense and long, but justified by 13 parameters and no output schema; a few clauses (e.g. re-listing throttle profiles already in the schema) are redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully documents the return contract: the { records, bodiesOmitted? } summary shape, the HAR 1.2 alternative, every record field, and the throttle/total/returned extras. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds cross-parameter interaction context not present in the schema — how limit interacts with urlSubstring/onlyErrors and the token budget, that total/returned appear only when records were dropped, and that a top-level throttle field surfaces when throttling was active.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Capture network requests made by a page running on the device ... via CDP') plus the mechanism (CDP Network domain, event set), so it is clearly distinct from native-traffic tools like android_traffic_* and from sibling DevTools tools. It never explicitly names an alternative or says when-not to use it, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when/when-not guidance: pass triggerJs rather than triggering navigation from a separate tool call because the latter 'races the attach and returns 0 records'; use urlSubstring/onlyErrors to keep heavy pages within the token budget; omit pageId to auto-select the visible page; set includeBodies/throttle/blockUrls/extraHeaders only when needed for the window.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_close_pageAndroid DevTools close pageAIdempotentInspect
Close a debuggable tab/page on the device by pageId (CDP /json/close). Use to clean up stale tabs that accumulate across sessions and clutter android_devtools_list_pages. Get the pageId from android_devtools_list_pages. Returns { closed, pageId } — closed:false if no such page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| pageId | Yes | Target page id (from android_devtools_list_pages) to close | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false); the description adds value on top by disclosing the return shape ({ closed, pageId }) and the no-op outcome (closed:false if no such page). It doesn't mention auth or socket behavior, but the annotations already do the heavy lifting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: action first, then purpose/routing, then return contract. No filler, nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return contract itself, plus the pageId prerequisite and cleanup rationale. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents udid, pageId (including its origin in android_devtools_list_pages), and socket. The description reinforces the pageId source but adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Close a debuggable tab/page on the device by pageId') plus the underlying mechanism (CDP /json/close). It is clearly distinguishable from android_devtools_list_pages and the other android_devtools_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('clean up stale tabs that accumulate across sessions and clutter android_devtools_list_pages') and where to get the required pageId. It does not name a when-not condition or an alternative close path, but none is needed here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_console_logsAndroid DevTools console logsARead-onlyIdempotentInspect
Collect console logs, exceptions, and log entries from a page running on the device for a time window. Enables Runtime and Log domains, then listens for Runtime.consoleAPICalled, Runtime.exceptionThrown, and Log.entryAdded events. Returns a normalized array of { level, text, url?, lineNumber? } entries. This is a LIVE-WINDOW collector: it only captures events fired AFTER it attaches, so triggering the logging from a SEPARATE tool call races the ~1-3s attach latency and is silently missed. To capture logs from an action, pass triggerJs (runs inside the window). Default window: 3 000 ms. Maximum: 15 000 ms. Omit pageId to auto-select the visible/active page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| pageId | No | Target page id (auto-picked when omitted) | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) | |
| triggerJs | No | JavaScript run INSIDE the collection window (right after the listeners attach) so the logs it produces are captured race-free — e.g. "location.reload()", "document.querySelector('#go').click()", or "console.log('probe')". Prefer this over triggering from a separate call. | |
| durationMs | No | Collection window in milliseconds (default: 3000, max: 15000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them: it discloses that it enables Runtime and Log domains, subscribes to specific events, returns a normalized entry array, and — critically — that it only captures events fired AFTER attach. That live-window caveat is essential behavioral context an agent cannot infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then mechanism, then return shape, then the crucial race caveat and defaults. Sentences are dense but each one carries non-redundant information (event names, latency window, defaults, auto-select).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by specifying the exact return shape ({ level, text, url?, lineNumber? }). Combined with the attach-window semantics and parameter defaults, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents the default (3000ms), max (15000ms), triggerJs race-free rationale, and pageId auto-pick. The description largely restates this, so the baseline of 3 applies; it adds no syntax or format detail absent from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Collect console logs, exceptions, and log entries from a page running on the device') and scopes it to a time window. It is clearly distinguishable from siblings like android_devtools_capture_network and web_console_messages, and even lists the exact CDP events it listens to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong conditional guidance: it warns that triggering logging from a separate tool call races the ~1-3s attach latency and is silently missed, and directs the agent to use triggerJs instead. It does not name an alternative sibling tool for the non-live case, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_cookiesAndroid DevTools cookiesARead-onlyIdempotentInspect
Get cookies for a page on the device via CDP (Network.getCookies), including httpOnly / secure / sameSite / domain / path / expiry — useful for debugging auth/session state. Falls back to document.cookie (non-httpOnly only) if the CDP call is unavailable. Omit pageId to auto-select the visible/active page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| pageId | No | Target page id (auto-picked when omitted) | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior. The description adds valuable context beyond that: the CDP fallback to document.cookie (which limits results to non-httpOnly cookies) and the specific cookie attributes returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no wasted words. The purpose is front-loaded, followed by fallback behavior and parameter hint, all of which earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with full schema coverage, safety annotations, and no output schema, the description provides sufficient context: what it returns (cookie fields), how it retrieves them, fallback behavior, and parameter defaulting. Nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds a useful clarification that omitting pageId auto-selects the visible/active page, which is more specific than the schema's 'auto-picked when omitted'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'Get' and resource 'cookies' with scope 'for a page on the device via CDP', and names the exact CDP method. It is clearly distinguishable from sibling devtools tools like android_devtools_capture_network or android_devtools_console_logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a use case ('useful for debugging auth/session state') but does not name alternatives or conditions when this tool should not be used. The parameter hint about pageId omission is more about parameter semantics than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_elementsAndroid DevTools elementsARead-onlyIdempotentInspect
Extract locator-friendly element data from a page on the device for building Playwright/Selenium locators. For each element (interactive/meaningful elements by default, or those matching selector) returns: tag, trimmed text, key attributes (id/name/type/role/aria-label/placeholder/href/value/data-testid + any data-*), classes, bounding box {x,y,w,h} and a visibility flag. USE suggested — the locator worth writing (id, then test-id, name, aria-label, placeholder), each verified unique before it is offered, with playwright giving the same target in getByRole/getByTestId form. css and xpath are diagnostic fallbacks, not recommendations: the CSS path is an nth-of-type chain over layout classes and does not belong in a page object. When suggested is null nothing stable exists — act via ref and treat the missing test-id as the real finding. Set includeStyles=true to also return a curated set of computed styles per element. Omit pageId to auto-select the visible/active page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| limit | No | Max elements to return (default 150) | |
| pageId | No | Target page id (auto-picked when omitted) | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | CSS selector to scope extraction (default: interactive/meaningful elements) | |
| includeStyles | No | Include a curated set of computed styles per element (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial behavior: the exact return shape, that suggested locators are verified unique before being offered, the null-suggested edge case, and that css is an nth-of-type chain over layout classes not fit for page objects. This is context well beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, and every sentence carries weight (fallback warnings, null handling, style flag, page auto-select). Some sentences are dense multi-clause runs, but there is little pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so: it enumerates returned fields (tag, text, attributes, classes, bbox, visibility), the suggested/playwright/css/xpath structures, and the null case. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning: selector scopes extraction to matching elements vs the interactive/meaningful default, includeStyles returns a curated computed-style set, and omitting pageId auto-selects the visible/active page. That is genuine semantic enrichment over the schema strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (extract) and resource (locator-friendly element data from a device page), plus the downstream purpose (building Playwright/Selenium locators). An agent can distinguish this from android_devtools_get_dom, device_find_element and device_locators_for 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong prescriptive guidance: 'USE suggested', css/xpath are diagnostic fallbacks not recommendations, when suggested is null act via ref, set includeStyles for computed styles, omit pageId to auto-select. It lacks an explicit contrast with sibling tools like android_devtools_get_dom, but the in-tool usage rules are clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_evaluateAndroid DevTools evaluateADestructiveInspect
Evaluate a JavaScript expression in the context of a page running on the device via CDP. Enables Runtime, then calls Runtime.evaluate. Returns the result value, any exception details, and pageId/pageUrl identifying the tab it actually ran on — check those if a result looks like it came from the wrong page. Omit pageId to auto-select the active tab (after a navigate, that is the tab the navigate landed on).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| pageId | No | Target page id from android_devtools_list_pages (auto-picked when omitted) | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) | |
| expression | Yes | JavaScript expression to evaluate | |
| awaitPromise | No | Whether to await a returned Promise (default: true) | |
| returnByValue | No | Return the result as a serializable value (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, readOnlyHint=false, which the description does not contradict. The description adds valuable behavioral context about what is returned (result value, exception details, pageId/pageUrl) and the pageId auto-selection semantics. It doesn't explain why destruction is possible, but the return-value and tab-targeting details are non-obvious and genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with no filler. The CDP-mechanics detail is front-loaded, followed by return-value and pageId guidance. Slightly dense but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a CDP evaluate tool with rich annotations and a full schema but no output schema, the description covers the operation, the return shape (result, exceptions, pageId/pageUrl), and the page-targeting rule. Minor gap: it doesn't warn about the destructiveHint or when evaluation could mutate page state, but otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters. The description adds a nuance about omitting pageId (auto-select active tab, post-navigate binding) that enriches semantics beyond the schema's terse note, keeping it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (evaluate) and resource (JavaScript expression in a device page via CDP) and names the underlying CDP method call (Runtime.evaluate). Distinct enough from siblings like ios_safari_evaluate and webpage_cdp_command that an agent can select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides implicit guidance for pageId selection ('omit pageId to auto-select the active tab; after a navigate, that is the tab the navigate landed on'), but does not explicitly contrast with alternatives that could also evaluate JS (webpage_cdp_command, session_execute) or specify when to prefer this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_get_domAndroid DevTools get DOMARead-onlyIdempotentInspect
Get the outer HTML of the page (or a CSS-selector-matched element) running on the device via CDP. Output is capped at 100 000 characters; a truncation notice is appended when the limit is hit. Omit pageId to auto-select the visible/active page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| pageId | No | Target page id (auto-picked when omitted) | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | Optional CSS selector — returns outerHTML of the first matching element, or null if not found |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context the annotations don't carry: the 100,000-character output cap and the appended truncation notice, which directly affects how an agent should handle the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the output-size constraint, then the parameter default. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carry the return contract, and it does: outerHTML of the page or matched element, with the size cap and truncation behavior disclosed. Annotations cover safety. The only gap is the lack of routing guidance against sibling DOM/page-source tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description goes slightly beyond the schema by spelling out what 'auto-picked' means for pageId — the visible/active page — which the schema only labels 'auto-picked when omitted.' Selector semantics are already in the schema, so the added value is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get the outer HTML of the page (or a CSS-selector-matched element) running on the device via CDP.' An agent knows exactly what it returns, but the description never distinguishes it from close siblings like android_devtools_elements or device_page_source, which also expose page structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is 'Omit pageId to auto-select the visible/active page,' which explains a parameter default rather than when to pick this tool over android_devtools_elements or device_page_source. Usage context is implied by the CDP/outerHTML framing but 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.
android_devtools_list_pagesAndroid DevTools list pagesARead-onlyIdempotentInspect
List debuggable pages/targets available on the device. Returns id, type, title, url, active and visible per target, newest-active FIRST. active: true marks the ONE page every other tool resolves to when you omit pageId — you do NOT need to list tabs and pass an id just to act on the current tab, only to act on a DIFFERENT one. visible is a WebView-only hint and is null for ordinary browser tabs on every browser tested; use active, not visible. Stale tabs accumulate across sessions; close unwanted ones with android_devtools_close_page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial extra behavior: result ordering (newest-active first), the meaning of `active: true` as the default resolution target for other tools, the WebView-only nature of `visible` (null on ordinary browser tabs), and the caveat that stale tabs accumulate across sessions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then dense, non-redundant guidance about active vs visible and the close_page follow-up. Every sentence carries unique, actionable information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe returns — and it does (id, type, title, url, active, visible, ordering). Combined with the active/visible semantics and stale-tab caveat, an agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters (udid, socket) with their own descriptions, so the schema already carries the parameter burden. The description adds nothing about the parameters themselves (pageId is referenced only as a parameter of other tools), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (debuggable pages/targets on the device) and immediately enumerates the returned fields, so an agent knows exactly what it gets. It is clearly separable from android_devtools_close_page and the many android_devtools_* action tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when NOT to call it for a lookup purpose: 'you do NOT need to list tabs and pass an id just to act on the current tab, only to act on a DIFFERENT one.' It also names the follow-up tool (android_devtools_close_page) for cleaning up stale tabs, giving both context and an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_mock_addAndroid DevTools mock addAInspect
Add (or update in place, when id matches an existing route) a mock/abort rule for Chrome/WebView requests on this device. mode "mock" (default) serves the given status/headers/body without the request leaving the device; mode "abort" fails it so the page sees a network error. Routes apply immediately and survive navigation. WEB CONTENT ONLY: this intercepts requests made by browser/WebView pages. Requests made by native app code are NOT intercepted and never will be by this tool. Nothing device-wide is changed and no certificate is installed — the effect is scoped to the page. For requests made by native app code use android_traffic_mock_add instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Route id to update in place; omit to auto-generate a new one | |
| body | No | Response body for mode "mock" (text, or base64 when bodyEncoding is "base64") | |
| mode | No | "mock" serves a canned response (default); "abort" fails the request | |
| udid | Yes | Device id (Android serial or iOS UDID) | |
| method | No | Optional HTTP method filter (e.g. "GET"/"POST"); matches any method when omitted | |
| pageId | No | Pin routing to a specific page id (from the *_list_pages tool). Omit to follow the active page automatically across navigations and new tabs — recommended. | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) | |
| status | No | HTTP status to serve for mode "mock" (default 200) | |
| delayMs | No | Latency injected before responding/failing, in ms (clamped to 60s) | |
| enabled | No | Whether the route is active (default true) — disabled routes are kept but ignored | |
| headers | No | Response headers for mode "mock", as {headerName: value} — e.g. {"content-type": "application/json"}. On iOS a `charset` in content-type is NOT applied to the response: an HTML body with non-ASCII characters must declare it in the document (e.g. <meta charset="utf-8">) or it will be decoded with the default encoding and render as mojibake. | |
| matchUrl | Yes | URL pattern to match against the request's full URL | |
| matchType | No | How matchUrl is interpreted against the request URL (default "contains") | |
| bodyEncoding | No | Encoding of `body` (default "text") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: routes apply immediately, survive navigation, nothing is changed device-wide, no certificate is installed, and the effect is scoped to the page. It also clarifies the update-in-place semantics when an id matches. This is exactly the kind of side-effect and scope disclosure a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and then layers the constraints in ordered sentences with a clear WEB CONTENT ONLY callout. It is dense but every sentence carries information; slightly long, but appropriately so for a 14-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 14 parameters, rich annotations, and no output schema, the description covers scope, effect lifetime, mode semantics, and the sibling alternative. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 14 parameters with enums and defaults. The description reinforces the meaning of mode and id but adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add/update-in-place) and resource (a mock/abort routing rule) and immediately names the scope (Chrome/WebView requests on this device). It also explicitly distinguishes itself from the sibling android_traffic_mock_add, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use each mode (mock serves a canned response, abort fails the request) and when NOT to use this tool, routing the agent to android_traffic_mock_add for native app code. The alternative and its selecting condition are named outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_mock_clearAndroid DevTools mock clearADestructiveIdempotentInspect
Remove ALL Chrome/WebView routes for this device and un-arm interception. Call this when finished — it restores completely normal networking for the browser on that device.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: it deletes ALL routes (not one), disables interception, and restores normal networking for the device's browser.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste: scope/effect first, then the usage trigger. Nothing redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive teardown tool, annotations cover reversibility/idempotency and the description covers scope, effect, and timing, and no output schema is expected to be explained. Only minor detail missing (e.g. behavior when no routes are armed) keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single udid parameter with 100% schema description coverage, so the schema carries the meaning; "this device" only loosely ties the action to the parameter. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (remove ALL Chrome/WebView routes for this device) plus the secondary effect of un-arming interception, which separates it from mock_add. It does not explicitly name mock_remove/mock_list, so the contrast with the per-route removal sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call this when finished" gives a clear trigger condition for teardown, which is exactly the lifecycle guidance an agent needs. It stops short of naming the alternative (mock_remove) for removing a single route, so no explicit when-not is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_mock_listAndroid DevTools mock listARead-onlyIdempotentInspect
List the Chrome/WebView mock/abort routes currently registered for this device, in match order (first match wins). WEB CONTENT ONLY: this intercepts requests made by browser/WebView pages. Requests made by native app code are NOT intercepted and never will be by this tool. Nothing device-wide is changed and no certificate is installed — the effect is scoped to the page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is handled. The description adds genuinely non-redundant behavior: matching is first-match-wins, the effect is scoped to the page, no certificate is installed, and nothing is changed device-wide. It stops short of describing the returned entry structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with what is listed and in what order. The two follow-up sentences are scope/reassurance rather than filler, though the 'never will be by this tool' clause is slightly emphatic for the space it occupies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only list with full schema coverage and annotations, the description supplies the missing behavioral context (ordering, scope limits). Since there is no output schema, it would be marginally better if it hinted at the fields of a returned route, but nothing critical to invoking it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter (udid) and schema description coverage is 100%, so the schema already documents it fully. The description contributes no additional meaning about the udid argument, which is the baseline-3 case for a fully covered single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Chrome/WebView mock/abort routes registered for this device), plus the ordering semantics (match order, first match wins). That is enough to distinguish it from mock_add/mock_remove/mock_clear, but it does not explicitly contrast itself with the close sibling mock_status, which is the one an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clarifies scope (web content only, native app requests not intercepted) which implicitly tells the agent when this tool is relevant, but it never names an alternative tool or states a when-to-use condition versus mock_status or the traffic-mock equivalents. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_mock_removeAndroid DevTools mock removeADestructiveIdempotentInspect
Remove one Chrome/WebView route by id. When the last route is removed the device is automatically un-armed, so no traffic is paused for nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Route id to remove (from *_mock_list) | |
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds real behavioral context beyond them: removing the last route automatically un-arms the device so traffic is not paused needlessly — a non-obvious side effect an agent could not get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and resource, with the second sentence dedicated to the side effect. No filler and nothing redundant with structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with annotations covering destructiveness and idempotency, the description is nearly complete; the auto-un-arm behavior is the key extra. It omits what happens when the id is unknown or the device is not armed, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two simple parameters (id, udid), so the schema already carries the meaning. The description adds nothing about parameter format or the id's provenance beyond what the schema states. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove), resource (one Chrome/WebView route) and lookup key (by id), which distinguishes it from bulk siblings like android_devtools_mock_clear. It does not, however, explicitly contrast itself with android_traffic_mock_remove or ios_safari_mock_remove, so an agent must infer the platform boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: remove a previously added mock route. No when-to-use/when-not guidance, no named alternative (mock_clear would be the obvious one), and no prerequisites such as needing an active DevTools page. The id source is mentioned in the schema, not here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_devtools_mock_statusAndroid DevTools mock statusARead-onlyIdempotentInspect
Report whether Chrome/WebView interception is currently armed on this device, which page target it is attached to, the active routes, and live hit counters (paused/mocked/aborted/passedThrough/errors). Check the counters to confirm a mock is actually firing — a route that never matches shows mocked: 0.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds genuine context beyond that: the meaning of each counter category and the diagnostic insight that a non-matching route reports mocked: 0. It does not discuss error states of the status call itself, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the enumeration of reported fields is front-loaded ahead of the diagnostic tip. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey what comes back, and it does: the armed flag, target, routes, and named counter values. Combined with annotations covering the safety profile and 100% param coverage, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (udid) with 100% schema description coverage, so the schema already documents it fully. The description adds no format or constraint detail about the device id. Baseline 3 is appropriate when the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and enumerates exactly what is reported: armed state, attached page target, active routes, and hit counters. This is far more informative than the name alone. It does not explicitly distinguish itself from nearby siblings such as android_devtools_mock_list, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete diagnostic condition for using the tool: 'Check the counters to confirm a mock is actually firing — a route that never matches shows mocked: 0.' That is clear when-to-use guidance. It names no alternative or exclusion (e.g., vs. mock_list or mock_add), so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_fpsAndroid FPSARead-onlyIdempotentInspect
FPS / jank stats for a package via dumpsys gfxinfo (total/janky frames, jank %, frame-time percentiles, missed vsyncs).
| Name | Required | Description | Default |
|---|---|---|---|
| pkg | Yes | App package name, e.g. com.android.settings | |
| serial | Yes | Android device serial (from `device_list`) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds the non-mutating data source (dumpsys gfxinfo), but discloses no operational caveats such as whether the app must be running or that gfxinfo stats are cumulative since last reset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the parenthetical metric list earns its place by telling the agent exactly what comes back. No redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned metrics (jank %, percentiles, missed vsyncs). Combined with fully documented params and safety annotations, this is nearly complete, though it omits prerequisites for obtaining meaningful stats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'pkg' and 'serial' documented (including an example and a reference to device_list). The description adds no further parameter meaning, which is the correct baseline 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope (FPS/jank stats for a package) and even names the underlying mechanism (dumpsys gfxinfo), so an agent can tell what it returns. It does not explicitly differentiate from potential siblings like android_performance_snapshot, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the metric provided (fetch FPS/jank for a package), but there is no explicit when-to-use, when-not-to-use, or named alternative such as android_performance_snapshot. This is the minimum-viable level of guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_mjpeg_screenshotAndroid MJPEG screenshotARead-onlyIdempotentInspect
PREFERRED fast screenshot of an Android device via the ALREADY-RUNNING shared video stream. Returns a single JPEG frame decoded from the live video stream — no fresh full-resolution screen grab is spawned. Use this for routine per-action screen checks; it is much faster than device_screenshot, so make it your default for iterating on a flow. Image is captured at the device physical resolution (the stream is never downscaled), so pixel positions match device_tap coords 1:1 — same invariant device_screenshot promises. Reserve device_screenshot for when you need the bundled labeled-elements list or a full-fidelity image. Image-only (no page-source bundling) to keep this call fast.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description adds substantive traits: no new full-resolution grab is spawned, capture is at physical resolution with no downscaling, and no page-source is bundled. It omits the failure behavior when the shared stream is not already running, which is the one precondition it implies but never states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the PREFERRED/ALREADY-RUNNING qualifiers and the core tradeoff; each sentence carries information. Slightly repetitive in restating the resolution invariant that device_screenshot already promises, which costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param, no-output-schema read tool, the description covers return format (single JPEG frame), the fast-path rationale, and the sibling tradeoff. The main gap is not stating what happens if the shared stream is not running, a precondition this tool depends on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) and schema description coverage is 100%, so the schema fully documents it. The description adds no format or sourcing detail for udid, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (screenshot of an Android device) and a distinguishing mechanism (single JPEG frame decoded from the already-running MJPEG stream, no fresh grab). It explicitly names and contrasts with the sibling device_screenshot, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('routine per-action screen checks', 'make it your default for iterating on a flow') and when not ('reserve device_screenshot for when you need the bundled labeled-elements list or a full-fidelity image'). Alternatives and selection criteria are both given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_performance_record_startAndroid performance record startAInspect
Start recording per-process CPU/memory over time (like screen recording, for metrics). Stop with android_performance_record_stop.
| Name | Required | Description | Default |
|---|---|---|---|
| pkg | No | Focus processes containing this package; else top by CPU | |
| serial | Yes | Android device serial (from `device_list`) | |
| intervalMs | No | Sample interval ms (default 1000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so safety is covered. The description adds the session lifecycle fact that recording must be explicitly stopped, but says nothing about rate limits, what happens on a second start, or where metrics surface, so it only modestly extends the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no waste, with the core action front-loaded and the stop counterpart as a closing pointer. Nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter start tool with no output schema and annotations covering the safety profile, the description is nearly sufficient. The one small gap is that it does not say where the recorded metrics are retrieved (stop return vs snapshot), which an agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (serial, pkg, intervalMs) are already documented with defaults and bounds. The description adds no syntax or format detail beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Start recording') plus the resource and scope ('per-process CPU/memory over time'), and explicitly names the paired sibling android_performance_record_stop, so an agent can place it against the stop/snapshot tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use (continuous metrics capture) and routes the agent to android_performance_record_stop for termination, which is the essential workflow pairing. It does not, however, distinguish when to prefer this recording over android_performance_snapshot or android_fps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_performance_record_stopAndroid performance record stopAInspect
Stop a performance recording and return the full time-series + a per-process summary (avg/peak CPU, peak memory). Each process also carries derived facts: memory slope (MB/min) and fit quality, a leak-suspected flag, CPU/memory spike episodes, and a one-line verdict. Also a thermal block: battery temperature sampled every ~15 s ({startC, endC, peakC, riseC, samples}) and Android thermal status over time (state: max + timeline; throttling = MODERATE or above), with a verdict phrase when the device warmed notably or throttled. Recordings of 60 s or more also carry a baseline: peak memory, CPU, temperature rise against the median of your last runs of the same app on the same device model. Also a frames block when a package is focused: fps over time from dumpsys gfxinfo deltas ({avgFps, minFps, p10Fps, jankPct, lowFpsSpans, samples}), skipping idle intervals, with a verdict phrase. Battery drain is not measured (fleet devices are always charging).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session id from android_performance_record_start |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds substantial behavioral context beyond that: the ~15 s sampling interval, the 'throttling = MODERATE or above' threshold, the 60 s minimum before a baseline block appears, frames only when a package is focused, and the explicit limitation that battery drain is not measured.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loading is good ('Stop a performance recording and return...'), but the rest is a single dense wall of text mixing return-value fields, thresholds, and caveats with no hierarchy. Given there is no output schema the detail is warranted, but the packing hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return values, and it does so comprehensively for a complex tool (per-process metrics, derived facts, thermal, baseline, frames). It is only slightly incomplete in not clarifying whether the session is consumed/terminated by the stop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (sessionId) and schema description coverage is 100%, so the schema already fully documents it. The description adds no format or provenance detail beyond what the schema's own 'Session id from android_performance_record_start' note provides, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Stop') and resource ('a performance recording') and immediately enumerates what it returns (time-series, per-process summary, thermal/frames/baseline blocks). This clearly distinguishes it from the sibling android_performance_record_start and android_performance_snapshot without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the sessionId param note ties it to android_performance_record_start, so an agent can infer this is the closing call of a record session. There is no explicit when-to-use vs snapshot/start guidance, no statement of whether stop can be called twice, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_performance_snapshotAndroid performance snapshotARead-onlyIdempotentInspect
Snapshot per-process CPU %% and memory (MB) for an Android device via top. Top-N by CPU, or one app via pkg.
| Name | Required | Description | Default |
|---|---|---|---|
| pkg | No | Filter to processes whose name contains this package | |
| topN | No | Top-N by CPU (default 15) | |
| serial | Yes | Android device serial (from `device_list`) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds useful context that the data comes from `top` and which metrics are captured, but says nothing about sampling cost, latency, or how the single snapshot relates to the record_start/record_stop flow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loading what the tool returns before the parameter modes. No filler, though the escaped '%%' is a minor readability blemish.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only snapshot tool with no output schema, the description adequately states the returned metrics (CPU %, memory MB) and the two scoping modes, and annotations cover safety. Missing only a note on return shape (e.g., listing format) to be fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented; the baseline is 3. The description adds mild reinforcement by restating that topN ranks by CPU and pkg selects a single app, but no syntax, default, or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Snapshot'), the exact resource measured (per-process CPU % and memory in MB), the platform (Android) and the mechanism (`top`). An agent can distinguish it from siblings like android_performance_record_start/stop or android_fps, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clarifies the two operational modes ('Top-N by CPU, or one app via pkg'), which implies when to use each parameter, but gives no when-not-to-use guidance and does not point to alternative tools such as the recording start/stop pair for continuous profiling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_talkbackAndroid TalkBackAInspect
Drive Android's TalkBack screen reader and read what it is focused on. Actions: 'status' (is it on, and what is focused), 'enable' / 'disable' (turn TalkBack on or off — up to ~5 s; 'start' / 'stop' are accepted as the same, matching ios_voiceover), 'next' / 'previous' (swipe to the next or previous item, as a TalkBack user would), 'activate' (double-tap the focused item). Returns code, enabled, running, text, className and the focused item's bounds in screen pixels. text is COMPOSED from the focused node (its label, role and state, plus any announcement made during the action) — close to what TalkBack says but not its verbatim spoken string: usage hints and exact word order are not included. Each action takes up to ~3 s. code 'not_running' means TalkBack is off and the gesture was NOT sent — enable it first. code 'text_unavailable' means another UI-automation client (such as a running test session) holds the device: the gesture was still performed but no text could be read. code 'not_installed' means the device has no TalkBack. While TalkBack is on, ordinary taps and swipes behave differently (a single tap only moves focus), so disable it when done. The device is kept silent automatically while TalkBack is on, unless someone is watching it in a browser, who hears it instead.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| action | Yes | What to do. 'status' changes nothing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (readOnlyHint false, destructiveHint false, idempotentHint false): discloses ~5 s enable/disable latency, ~3 s per action, the meaning of code values ('not_running', 'text_unavailable', 'not_installed'), the side effect that single taps only move focus while TalkBack is on, and the automatic silence/local-versus-remote audio behavior — none of which the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the action catalog, then error codes and side effects; every sentence carries information. It is long and dense, but the length is justified by the multi-action surface and the important error/side-effect caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fully documents the return fields (code, enabled, running, text, className, bounds) plus the caveat that 'text' is composed rather than verbatim spoken output. Nothing an agent needs to invoke or interpret the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum already lists the action values, so the baseline is 3; the description nonetheless adds real meaning by explaining what each action does (gesture semantics for next/previous, double-tap for activate) and clarifying 'status' is a no-op. It does not add format detail for udid beyond the schema, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Drive) and resource (Android's TalkBack screen reader) and enumerates every action with its meaning, so an agent can match intent without opening the schema. It is clearly distinguishable from siblings like android_accessibility_audit and pairs the alias 'start'/'stop' with ios_voiceover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational conditions: enable TalkBack first when code is 'not_running', disable it when done because taps/swipes change behavior, and notes 'status' changes nothing. It does not explicitly contrast with alternative accessibility tools, so it stops short of naming when-not-to-use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_traffic_flowsAndroid traffic flowsARead-onlyIdempotentInspect
Snapshot recent DECRYPTED HTTPS flows (request/response) captured since android_traffic_start. Each flow: method, url, host, status, contentType, req/resp sizes, durationMs. Set includeBodies to also return headers + (truncated) request/response bodies. Filter by urlSubstring or onlyErrors. Returns the most recent limit flows.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max flows to return, most recent first-matched (default 100) | |
| serial | Yes | Android device serial (adb serial) | |
| onlyErrors | No | Only 5xx / connection-error flows | |
| urlSubstring | No | Only flows whose URL contains this substring | |
| includeBodies | No | Include headers + bodies (each body capped at 32000 chars). Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds meaningful behavioral context beyond them: traffic is DECRYPTED HTTPS, bodies are truncated when includeBodies is set, and only the most recent `limit` flows are returned. It omits whether capture must be active (fails silently vs errors) and any retention window.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then the returned fields, then the optional behaviors and filters. Four compact sentences with essentially no filler, though the field enumeration sits a bit dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 usefully enumerates the return shape (method, url, host, status, contentType, sizes, durationMs) and the body-truncation behavior. Combined with the 100%-covered input schema, an agent has what it needs, though pagination/retention semantics are only partially addressed via `limit`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (limit, serial, onlyErrors, urlSubstring, includeBodies) is already documented in the schema. The description restates the includeBodies behavior and filters but adds little beyond what the schema provides, which is the expected baseline-3 case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (snapshot decrypted HTTPS flows) and lists the fields each flow contains, making the tool's output concrete. It ties itself to the capture lifecycle via 'since android_traffic_start', which implicitly separates it from android_traffic_status and android_traffic_stop, but it never names a sibling or explicitly distinguishes itself from the mock tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'captured since android_traffic_start' implies the prerequisite that capture must be running, and the filter options hint at use cases (finding errors, matching URLs). However, there is no explicit when-to-use guidance, no statement of when to prefer android_traffic_status or the mock tools, and no mention of the iOS counterpart ios_traffic_flows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_traffic_mock_addAndroid traffic mock addAInspect
Add (or update in place, if id matches an existing route) a mock/abort rule that short-circuits future matching HTTPS requests on this device inside the TLS-inspecting proxy — the request never reaches the real server. mode "mock" (default) returns the given status/headers/body; mode "abort" kills the connection so the app sees a network failure. Requires TLS capture to already be running on this device (android_traffic_start) — routes are stored per-device and take effect live, no restart needed. Certificate-pinned apps cannot be intercepted at all (same limit as capture itself), so a route targeting pinned traffic will simply never match.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Route id to update in place (replaces the existing route); omit to auto-generate a new one | |
| body | No | Response body to inject for mode "mock" (text, or base64 when bodyEncoding is "base64") | |
| mode | No | "mock" injects a canned response (default); "abort" kills the connection | |
| method | No | Optional HTTP method filter (e.g. "GET"/"POST"); matches any method when omitted | |
| serial | Yes | Android device serial (adb serial) | |
| status | No | HTTP status to inject for mode "mock" (default 200) | |
| delayMs | No | Latency to inject before responding/aborting, in ms (clamped to 60s server-side) | |
| enabled | No | Whether the route is active (default true) — disabled routes are kept but ignored | |
| headers | No | Response headers to inject for mode "mock", as {headerName: value} — e.g. {"content-type": "application/json"} | |
| matchUrl | Yes | URL pattern to match against the request's full URL | |
| matchType | No | How matchUrl is interpreted against the request URL (default "contains") | |
| bodyEncoding | No | Encoding of `body` (default "text") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only covering safety flags, the description carries real behavioral weight: per-device storage, live effect with no restart, mock-vs-abort outcome (canned response vs killed connection), and the certificate-pinning limitation. The 'update in place if id matches' semantics are consistent with idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded, leading with the verb and the update-in-place caveat. Every clause carries information (prerequisite, live effect, pinning limit), though the multi-clause sentence is heavy and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, the description covers purpose, prerequisites, live behavior, and limitations well. The one gap is that it never says what is returned (e.g. the generated route id), which matters for follow-up calls to mock_list/mock_remove.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema for key parameters: it explains mode 'mock' vs 'abort' behavior and the id-driven update-in-place path. Other params (headers, delayMs, matchType) are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (add/update a mock or abort route) and precisely scopes it to the TLS-inspecting proxy on this device, distinguishing it from sibling tools like android_traffic_mock_list/remove and android_traffic_start. It even clarifies the update-in-place semantics when `id` matches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition (TLS capture must already be running via android_traffic_start) and an explicit exclusion (certificate-pinned apps can never be intercepted, so such routes never match). It does not name sibling alternatives (e.g. android_devtools_mock_add, webpage_mock_add) for the non-Android case, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_traffic_mock_listAndroid traffic mock listARead-onlyIdempotentInspect
List the mock/abort routes currently configured for this device (see android_traffic_mock_add).
| Name | Required | Description | Default |
|---|---|---|---|
| serial | Yes | Android device serial (adb serial) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds only scoping ('for this device'); it says nothing about return format, ordering, or whether it includes abort routes separately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler, front-loading the verb and resource before the cross-reference. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema and one fully documented parameter, the definition covers purpose and scope adequately. It could note what the listing returns, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is a single serial parameter fully documented in the schema, so the baseline is 3. 'For this device' loosely reinforces that serial targets a device but adds no format or syntax detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (mock/abort routes configured for this device), clearly distinct from mock_add and mock_remove siblings. It cross-references the companion add tool rather than naming what it is not, so sibling differentiation is partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'currently configured for this device' establishes the scenario for calling it, and the pointer to android_traffic_mock_add implies the setup relationship. No explicit when-not-to-use or alternative-tool routing is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_traffic_mock_removeAndroid traffic mock removeADestructiveIdempotentInspect
Remove one mock/abort route by id, or every route on this device when all is true. Returns the resulting route list.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Route id to remove (from android_traffic_mock_add or android_traffic_mock_list) | |
| all | No | Remove every route configured for this device instead of a single one | |
| serial | Yes | Android device serial (adb serial) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=false, so the bar is lower. The description adds return behavior ('Returns the resulting route list') and the `all`-vs-`id` scope distinction, which is useful context beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single front-loaded sentence with zero waste: it covers the two removal modes and the return value. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers what the tool does, both removal modes, and the return value. With annotations carrying the destructive/idempotent profile and the schema documenting params, only the explicit when-to-use decision and any error/partial-failure behavior are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both `id` and `all` are already fully documented in the schema, including that `id` comes from add/list. The description only restates the same semantics, adding no new syntax or edge-case meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Remove one mock/abort route by `id`, or every route on this device when `all` is true.' Distinguishes from sibling android_traffic_mock_add/list by naming the operation and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage through the two mutually exclusive paths (single `id` vs `all`), but never explicitly says when to prefer `all` over `id` or when removal is necessary. The sibling add/list tools are referenced only in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_traffic_startAndroid traffic startAInspect
Start TLS inspection on an Android device: brings up a per-device TLS-inspecting proxy and points the device at it, so subsequent HTTPS traffic is DECRYPTED and captured (works for native apps too, unlike Chrome DevTools). If com.robotactions.dpc is Device Owner, the proxy AND CA are set SILENTLY (installMode "dpc", zero on-device interaction); otherwise it falls back to an adb global proxy (installMode "manual") and the app must already trust user certs. Then drive the app and read flows with android_traffic_flows. The app must trust user certificates (network_security_config, usually a debug build); certificate-pinned apps will not decrypt.
| Name | Required | Description | Default |
|---|---|---|---|
| serial | Yes | Android device serial (adb serial) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare this is a non-read-only, non-idempotent, non-destructive write, and the description adds substantial behavior beyond that: the two install modes (dpc vs manual), that the Device Owner path installs the proxy AND CA silently with zero on-device interaction, the fallback to an adb global proxy, and the cert-pinning limitation. This is unusually rich disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded in the first clause and every sentence carries information (mechanism, install modes, prerequisites, follow-up tool, limitation). It is dense and parenthesis-heavy with mode labels and path names, which is slightly taxing but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with no output schema, the description covers mechanism, both execution paths, prerequisites, the natural next tool, and the failure mode (pinned apps). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (serial) with 100% schema description coverage, so the schema already documents it fully. The description frames the operation as per-device but adds no format or syntax detail for the serial beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (start TLS inspection) and resource (Android device traffic) and describes the concrete mechanism: bringing up a per-device TLS-inspecting proxy and pointing the device at it. It explicitly distinguishes itself from Chrome DevTools and names the companion read tool android_traffic_flows, so an agent can place it against siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context (native app HTTPS capture, which DevTools cannot do), the prerequisite that the app must already trust user certificates, and the follow-up step (drive the app and read flows with android_traffic_flows). It also states the exclusion that certificate-pinned apps will not decrypt, which is exactly the kind of routing 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.
android_traffic_statusAndroid traffic statusARead-onlyIdempotentInspect
Report whether TLS inspection is running for an Android device, its proxy mode (dpc/manual), and how many flows are buffered.
| Name | Required | Description | Default |
|---|---|---|---|
| serial | Yes | Android device serial (adb serial) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds what fields are reported but says nothing about auth requirements, whether a stopped capture returns an error or an 'inactive' status, or other behavioral edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the reported fields are listed in priority order and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the return fields (TLS state, proxy mode, buffered flow count), which is the main thing an agent needs. Minor gap: it doesn't clarify what 'buffered' means or whether counts are cumulative, but for a simple status probe this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (serial) and schema description coverage is 100%, so the schema already documents it fully. The description adds no additional meaning about the serial argument, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Report') and enumerates exactly what is returned: TLS inspection state, proxy mode (dpc/manual), and buffered flow count. This clearly separates it from android_traffic_flows (lists flows) and android_traffic_start/stop (mutate capture state).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (check traffic capture status for a device), but there is no explicit when-to-use or when-not-to-use guidance, and no routing to sibling tools like android_traffic_flows when the agent actually wants the buffered flow contents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_traffic_stopAndroid traffic stopAInspect
Stop TLS inspection for an Android device from THIS (AI) consumer only. If the workspace UI (or another agent) also has capture open on the same device, the TLS-inspecting proxy and device proxy (and DPC CA) are left running for them — the response includes stillRunning: true in that case. Only when every consumer has stopped are the proxy killed, the device proxy/CA cleared, and buffered flows discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| serial | Yes | Android device serial (adb serial) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations, which only say readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description discloses consumer-scoped reference counting, the stillRunning: true response signal, and exactly what is destroyed when the last consumer stops (proxy killed, device proxy/CA cleared, buffered flows discarded).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and its scope, then the non-obvious conditional behavior. Dense but essentially waste-free; the final sentence is long yet each clause (killed proxy, cleared CA, discarded flows) carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description pre-emptively covers the key return signal (stillRunning: true). Given a single fully-documented parameter and the teardown semantics explained, nothing needed to invoke or interpret this call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'serial' parameter is fully documented as the adb serial. The description adds no format detail or constraints beyond 'for an Android device', so the schema does the work — baseline 3 is correct for a fully-specified single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Stop TLS inspection for an Android device') plus a precise scope qualifier ('from THIS (AI) consumer only'). An agent can distinguish it from android_traffic_start and ios_traffic_stop 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the condition under which stopping actually tears down proxies ('Only when every consumer has stopped') versus when resources are left running for other consumers. It does not name the counterpart tool (android_traffic_start) or state prerequisites, so it stops short of explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_video_streamAndroid video streamAInspect
Get a LIVE video-stream link for an Android device that a human can open in a browser to watch the screen in real time (unlike device_screenshot, which is one frame). Returns a short-lived, single-device viewer URL — open it directly. The server transcodes the device's live video stream to MJPEG on the fly. Use this to let a person supervise what the agent is doing on the device.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and idempotentHint=false, but give no sense of what actually happens. The description fills that gap: the URL is short-lived, single-device, browser-openable, and the server transcodes the live stream to MJPEG on the fly. It doesn't say whether repeated calls spawn multiple transcodes or how/whether a stream is stopped, which is the remaining unknown for a non-read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core capability, then the return-value shape, then the intended use. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains the return value (a short-lived viewer URL) and the required follow-up action (open it directly in a browser). The only gaps are operational details an agent might want, such as URL lifetime and whether the stream needs to be torn down, which is a minor omission rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) with 100% schema description coverage ('Device serial number (UDID)'), so the schema carries the meaning. The description adds only that the resulting URL is bound to a single device, not new syntax or format detail for udid. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Get) plus resource (LIVE video-stream link) and scope (Android device, single-device, real-time). It explicitly contrasts with device_screenshot ('one frame'), so the agent can distinguish it from the nearest sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case ('Use this to let a person supervise what the agent is doing on the device') and distinguishes the live-stream case from the one-frame screenshot case. It stops short of stating when-not to use it (e.g. for automated analysis, use device_screenshot/MJPEG instead) or any device prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_vnc_closeAndroid vnc closeAIdempotentInspect
The Android counterpart of ios_vnc_close_hid, accepted so one flow works on both platforms. Android live views hold nothing of their own: a viewer lasts while the user's device session does and while it stays connected, so there is nothing to release. Safe to call at any time.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by explaining WHY the idempotentHint/destructiveHint=false profile holds: Android live views own no state, the viewer's lifetime is tied to the device session and connection, so there is nothing to release. That is real behavioral context an agent cannot infer from readOnlyHint=false plus idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the cross-platform rationale, followed by the reason no cleanup occurs and the safety note. Nothing is padded, though "accepted so one flow works on both platforms" arguably restates the first clause's point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema, no-op tool whose annotations already declare the safety profile, the description supplies everything needed: what it is, why it exists, that it holds no resources, and that it is always safe to call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter, udid, and schema description coverage is 100%, so the schema already carries the semantics. The description adds no meaning about udid or about what identifier form is acceptable, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies this as the Android counterpart of ios_vnc_close_hid, a compatibility stub that closes an Android live view, which distinguishes it from every other android_* sibling. It is slightly indirect in that it explains the rationale (nothing to release) rather than stating the verb+resource in a leading clause, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Safe to call at any time" gives explicit permission to invoke unconditionally, which is exactly the guidance needed for a no-op compatibility tool. It does not mention the natural pairing with android_vnc_open or state any when-not condition, but for a harmless stub there is little more to exclude.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_vnc_openAndroid vnc openAInspect
Open a live, interactive view of an Android device for the USER -- they see the screen and can tap, swipe, scroll and type on it (right click is Back, middle click Home). Returns JSON {viewerUrl, viewerExpiresInSeconds, websocketUrl, width, height, expiresInSeconds}. GIVE THE USER viewerUrl (or open it in the IDE's built-in browser): a ready page that shows the device scaled to fit and takes their input. It self-authenticates for ~5 minutes from now (once opened, the page keeps working for 30 minutes and reconnects after a drop) and only for the user currently holding this device -- share with care. websocketUrl is the raw RFB-over-WebSocket stream (noVNC-compatible, subprotocol "binary", no VNC password) with its own short-lived ticket, for a client that brings its own viewer. width/height are the screen in device pixels (device_tap's coordinates); they swap when the device rotates. The view lasts as long as your device session; android_vnc_close is accepted but has nothing to release. To LOOK at the screen yourself, use android_vnc_snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only covering the safety profile (not read-only, not destructive, not idempotent), the description adds the operationally critical details: the page self-authenticates for ~5 minutes, keeps working for 30 minutes, reconnects after a drop, and is bound to 'the user currently holding this device -- share with care'. It also states the view's lifetime is the device session, which explains the non-idempotent/non-destructive hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the key delivery instruction, and nearly every clause carries real information. It is nevertheless dense for a one-parameter tool, with overlapping lifetime statements (5-minute auth, 30-minute page, session-length view) that could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description enumerates the returned JSON fields and explains what each is for (viewerUrl to hand to the user, websocketUrl as a raw RFB stream with subprotocol and no password, width/height as device pixels matching device_tap coordinates). Nothing an agent needs to call or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single udid parameter, so the schema already carries its meaning. The description's coordinate/lifetime notes concern the return payload rather than the input, so it adds nothing new about parameters; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open a live, interactive view of an Android device') and immediately scopes who it is for ('for the USER -- they see the screen and can tap, swipe, scroll and type'). It is clearly distinguishable from android_vnc_snapshot, which the description explicitly reserves for the agent looking at the screen itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: 'GIVE THE USER viewerUrl (or open it in the IDE's built-in browser)' for the interactive case, and 'To LOOK at the screen yourself, use android_vnc_snapshot' for the alternative. It even pre-empts a related tool's misuse by noting android_vnc_close 'has nothing to release'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_vnc_snapshotAndroid vnc snapshotARead-onlyIdempotentInspect
See the Android device's screen yourself: returns the current screen as an image, plus JSON {width, height, imageWidth, imageHeight}. It is the exact picture VNC viewers are sent, read from the device server's shared screen capture -- cheap enough to call after every action. width/height are the screen in device pixels (device_tap's coordinates); the image may be scaled down to imageWidth x imageHeight, so multiply image positions by width/imageWidth. Does not need android_vnc_open first.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior: the image is the exact frame VNC viewers receive, sourced from a shared capture (cheap, non-exclusive), and no VNC session must be open first. It does not mention cost limits or staleness, but adds substantive context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the return shape, then the coordinate-scaling caveat and the 'no VNC open needed' note. Every sentence carries information, though the em-dash/semicolon packing makes it slightly dense versus a cleaner multi-sentence form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned JSON keys (width, height, imageWidth, imageHeight) and the critical scaling rule (multiply image positions by width/imageWidth). Combined with the coordinate linkage to device_tap, an agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid), and schema coverage is 100% with its own description, so the schema carries the burden. The description does not elaborate on udid, instead spending its detail on the return payload's coordinate semantics — useful but not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('returns the current screen as an image') plus the exact JSON payload fields. It also distinguishes itself from VNC-viewer infrastructure by noting it reads the device server's shared screen capture, so an agent can tell it apart from android_mjpeg_screenshot or device_screenshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly says it is 'cheap enough to call after every action' and that it 'Does not need android_vnc_open first' — an explicit prerequisite removal. It stops short of naming alternative screenshot siblings (device_screenshot, android_mjpeg_screenshot, android_video_stream) and when those would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_deleteApp deleteADestructiveIdempotentInspect
Delete an uploaded app file from the server. Use app_list to get the file ID.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | File ID from app_list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered without description help. The description adds that the deletion targets the server-side uploaded artifact rather than an installed app, but says nothing about behavior on a missing/invalid ID or whether re-deletion is a no-op.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the action stated first and the prerequisite second. Nothing is padded or repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool whose annotations carry the safety semantics, the description is nearly sufficient. It could still note behavior for missing IDs or whether only uploaded (not installed) artifacts are affected, but nothing critical for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is already documented as "File ID from app_list". The description merely restates that provenance, adding no new syntax, format, or validation detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (an uploaded app file), scoped to the server. It is distinguishable from app_list/app_upload/app_install, though it does not explicitly contrast with the other delete-shaped siblings such as device_file_delete or device_uninstall_app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives a concrete prerequisite routing step ("Use app_list to get the file ID"), which is useful. However, it never says when this tool is the right choice or when a sibling delete is preferable, so usage is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_installApp installAInspect
Install an uploaded app on a device. For Android: installs APK via the Android transport. For iOS: installs IPA . Use app_list to get the file ID first.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID to install on | |
| appId | Yes | File ID from app_list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a non-read-only, non-idempotent, non-destructive operation, so the description carries less burden. The description adds platform-specific mechanics (APK/IPA installation methods), but it doesn't disclose prerequisites like device connectivity, potential side effects (e.g., overwriting existing app data), behavior on insufficient storage, or whether the install is silent or requires user interaction. This is a gap for a mutation tool 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences, front-loaded with the core action and platform nuances, and ends with a crucial prerequisite. Every sentence earns its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema and low annotation coverage, the description is adequate but incomplete. It covers the basic action and prerequisite but omits behavioral details like error conditions, side effects, and return information, which an agent would need to invoke it correctly in an automation flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (udid, appId) are already documented in the schema. The description adds a hint that appId comes from app_list, but that's also in the schema's parameter description. No additional syntax or format details are provided beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Install an uploaded app') and clarifies it works on a device, with platform-specific detail (APK via Android transport, IPA for iOS). It distinguishes itself from app_upload and app_list, though the cross-platform nature overlaps with ios_install_app, a sibling that is not mentioned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to 'Use app_list to get the file ID first', which provides a clear prerequisite and points to a sibling tool. However, it doesn't address when to use this multi-platform tool versus the platform-specific ios_install_app.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_listApp listBRead-onlyIdempotentInspect
List uploaded app files belonging to the current user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds the 'current user' scoping constraint, which is genuinely useful behavioral context beyond the annotations, but nothing more (no pagination, ordering, or return shape).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param read tool whose annotations and schema are fully covered, the description is minimally adequate. It does not state what is returned or whether results are paginated, and there is no output schema to fall back on, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to document; baseline for 0 params is 4. The 'current user' phrase appropriately clarifies the implicit scoping of the (absent) parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (uploaded app files) scoped to the current user. It is clear on its own, though it doesn't differentiate from siblings like app_upload, app_delete, or app_install that share the 'app' namespace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no alternatives named, no prerequisites. The agent must infer from the name alone that this is the read-listing counterpart to app_upload/app_delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_uploadApp uploadAInspect
Upload an app build (.apk/.ipa) to your App Library. Send the file in chunks: base64-encode at most 50MB of the file per call as fileData, with chunkIndex (0-based) and totalChunks; the build is registered when the last chunk arrives. A file up to 50MB may be sent in one call without chunkIndex/totalChunks. .ipa files are re-signed for your devices on the way in unless skipResign is true. Returns the id that app_install uses; an automated test session references the same build as its app capability "ra-app://".
| Name | Required | Description | Default |
|---|---|---|---|
| fileData | Yes | Base64-encoded file data — at most 50MB decoded per call | |
| fileName | Yes | File name (e.g. "myapp.apk" or "myapp.ipa") | |
| userEmail | No | User email for file ownership (defaults to the authenticated user) | |
| chunkIndex | No | Chunk index (0-based) for chunked uploads | |
| skipResign | No | Keep an .ipa exactly as uploaded (it is already signed for the target devices) | |
| totalChunks | No | Total number of chunks for chunked uploads |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: 50MB decoded-per-call cap, 0-based chunk ordering, that registration occurs only when the last chunk arrives, and that .ipa files are re-signed on the way in unless skipResign is true. Annotations only give safety hints; the description supplies the actual operational semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the chunking mechanics, the single-call shortcut, re-signing behavior, and return value in sequence. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex chunked-upload mutation with no output schema, the description fully specifies size limits, chunk protocol, re-signing, and what the return value is (the id used by app_install and referenced as 'ra-app://<id>'). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3 baseline applies, but the description adds inter-parameter logic the schema does not — how chunkIndex/totalChunks must be paired, and that a sub-50MB file needs neither. This exceeds what the individual field descriptions convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Upload an app build (.apk/.ipa) to your App Library' — and clearly distinguishes this from sibling install/list/delete operations. An agent immediately knows this is the ingest step that precedes app_install.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes the workflow relationship ('Returns the id that app_install uses') and explains the single-call vs. chunked condition, which tells the agent when to supply chunkIndex/totalChunks. No explicit exclusions or when-not-to-use guidance, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automation_build_linkAutomation build linkARead-onlyIdempotentInspect
Build a clickable link to a run's detail page. Present the result as a markdown link, e.g. "View this run". The path is relative and the chat routes it internally, so the user lands on the run without losing this conversation. Offer it after explaining a run so they can see the video, screenshots and full command list for themselves. This only formats a URL — it does not check that the run exists, so call automation_session_get first if you have not already.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | The run's session id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive behavior, so the safety profile is covered. The description still adds real context beyond that: it 'only formats a URL', does not verify the run exists, and the path is relative and routed internally by the chat. It doesn't discuss any failure modes of a malformed sessionId, but that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then usage, then the prerequisite caveat, which is a sound ordering. Four sentences plus a markdown example is slightly longer than this trivial formatting tool needs, but each sentence carries a distinct instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description appropriately supplies the return format ('Present the result as a markdown link', with a concrete example) and the routing behavior. Combined with the prerequisite check and the when-to-offer guidance, an agent has everything needed to call and present this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter with 100% schema description coverage ('The run's session id'), so the schema already carries the semantics. The description implies the sessionId identifies a run but adds no format, sourcing, or validation detail beyond the schema, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Build a clickable link to a run's detail page') and immediately contrasts it with the sibling that fetches run data ('call automation_session_get first'), so an agent can tell it apart from automation_report or insights_build_link without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to offer it ('after explaining a run so they can see the video, screenshots and full command list') and names the prerequisite/alternative path (call automation_session_get first if the run hasn't been fetched). Nothing about when-to-use 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.
automation_reportAutomation reportRead-onlyIdempotentInspect
Pre-aggregated automation statistics over a date range: pass/fail/active counts, pass rate, per-platform and per-device breakdowns, the most-failed commands and the slowest ones. USE THIS FOR ANY CHART OR TOTAL — the counts are computed server-side over the full period, so they are correct where tallying automation_sessions_list rows would silently only cover the recent window. The breakdowns map directly onto a pie or bar chart (ra-chart). failureCategories breaks the window's failed runs down by the same failureCategory values automation_session_get returns (app_bug / test_script / environment_device / timing / unknown), plus unanalyzed for failed runs nobody has read with automation_session_get yet — this tool never computes new analysis, only tallies what is already cached. Omit the dates for the default period. When charting a time-relative request (today, last 7 days), put the same dates you passed here in the chart's source.params and add source.relative (e.g. {startDate:'-6d',endDate:'today'}) so a pinned widget keeps moving.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | ISO date (YYYY-MM-DD, zero-padded) — end of the window, inclusive. | |
| platform | No | Restrict to one platform, e.g. "android" or "ios". | |
| startDate | No | ISO date (YYYY-MM-DD, zero-padded) — start of the window, inclusive. | |
| testSuite | No | Restrict to one suite. |
automation_session_commandsAutomation session commandsARead-onlyIdempotentInspect
Read the step-by-step command history of a run — every action it performed, in order, with duration and pass/fail per step. THIS IS THE DEBUGGING TOOL: to explain why a run failed, fetch it with failuresOnly=true to land directly on the failing step, then read the steps immediately before it for context. When a failed run has NO failed command — an assertion failure, where every WebDriver call succeeded and the test reported the verdict itself — failuresOnly returns no steps and a whyNoFailedSteps block naming what the run reported and which step carried it, so an empty list is never mistaken for "nothing went wrong" and you do not need to re-fetch the whole history to find out. Each entry carries the error message when the step failed, and every element-scoped step (click, sendKeys, getText…) carries the locator that found its element plus the index of the find it came from — so a click at step 24 reads as the button it clicked, not an opaque id. On a run that is still going this returns the steps completed so far, so it is also how you answer "where has it got to?". For browser runs, follow up with session_console_logs / session_network_logs using the SAME session id to see whether a JS error or a failed request explains it. Output is summarised and capped, so ask for a filtered view rather than everything — when a step needs explaining, take its index to automation_session_step for the request/response bodies and the locator behind an element id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max steps to return (default 200, which is also the ceiling). Returns the LAST n steps, not the first — a run that fell over did so at the end. On a long run that means the window can exclude the very failure `firstFailureIndex` points at, so use failuresOnly=true to land on it instead of raising this. | |
| sessionId | Yes | The run's session id. | |
| failuresOnly | No | Return only steps that failed. Use this FIRST when debugging — it is usually one or two rows out of hundreds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds substantial behavior beyond that: output is summarised and capped, limit returns the LAST n steps, failuresOnly can produce an empty list paired with a whyNoFailedSteps block on assertion failures, and each returned step carries error messages and locator provenance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core verb and resource, then immediately identifies the tool as the debugging entry point. Despite being lengthy, each sentence carries actionable information about failure handling, step content, ongoing runs, follow-up tools, and output capping.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully explains the return shape: ordered steps with duration and pass/fail, error messages on failed steps, locator/index data on element-scoped steps, empty-list semantics via whyNoFailedSteps, and partial results for ongoing runs. It also names the correct follow-up tool for per-step request/response details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains limit behavior, failuresOnly usage, and sessionId. The description reinforces the debugging use of failuresOnly and the filtered-view preference, but does not add parameter syntax or constraints beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 step-by-step command history of a run' with duration and pass/fail per step. It distinguishes itself from siblings by positioning itself as 'THE DEBUGGING TOOL' and pointing to automation_session_step, session_console_logs, and session_network_logs for follow-up.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('to explain why a run failed'), alternatives ('use failuresOnly=true to land directly on the failing step'), and when-to-follow-up with sibling tools using the SAME session id. It also covers the ongoing-run case ('where has it got to?') and warns against re-fetching everything.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automation_session_feedbackAutomation session feedbackAInspect
Record a verdict on one automatically-computed failure analysis: confirm it was right, or correct the category it picked. Call automation_session_get first — this only works on a run whose failureAnalysis.source is "recorded" (an older, lazily-analysed run has nothing to give feedback on yet). failureKey picks which failure on the run when there is more than one (from failureAnalysis.failures[].failureKey); omit it on a run with exactly one. Set verdict to "correct" to confirm the latest analysis, or "incorrect" plus correctedCategory to override it. Feedback is APPEND-ONLY — nothing is ever deleted or edited — and the most recent entry becomes the effectiveVerdict the next automation_session_get / automation_report reads return. Only your own runs can be given feedback on, same ownership rule as every other automation_* tool: a foreign session reads as not found.
| Name | Required | Description | Default |
|---|---|---|---|
| comment | No | Optional free-text note explaining the correction. | |
| verdict | Yes | Whether the latest analysis got the category right. | |
| sessionId | Yes | The run's session id. | |
| failureKey | No | Which failure on this run — from `failureAnalysis.failures[].failureKey`. Omit when the run has exactly one failure (the common case today). | |
| correctedCategory | No | Required when verdict is "incorrect" — the category it should have been. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false); the description adds substantial context beyond that: append-only semantics with no edit/delete, that the latest entry becomes the effectiveVerdict read back by other tools, and the ownership constraint where a foreign session reads as not found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then prerequisites, then parameter selection, then behavioral consequences. Dense but nearly every sentence carries unique, non-redundant information; slight length and backtick-heavy references keep it from a clean 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param mutation tool with no output schema, it covers the full call path: prerequisite read, precondition on failureAnalysis.source, parameter selection per case, consequences (effectiveVerdict), and the ownership/permission boundary. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds relational meaning: failureKey's source path and omission rule for single-failure runs, the correct/incorrect dichotomy, and the conditional requirement of correctedCategory when verdict is incorrect. It reinforces rather than merely repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Record a verdict on one automatically-computed failure analysis'. It explicitly distinguishes its scope from the sibling read tools by stating it publishes feedback that automation_session_get / automation_report subsequently return, so an agent can tell it apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Call automation_session_get first — this only works on a run whose failureAnalysis.source is "recorded"'), explains the when-not case (lazily-analysed runs have nothing to give feedback on), and routes per-field usage (failureKey multiplicity, verdict=correct vs incorrect+correctedCategory).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automation_session_getAutomation session getARead-onlyIdempotentInspect
Read one finished automation run: its verdict, the test it belonged to, the device/browser it ran on, its full desired capabilities, how long it took, and whether a video or failure snapshot exists. START HERE when the user pastes a session id or an /automation?session_id=... link and asks what happened, why it failed, or how it went. Returns verdict together with confidence: "reported" means the test itself declared the outcome and is authoritative; "inferred" means the run reported nothing and the platform guessed from how it ended — accurate most of the time but NOT a fact, so say so rather than stating it flatly. stillRunning: true means the run has not finished yet — report it as in progress, never as "no result". On a FAILED run this also returns failureAnalysis, whose shape depends on failureAnalysis.source: "recorded" (the common case — this run was already analysed automatically in the background) carries failures, one entry per failure on this run (today always one), each with failureCategory (app_bug / test_script / environment_device / timing / unknown), confidence, reasons, aiComment, target (the element this failure's lookup was searching for — value/strategy/locator plus source: "failed_command" when a WebDriver call itself failed on it, "last_find" when the test reported the failure itself and this is the last element lookup beforehand — and stepIndex naming which command; null when there was nothing to resolve), the initialVersion and latestVersion this analysis has gone through, any human/agent feedback left on it, and the effectiveVerdict — trust effectiveVerdict over failureCategory when they differ, since it already accounts for feedback. reanalysisPending: true alongside failureAnalysis means a background refresh was just triggered (a newer rule set landed since this was last analysed, or nothing was analysed yet) — the fields returned now are the best answer available immediately; re-read in about 30 seconds for the refreshed one. analysisUnavailable: {reason} instead means this run cannot be analysed at all right now (its data aged out of the grid, or was never retained) — do not re-read expecting a change; say plainly that no analysis exists for this run and why. "lazy" (an older run the background analysis never reached) carries the flatter pre-recorded shape instead: failureCategory/confidence/reasons directly, plus flakiness facts (pass rate over this test's recent runs, whether it is flaky vs a clean regression, whether it only fails on this device) and, on an element-lookup failure with a failure-time screen snapshot, screenAtFailure describing what the screen looked like when the lookup gave up. Either way this is rule-based, not a guarantee — read the reasons before repeating the category as fact, and use automation_session_feedback to correct one that is wrong. Only your own runs are readable; another user's session is indistinguishable from one that does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | The run's session id — the `session_id` value from an /automation?session_id=... link, or the id shown on the run. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a safe read operation; the description goes far beyond by explaining verdict/confidence semantics ("reported" vs "inferred"), stillRunning handling, the three failureAnalysis shapes (recorded/lazy/unavailable), reanalysisPending timing, and how source/effectiveVerdict should be interpreted. This is exactly the context an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the activation trigger are correctly front-loaded, but the body is one very dense multi-clause paragraph with no formatting, making the nested failureAnalysis variants hard to scan. Most sentences carry real information, so it is not padding, but the structure works against readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of describing return shape, and it does so thoroughly for every branch (recorded/lazy/unavailable analyses, stillRunning, reanalysisPending). Nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter at 100% schema coverage, so the schema already documents sessionId and its origin (the /automation?session_id= link). The description adds no syntax, format, or validation detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Read) and resource (one finished automation run), immediately enumerating what is returned: verdict, test, device/browser, capabilities, duration, video/snapshot presence. This distinguishes it cleanly from automation_sessions_list (plurals) and automation_session_step/commands (drill-downs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ("START HERE when the user pastes a session id or an /automation?session_id=... link and asks what happened, why it failed, or how it went") and routes the agent to automation_session_feedback when a category is wrong. It also states the access boundary (only your own runs are readable).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automation_sessions_listAutomation sessions listRead-onlyIdempotentInspect
Find and list your automation runs — use for "how did my tests go", "what failed recently", "show me the runs for suite X", or to locate a run when the user describes it instead of giving an id. Every filter is applied by the SERVER across your whole history, so a suite or a session id from weeks ago is found just as reliably as one from today. total is the true number of matching runs; runs is one page of them, so page with offset rather than assuming the first page is everything. Pass search to hunt for a session id — the short 8-character form shown in the UI and the full id both work. For pass rates and aggregate breakdowns use automation_report instead of tallying these rows. TRIAGE: each FAILED row also carries its already-computed failure analysis — failureKey (the failure signature: runs failing the same way share it), category with categoryConfidence (app_bug / test_script / environment_device / timing / unknown, feedback-aware), flaky (the test passes and fails intermittently), and errorText (first ~200 chars). A failed row with none of these carries analysis: "unanalyzed" instead. To triage a suite or a day, call this once with failedOnly, GROUP the rows by failureKey, and report one line per group (count, category, flaky, errorText, example sessionId). Call automation_session_get only to drill into one group's representative run, never once per failed row. Page with offset if hasMore.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max runs per page (default 50, which is also the ceiling). | |
| offset | No | Skip this many matching runs — page through with `total` to know when to stop. | |
| search | No | Free text matched against session id, test name and suite. Use this for a pasted session id; the truncated form shown in the UI matches too. | |
| endDate | No | ISO date (YYYY-MM-DD, zero-padded) — latest run to include. | |
| platform | No | Only runs on this platform, e.g. "android", "ios", "linux". | |
| startDate | No | ISO date (YYYY-MM-DD, zero-padded) — earliest run to include. | |
| testSuite | No | Only runs from this suite (exact match). | |
| deviceUdid | No | Only runs on this device (exact udid match). | |
| failedOnly | No | Only runs that failed — reported failures AND inferred ones, matching the verdict this tool reports. |
automation_session_stepAutomation session stepARead-onlyIdempotentInspect
Open ONE step of a run in full: its request body, its response body, status, timing, and — for element-scoped steps — the locator that actually found the element. Use automation_session_commands first to get the step index, then come here for the step that matters. THIS IS HOW YOU ANSWER "which element?": a click/sendKeys/getText step addresses its element by an opaque id in the URL and arrives with an empty body, so the step alone never names what it touched; this resolves that id back to the findElement that produced it and returns the using/value locator. networkDuring lists the page requests that overlapped the step, so a click that failed while an XHR was in flight is visible as such — browser runs only, and it says so explicitly when the run captured no network traffic rather than returning an empty list that reads as "nothing happened".
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Which step, as the `index` reported by automation_session_commands. Indexes are positions in the FULL history, so they stay valid regardless of any window that tool applied. | |
| sessionId | Yes | The run's session id. | |
| includeNetwork | No | Correlate page network traffic to this step (default true). Set false to skip the extra lookup. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only, idempotent profile, and the description layers on genuinely new behavioral facts: element-scoped steps arrive with an empty body and an opaque id that this tool resolves back to the findElement locator, and networkDuring explicitly reports when no traffic was captured rather than returning a misleading empty list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and dense with useful detail, but the em-dash-heavy sentences run long and the element-resolution explanation could be tightened. Every sentence does earn its place, so it stops short of waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so thoroughly: bodies, status, timing, resolved locator, and correlated network requests. An agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (sessionId, index, includeNetwork) are already documented in the schema, including the index semantics and the default-true network flag. The description adds only marginal semantics, mainly the browser-only scope of network correlation, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open ONE step of a run') and enumerates exactly what is returned: request body, response body, status, timing, and the resolved locator. It is immediately distinguishable from automation_session_commands, which it names as the source of the index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the workflow: 'Use automation_session_commands first to get the step index, then come here for the step that matters.' It also states when the tool is the right answer ('which element?') and scopes the network behavior to browser runs only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
azdo_create_work_itemAzure DevOps create work itemAInspect
Create a new AzDO work item. Returns the new id + browse URL. ALWAYS confirm with the user before calling — this is a mutating operation. Defaults workItemType to 'Task'. The 'project' arg is the AzDO project name (often the same as the URL segment after the org). description is plain text and gets wrapped in basic tags for AzDO's HTML field.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional tags. AzDO stores as semicolon-separated string internally. | |
| title | Yes | Short work item title. Keep under 255 chars. | |
| project | Yes | AzDO project name (e.g. 'MyApp', 'Digital Platform'). Case-sensitive. Use the same value visible in the AzDO URL after the org segment. | |
| description | No | Work item body. Plain text — newlines become paragraph breaks in AzDO. | |
| workItemType | No | Work item type (e.g. "Bug", "Task", "User Story", "Epic"). Defaults to "Task". Must match a type available in the target project (depends on the AzDO process template). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior: it returns the new id and browse URL, defaults workItemType, and states that plain text gets wrapped in <p> tags. This is useful context beyond the structured fields, though it doesn't discuss failure modes or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each earning its place, with the core action and the confirm-before-calling constraint front-loaded. No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating the return value (new id + browse URL). Combined with the 100%-covered input schema and safety annotations, an agent has enough to invoke correctly; minor gaps remain (no mention of permission scope or tag behavior beyond schema).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description's notes on the 'project' arg and on 'description' being plain text largely echo the schema, though the plain-text-to-HTML wrapping detail adds marginal value. Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new AzDO work item') and distinguishes itself from siblings azdo_get_work_item and azdo_search_work_items by being the creation path. An agent can tell what it does immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit, non-optional usage rule ('ALWAYS confirm with the user before calling — this is a mutating operation'), which is strong guidance. It does not name an alternative tool or describe when to prefer creating vs. updating/searching, but the confirmation precondition is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
azdo_get_work_itemAzure DevOps get work itemRead-onlyIdempotentInspect
Fetch a single Azure DevOps work item by integer ID. Returns id, browse URL, title, description (HTML stripped to plain text), work item type, state, priority, assignee, creator, tags, area path, iteration path, timestamps, acceptanceCriteria (plain text), steps (Test Case items: [{action, expected}] with shared steps expanded and @params filled from the first data row), and links (URLs from description anchors and Hyperlink relations, deduped; each has a kind — "figma" marks a design mockup). TIP: links with kind 'figma' are design mockups — open them with figma_frame_image / figma_frame_spec to check the build against the design. Uses the calling user's stored AzDO credential — does not accept inline credentials. Returns an actionable error if AzDO is not configured.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | AzDO work item ID (e.g. 12345). Positive integer. |
azdo_search_work_itemsAzure DevOps search work itemsARead-onlyIdempotentInspect
Search AzDO work items with WIQL (Work Item Query Language — AzDO's equivalent of Jira's JQL). Returns up to 50 matching work items with the same projection as azdo_get_work_item (minus links — URLs stay inline in the description; call azdo_get_work_item for the structured list). WIQL examples: SELECT [System.Id] FROM WorkItems WHERE [System.State] = 'Active' AND [System.AssignedTo] = @Me, SELECT [System.Id] FROM WorkItems WHERE [System.WorkItemType] = 'Bug' AND [System.CreatedDate] >= @Today - 7. The SELECT clause is required but only the IDs are honored — the tool batch-fetches full fields.
| Name | Required | Description | Default |
|---|---|---|---|
| wiql | Yes | WIQL query string. See https://learn.microsoft.com/azure/devops/boards/queries/wiql-syntax | |
| maxResults | No | Max work items to return (default 20, hard cap 50). Narrow WIQL for wider sweeps. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), but the description adds real context: a 50-item cap, the return projection matching azdo_get_work_item minus links, and the non-obvious quirk that the SELECT clause is ignored except for IDs because the tool batch-fetches full fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return behavior, then syntax examples – a sensible order. The parenthetical asides are slightly dense but each sentence conveys distinct, useful information rather than restating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the return shape (up to 50 items, projection minus links). It covers the essentials for correct invocation; only pagination/auth details are left implicit, which the openWorld annotation partly signals.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds value by giving two concrete WIQL examples and clarifying that only the SELECT IDs are honored regardless of what fields are projected. This meaningfully augments the wiql parameter beyond its schema entry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (AzDO work items) plus the mechanism (WIQL), and anchors it against a familiar equivalent ('AzDO's equivalent of Jira's JQL'). It also implicitly distinguishes itself from azdo_get_work_item and azdo_create_work_item by naming the former for the structured link list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent to azdo_get_work_item when the structured links list is needed, and the schema reinforces narrowing WIQL for wider sweeps. It gives clear context for use but offers no exclusions (e.g., when to prefer jira_search or a non-WIQL path).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_app_apk_pathsDevice app APK pathsARead-onlyIdempotentInspect
List APK file paths for an installed app via pm path. Returns base APK plus any split APKs (config splits, dynamic feature modules). Each entry includes path and sizeBytes — use device_file_pull on individual paths to fetch the bytes (default 5MB cap, raise via maxSizeBytes up to 20MB). Returns { ok, packageName, apks: [{ path, sizeBytes, role: 'base'|'split' }] }.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| packageName | Yes | Android package name (e.g. com.android.chrome) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, destructiveHint=false. The description adds useful behavioral context beyond the annotations: it discloses the output shape ({ ok, packageName, apks: [{ path, sizeBytes, role }] }) and the downstream constraints (5MB default pull cap, 20MB max). It does not mention authentication or permission requirements, but for a read-only path listing that's minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and mechanism, then behavior details, then return shape. No waste; every sentence adds distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 compensates by fully specifying the return object. It covers the action, the split-APK nuance, downstream usage with device_file_pull, and size limits. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (udid, packageName) have descriptions in the schema. The description mentions packageName implicitly through 'an installed app' but adds no additional semantics beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List), a specific resource (APK file paths for an installed app), and notes the mechanism (`pm path`). The description also notes it returns base + split APKs, which clearly distinguishes it from device_list_apps (lists installed apps) and device_file_list (lists directory contents).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent what to do with the results: "use device_file_pull on individual paths to fetch the bytes (default 5MB cap, raise via maxSizeBytes up to 20MB)". It names the alternative for a subsequent step but doesn't explicitly state when this tool should NOT be used (e.g., when you only want metadata vs. bytes). Clear context, no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_batteryDevice batteryARead-onlyIdempotentInspect
Get battery status of an Android device (level, charging state, temperature).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds value by enumerating the returned data (level, charging state, temperature), which is meaningful behavioral context given no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly written sentence, front-loaded with the verb and scope, with the parenthetical detail placed where it does not obstruct comprehension. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with a full annotation set, this is nearly complete; the only gap is the absence of guidance about refresh/polling behavior, which is minor and not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single udid parameter is fully documented in the schema, so the baseline is 3. The description does not mention the udid requirement or add any format detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get battery status') and scopes it to an Android device, which distinguishes it from the sibling ios_battery tool without opening either schema. It also names the returned fields (level, charging state, temperature), so the agent knows exactly what it retrieves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no prerequisites are stated. For a self-evident read-only status tool this is acceptable, but an agent gets no routing hint beyond the platform word 'Android'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_clear_app_dataDevice clear app dataADestructiveIdempotentInspect
Clear all data and cache for an app on an Android device. Equivalent to "Clear Storage" in Settings.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| packageName | Yes | Package name to clear (e.g. com.example.app) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose the key behavioral traits: destructiveHint=true, idempotentHint=true, readOnlyHint=false. The description reinforces which artifacts are destroyed (data + cache) but adds no auth requirements, running-state constraints, or irreversibility note beyond what annotations declare.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, purpose front-loaded before the clarifying analogy. Nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param destructive tool with full annotation coverage and no output schema, the definition covers what it does and what it wipes, and idempotency/destructiveness come from annotations. Only minor gaps remain (device/app state prerequisites), which is why it falls just short of a 5 rather than failing completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are self-documented (UDID serial, package name with example). The description only confirms the target app, adding no new parameter semantics, so this sits at the baseline rather than above it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Clear all data and cache for an app on an Android device.' The Settings equivalence ('Clear Storage') anchors the meaning precisely. It is clearly distinguishable from siblings like device_terminate_app, device_uninstall_app, and device_clear_app_locale.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Settings analogy implies when to use it, but the description never states prerequisites (app should be installed/not running) nor routes the agent among close siblings such as device_terminate_app (stops process), device_uninstall_app (removes app), and device_clear_app_locale (narrower reset). Usage is inferable, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_clear_app_localeDevice clear app localeADestructiveIdempotentInspect
Drop the per-app locale override on an Android app so it falls back to the device system language. Counterpart to device_launch_app_in_language. Requires Android 13+.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| packageName | Yes | App package name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds value beyond them with a real precondition ('Requires Android 13+') and the post-condition (fallback to system language), though it does not state whether the app must be relaunched for the change to take effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler: effect first, then the sibling relationship, then the platform requirement. Every sentence carries information an agent needs and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema tool with rich annotations, the definition covers the effect, the alternative, and the OS floor. The one missing piece is whether the locale change takes effect immediately or only after relaunching the app.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid and packageName are already fully documented in the schema. The description says 'an Android app' without adding format or constraint detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('drop') and resource ('per-app locale override') plus the resulting state ('falls back to the device system language'), which makes the outcome unambiguous. It also names the counterpart tool, device_launch_app_in_language, so an agent can separate it from device_set_device_language and other locale siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Naming device_launch_app_in_language as the counterpart gives a clear implied usage pattern: this is the undo/reset path after a per-app language was applied. It gives clear context but stops short of explicit when-not conditions (e.g. use device_set_device_language to change the whole device locale).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_clear_locationDevice clear locationADestructiveIdempotentInspect
Stop mock GPS on an Android device. Counterpart to device_set_location — the helper service stops pushing mocked fixes and apps fall back to the real GPS / network provider.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, openWorldHint=false, so the state-change profile is known. The description adds genuine context beyond that: the helper service stops pushing mocked fixes and apps fall back to the real GPS/network provider, explaining the observable consequence. It does not cover failure modes (no active mock, unknown UDID).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the core action front-loaded and the sibling reference placed where a routing agent will see it immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, annotation-rich tool with no output schema, the description supplies purpose, effect, and the sibling relationship. Only edge-case behavior (calling when no mock is active, error response) is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) and schema description coverage is 100%, so the schema fully documents it. The description adds no syntax or format detail beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Stop) plus resource (mock GPS) and scope (Android device), then explicitly names its counterpart device_set_location. An agent can distinguish it from device_set_location, device_get_location, and device_clear_app_data 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The counterpart framing to device_set_location clearly implies when to call it (after location mocking is no longer needed), and it implicitly routes the agent to device_set_location for the inverse action. No explicit when-not-to-use or prerequisite (e.g., mock must be active) is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_clear_textDevice clear textADestructiveIdempotentInspect
Clear the focused text field on Android by removing its characters: reads the current text length from the UI and sends exactly that many DELETE (backspace) keycodes, after moving the cursor to the end. Tap the field to focus it first. To clear and re-type in one call, use device_type with clearFirst:true instead.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false. The description adds genuine context beyond those flags: the cursor is moved to the end, exactly N backspaces are sent based on the current text length, and the field must already be focused. It stops short of noting edge cases such as an empty field or non-text focused elements, so it is helpful but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, action and mechanism front-loaded, followed by the prerequisite and the alternative. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-readOnly mutation with no output schema, the description covers mechanism, prerequisite, and the preferred alternative path. It omits only minor edge behavior (e.g., clearing an already-empty field, non-text targets), which keeps it just short of fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (udid) with 100% schema description coverage, so the schema carries the meaning and the description adds nothing about parameters. This matches the baseline 3 for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Clear the focused text field on Android') and even explains the mechanism (reads text length, sends that many DELETE keycodes). It is impossible to confuse with device_type, which is named and distinguished explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the precondition ('Tap the field to focus it first') and routes to the alternative for the related case ('To clear and re-type in one call, use device_type with clearFirst:true instead'). Both the when and the when-not are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_clipboard_getDevice clipboard getARead-onlyIdempotentInspect
Read the current clipboard content from an Android device. Reliable on Android 12 and earlier. On Android 13+, both this path and the legacy cmd clipboard get path are blocked by the OS (the device-side control process runs as shell, which lacks foreground/READ_CLIPBOARD_IN_BACKGROUND), so this returns an empty-clipboard sentinel rather than the cleartext "No shell command implementation." error. To round-trip text on 13+, set the clipboard via device_clipboard_set and paste it directly — do not rely on reading it back.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, but the description adds critical behavior beyond them: on Android 13+ the OS blocks this path, so it returns an empty-clipboard sentinel rather than throwing 'No shell command implementation.' This is exactly the kind of failure-mode disclosure an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by the platform constraint and the workaround. The sentences are dense but each carries information; minor verbosity in the 13+ explanation keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read tool with no output schema, the description supplies the return behavior (empty sentinel vs error) and the platform caveat, so nothing an agent needs to call and interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single udid parameter, so the schema already carries parameter meaning. The description adds no syntax or format detail beyond it, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (clipboard content) scoped to an Android device, and implicitly contrasts with the sibling device_clipboard_set. An agent can distinguish it from other device_* tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when the tool works (Android 12 and earlier) and when it does not (Android 13+), and names the alternative (set via device_clipboard_set and paste directly). Both the condition and the recommended workaround are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_clipboard_setDevice clipboard setAIdempotentInspect
Set the Android device clipboard via the device control channel. Pass paste: true to have the device inject KEYCODE_PASTE immediately after (built into the device control protocol — no separate Ctrl+V needed). Empty string clears the clipboard.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| paste | No | If true, the device injects KEYCODE_PASTE right after setting the clipboard | |
| content | Yes | Text to write to the clipboard (empty string clears it) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (idempotent, non-destructive, not read-only), and the description adds genuine behavioral context beyond them: the paste injection is built into the device control protocol rather than requiring a separate Ctrl+V, and an empty string clears the clipboard. It stops short of noting auth, device-state, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the paste side effect, then the clearing edge case. Zero filler and no repetition of schema content beyond what reinforces behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter setter with no output schema, the description covers the action, the notable side effect, and the edge case, which is nearly everything an agent needs. It could still mention required device state (unlocked/focused target for paste) to be fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics the schema doesn't: paste triggers KEYCODE_PASTE 'immediately after' the set, and that this happens inside the control protocol. The empty-string-clears behavior duplicates the schema's content description but confirms the edge case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the Android device clipboard') along with the transport ('device control channel'), so the operation is unambiguous. It doesn't explicitly contrast itself with the obvious counterpart device_clipboard_get or the iOS ios_clipboard_set_hid, but the Android-specific scope is clear enough to disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent learns that paste:true triggers an immediate KEYCODE_PASTE, which suggests the tool is for clipboard-then-paste workflows. There is no explicit when-to-use vs. alternatives guidance, no mention of prerequisites (device unlocked, focused field), and no pointer to device_clipboard_get for the read counterpart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_current_appDevice current appBRead-onlyIdempotentInspect
Get the currently active (foreground) app on an Android device. Returns package name and activity.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered. The description adds the return payload (package name and activity), which is useful given no output schema, but says nothing about failure modes on a non-Android or disconnected device.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action first, return value second. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with full annotation coverage, the description delivers purpose and return shape. The only minor omission is error behavior if the device is unavailable, which is marginal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage, so the schema already documents udid as the device serial. The description adds nothing about the parameter, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the currently active (foreground) app') and scopes it to an Android device, which implicitly separates it from the iOS sibling ios_active_app. It stops short of explicitly naming that sibling, so it is clear but not fully differentiated in text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to prefer this over alternatives such as device_list_apps, device_page_source, or ios_active_app. The Android qualifier is the only routing signal, and it is left for the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_dismiss_recent_appDevice dismiss recent appADestructiveInspect
Open the Recents screen and dismiss an app card. Optionally tap "Close all". Useful for clearing background apps or verifying an app was killed. Sends keycode 187 (APP_SWITCH) shell (policy-gated), waits for the UI to settle, then locates and swipes away the target card. Returns { success, action, ... }.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Tap "Close all" / "Clear all" button instead of swiping a single card | |
| udid | Yes | Device serial number (UDID) | |
| packageName | No | Package name of the app card to dismiss (e.g. com.android.chrome). If omitted, dismisses the first/frontmost card. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, but the description adds real value beyond them: keycode 187 (APP_SWITCH) dispatch, a policy-gated shell, a UI settle wait, and the swipe-away sequence. It also sketches the return shape, which no output schema provides. It does not say what happens if the target card is absent, a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core action before the mechanism and return value. The trailing "Returns { success, action, ... }" is slightly truncated but earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no output schema, the description covers the action, the gating constraint, the internal sequence, and a return hint. It is nearly complete; only the not-found/no-target behavior and any permission prerequisites are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid, all, and packageName are already documented in the schema. The description only echoes the "Close all" behavior of `all` and adds no syntax or format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ("Open the Recents screen and dismiss an app card") and even names the mechanism, so an agent can tell what it does. It stops short of explicitly distinguishing itself from close siblings like device_terminate_app or device_clear_app_data, which also clear apps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Useful for clearing background apps or verifying an app was killed" implies intent but never states when to pick this over device_terminate_app or device_clear_app_data. There are no exclusions or explicit alternative routing, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_drag_dropDevice drag dropAInspect
Drag-and-drop on an Android device: hold at (x1,y1) for holdMs to grab, then move to (x2,y2) over durationMs. Distinct from device_swipe (no hold — scroll-style) and device_long_press (no motion — context menus). Use for app-icon reorder, drag-into-folder, slide gestures that need a deliberate grab. Coordinates are PHYSICAL pixels (from page_source bounds).Pass input="hid" to require the virtual touchscreen: the gesture then reaches the app as real kernel input and fails loudly instead of silently falling back to injected input. That strict path used to be device_uhid_drag_drop, which stays callable under its old name.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start X in physical pixels | |
| x2 | Yes | End X in physical pixels | |
| y1 | Yes | Start Y in physical pixels | |
| y2 | Yes | End Y in physical pixels | |
| udid | Yes | Device serial number (UDID) | |
| input | No | Input path. 'auto' (default) prefers the virtual touchscreen and falls back to injected input. 'hid' requires the virtual touchscreen and fails if the device does not provide one — use it when the gesture must be real kernel input or must fail loudly. | |
| holdMs | No | Hold-in-place duration before motion in ms (default: 500) | |
| durationMs | No | Motion duration from start to end in ms (default: 400) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, destructive=false, idempotent=false), the description discloses coordinate semantics (physical pixels from page_source bounds), the input path behavior (auto prefers virtual touchscreen and falls back vs hid requiring it and failing loudly), and the renamed-ancestor history. This is operational detail the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with the core gesture and routing first, then caveats. It is slightly dense, and the coordinate-pixel point plus the device_uhid_drag_drop historical note are tangential to invocation, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no output-return explanation is needed, and the description covers coordinate system, timing parameters, alternative tools, and the input-path contract. An agent has everything required to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds conceptual meaning: holdMs is described as the 'grab' dwell and durationMs as the motion span, and the input enum is framed as a strict-vs-fallback contract. This goes modestly beyond the schema's terse per-field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Drag-and-drop on an Android device') and gives the exact gesture mechanics (hold at x1,y1 for holdMs, move to x2,y2 over durationMs). It explicitly distinguishes itself from device_swipe and device_long_press, so an agent can select it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states both when to use it ('app-icon reorder, drag-into-folder, slide gestures that need a deliberate grab') and when not to, naming the two nearest alternatives with the distinguishing condition (swipe = no hold, long_press = no motion). Routing guidance is explicit and complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_elements_in_regionDevice elements in regionARead-onlyIdempotentInspect
List addressable UI elements (resource-id, text, or content-desc present) whose bounding box intersects the given physical-pixel rectangle. Returns each element with its attributes, bounds, center coords, and ranked locator strategies. Sorted smallest-first so the most specific element comes back first. Use to enumerate the contents of a region (bottom nav, dialog, list section) without parsing the full XML.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Left edge of region (physical pixels) | |
| x2 | Yes | Right edge of region (physical pixels) | |
| y1 | Yes | Top edge of region (physical pixels) | |
| y2 | Yes | Bottom edge of region (physical pixels) | |
| udid | Yes | Device serial number (UDID) | |
| limit | No | Cap on number of returned elements (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, and non-open-world behavior. The description adds substantial context beyond that: what counts as addressable, that bounding boxes must intersect the rectangle, the returned fields (attributes, bounds, center coords, ranked locator strategies), and the smallest-first sort order.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with no wasted words. The core operation and scope are front-loaded, followed by return shape, sort order, and intended use, which is an efficient structure for an agent deciding whether to call it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, matching semantics, return fields, sort behavior, and typical use cases. With no output schema, it still explains what comes back well enough, and annotations cover the safety profile, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, making the baseline 3. The description adds meaningful semantics beyond the schema by clarifying that elements are matched by intersection with the rectangle rather than containment and by defining the physical-pixel coordinate space.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (addressable UI elements intersecting a physical-pixel rectangle), including the inclusion criteria (resource-id, text, or content-desc present). It also contrasts with the alternative of parsing the full XML, so an agent can distinguish it from page-source tools without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use guidance with concrete examples (bottom nav, dialog, list section) and an implied alternative ('without parsing the full XML'). It does not name a specific sibling tool or state when-not to use this one, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_file_copyDevice file copyADestructiveInspect
Copy a file or directory on the device (recursive). Counterpart of ios_file_copy. Copies WITHIN the device — to move bytes to or from the host use device_file_pull / device_file_push.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Absolute destination path | |
| udid | Yes | Device serial number (UDID) | |
| remotePath | Yes | Absolute path of the source file or directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the agent knows this is a mutating, non-reversible operation. The description adds genuinely useful context that copies are recursive for directories, but does not disclose overwrite behavior at the destination or what happens on path conflicts — a meaningful gap for a destructive tool even with annotations present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and followed by the routing disambiguation. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers purpose, in-device scoping, recursion, and sibling routing, which is strong. It falls short of complete only by omitting destination-overwrite/conflict behavior expected of a destructive file operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents udid, remotePath, and to. The description indicates the source may be a file or directory, which loosely maps to remotePath, but adds no path-format or overwrite semantics beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Copy) and resource (a file or directory on the device) and adds scope detail (recursive). It explicitly distinguishes itself from siblings by naming ios_file_copy as its counterpart and by clarifying that it copies within the device, not to/from the host.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use/when-not guidance: 'Copies WITHIN the device — to move bytes to or from the host use device_file_pull / device_file_push.' The alternatives are named and the selecting condition is stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_file_deleteDevice file deleteADestructiveIdempotentInspect
Delete a file or directory on the device (recursive). Counterpart of ios_file_delete. NOT REVERSIBLE — there is no trash on Android. Refuses the storage roots (/, /sdcard, /storage/emulated/0, /data, /system): an agent asking to delete one of those has almost always built the path wrong, e.g. an empty variable in /sdcard/${dir}. Deleting a path that does not exist is reported as an error rather than a silent success, so a wrong path surfaces instead of reading as done.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| remotePath | Yes | Absolute path of the file or directory to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, yet the description adds substantial context beyond them: irreversibility with no trash on Android, refusal of storage roots with a rationale (path-construction bugs like an empty variable), and error-not-silent-success semantics for non-existent paths. These are exactly the operational traits an agent needs for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and recursiveness, then layered with the highest-stakes fact (NOT REVERSIBLE), then the guard rails and error semantics. Four sentences, each carrying distinct, non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool with no output schema, the description covers irreversibility, refusal boundaries, and error reporting. There is no output schema to explain and nothing an agent needs to call it safely that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented structurally (baseline 3). The description adds meaning to remotePath beyond the schema's terse 'Absolute path... to delete' by specifying which roots are refused and that non-existent paths error out, giving the agent real constraints on valid values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a file or directory on the device (recursive)') and explicitly distinguishes itself from its sibling ios_file_delete as the Android counterpart. An agent can identify the tool's function and platform scope 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly positions itself against the ios_file_delete sibling and implies the Android-platform context, but offers no explicit when-not-to-use guidance or alternative tools for edge cases (e.g., a safer move-to-trash path does not exist, which it notes, but no alternative is suggested). Context is clear, exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_file_findDevice file findARead-onlyIdempotentInspect
Search a directory subtree for files whose NAME matches. Counterpart of ios_file_find. Matches on the name only, not on contents. query is a case-insensitive substring, or a glob if it contains * ? or [. Returns { ok, remotePath, query, count, truncated, matches }. truncated true means the limit was hit and there are more — raise limit or narrow the subtree rather than assuming the list is complete. Permission-denied subtrees are skipped silently by the device shell, so a result of zero is not proof of absence outside /sdcard.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| limit | No | Maximum matches (default 200) | |
| query | Yes | Name substring, or a glob if it contains * ? or [ | |
| maxDepth | No | Maximum depth to descend | |
| remotePath | Yes | Absolute path of the subtree to search, e.g. /sdcard/Download |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description goes well beyond them: it explains truncated semantics (limit hit vs complete, and how to resolve it) and warns that permission-denied subtrees are silently skipped so zero results aren't proof of absence outside /sdcard. This is exactly the operational context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then layers matching semantics, return shape, and the truncation/permission caveats. Every sentence carries information, though the density is high and it runs long for a search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly documents the return shape ({ ok, remotePath, query, count, truncated, matches }) and the failure/edge behavior of the underlying device shell. An agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds detail the schema lacks: query is case-insensitive (schema omits case sensitivity) and describes the glob characters, plus it links limit to the truncated return field. That is genuine added meaning over the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) plus resource (a directory subtree for files whose NAME matches) and explicitly scopes matching to names, not contents. It also identifies the sibling it mirrors (ios_file_find), letting an agent distinguish it from the device_file_list/stat family without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description pins down when name-matching (vs content matching) is the right approach and how to react to a truncated result, which is usable context. It stops short of explicitly naming the sibling to prefer for full listing (device_file_list) or metadata (device_file_stat), so guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_file_listDevice file listARead-onlyIdempotentInspect
List files and directories at a path on the device. Uses the device file-sync protocol (no shell roundtrip). Returns { ok, remotePath, count, entries: [{ name, isDir, size, modTime }] }. Common roots: /sdcard/ (user storage), /sdcard/Download, /sdcard/DCIM. Symlinks are resolved one level.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| remotePath | Yes | Absolute path on the device, e.g. /sdcard/Download |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real value beyond that: it discloses the transport ('device file-sync protocol, no shell roundtrip') and the symlink resolution rule ('one level'), which are non-obvious behaviors an agent should know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action, then transport, return shape, and path hints. Every sentence carries distinct information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully inlines the return shape ({ ok, remotePath, count, entries }). It covers transport, path conventions, and symlink handling. The only gap is that recursion behavior (does it list subdirectory contents or only immediate children?) is not explicitly stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented with examples (including '/sdcard/Download' for remotePath). The description's list of common roots (/sdcard/, /sdcard/Download, /sdcard/DCIM) marginally enriches remotePath but largely repeats the schema's example. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('files and directories at a path on the device'), which is clear and unambiguous. However, it does not distinguish itself from close siblings like device_file_find or device_file_stat, which an agent could easily confuse for a directory listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the 'common roots' examples, which hint at typical Android storage paths, but there is no explicit guidance on when to use this versus device_file_find (search) or device_file_stat (single-entry metadata). The agent must infer the distinction from tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_file_mkdirDevice file mkdirAIdempotentInspect
Create a directory on the device, including any missing parents (mkdir -p). Counterpart of ios_file_mkdir. Succeeds silently if the directory already exists. Fails with the shell error if the parent is read-only — most of the filesystem is, outside /sdcard and /data/local/tmp.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| remotePath | Yes | Absolute path of the directory to create |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: it creates missing parents, succeeds silently when the directory already exists (reinforcing the idempotentHint), and fails with the shell error on a read-only parent. That failure-mode and path-constraint detail is not derivable from {readOnlyHint:false, idempotentHint:true, destructiveHint:false}. It omits any note on permissions prerequisites or return payload, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the core action and mkdir -p semantics first, sibling routing second, failure/constraint context last. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with full annotation coverage, no output schema (so return values needn't be described), and complete schema documentation, the description supplies everything needed to invoke it correctly: parent creation, idempotency, and the read-only filesystem caveat that will most often cause failure. Only permission/auth prerequisites are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully documented in the schema (udid, remotePath at 100% coverage) and the description adds no parameter-level syntax, formatting, or path-convention guidance. Baseline 3 is appropriate when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (directory on the device), plus behaviorally relevant detail (mkdir -p semantics) and an explicit sibling pointer to ios_file_mkdir. An agent can distinguish it from device_file_list, device_file_delete, and other file siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Situates usage via the iOS counterpart and, more usefully, the writable-location constraint ('most of the filesystem is read-only outside /sdcard and /data/local/tmp'), which effectively tells the agent where this call is viable. It stops short of naming explicit alternatives (e.g. device_shell) or stating 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.
device_file_moveDevice file moveADestructiveInspect
Move or rename a file or directory on the device. Counterpart of ios_file_move. Both paths must be on the SAME filesystem — moving between /sdcard and /data fails, because Android mounts them separately; copy then delete instead.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Absolute destination path | |
| udid | Yes | Device serial number (UDID) | |
| remotePath | Yes | Absolute path of the file or directory to move |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and non-idempotent, so the safety profile is covered. The description adds genuine behavioral value beyond them: the same-filesystem constraint, the concrete failure mode, and the copy-then-delete workaround. It stops short of stating overwrite behavior when the destination exists or root/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, followed by the constraint and fallback. No filler; every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter destructive mutation with no output schema, the description covers the main operational pitfall (cross-filesystem failure) and the rename capability. It could go further on destination-overwrite semantics and permission prerequisites, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with three well-documented parameters, so the baseline is 3. The description adds only marginal meaning to the 'to' parameter by implying it can be a new name (rename) as well as a destination path, but it gives no syntax or path-format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move or rename a file or directory on the device') and immediately distinguishes itself from the platform sibling by naming ios_file_move as its counterpart. An agent can pick this tool correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the when-not condition (both paths must be on the SAME filesystem; /sdcard to /data fails) and the alternative workflow (copy then delete). This is exactly the routing guidance an agent needs versus device_file_copy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_file_pullDevice file pullAInspect
Pull a file from the device. Returns base64-encoded content. Default size cap 5242880 bytes (5MB); pass maxSizeBytes to override up to 20971520 bytes (20MB). Refuses directories and oversized files before transferring. Returns { ok, remotePath, sizeBytes, content (base64) }.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| remotePath | Yes | Absolute path of the file to pull | |
| maxSizeBytes | No | Override the default 5MB cap; max 20MB. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavior well beyond the annotations: base64 return format, a 5MB default cap with a 20MB override ceiling, and that directories and oversized files are rejected before transfer. Annotations already cover safety (destructiveHint=false), so this is a solid additive layer. Minor note: readOnlyHint=false sits slightly oddly against a read-style operation, though it does not directly contradict anything stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the purpose, then return format, limits, and return shape. The only waste is mild repetition of the base64 return ('Returns base64-encoded content' and 'content (base64)' in the shape).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully supplies the return shape { ok, remotePath, sizeBytes, content }. It covers purpose, limits, and refusal behavior; the main gap is operational context such as session/connection prerequisites and how errors surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description restates maxSizeBytes' default cap and override ceiling, which the schema already documents, adding little new semantic detail for udid or remotePath beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'pull' plus the resource 'file from the device' is specific and directionally distinguishes it from siblings like device_file_push, device_file_copy, and device_file_stat. It stops short of naming those siblings or explicitly contrasting itself, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (retrieve a file's bytes from the device) and the 'refuses directories' clause implicitly steers directory inspection to device_file_list. However, there is no explicit when-to-use guidance, no mention of prerequisites (e.g. an active session), and no named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_file_pushDevice file pushADestructiveInspect
Push a base64-encoded file to the device. Allowed destinations: /sdcard/ (user storage) or /data/local/tmp/ (writable scratch dir — frida-server, tcpdump, etc.). Decoded size hard cap 20971520 bytes (20MB). remotePath must contain no shell metacharacters. For APKs, prefer app_install instead. Returns { ok, remotePath, sizeBytes }.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| content | Yes | File content as a base64 string | |
| remotePath | Yes | Absolute target path on the device; must start with /sdcard/ or /data/local/tmp/ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, so the mutation profile is covered. The description adds real context beyond that: a hard 20MB decoded-size cap, a metacharacter restriction, and the return shape. It does not state overwrite/conflict behavior, which keeps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the action and destination policy before the size cap, safety rule, sibling redirect, and return shape. No filler or restatement of the name/title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description still gives the return shape ({ ok, remotePath, sizeBytes }). With all three parameters documented and the key limits and constraints stated, nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: the enumerated allowed prefixes, the base64 encoding of content, the 20971520-byte decoded cap, and the metacharacter rule for remotePath. Only udid is left to the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Push a base64-encoded file to the device') and goes further by naming the allowed destination roots. It also differentiates from the app_install sibling for the APK case, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says where files may go ('/sdcard/' or '/data/local/tmp/') and gives a when-not rule plus the alternative: 'For APKs, prefer app_install instead.' The path precondition (no shell metacharacters) is also stated as a usage constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_file_statDevice file statARead-onlyIdempotentInspect
Get metadata for one file or directory on the device — type, size and modification time. Counterpart of ios_file_stat. Returns { ok, remotePath, exists, isDir, size, modTime }. A missing path is NOT an error: it comes back with exists=false, so this is the cheap way to check for a file before pulling it.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| remotePath | Yes | Absolute path on the device, e.g. /sdcard/Download/report.pdf |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful non-obvious behavior: a missing path is NOT an error and returns exists=false, which is exactly the kind of edge-case disclosure annotations cannot provide. It could have added more (relative vs absolute path handling, performance notes) but this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, then the return shape, then the key edge case. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only stat tool with rich annotations and a fully documented schema, the description covers the essential gaps: return field list and the exists=false non-error behavior. An agent has everything needed to call it correctly without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – both udid and remotePath are documented in the schema with examples. The description adds no additional parameter meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get metadata') and resource ('one file or directory on the device'), and names the exact fields returned (type, size, modification time). It also distinguishes itself from the sibling ios_file_stat by calling itself its counterpart, so an agent can pick the right platform variant immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use case: 'the cheap way to check for a file before pulling it' tells the agent to prefer stat over a pull for existence checks. It does not explicitly exclude alternatives (e.g., when to use device_file_find or device_file_list instead), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_find_elementDevice find elementARead-onlyIdempotentInspect
Find a UI element on an Android device by visible text or content description. Returns element center coordinates in PHYSICAL pixels — use directly with device_tap (no scaling needed).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Visible text of the element | |
| udid | Yes | Device serial number (UDID) | |
| resourceId | No | Resource ID of the element (e.g. com.android.chrome:id/url_bar) | |
| contentDesc | No | Content description (accessibility label) of the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds value beyond them by disclosing the return payload (element center coordinates) and the critical behavioral detail that coordinates are in PHYSICAL pixels and require no scaling before device_tap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and matching modes, followed by the return-value contract. No filler; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return value and the pixel-scaling caveat needed to chain into device_tap. Minor gap: the resourceId match mode is unmentioned and no behavior on zero/multiple matches is given.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces 'visible text' and 'content description' but omits the resourceId parameter entirely, adding little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find) and resource (UI element on an Android device) with the matching criteria (visible text or content description). The Android qualifier helps separate it from ios_find_element and session_find_element, though it does not differentiate from near siblings like device_wait_for_element or device_elements_in_region.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'use directly with device_tap (no scaling needed)' clause implies the intended follow-up action, which is useful context. However there is no explicit when-to-use guidance versus alternatives (wait_for_element, elements_in_region, tap_by_text) and no stated preconditions or when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_focus_eventsDevice focus eventsARead-onlyIdempotentInspect
Read recent Android focus-change events from logcat. Useful AFTER a tap on an input field and BEFORE device_type to verify focus actually landed on the expected element — diagnoses the "type went into the wrong field" race that bites parallel tap+type sequences. Filters to ViewRootImpl (window focus), WindowManager (focus transitions), and InputMethodManager (IME show/hide) events. Returns a short summary line followed by the matching logcat lines (newest last). Empty result = no focus events in the recent window, which usually means the tap did NOT change focus (tap missed, or you tapped a non-focusable element).
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max focus events to return (default: 30, capped at 500). Newest last. | |
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description goes further by disclosing the exact event sources filtered (ViewRootImpl, WindowManager, InputMethodManager), the output shape (summary line plus newest-last logcat lines), and the semantics of an empty result. This is meaningful behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, filters, return format, and empty-result meaning. Every sentence contributes, though the phrasing is dense and slightly verbose in the diagnostic explanation, keeping it just short of maximal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with no output schema, the definition covers purpose, timing, filter scope, return format, and empty-result interpretation. An agent has everything needed to invoke it correctly and read its output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'udid' and 'max' are already documented. The description only obliquely references the return window ('recent window'), adding no syntax or range detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb ('Read') and resource ('recent Android focus-change events from logcat'), immediately distinguishing it from siblings like device_tap and device_type. The scope (logcat focus events) is precise enough that an agent knows exactly what it retrieves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it ('AFTER a tap on an input field and BEFORE device_type') and why (diagnosing the wrong-field race). It even interprets the negative case — empty result means the tap did not change focus — leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_gamepad_disconnectDevice gamepad disconnectAIdempotentInspect
Detach the virtual game controller from an Android device, as if unplugging it. Releases everything first, so nothing is left held down. Safe to call when no controller is attached.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false. The description adds useful behavior: it releases held inputs first and is a safe no-op if no controller is attached, which clarifies the idempotent safety. It omits auth/error behavior, but adds solid context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the primary action and followed by the key behavioral caveat. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter disconnect tool with annotations covering safety and no output schema, the description supplies purpose, cleanup behavior, and the no-controller edge case. It is close to complete, though it could explicitly route agents away from status-query siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the only parameter (udid) is fully documented in the schema. The description adds no additional meaning or format detail for udid; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Detach) and resource (virtual game controller) plus platform (Android device), clearly distinguishing it from the iOS sibling and from device_gamepad_state/status. The 'as if unplugging it' analogy reinforces the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the cleanup use case and notes it is safe when no controller is attached, but it does not explicitly say when to choose this over device_gamepad_status or device_gamepad_state, nor does it give prerequisites. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_gamepad_stateDevice gamepad stateAInspect
Present a connected game controller to an Android device and set its state. The device sees a REAL controller — a kernel-level input device that native games and apps receive exactly as they would a pad plugged into the phone.
HOW TO FIRE INPUT PROPERLY:
• One call = ONE frame = one instant in time. A button stays pressed until you send a frame WITHOUT it, so every press needs a matching release frame — keydown then keyup. Press after press just holds them all down.
• For anything that should look played rather than stepped — mashing, combos, a stick sweep — pass frames instead of calling repeatedly. The sequence plays out device-side at intervalMs (default 33 ms ≈ 30 fps). A round trip per frame cannot reach that cadence, so a rapid sequence built from single calls always reads as held buttons.
• Alternate press and release inside frames: [{buttons:[1]}, {}, {buttons:[1,1]}, {}] is tap A, release, tap A+B, release.
• Axes are [leftX, leftY, rightX, rightY], -1..1. Sweep them across frames to roll a stick; omitted axes read as centred.
• Confirm with device_gamepad_status.
Buttons and axes use W3C standard order, identical to the iOS gamepad tools — the mapping onto whatever the chosen controller reports is done for you. Pick profile to match the hardware you want the device to believe is attached; it changes both the reported identity and the button layout, so a game showing on-screen prompts shows the right ones. This is the tool to reach for. device_uhid_gamepad_state is the raw twin — it takes the fixed-format report directly (one profile, rotated bit order) instead of translating from W3C arrays; use it only to send an exact report byte-for-byte.
| Name | Required | Description | Default |
|---|---|---|---|
| axes | No | Axis values -1..1: [leftX, leftY, rightX, rightY]. Omitted axes read as centred. | |
| udid | Yes | Device serial number (UDID) | |
| frames | No | Play a SEQUENCE of frames at intervalMs instead of setting one state. This is how you produce real gameplay input: include the release frames (an entry with no buttons releases everything). Capped at 300 frames. Overrides buttons/axes when present. | |
| buttons | No | Button values 0..1 in W3C standard order (0-3 face, 4/5 shoulders, 6/7 analog triggers, 8 select, 9 start, 10/11 stick clicks, 12-15 d-pad, 16 home, 17 touchpad). >= 0.12 counts as pressed. Omitted releases everything. | |
| profile | No | Which controller the device should believe is attached (default dualshock4). Changing it between calls unplugs and re-attaches the pad. | |
| intervalMs | No | Gap between frames in ms (default 33). Lower = faster mashing; 33 ms matches a 30 fps controller poll. | |
| browserTouchpad | No | Also expose the touchpad click (index 17) to a web page open on the device. Off by default. The pad is a REAL input device here, and Chromium's Android mapper fills indices 0-16 only, so index 17 reaches the kernel and native apps but can never reach a browser gamepad tester on its own — not even from a physically-plugged DualShock. This overlays it onto the page. Indices 0-16 still come from the real pad; only 17 is synthesized. Needs an inspectable page open; ignored if there is none. After a navigation the page only exposes a pad once it sees activity, and the touchpad alone cannot provide it — lead with a stick sweep, e.g. frames [{axes:[1,0,0,0]},{axes:[0,0,0,0]},{buttons:[...17]}], which wakes it without adding a button to a tester's history. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive behavior, but the description adds substantial context beyond that: the device sees a real kernel-level input device, button presses persist until a frame omits them, `frames` play out device-side at intervalMs, and changing `profile` unplugs and re-attaches the pad. These are exactly the behavioral traits an agent needs to invoke it correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, the description is front-loaded, segmented with short headings and bullets, and every section maps to a real invocation concern: purpose, frame semantics, axes, profile choice, and sibling tool selection. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 7-parameter mutation tool with no output schema, the description covers purpose, usage, frame timing, parameter behavior, and confirmation with a sibling status tool. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description still adds meaningful semantics: W3C button/axis ordering, concrete `frames` examples, cadence rationale for intervalMs, profile identity/layout effects, and the nuanced browserTouchpad overlay behavior. It does not simply repeat the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Present a connected game controller to an Android device and set its state.' It also explicitly distinguishes the tool from its closest sibling, device_uhid_gamepad_state, and names device_gamepad_status for confirmation, so an agent can tell it apart without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'This is the tool to reach for' and when to use the raw twin instead: 'use it only to send an exact report byte-for-byte.' It also gives concrete guidance on single calls vs. `frames`, press/release pairing, and how to confirm state via device_gamepad_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_gamepad_statusDevice gamepad statusARead-onlyIdempotentInspect
Report whether a virtual game controller is currently attached to an Android device, what it is presenting as, and the last state that was sent to it. Use to confirm device_gamepad_state took effect. The attachment is read from the device itself; the held state is the last frame this server sent, since a controller reports state to apps rather than back to us.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds non-obvious semantics: attachment is read from the device itself, while the held state is the last frame this server sent, since a controller does not report state back. This resolves a likely agent misconception about data provenance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the report contents come first, the usage guidance second, and the provenance caveat last. No sentence is filler; each adds a distinct piece of information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating what is reported (attachment presence, presentation, last state) plus where each value comes from. An agent has everything needed to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single udid parameter is fully documented in the schema, so the description need not carry that burden. It adds no additional syntax or format detail for udid, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reports whether a virtual game controller is attached to an Android device, what it presents as, and its last sent state. It is clearly a read/status counterpart to the sibling mutator device_gamepad_state, so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use to confirm device_gamepad_state took effect" gives an explicit usage condition and names the sibling tool it complements. The read-vs-write relationship between the two tools is spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_gesture_pathDevice gesture pathAInspect
Replay a freeform stroke as ONE continuous touch — the polyline lands exactly as given, so use it for curves, arcs, signatures, unlock patterns, or any gesture a straight device_swipe cannot express. points is an ordered list of {x, y}; the first is touch-down, the last is lift. Minimum 2 points. Waypoints are sent AS GIVEN and not densified — the polyline you pass IS the gesture, so pass enough points to describe the curve. Prefers the HID touchscreen and falls back to injected MotionEvents. Coordinates are PHYSICAL pixels — same as device_page_source bounds. The iOS counterpart is ios_gesture_path.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| points | Yes | Ordered waypoints of the stroke (first = touch-down, last = lift) | |
| durationMs | No | Total stroke time in ms, split evenly across segments (default 400) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly/destructive/idempotent/openWorld). The description goes well beyond: it discloses the backend behavior (prefers HID touchscreen, falls back to injected MotionEvents), the densification semantics (waypoints sent AS GIVEN, not densified, so the polyline IS the gesture), and the coordinate space (physical pixels matching device_page_source bounds). These are exactly the traits annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the device_swipe contrast are front-loaded, followed by point semantics, the densification caveat, backend behavior, and coordinate space. Each sentence carries distinct, non-redundant information; none restates the name, title, or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an action tool with no output schema, the description supplies everything needed to invoke correctly: what the gesture means, point ordering and density requirements, coordinate space, and the execution backend with its fallback. Nothing an agent needs to call this successfully is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents udid, points, and durationMs, making the baseline 3. The description nonetheless adds meaning beyond it: the ordering convention (first = touch-down, last = lift), the minimum of 2 points, and the physical-pixel coordinate clarification that sharpens the schema's vaguer 'device tap-coord space'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Replay) and resource (freeform stroke as one continuous touch) and explicitly positions itself against the sibling device_swipe for gestures 'a straight device_swipe cannot express'. It also names its iOS counterpart ios_gesture_path, so an agent can distinguish it from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use criteria ('curves, arcs, signatures, unlock patterns, or any gesture a straight device_swipe cannot express') and names the alternative tool it supersedes. The selection condition between this and device_swipe is fully spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_get_browser_urlDevice get browser URLBRead-onlyIdempotentInspect
Get the current URL loaded in Chrome on an Android device. Returns the URL string without needing to parse page source.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that the return is a URL string, which is mildly useful since no output schema exists, but it says nothing about failure behavior when Chrome is not running or how the device must be configured.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and scope; the second sentence is partly rationale but still earns its place by clarifying the return. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with rich annotations, the description covers purpose and return type adequately. It omits preconditions and error conditions, which is a modest gap given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single udid parameter, so the schema fully documents the input. The description adds no meaning about udid beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the current URL loaded in Chrome on an Android device') with platform and browser scope, and implicitly differentiates from device_page_source by noting the URL comes 'without needing to parse page source.' It does not explicitly name a sibling, but the resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the 'without needing to parse page source' clause hints at an alternative path, but the description never says when to prefer this over device_page_source, android_devtools_list_pages, or device_navigate_url, nor any precondition (e.g. Chrome must be foregrounded).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_get_locationDevice get locationARead-onlyIdempotentInspect
Read the Android device's current GPS location. Counterpart of ios_get_location. Returns { latitude, longitude, source }. source is the part worth reading: "mock" = the value device_set_location is currently simulating (authoritative); "device" = a real fix parsed from dumpsys location, which is BEST-EFFORT — the format varies by OEM and Android version, so a device with a valid fix can still come back as "none"; "none" = nothing could be determined, with latitude and longitude null. Treat "none" as "unknown", never as "the device has no location".
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial context beyond them: the return shape, the authoritative-vs-best-effort distinction, OEM/Android-version variance, and the explicit warning that 'none' means unknown rather than 'no location'. This is exactly the kind of ambiguity an agent needs surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by return semantics and the highest-value caveat about 'none'. It is dense and slightly long, but every clause addresses a real ambiguity in interpreting the result rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of explaining the return value and does so fully, including per-source meaning and null handling. Nothing needed to call or interpret the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single well-documented udid parameter, so the schema carries parameter meaning. The description adds no syntax or format detail beyond it, which is the correct baseline for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the Android device's current GPS location') and immediately situates itself relative to siblings by naming ios_get_location as its counterpart. An agent can distinguish it from device_set_location and device_clear_location 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the iOS counterpart and ties the 'mock' source to device_set_location, giving clear routing context. It stops short of explicit when-not-to-use guidance, but the sibling relationships it establishes are enough to select the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_infoDevice infoARead-onlyIdempotentInspect
Get detailed info about a device including physical screen size. device_tap/device_swipe use PHYSICAL pixel coordinates — same as page_source bounds. No scaling needed.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, idempotent operation. The description adds a useful non-obvious fact about physical pixel coordinates and page_source bounds, but it does not describe what 'detailed info' includes beyond screen size or any other operational traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary purpose and followed by a tightly relevant coordinate note. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one fully documented parameter and rich annotations, the description gives enough context to call it correctly. It is slightly vague about exactly what 'detailed info' comprises, but the annotation coverage compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'udid' parameter, so the schema already fully documents it. The description does not add any parameter-level meaning beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('detailed info about a device'), and names a concrete return item ('physical screen size'). It does not explicitly differentiate from sibling tools like device_list or ios_device_info, so it is clear but lacks sibling routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The coordinate note ('device_tap/device_swipe use PHYSICAL pixel coordinates... No scaling needed') implies a usage context for obtaining coordinate-related device metrics, but there is no explicit when-to-use or when-not-to-use guidance relative to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_keyDevice keyAInspect
Send a keycode to a device. Accepts numeric keycode OR named key (HOME, BACK, ENTER, VOLUME_UP, VOLUME_DOWN, POWER, APP_SWITCH, ESCAPE, DELETE, TAB, SEARCH, MENU). System-policy keys (APP_SWITCH/187, MENU/82, POWER/26) are always sent via shell — they require policy-level handling that the control channel cannot reach. Other keys try the control channel first and fall back to shell on error/timeout. Every route here is injected — this tool has no kernel input path. Use device_uhid_key_press instead when the target app filters or ignores injected key events and the press has to land as real kernel input.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| keycode | Yes | Android keycode number OR name (HOME, BACK, ENTER, VOLUME_UP, VOLUME_DOWN, POWER, APP_SWITCH, ESCAPE, DELETE, TAB, SEARCH, MENU) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds real behavioral context: the two-tier routing, the shell fallback on error/timeout, the always-shell policy keys, and the crucial constraint that every route is injected with no kernel input path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then routing rules, then the alternative. Dense but each sentence carries distinct, non-redundant information; the parenthetical key lists run slightly long but earn their place given no enums in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation tool with no output schema, the description covers routing behavior, fallbacks, exceptions, and the sibling decision, leaving nothing an agent needs to call it correctly unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents both params, so the baseline is 3. The description goes slightly further by supplying the numeric equivalents for policy keys (187/82/26) that the schema does not map, adding marginal meaning beyond the enum-less schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send a keycode to a device') and explicitly differentiates itself from the sibling device_uhid_key_press by contrasting injected routes against kernel input. An agent can select between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: policy keys (APP_SWITCH/187, MENU/82, POWER/26) always go via shell, other keys try the control channel then fall back, and it names the exact alternative (device_uhid_key_press) plus the condition that selects it (target app filters or ignores injected events).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_launch_appDevice launch appBInspect
Launch an Android app. Accepts a package name (e.g. com.android.chrome) OR a display name (e.g. "Chrome"). Display-name lookup is case-insensitive substring match against installed apps.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| packageName | Yes | Package name (com.x.y) OR display name (case-insensitive substring) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds the matching semantics of display-name resolution but says nothing about what happens if the app is already running, if the package is not installed, or if a display name matches multiple apps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action front-loaded and no filler. The final sentence is partially redundant with the parenthetical in sentence two, which keeps it just short of ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and for a simple launch action the description is nearly sufficient. However, it omits the failure/ambiguity behavior an agent needs to act on (uninstalled package, multiple substring matches, no return info), leaving a meaningful gap for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, and the description largely restates them (package name or display name, case-insensitive substring). It adds an illustrative example ("Chrome") but no extra syntax, normalization, or ambiguity-resolution rules, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Launch an Android app") and the platform qualifier implicitly separates it from ios_launch_app. It does not name or contrast any sibling (device_launch_app_in_language, device_terminate_app), so differentiation relies on the reader scanning the tool list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains accepted input formats but never says when to use this tool versus alternatives such as device_launch_app_in_language or how it relates to device_terminate_app/device_list_apps. No prerequisites (app must be installed, device must be connected) or when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_launch_app_in_languageDevice launch app in languageAInspect
Launch an Android app forced into a specific language / locale without changing the device's system settings. Requires Android 13+ (API 33). Uses the per-app LocaleManager API via cmd locale set-app-locales. The tool force-stops the app first so cold launch picks up the new locale. Override persists until cleared (or until the app is uninstalled).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| locale | Yes | BCP-47 locale tag, e.g. "fr-FR", "es-US", "ja-JP" | |
| packageName | Yes | App package name, e.g. com.example.app |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the underlying mechanism (cmd locale set-app-locales / per-app LocaleManager), a hard platform prerequisite (Android 13+, API 33), and a real side effect: the tool force-stops the app first, so in-flight app state is destroyed. It also documents persistence semantics (override survives until cleared or uninstall), which matters given idempotentHint=false and no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the key constraint are front-loaded in the first sentence, followed by tightly packed requirement, mechanism, side-effect, and persistence details with no filler. Slightly dense at five sentences, but every sentence carries non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter launch tool with no output schema, the description supplies everything an agent needs: platform requirement, what gets interrupted (force-stop), how the override is implemented, and how long it lasts. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already defines udid, packageName, and locale with examples, so the description is not required to carry parameter meaning. It reinforces the locale concept ('specific language / locale') but adds no syntax or format detail beyond the BCP-47 example already in the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (launch an Android app) plus the defining modifier (forced into a specific language/locale), and explicitly scopes it against the obvious alternative behavior: 'without changing the device's system settings'. That distinguishes it from device_launch_app and device_set_device_language without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (per-app locale forcing on Android 13+) and notes the override persists 'until cleared', which implicitly points at device_clear_app_locale. It never explicitly names device_launch_app or device_set_device_language as the alternatives to reject, so it falls short of a full when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_listDevice listARead-onlyIdempotentInspect
List available devices (Android and iOS) across every connected device host. A device on another host carries a host field; every device tool accepts its udid the same way. Shows only free devices and devices currently used by you. An Apple TV is listed with os "iOS" plus deviceClass "AppleTV" and osLabel "tvOS": read/app tools (ios_screenshot, ios_page_source, ios_active_app, ios_list_apps, ios_launch_app) work as usual, but it has NO touchscreen — ios_tap/ios_swipe/ios_send_keys refuse on it. Drive it with the TV tools instead: tvos_select(x,y) / tvos_focus(label) to pick an element, ios_tv_button for remote keys, ios_tv_text to type, ios_tv_volume for volume. An Android TV (Chromecast with Google TV) is listed with os "Android" plus deviceClass "AndroidTV" and osLabel "Android TV": every device_* tool works on it as on a phone, and the remote is device_key (DPAD_UP/DOWN/LEFT/RIGHT = 19-22, DPAD_CENTER = 23, BACK, HOME, MEDIA_PLAY_PAUSE = 85).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile, but the description adds substantial behavioral context beyond them: the filtering rule (only free + your devices), the presence of a `host` field for remote-host devices, the shared udid convention, and the Apple TV touchscreen limitation with the exact tool workarounds. This is exactly the extra operational detail an agent needs and could not derive from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and filtering rule are front-loaded in the first sentence, and the device-class specifics follow in a logical order. It is dense and long, but nearly every clause is substantive (field names, tool routing, key codes) rather than filler, so it earns most of its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a discovery tool with no output schema, the description helpfully names the fields an agent will see (host, os, deviceClass, osLabel) and explains the two TV device classes that behave differently. Return shape and ordering/pagination are not spelled out, but nothing critical to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description still adds value by explaining that every device tool accepts a device's udid the same way and that host-scoped devices carry a `host` field, priming the agent for how returned identifiers feed sibling tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List available devices (Android and iOS) across every connected device host') and defines scope precisely (only free devices plus devices currently used by you). It does not explicitly name a sibling like device_info to differentiate itself, which keeps it just short of a 5, but an agent can still tell what this tool does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: which devices appear in the list, and explicitly which downstream tools apply to edge cases. Notably it routes the agent away from ios_tap/ios_swipe/ios_send_keys on Apple TV and toward tvos_select/tvos_focus/ios_tv_button instead. It stops short of naming alternative list/discovery tools, so no full when-not-vs-sibling statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_list_appsDevice list appsARead-onlyIdempotentInspect
List the APPS installed on an Android device — things with a launcher icon, user and system alike, so Settings and Chrome are included. Installed packages that are not apps (providers, accessibility services, Bluetooth stacks) are excluded: a Pixel reports 275 installed packages of which 23 are apps. Set userOnly to drop preinstalled apps, or includeNonLaunchable for the raw package list.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| userOnly | No | Only user-installed apps, excluding preinstalled ones (default: false) | |
| includeNonLaunchable | No | Include installed packages with no launcher activity — providers, services, OEM stubs. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so safety and repeatability are covered. The description adds genuine context beyond that: exactly what counts as an app (launcher icon, user and system alike), what is excluded (providers, accessibility services, Bluetooth stacks), and a concrete scale example (275 packages vs 23 apps). Return shape and pagination are not described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action before the inclusion/exclusion detail. The Pixel 275-vs-23 statistic is illustrative rather than filler, though it is the one element that could be trimmed without losing operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool whose annotations already carry the safety profile and whose schema fully documents its three parameters, the description covers the key ambiguity (apps vs packages) and the effect of both flags. With no output schema, it could say more about what each returned entry contains, but nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both flags are already documented in the schema, which sets the baseline at 3. The description's "drop preinstalled apps" and "raw package list" phrasing largely restates the schema's "excluding preinstalled ones" and "packages with no launcher activity," adding only the framing that the two flags are opposing directions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("List the APPS installed on an Android device") and draws a sharp semantic line between apps and raw packages, which is the main source of confusion for this tool. It does not, however, explicitly distinguish itself from nearby siblings like app_list, ios_list_apps, or firebase_list_apps, so an agent must infer the device-vs-catalog split from the word "Android device".
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence "Set userOnly to drop preinstalled apps, or includeNonLaunchable for the raw package list" gives conditional guidance for the two flags, which implies when each mode is appropriate. There is no explicit when-to-use versus alternatives such as app_list or ios_list_apps, 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.
device_locators_forDevice locators forARead-onlyIdempotentInspect
Generate ranked locator strategies for a UI element on Android. Pass either coordinates (x, y — picks the smallest containing element) OR a text/contentDesc/resourceId to look up. Returns the same priority-ordered list the UI inspector shows: id, text, content-desc, accessibility selector, XPath. Use these to fill page-object selectors when generating test scripts so you do not have to re-derive them.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Physical x coordinate of the element (use with y) | |
| y | No | Physical y coordinate of the element (use with x) | |
| text | No | Lookup by visible text (matches text or content-desc) | |
| udid | Yes | Device serial number (UDID) | |
| resourceId | No | Lookup by resource-id | |
| contentDesc | No | Lookup by content-desc / accessibility label |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real value by disclosing the return shape (priority-ordered id, text, content-desc, accessibility selector, XPath) and the coordinate-mode rule (picks the smallest containing element), which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, purpose front-loaded, no filler. The middle sentence is somewhat dense with parentheticals, but each clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully documents the returned locator list and its priority ordering. It is complete enough to call correctly, though it omits edge-case behavior (missing element, conflicting inputs) for a tool that must resolve a target before returning locators.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds meaning beyond the schema: the either/or exclusivity between coordinate mode and lookup mode, and the clarification that a query matches across text/content-desc/resourceId. It does not specify what happens if both or neither mode is passed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Generate ranked locator strategies for a UI element on Android") and clearly scopes the platform. It is readily distinguishable from siblings like device_find_element, device_page_source, and ios_locators_for 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ("fill page-object selectors when generating test scripts so you do not have to re-derive them") and explains the two input modes. It does not name alternative tools or state when-not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_long_pressDevice long pressAInspect
Long press at (x,y) on an Android device screen. Triggers context menus, drag handles, and other long-press actions. Coordinates are PHYSICAL pixels (from page_source bounds).Pass input="hid" to require the virtual touchscreen: the gesture then reaches the app as real kernel input and fails loudly instead of silently falling back to injected input. That strict path used to be device_uhid_long_press, which stays callable under its old name.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in physical pixels (from page_source bounds) | |
| y | Yes | Y coordinate in physical pixels (from page_source bounds) | |
| udid | Yes | Device serial number (UDID) | |
| input | No | Input path. 'auto' (default) prefers the virtual touchscreen and falls back to injected input. 'hid' requires the virtual touchscreen and fails if the device does not provide one — use it when the gesture must be real kernel input or must fail loudly. | |
| duration | No | Hold duration in ms (default: 800) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower; the description still adds real behavior: 'auto' silently falls back to injected input while 'hid' fails loudly instead. That fallback/failure-mode disclosure is the kind of context annotations cannot convey. It stops short of describing failure errors or session prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and coordinates, then the input-path nuance; every sentence carries information. Minor flaw: a missing space between 'bounds).' and 'Pass input="hid"' makes one sentence run together, and the third sentence is dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the tool is a gesture with no meaningful return value, and annotations cover the safety profile. The description supplies coordinate semantics, default behavior, and the strict-input escape hatch. It omits error behavior and any device-session prerequisites, which is a modest gap for a 5-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents x, y, udid, input, and duration (including the enum semantics and the 800ms default). The description's coordinate-source note (page_source bounds) and input explanation duplicate the schema rather than extending it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Long press at (x,y) on an Android device screen', and names the effects it produces (context menus, drag handles). It implicitly separates itself from ios_long_press and explicitly from device_uhid_long_press, which it identifies as the legacy name for the strict path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear condition for the non-default path: use input='hid' when the gesture must reach the app as real kernel input or must fail loudly rather than silently fall back. It also notes the legacy tool name remains callable, which helps routing. It does not state when to prefer device_tap/device_swipe instead, so no explicit exclusion set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_network_infoDevice network infoBRead-onlyIdempotentInspect
Get network info from an Android device: WiFi SSID, IP address, and signal strength.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered without the description. The description adds the concrete fields returned, which is useful, but discloses no auth, connectivity, or failure behavior beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb and resource, listing the returned fields with zero filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool, the definition is essentially complete: annotations carry the safety profile and the description names the returned values despite there being no output schema. Only the absence of when-to-use routing keeps it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) with 100% schema description coverage, so the schema fully documents it. The description adds no meaning about udid or device targeting, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Get") and resource ("network info from an Android device") and enumerates the returned fields (WiFi SSID, IP address, signal strength), which cleanly separates it from general tools like device_info. It does not, however, name or contrast itself with any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 tool versus alternatives such as device_info or the traffic/devtools network tools. Usage is only implied by the Android scope; no conditions or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_notificationsDevice notificationsARead-onlyIdempotentInspect
Read current notifications on an Android device. Returns structured list of active notifications (app, title, text).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the useful detail that only *active* notifications are returned, but it omits Android's notification-listener permission requirement and whether the capture is a one-shot snapshot of the shade.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the read action and platform front-loaded, then the return shape. No filler or restated boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names the returned fields (app, title, text), and annotations carry the safety profile. The only meaningful gap is Android notification-access permission prerequisites, which an agent would need before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single required udid parameter, and the schema already documents it as the device serial number. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read current notifications') and pins the platform to Android, which distinguishes it from the iOS counterpart ios_notifications_capture in the sibling list. An agent can identify the tool without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (reading live notifications) but names no alternative or exclusion. It never contrasts itself with ios_notifications_capture, which is the natural point of confusion for a nearly identically named tool on another platform.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_orientationDevice orientationAIdempotentInspect
Set the screen orientation of an Android device. PORTRAIT and LANDSCAPE mirror ios_orientation; PORTRAIT_REVERSE and LANDSCAPE_REVERSE are the 180°-turned variants and have no iOS counterpart. Turns AUTO-ROTATE OFF as a side effect, and leaves it off — otherwise the accelerometer overrides the setting the moment the device is moved and the call looks like it silently did nothing. Returns once the stream has reported the new frame size, so the next device_tap is mapped against the new shape rather than the old one.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| orientation | Yes | Target orientation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring non-read-only, non-destructive, and idempotent behavior, the description adds substantial context beyond the structured fields: it disables AUTO-ROTATE as a persistent side effect and explains why. It also states that the call returns only after the stream reports the new frame size, which affects subsequent tap mapping.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, and each following sentence earns its place by covering enum semantics, the important AUTO-ROTATE side effect, and return timing. There is no filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter Android orientation tool with no output schema, the description covers the action, enum meanings, side effects, and call-completion timing. Combined with annotations and schema, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful enum semantics by mapping PORTRAIT/LANDSCAPE to iOS equivalents and explaining the 180° reverse variants, though it does not add detail for the udid parameter beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Set the screen orientation of an Android device.' It distinguishes Android behavior from the sibling ios_orientation and specifies which orientation enum values mirror iOS versus which are Android-only reverse variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description references the iOS counterpart and explains sequencing with device_tap, but it does not explicitly say when to use device_orientation instead of other siblings such as device_rotate. Usage is implied rather than contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_page_sourceDevice page sourceARead-onlyIdempotentInspect
Get UI hierarchy XML of a device . Bounds are in physical pixel coordinates — use them directly with device_tap/device_swipe (no scaling needed). Supports element filtering by text/class and compact description format. Pass search to grep the dump case-insensitively across text/content-desc/class/resource-id — the fast way to check if a target is present. If it is NOT in the dump it may be scrolled off-screen (Android only dumps rendered nodes): use device_scroll_to_element to bring it in, device_find_element/device_locators_for to resolve a stable locator, or device_wait_for_element to wait out animations.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Filter: only return elements where text or content-desc matches this string | |
| udid | Yes | Device serial number (UDID) | |
| format | No | Output format: xml (default) or description (compact readable list) | |
| search | No | Case-insensitive substring grepped across the whole node (text, content-desc, class, resource-id). Looser than `text` (which is an exact text=/content-desc= match) — use it to locate an element without knowing its exact label. | |
| className | No | Filter: only return elements matching this class name (e.g. android.widget.Button) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent profile, and the description adds substantial non-obvious behavior: bounds are in physical pixels needing no scaling for device_tap/device_swipe, and only rendered nodes appear in the dump so off-screen elements are missing. It does not mention output size or cost for large hierarchies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the critical pixel-coordinate note are front-loaded, and each subsequent sentence carries distinct information (filtering, search semantics, fallback tools). It is slightly dense at four sentences for a read tool, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains both output shapes (xml vs compact description list), the coordinate system of the returned bounds, the search behavior, and what to do when an element is absent. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates filtering by text/class, compact format, and the case-insensitive grep semantics of `search`, but adds no syntax, default, or constraint details beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get UI hierarchy XML of a device') and implicitly scopes itself to Android via the caveat that 'Android only dumps rendered nodes', distinguishing it from ios_page_source and session_page_source in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Pass `search` ... the fast way to check if a target is present', and if the target is absent, names three concrete alternatives (device_scroll_to_element, device_find_element/device_locators_for, device_wait_for_element) each with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_panelDevice panelAInspect
Pull down the notification panel, the Quick Settings panel, or collapse open panels. action="notifications": pull down the first panel (notifications). action="settings": pull down Quick Settings (some OEMs require notifications first). action="collapse": close any open panel. Tries control channel first; falls back to cmd statusbar shell on error. Returns { ok, action, transport }.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| action | Yes | Which panel operation to perform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate it is a mutating (readOnlyHint=false) but non-destructive action. The description adds real behavioral context beyond them: it tries a control channel first and falls back to `cmd statusbar` shell on error, and returns { ok, action, transport }. It does not discuss permissions or repeated-call effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly front-loaded: the main purpose comes first, then each action is defined in one clause, followed by implementation fallback and return shape. Every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter device action with no output schema, the description supplies the crucial fallback behavior and return shape. It omits prerequisites like device connectivity or screen state, but the annotations and required udid cover enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds meaning to the action enum by explaining each value and the OEM ordering caveat, going beyond the schema's generic 'Which panel operation' text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states specific UI operations—pulling down the notification panel, Quick Settings, or collapsing panels—and enumerates the three action values. It is clear what the tool does, though it does not explicitly contrast itself with sibling tools such as device_notifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains what each action does and notes an OEM dependency for action=settings, which is useful in-band guidance. However, it gives no explicit when-to-use-vs-alternatives or when-not-to-use guidance relative to other device control tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_pinchDevice pinchAInspect
Two-finger pinch-to-zoom centred at (x,y) on an Android device. scale > 1 zooms IN (fingers spread), scale < 1 zooms OUT (fingers converge); ~2 doubles, ~0.5 halves. Both fingers ride a VERTICAL axis through the centre, so the centre governs where they land: put it on the content you want to zoom, ideally the middle third of the screen. A centre near the top or bottom leaves no room — the span is squeezed to fit the content area and the zoom comes out weak or does nothing. Fingers are kept clear of the status and navigation bars; a finger in the status bar pulls down the notification shade instead of touching the app. Bottom sheets, dialogs and cards are app UI and cannot be detected here: if one covers the lower half, centre the pinch above it or the sheet swallows the gesture. The reply reports the finger endpoints and span actually used — if the screen did not change, check those before retrying. Coordinates are PHYSICAL pixels — same as the bounds in device_page_source.Pass input="hid" to require the virtual touchscreen: the gesture then reaches the app as real kernel input and fails loudly instead of silently falling back to injected input. That strict path used to be device_uhid_pinch, which stays callable under its old name.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Pinch centre X | |
| y | Yes | Pinch centre Y | |
| udid | Yes | Device serial number (UDID) | |
| input | No | Input path. 'auto' (default) prefers the virtual touchscreen and falls back to injected input. 'hid' requires the virtual touchscreen and fails if the device does not provide one — use it when the gesture must be real kernel input or must fail loudly. | |
| scale | Yes | End/start finger-separation ratio: >1 zoom in, <1 zoom out (0.2-5) | |
| duration | No | Gesture duration in ms (default: 300) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry the generic safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=false). The description goes well beyond that: the vertical-axis geometry, clamping of the finger span to the content area, status-bar fingers pulling down the notification shade, bottom sheets swallowing the gesture, and the fallback semantics of input='hid'. It does not restate safety but adds substantial operational behaviour.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scale rule, then layers geometry, pitfalls, and the input path in a logical order. It is dense and fairly long for a gesture tool, but nearly every sentence carries operational value, so it stays just short of being padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating what the reply reports (finger endpoints and span actually used) and how to use that on retry. With all six parameters covered, failure modes described, and the legacy alias noted, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: scale is reframed as a ratio with concrete anchors (~2 doubles, ~0.5 halves), coordinates are pinned to PHYSICAL pixels matching device_page_source bounds, and input='hid' is explained in terms of fallback versus hard failure. These are semantic clarifications rather than restatements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Two-finger pinch-to-zoom centred at (x,y) on an Android device') and immediately disambiguates it from siblings by scope (Android) and by naming the legacy tool device_uhid_pinch that still works under its old name. An agent can separate this from device_two_finger_swipe, device_gesture_path, or ios_pinch without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance: place the centre on the content to zoom, keep it in the middle third, avoid top/bottom where the span gets squeezed, and route around bottom sheets. It also states when to pick input='hid' (gesture must be real kernel input or fail loudly) versus the auto default, and names the alternative device_uhid_pinch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_rebootDevice rebootADestructiveInspect
Reboot an Android device. DISRUPTIVE and NOT REVERSIBLE: the device is unreachable for roughly 40 seconds, the stream drops, the MCP session is torn down, and anything in progress on the device is lost. Requires confirm=true — there is no default. Do NOT reach for this to recover from a flaky tool call; try device_release first, which resets the session without touching the device. Reboot only when the device itself is wedged and a human has asked for it. The iOS counterpart is ios_reboot.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| confirm | Yes | Must be exactly true. Acknowledges the device will restart and the session will be lost. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds concrete consequences beyond them: ~40s unreachability, stream drop, MCP session teardown, and loss of in-progress work. It also surfaces the confirm=true requirement and that there is no default, which is meaningful behavioral context for a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then consequences, then routing guidance, then the counterpart. Five sentences, each carrying distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output tool, the description covers purpose, irreversibility, timing, required confirmation, when-not to use it, the preferred alternative, and the iOS sibling. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both udid and confirm (including const=true and its acknowledgment meaning). The description's 'Requires confirm=true — there is no default' largely restates that, adding only the no-default nuance. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reboot an Android device') and explicitly names the sibling alternatives device_release and ios_reboot. An agent can distinguish this from every other device_* tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not guidance ('Do NOT reach for this to recover from a flaky tool call; try device_release first') and an explicit when ('Reboot only when the device itself is wedged and a human has asked for it'). The alternative and the condition that selects it are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_record_startDevice record startAInspect
Start a screen recording on an Android device. Recording subscribes to the per-device shared device control session (same session that powers live UI streaming and MCP control — never a duplicate device control process). H.264/H.265 video frames are remuxed server-side into an mp4 on the server host. No on-device storage, no FLAG_SECURE limits, no 180 s on-device recorder cap. The recording auto-stops after maxDurationSec (default 300, max 600) so a forgotten stop call cannot fill disk indefinitely. Returns a recordingId to pass to device_record_stop. Only one recording per device at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| maxDurationSec | No | Auto-stop cap in seconds (default 300, max 600) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-readonly, non-destructive, non-idempotent mutation, but the description adds crucial operational context: it reuses the shared device control session, remuxes H.264/H.265 server-side, avoids on-device storage and FLAG_SECURE limits, auto-stops to prevent disk fill, and allows only one recording per device. These are traits an agent cannot infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, every sentence carries non-redundant information: session reuse, remux pipeline, storage guarantees, auto-stop rationale, return value, and concurrency limit. The purpose is front-loaded and the detail is warranted for a stateful recording start tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description states the return value (recordingId) and its use with device_record_stop. Annotations cover safety hints, and the description covers behavior, constraints, and cleanup semantics, leaving no significant gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both udid and maxDurationSec are documented. The description reinforces the maxDurationSec auto-stop behavior and default/max values, but adds little parameter-specific syntax or meaning beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Start a screen recording on an Android device') and distinguishes this from the iOS sibling by platform and from on-device recording by its server-side remux architecture. The agent can identify it as the Android screen-recording start tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the platform (Android) and the action (start screen recording), and routes the agent to device_record_stop via the returned recordingId. It also notes the single-recording-per-device constraint. However, it never explicitly contrasts with sibling recording tools such as android_performance_record_start or ios_record_start, nor states when not to record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_record_stopDevice record stopAInspect
Stop a screen recording started by device_record_start. Closes the remux pipeline cleanly so the mp4 has a valid moov atom. Returns hostPath (already on the server host), sizeBytes, durationMs, and the negotiated codec/resolution.
| Name | Required | Description | Default |
|---|---|---|---|
| recordingId | Yes | recordingId returned by device_record_start |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-destructive, non-idempotent write. The description adds genuine behavioral value beyond that: it explains the clean remux-pipeline closure that yields a valid moov atom, which is important for understanding output integrity. Auth/rate-limit behavior is not covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, then the correctness guarantee, then the return values. No filler; each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description's enumeration of return values (hostPath, sizeBytes, durationMs, codec/resolution) is exactly what an agent needs. Combined with the pairing to the start tool and the moov-atom note, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single recordingId parameter is fully documented in the schema as 'recordingId returned by device_record_start'. The description adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Stop a screen recording') and explicitly ties it to its counterpart 'device_record_start', distinguishing it from the many other stop/record siblings. An agent can identify the tool's role immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly positions the tool as the termination of a flow begun by device_record_start, giving strong implied context for when to call it. It doesn't state explicit exclusions or what to do if no recording is active, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_reflex_probeDevice reflex probeAInspect
SPIKE: arm a local reflex on an Android device — watch the video stream for a brightness jump and fire gamepad button 0 immediately, without a round trip. Measures how fast the loop can close. Returns fire count, decoded frame count, frame intervals, and the detect-to-write time measured server-side. The authoritative end-to-end number must come from the device clock (a page that flips a marker and watches for the button).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| holdMs | No | How long to hold the button before releasing and re-arming (default 120) | |
| durationMs | No | How long to keep the reflex armed (default 8000) | |
| thresholdDelta | No | Mean-luminance jump that counts as a stimulus, 0-255 (default 25) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false. The description adds valuable behavior beyond those: it arms a local reflex, watches the video stream, fires gamepad button 0 immediately, avoids a round trip, and returns fire/frame counts and server-side detect-to-write timing. It does not fully cover permission or rate-limit behavior, but the operational mechanics are well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and avoids obvious filler. It is slightly dense with a caveat about authoritative measurement, but each sentence contributes useful information about operation, return values, or interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description appropriately names what is returned: fire count, decoded frame count, frame intervals, and server-side detect-to-write time. It also warns that the authoritative end-to-end number must come from the device clock. For a complex timing probe, this is strong, though setup prerequisites such as gamepad or video-stream availability are not fully spelled out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so required parameters and defaults are already documented in the schema. The description adds contextual meaning for thresholdDelta ('brightness jump') and holdMs ('hold the button before releasing and re-arming'), but does not provide additional syntax or format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'arm a local reflex on an Android device' that watches a video stream for a brightness jump and fires gamepad button 0. It clearly differentiates from sibling tools like device_gamepad_state, device_video_stream, or android_fps by describing a closed-loop latency probe rather than a simple state read or stream.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: it 'measures how fast the loop can close' and is labelled a SPIKE, which suggests latency/performance investigation. However, it does not explicitly say when to choose this over alternatives such as android_fps or device_gamepad_state, nor does it state prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_releaseDevice releaseAIdempotentInspect
Release your hold on a device so it stops counting against your parallel-device limit. Also tears down your control session for it, so the device stops streaming for you immediately instead of idling out. Call this when finished with a device. Holds also expire automatically after an idle period.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) to release |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive. The description adds meaningful behavior beyond them: it tears down the control session and stops device streaming immediately, and explains the resource-limit accounting. This is useful context about what happens to state, though it doesn't discuss error cases or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct information: the primary effect, the session/streaming consequence, and the usage trigger plus expiry fallback. Front-loaded with the core action and no filler, though slightly more verbose than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutating tool with no output schema and annotations that cover the safety profile, the description supplies the key behavioral facts an agent needs (what is released, that streaming stops, that expiry is automatic). Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single udid parameter, which the schema already documents as the device serial number to release. The description adds no syntax or format detail beyond that, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Release your hold on a device') and goes further by naming the concrete effect ('stops counting against your parallel-device limit') and the session teardown. It is precise and unambiguous, though it does not explicitly name a sibling to contrast with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition ('Call this when finished with a device') and an implicit alternative ('Holds also expire automatically after an idle period'). This tells the agent both when to call it and that an automatic fallback exists, though no explicit 'when not to use' or alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_rotateDevice rotateAInspect
Two-finger rotation (twist) about (x,y) on an Android device — the gesture maps, photo editors and canvas apps listen for. Positive degrees turns clockwise on screen. The fingers follow the ARC of a circle rather than a straight line, which is what a rotation detector needs. Coordinates are PHYSICAL pixels.Pass input="hid" to require the virtual touchscreen: the gesture then reaches the app as real kernel input and fails loudly instead of silently falling back to injected input. That strict path used to be device_uhid_rotate, which stays callable under its old name.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Rotation centre X | |
| y | Yes | Rotation centre Y | |
| udid | Yes | Device serial number (UDID) | |
| input | No | Input path. 'auto' (default) prefers the virtual touchscreen and falls back to injected input. 'hid' requires the virtual touchscreen and fails if the device does not provide one — use it when the gesture must be real kernel input or must fail loudly. | |
| degrees | Yes | Turn in degrees; positive is clockwise on screen | |
| duration | No | Gesture duration in ms (default: 400) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent, closed-world; the description adds meaningful behavior: physical-pixel coordinates, clockwise direction, arc-following finger path, and the strict hid path that reaches the app as real kernel input instead of silently falling back. It also notes the legacy alias device_uhid_rotate, which helps routing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and most sentences carry unique information. It is slightly long for a single gesture, and 'which is what a rotation detector needs' plus the legacy-name sentence are borderline extras, but there is no serious waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter gesture tool with no output schema and full annotation coverage, the description supplies the missing operational context: coordinate units, direction, input-path behavior, and alias. Nothing critical for calling it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters including the input enum and duration default. The description adds one useful semantic beyond the schema: coordinates are PHYSICAL pixels, while the clockwise-degrees note duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific gesture ('Two-finger rotation (twist) about (x,y)') on Android and distinguishes it from straight-line siblings by noting the fingers follow an arc rather than a straight line. An agent can identify the operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context — maps, photo editors and canvas apps listen for this gesture — and explains when to pass input='hid' (real kernel input, fail loudly). It does not explicitly name alternatives like device_pinch or device_two_finger_swipe, so no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_screenDevice screenBInspect
Control device screen power state and rotation. action="on": wake the screen if asleep (idempotent — checks current wakefulness first). action="off": put the screen to sleep (idempotent). action="rotate": set orientation to portrait/landscape/portrait-reverse/landscape-reverse; auto-rotation gets disabled so the new orientation sticks. Returns { ok, action, screenState, orientation? }.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| action | Yes | on/off toggles screen power; rotate sets orientation | |
| orientation | No | Required when action="rotate"; ignored otherwise |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly asserts 'action="on" ... (idempotent — checks current wakefulness first)' and 'action="off" ... (idempotent)', while the annotations declare idempotentHint: false. That is a direct clash between the prose and the structured hint, so per the rubric this is scored 1 and flagged as an annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the tool's purpose, then proceeds action-by-action with no filler, and closes with the return shape. It is slightly long but essentially every clause carries information (idempotency, side effect, return fields) rather than restating the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description usefully supplies the return shape ({ ok, action, screenState, orientation? }) and covers all three parameters and actions. The remaining gap is that it does not address overlap with device_rotate/device_orientation, but an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both enums are documented, so the baseline is 3. The description adds real meaning beyond the schema: it explains the conditional requirement of orientation only for action='rotate', lists the orientation values, and discloses the side effect that auto-rotation is disabled so the new orientation sticks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Control device screen power state and rotation') and enumerates the three actions with their precise effects. It is clear on its own, but it never distinguishes itself from the sibling tools device_rotate, device_orientation, or ios_rotate/ios_orientation, which overlap with the 'rotate' action, so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the per-action breakdown (use action='on' to wake, 'off' to sleep, 'rotate' to set orientation), which is enough to pick an action. However, there is no guidance on when to call device_screen versus the dedicated device_rotate or device_orientation tools, nor any stated prerequisites (e.g., needing an active session/connected device identified by udid).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_screenshotDevice screenshotARead-onlyIdempotentInspect
Take a screenshot of a device (one frame). Returns the JPEG image PLUS, by default, a compact list of labeled UI elements with their bounds (in device-tap coord space — use directly with device_tap, no scaling). The bundled element list eliminates the second roundtrip to device_page_source and removes visual-estimation guesswork for tap targets that appear in the accessibility tree. Prefer device_tap_by_text for elements with a visible label; use these bounds only as a fallback. For continuous observation or debugging a stuck flow, use android_video_stream (live MJPEG) instead of polling screenshots. Set includeElements=false to skip the page-source fetch and return only the image. For routine per-action screen checks, android_mjpeg_screenshot is much faster — it reads the already-running video stream instead of taking a fresh capture, and bundles no element list; reserve this tool for when you need the labeled elements or a full-fidelity frame.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| includeElements | No | Include the compact labeled-element list alongside the image (default: true). Set false to save tokens on screens you only need to look at, not interact with. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, non-destructive profile, and the description adds rich context beyond them: the default page-source fetch, the device-tap coordinate space with no scaling required, and the performance trade-off versus the MJPEG stream. It also explains that includeElements=false skips the page-source fetch, which is behavioral detail not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and return are front-loaded, and every subsequent sentence carries distinct routing, fallback, or parameter-effect information. Despite its length, there is no filler, and each sentence helps the agent choose correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and several close siblings, the description is complete: it explains the return payload, coordinate space, default behavior, token-saving option, and all relevant alternatives. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3, but the description adds meaningful semantics for includeElements by explaining that setting it false skips the page-source fetch and returns only the image, and that the default bundles the labeled element list. The udid parameter is not further explained, but it is self-evident and fully documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Take a screenshot of a device') and immediately clarifies scope ('one frame') plus the dual return (JPEG image + labeled UI elements). It explicitly distinguishes itself from siblings like device_tap_by_text, android_video_stream, and android_mjpeg_screenshot, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use guidance: prefer device_tap_by_text for labeled elements, use returned bounds only as fallback, use android_video_stream for continuous observation, and reserve this tool for labeled-element or full-fidelity needs rather than routine checks. It also names the alternative android_mjpeg_screenshot for routine per-action checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_scrollDevice scrollBInspect
Scroll the screen in a direction on an Android device. Uses video coordinate space automatically. No coordinate math needed.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| amount | No | Fraction of screen to scroll (0.0-1.0, default: 0.5) | |
| direction | Yes | Scroll direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-idempotent, non-destructive, closed-world action, so the safety profile is covered. The description adds one useful trait beyond that ('Uses video coordinate space automatically'), but says nothing about effects on device state, scroll speed, or return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the action front-loaded. The final sentence 'No coordinate math needed' is largely redundant with the preceding coordinate-space claim, but the whole thing is efficiently sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, well-annotated scroll action with a fully documented schema and no output schema, the description is adequate but thin. It omits any indication of when the action is complete, how it interacts with existing scroll position, or how it relates to swipe/scroll-to-element tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid, amount (fraction 0.0-1.0, default 0.5), and the direction enum are fully documented in the schema. The description adds no meaning beyond that and never mentions the amount parameter, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Scroll the screen in a direction on an Android device'), clearly identifying the platform and action. It does not explicitly distinguish itself from close siblings like device_swipe, device_scroll_to_element, or device_gesture_path, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The claim 'No coordinate math needed' hints at why one would pick this over device_swipe or device_gesture_path, but it never states when to use this tool versus those alternatives or any prerequisites. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_scroll_to_elementDevice scroll to elementAInspect
Scroll the screen until an element matching ANY of the provided locators (text, contentDesc, resourceId) appears, then return its coordinates in PHYSICAL pixels. Scrolls up to maxScrolls times.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Visible text of the element (matches text or content-desc) | |
| udid | Yes | Device serial number (UDID) | |
| direction | No | Scroll direction (default: down) | |
| maxScrolls | No | Max scroll attempts (default: 5) | |
| resourceId | No | Resource ID (e.g. com.android.settings:id/switch_widget) | |
| contentDesc | No | Content description / accessibility label |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is already conveyed. The description usefully adds the bounded retry behavior (maxScrolls) and the pixel-unit return, but it does not say what happens when the element is never found (error vs. null result), which is the key behavioral unknown for a scroll-until loop.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and terminating condition, then the return format and retry bound. No filler or repetition of the name/title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Six parameters, no output schema, and the description covers matching semantics, direction/retry bound, and the shape of the return value, which is good. It stops short of describing the failure path when no matching element is found within maxScrolls, leaving the agent to guess the error/empty-result behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning the schema does not: locators are OR-combined ('ANY of the provided locators') and the returned coordinates are in PHYSICAL pixels rather than logical units. That disjunction and unit semantics are the details most likely to be misread from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scroll), the trigger condition (until an element matching ANY provided locator appears), and the result (coordinates in physical pixels). This clearly distinguishes it from the plain device_scroll and from device_find_element/device_wait_for_element, which do not scroll to reach off-screen content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trigger condition ('until an element ... appears') implies when to reach for it, but there is no explicit when-to-use/when-not guidance versus siblings like device_scroll, device_find_element, or device_wait_for_element. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_set_device_languageDevice set device languageAIdempotentInspect
Change the Android device's system language and locale (persistent, affects every app, survives reboot). Uses a bundled locale-change helper with reflection into ActivityManagerNative.updateConfiguration. For per-app testing without changing the whole device, prefer device_launch_app_in_language. Caveats: Samsung One UI / MIUI may re-apply their own locale after a few seconds; Android 14+ requires hidden_api_policy=1 (set automatically); MDM-managed devices may refuse the CHANGE_CONFIGURATION grant.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| script | No | Optional ISO 15924 script tag (e.g. "Hans" / "Hant" for Chinese variants) | |
| country | Yes | ISO 3166-1 alpha-2 country code, e.g. "FR", "US", "JP" | |
| language | Yes | ISO 639-1 language code, e.g. "fr", "es", "en", "ja" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing the implementation approach (bundled locale-change helper with reflection into ActivityManagerNative.updateConfiguration), persistence/survival across reboot, OEM re-application caveats (Samsung One UI / MIUI), Android 14+ hidden_api_policy requirement, and MDM refusal possibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then alternatives, then caveats in a logical order. Three dense sentences; every clause contributes, though a bit packed. Slightly long but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description covers behavior, persistence, failure modes, and the read/write profile is clear from annotations. Return-value expectations are not spelled out, which is a minor gap for a mutation tool that presumably reports success/failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including the optional 'script' tag. The description adds no additional parameter-level detail (no examples or format constraints beyond the schema), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Change the Android device's system language and locale') with scope clarified as system-wide, persistent, and reboot-surviving. It explicitly distinguishes itself from device_launch_app_in_language for per-app testing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (device_launch_app_in_language) and the condition selecting it (per-app testing without changing the whole device). It also states prerequisites/constraints (hidden_api_policy=1 on Android 14+, MDM grants), giving explicit when-to-use and when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_set_locationDevice set locationAIdempotentInspect
Mock GPS coordinates on an Android device for testing location-aware apps. Uses a bundled mock-location helper service (Apache-2.0, auto-installed on first call). API 26+. Scope: every app that reads LocationManager / FusedLocationProviderClient sees the mock fix; apps that check Location.isFromMockProvider (banks, ride-share, Pokémon GO) will detect it and refuse — that's an OS-level signal we can't hide.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| accuracy | No | Optional accuracy in meters (default 5) | |
| latitude | Yes | Latitude in decimal degrees, e.g. 37.7749 | |
| longitude | Yes | Longitude in decimal degrees, e.g. -122.4194 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=true, destructive=false), the description discloses a genuine side effect not captured anywhere else: a bundled Apache-2.0 helper service is auto-installed on first call. It also scopes the blast radius ('every app that reads LocationManager / FusedLocationProviderClient') and names the OS-level detection limitation. This is exactly the context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with zero filler: the capability and audience come first, then the mechanism, requirement, and limitation. Every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the definition covers prerequisites (API 26+), side effects (helper auto-install), and limitations (mock detection). The one notable gap is persistence/reversal semantics — it never says whether the mock persists or that device_clear_location is needed to remove it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with all four parameters documented inline (including the accuracy default of 5). The description adds no syntax, range, or format detail beyond the schema, so the baseline 3 for fully-documented schemas applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mock GPS coordinates on an Android device') plus the use case (testing location-aware apps). This clearly separates it from device_get_location, device_clear_location, and the iOS siblings (ios_set_location, ios_play_location_route).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides real context on when this works and when it doesn't: it lists the API 26+ floor and explicitly warns that apps checking Location.isFromMockProvider (banks, ride-share, games) will detect and refuse the mock. It doesn't explicitly route to device_clear_location for reverting or contrast with device_get_location, but the applicability boundaries are unusually well stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_shellDevice shellCDestructiveInspect
Execute a shell command on an Android device and return output
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| command | Yes | Shell command to execute on the device |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry the safety profile (destructiveHint=true, idempotentHint=false, readOnlyHint=false), so the description could focus on added context. It instead adds only 'return output' and omits what makes this risky: arbitrary command execution, possible permanent device changes, permission/root requirements, and timeout or truncation behavior for long-running commands.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the action front-loaded and no filler. It is appropriately sized, though the brevity is part of why behavioral gaps remain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an arbitrary-code-execution tool flagged destructive with no output schema, the description should warn about irreversibility, required privileges, and result format. None of that is present, so an agent cannot predict consequences before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters ('udid', 'command') fully described, so the schema carries the load. The description adds nothing about command syntax, quoting, multi-command chaining, or output formatting beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Execute) and resource (shell command) scoped to an Android device, and notes that output is returned. It is distinguishable from device_tap/device_key-style siblings, though it does not name a nearby alternative the way the best definitions do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to reach for a raw shell command versus a purpose-built device_* tool, no prerequisites (rooted device? adb access? timeouts?), and no mention of when-not-to-use. 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.
device_swipeDevice swipeAInspect
Swipe from (x1,y1) to (x2,y2) on a device screen. Coordinates are PHYSICAL pixels — same as the bounds in device_page_source (no scaling needed).Pass input="hid" to require the virtual touchscreen: the gesture then reaches the app as real kernel input and fails loudly instead of silently falling back to injected input. That strict path used to be device_uhid_swipe, which stays callable under its old name.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start X coordinate | |
| x2 | Yes | End X coordinate | |
| y1 | Yes | Start Y coordinate | |
| y2 | Yes | End Y coordinate | |
| udid | Yes | Device serial number (UDID) | |
| input | No | Input path. 'auto' (default) prefers the virtual touchscreen and falls back to injected input. 'hid' requires the virtual touchscreen and fails if the device does not provide one — use it when the gesture must be real kernel input or must fail loudly. | |
| duration | No | Swipe duration in ms (default: 500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly false, destructive false, idempotent false), the description discloses two behavioral traits: the default 'auto' path silently falls back to injected input, while 'hid' fails loudly, and the legacy device_uhid_swipe alias still works. It omits any auth/permission prerequisites, but adds real context the annotations do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and coordinate semantics in the first two sentences, then the input-path nuance. The final sentence about the old device_uhid_swipe name is borderline but useful for routing agents holding stale tool names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage, annotations covering the safety profile, and no output schema to explain, the description closes the remaining gaps an agent needs: coordinate units, the default-vs-strict input behavior, and the alias. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value the schema lacks: x/y values are physical pixels matching device_page_source bounds with no scaling, and it explains the intent behind the input enum values ('fails loudly instead of silently falling back').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Swipe ... on a device screen") and pins the coordinate system to physical pixels. However, it does not distinguish this tool from close siblings like device_drag_drop or device_gesture_path, so an agent must infer the boundary from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit condition for the strict path (pass input="hid" when the gesture must be real kernel input or must fail loudly), which is genuine usage guidance. It stops short of saying when to choose device_swipe over device_drag_drop, device_scroll, or device_uhid_input.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_tapDevice tapAInspect
Tap at (x,y) coordinates on a device screen. Coordinates are in DEVICE TAP-COORD SPACE (the "Tap-coord space" dims printed in the device_screenshot footer; same space as device_page_source bounds). First call starts a device control session (~3s).
COORDINATE SOURCES — in priority order:
PRIMARY: device_page_source bounds [L,T][R,B] (or the "Labeled elements" block bundled with device_screenshot) → tap center = ((L+R)/2, (T+B)/2). NO scaling. Pixel-exact.
FALLBACK ONLY (element not in page_source — image-only widget / custom Canvas): visual estimate from the screenshot pixels, scaled with the formula below.
VISUAL → TAP COORDINATE FORMULA (Android):
scale = device_width / rendered_chat_width
tap_x = visual_x × scale
tap_y = visual_y × scale
where device_width is the "Tap-coord space" width from the device_screenshot footer and rendered_chat_width is the "Image" width from the same footer. Both axes share one scale (aspect preserved). The footer prints concrete values per device — never assume any constant.
Skipping the scale on a visual estimate is the #1 cause of taps landing in the wrong place — the agent sees a downscaled image but device_tap expects full-resolution tap-space coords.
Pass input="hid" to require the virtual touchscreen: the gesture then reaches the app as real kernel input and fails loudly instead of silently falling back to injected input. That strict path used to be device_uhid_tap, which stays callable under its old name.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in device tap-coord space (NOT visual screenshot pixels — apply scale = device_width / rendered_chat_width if you started from a visual estimate) | |
| y | Yes | Y coordinate in device tap-coord space (NOT visual screenshot pixels — apply scale = device_width / rendered_chat_width if you started from a visual estimate) | |
| udid | Yes | Device serial number (UDID) | |
| input | No | Input path. 'auto' (default) prefers the virtual touchscreen and falls back to injected input. 'hid' requires the virtual touchscreen and fails if the device does not provide one — use it when the gesture must be real kernel input or must fail loudly. | |
| holdMs | No | How long the contact stays down, in ms. Only applies with input="hid" (default 60ms). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-destructive, non-idempotent, but the description adds substantial context the annotations cannot: the ~3s session startup on first call, the strict-failure semantics of input="hid", and the constraint that holdMs only applies with hid. This is real behavioral disclosure, not restated annotation data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and coordinate space, then structured into clearly labeled coordinate sources and a formula. Dense but mostly earning its space; the trailing aside about the former device_uhid_tap name is historical trivia that adds little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers coordinate derivation, session startup, and input-path behavior thoroughly. It omits what a failed tap returns or how errors surface, a minor gap given annotations already cover the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description exceeds that by supplying the coordinate-source priority order and the Android scaling formula rationale (the '#1 cause of taps landing in the wrong place'), which adds operational meaning beyond the per-parameter schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Tap at (x,y) coordinates on a device screen') and pins down the exact coordinate space, which distinguishes it from device_tap_by_text, device_long_press, and device_two_finger_tap 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit priority order for coordinate sources (page_source bounds first, visual estimate only as fallback) and explains the hid vs auto input path. It does not, however, say when to prefer this tool over siblings like device_tap_by_text or device_find_element, so routing guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_tap_by_textDevice tap by textAInspect
Find a UI element by text, content-description, or resource-id and tap it. NOT always usable — for elements without stable text/contentDesc/resourceId (image-only icons, custom Canvas widgets, dynamic/localized labels), use device_tap(x, y) with bounds from device_page_source instead. Both tools are first-class. When multiple nodes share the same text, this tool ranks candidates so an interactive widget (EditText, Button) wins over a passive label (TextView) — pass resourceId to pin a specific element. Returns after the tap is dispatched; an additional ~150ms focus-settle wait is included when the matched element is an EditText so a following device_type lands in the right field. When nothing in the accessibility tree matches text/contentDesc (and no resourceId is given), it falls back to reading the screen with OCR and taps the matching on-screen text; the reply says when OCR was used. CRITICAL: call this BEFORE device_type sequentially — do NOT issue both in parallel, or the type may race the focus change and write into the previously-focused field.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Visible text of the element (matches text or content-desc) | |
| udid | Yes | Device serial number (UDID) | |
| maxScroll | No | Max auto-scroll attempts before giving up (default: 3) | |
| autoScroll | No | If not found on-screen, scroll to look for it before failing (default: true) | |
| resourceId | No | Resource ID (e.g. com.android.chrome:id/url_bar) | |
| contentDesc | No | Content description / accessibility label | |
| scrollDirection | No | Auto-scroll direction (default: down) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (non-readonly, non-idempotent, non-destructive); the description adds the OCR fallback, the candidate-ranking heuristic favoring interactive widgets, the ~150ms EditText focus-settle wait, and the exact return timing. That is rich behavior beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries operational content (fallback, ranking, timing, sequencing). It is dense and long, and 'Both tools are first-class' is slightly editorial, but nothing is wasted filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param tap tool with no output schema, the description covers matching strategy, fallbacks, return timing, and interaction with the sibling type tool. An agent has everything needed to invoke it correctly and sequence it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics: how text/contentDesc/resourceId interact, that resourceId pins a specific element, and why text is preferred. It doesn't cover maxScroll/autoScroll/scrollDirection beyond the schema, keeping it just short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Find a UI element ... and tap it') and immediately scopes the resource types (text, content-description, resource-id). It clearly differentiates itself from device_tap and device_type by name, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when NOT to use it (image-only icons, Canvas widgets, dynamic/localized labels) and the alternative (device_tap with bounds from device_page_source). It also states the critical sequencing rule relative to device_type (call before, do not parallelize) and the resourceId pinning escape hatch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_terminate_appDevice terminate appADestructiveIdempotentInspect
Force-stop an Android app by package name. Tries the control channel first, falls back to am force-stop, verifies with pidof, and surfaces diagnostic info if the app persists (e.g. Samsung FGS resurrection). Returns { stopped, wasRunning, transport, retryRecommended }.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| packageName | Yes | Android package name to force-stop (e.g. com.android.chrome) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/idempotent/non-readOnly, but the description goes well beyond them: it discloses the control-channel-first strategy, the `am force-stop` fallback, `pidof` verification, and that diagnostics surface when an app persists (Samsung FGS resurrection). That is exactly the kind of failure-mode context an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with zero filler; the core action leads and the mechanism/return details follow. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully enumerates the return fields (stopped, wasRunning, transport, retryRecommended) and explains the fallback behavior. It omits prerequisites such as required device permissions or whether root is needed for the force-stop path, leaving a small gap for a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented with an example (com.android.chrome), so the schema carries the semantic load. The description adds only the phrase 'by package name', which is baseline-level reinforcement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Force-stop an Android app by package name'), which cleanly separates it from ios_terminate_app, device_uninstall_app, and device_clear_app_data without needing to name them. The platform and package-name scoping make the target unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the internal fallback chain but never states when to choose this tool over alternatives like device_uninstall_app (remove) or device_clear_app_data (reset state). Usage is implied by the verb rather than explicitly guided, so a 3 is warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_toggle_bluetoothDevice toggle bluetoothBIdempotentInspect
Enable or disable Bluetooth on an Android device.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| enable | Yes | true to enable Bluetooth, false to disable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation as not read-only, idempotent, and non-destructive. The description adds no further behavioral context beyond restating the toggle operation and platform; it does not cover side effects, required permissions, or state-change behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the core purpose without any wasted words. It is appropriately sized for a simple two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple toggle tool with full schema coverage and annotations covering the safety profile, the description is nearly complete. It could be more helpful by noting prerequisites or expected behavior, but no output schema exists and the structured fields carry most of the operational detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (udid and enable) are fully documented in the schema. The description adds no parameter-specific semantics beyond what the schema already provides, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (enable or disable) and resource (Bluetooth) on a specific platform (Android device). It clearly distinguishes itself from siblings such as device_toggle_wifi.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives, nor does it mention prerequisites such as device connection or ADB availability. Usage is only implied by the tool's purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_toggle_wifiDevice toggle wifiBIdempotentInspect
Enable or disable WiFi on an Android device.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| enable | Yes | true to enable WiFi, false to disable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered and the description is consistent with them (setting a state is idempotent). The description adds only the platform context and no extra behavioral detail such as permission or session requirements, which is acceptable given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is efficient, though its brevity leaves room for useful additions rather than being maximally informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter toggle with full schema coverage, rich annotations, and no output schema, the description is sufficient for correct invocation. It could still note the need for a connected device, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents udid and the enable boolean semantics. The description adds no syntax or format detail beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb pair (enable/disable) and resource (WiFi) scoped to an Android device, so the operation is unambiguous. It does not name or contrast with its obvious sibling device_toggle_bluetooth, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus alternatives, no mention of prerequisites (an active device session / valid udid), and no indication of when-not to use it. The agent must infer all usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_two_finger_swipeDevice two finger swipeAInspect
Two-finger swipe from (x1,y1) to (x2,y2) on an Android device — a two-finger scroll/pan. Both fingers travel the vector in parallel, offset perpendicular to it so one never runs through the other. Use where a one-finger swipe does the wrong thing, e.g. tilting a map or scrolling a view that pans with one finger. Coordinates are PHYSICAL pixels.Pass input="hid" to require the virtual touchscreen: the gesture then reaches the app as real kernel input and fails loudly instead of silently falling back to injected input. That strict path used to be device_uhid_two_finger_swipe, which stays callable under its old name.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start X | |
| x2 | Yes | End X | |
| y1 | Yes | Start Y | |
| y2 | Yes | End Y | |
| gap | No | Pixels between the two contacts (default: 120) | |
| udid | Yes | Device serial number (UDID) | |
| input | No | Input path. 'auto' (default) prefers the virtual touchscreen and falls back to injected input. 'hid' requires the virtual touchscreen and fails if the device does not provide one — use it when the gesture must be real kernel input or must fail loudly. | |
| duration | No | Gesture duration in ms (default: 400) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false), and the description adds genuinely new behavior: both fingers travel the vector offset perpendicular so they never overlap, coordinates are physical pixels, and the 'hid' path 'fails loudly instead of silently falling back to injected input.' The failure semantics are the most valuable disclosure. It stops short of documenting duration/gap defaults or return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the gesture definition, then usage, then the input-path caveat. Dense but mostly earning its place; the input='hid' explanation is somewhat redundant with the schema field description and the legacy-name note is a minor tangent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation-ish gesture tool with no output schema, the description covers geometry, coordinate units, usage conditions and the strict-input failure mode. The main gap is that gap/duration defaults are left to the schema, but that is acceptable given 100% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: coordinates are explicitly PHYSICAL pixels, and the gap parameter's role (perpendicular offset between contacts) is explained. The input='hid' explanation largely duplicates the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('two-finger swipe from (x1,y1) to (x2,y2) on an Android device') and clarifies it is a scroll/pan gesture. It distinguishes itself from the one-finger swipe and from two-finger tap siblings by describing the parallel-offset finger geometry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule: 'Use where a one-finger swipe does the wrong thing, e.g. tilting a map or scrolling a view that pans with one finger.' It also says when to pass input='hid'. It does not, however, compare against other multi-touch siblings like device_gesture_path or device_pinch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_two_finger_tapDevice two finger tapAInspect
Two-finger tap at (x,y) on an Android device — zooms OUT one step in Maps and is the accessibility/secondary gesture in several apps. Both fingers land either side of the point and lift without moving. Coordinates are PHYSICAL pixels.Pass input="hid" to require the virtual touchscreen: the gesture then reaches the app as real kernel input and fails loudly instead of silently falling back to injected input. That strict path used to be device_uhid_two_finger_tap, which stays callable under its old name.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Tap centre X | |
| y | Yes | Tap centre Y | |
| gap | No | Pixels between the two contacts (default: 120) | |
| udid | Yes | Device serial number (UDID) | |
| input | No | Input path. 'auto' (default) prefers the virtual touchscreen and falls back to injected input. 'hid' requires the virtual touchscreen and fails if the device does not provide one — use it when the gesture must be real kernel input or must fail loudly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic safety profile (readOnly=false, destructive=false, idempotent=false); the description adds genuinely new behavior: auto mode silently falls back to injected input, hid mode fails loudly, and the rename from device_uhid_two_finger_tap. It also discloses the physical gesture mechanics (fingers land either side, lift without moving) that determine whether the tap is recognized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and gesture semantics are front-loaded and every clause carries information, including the migration note for existing callers. It is slightly over-stuffed — the hid paragraph restates much of the schema's enum description — and has a formatting glitch ('pixels.Pass') that hurts readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, no-output-schema input tool this covers purpose, gesture mechanics, coordinate units, input-path selection, and failure behavior, which is close to complete. It does not mention device state prerequisites (screen on, target app foregrounded) that would affect success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds meaning the schema lacks: coordinates are 'PHYSICAL pixels' (the schema only says 'Tap centre X/Y'), and it reinforces the input enum's fail-loud contract. The gap parameter is left entirely to the schema, so it isn't a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Two-finger tap at (x,y) on an Android device') and immediately distinguishes itself from the single-finger tap and two-finger swipe siblings by describing the two-contact geometry. The Android qualifier also separates it from ios_two_finger_tap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context — 'zooms OUT one step in Maps and is the accessibility/secondary gesture in several apps' — and explains when to pick the strict input='hid' path versus the default auto path. It does not explicitly say when to prefer this over device_tap or device_two_finger_swipe, so it falls short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_typeDevice typeAInspect
Type text into the focused field on Android. CRITICAL: call this AFTER device_tap / device_tap_by_text completes — do NOT issue the focusing tap and this type in parallel, or the type will race the focus change and land in the previously-focused field (observed on a banking-app login: username+password concatenated into username box). method="keys" (default): decompose ASCII to keycode events (DOWN/UP with shift) — most reliable; non-ASCII chars (CJK/emoji) auto-fall-back to IME injection for that segment. method="ime": IME injection only — full UTF-8 in one shot, but Samsung IMEs intercept ./@/_ as autocomplete/action shortcuts and may trigger system gestures. method="shell": shell input text — slowest, and Samsung IME drops @/./_. Optional clearFirst wipes the field first; pressKey sends a keycode after typing. All three methods inject — there is no kernel input path for text, and no tool that types a whole string as one. To get text in as real kernel input you compose the reports yourself with device_uhid_create plus device_uhid_input (or device_uhid_key_press per character); only worth it when the app filters injected text.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type | |
| udid | Yes | Device serial number (UDID) | |
| method | No | Injection method: keys | ime | shell (default: keys — most reliable for ASCII; non-ASCII auto-falls-back to IME). | |
| pressKey | No | Keycode to press AFTER typing (e.g. ENTER, TAB, SEARCH) — handles common "type then submit" flows in one call | |
| clearFirst | No | Clear the field before typing — reads its current length from the UI and sends exactly that many backspaces (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-obvious behavior far beyond the annotations: the focus-race hazard, method tradeoffs (keys vs ime vs shell), Samsung IME quirks with `.`/`@`/`_`, non-ASCII auto-fallback, and clearFirst's backspace-count mechanics. Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false), so the description carries the real burden and does so well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the CRITICAL sequencing warning, then systematically covers methods. It is dense and long, but nearly every clause carries actionable detail; the only minor cost is that the method taxonomy is packed into one block rather than being skimmable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no output schema, the description covers everything an agent needs: preconditions, method selection, side effects (injected text is detectable, no kernel path), and escalation path to uhid tools. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: it explains method semantics and defaults, the non-ASCII fallback behavior, and pressKey's 'type then submit' purpose. It complements rather than repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+platform ('Type text into the focused field on Android'), immediately distinguishing it from the iOS/Web typing siblings (ios_send_keys, webpage_type, web_type). An agent can tell exactly what this does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the precondition ('call this AFTER device_tap / device_tap_by_text completes') and the anti-pattern ('do NOT issue the focusing tap and this type in parallel'), with a concrete failure observed in production. It also routes to alternatives (device_uhid_create / device_uhid_input) for the filtering-app case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_uhid_createDevice UHID createAInspect
Register a virtual HID device on an Android device via the device control channel. descriptor is base64-encoded HID report descriptor bytes. reportLen is the exact byte-length of every INPUT report for this id (used for validation). After CREATE, Android needs ~250ms before the device accepts INPUT — this delay is applied automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UHID device id (s32, unique per session) | |
| name | Yes | Human-readable device name (UTF-8) | |
| udid | Yes | Device serial number (UDID) | |
| vendorId | Yes | USB vendor ID (signed s16) | |
| productId | Yes | USB product ID (signed s16) | |
| reportLen | Yes | Expected byte-length of each INPUT report | |
| descriptorBase64 | Yes | HID report descriptor as base64 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnly=false, destructive=false, idempotent=false), so the description's job is to add context, which it does: it discloses the auto-applied ~250ms post-CREATE settling delay and the validation role of reportLen. It stops short of stating failure/conflict behavior (e.g., duplicate id handling).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: identity/action first, then the two non-obvious parameters, then the timing behavior. Front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers the essential creation semantics plus the timing behavior an agent needs. It omits what happens on id collisions or whether an existing device must be destroyed first, which would fully close the loop for a non-idempotent mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real meaning beyond the schema strings: it clarifies that descriptor is the base64 report descriptor bytes and that reportLen is the exact per-report INPUT length used for validation. This contextualizes why those two fields matter rather than merely restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Register a virtual HID device on an Android device via the device control channel'), and the lifecycle language ('After CREATE ... accepts INPUT') makes clear it is the setup step of the UHID family. It does not name sibling tools like device_uhid_input or device_uhid_destroy directly, so sibling differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the CREATE-then-INPUT lifecycle referenced in the delay sentence, which tells the agent this precedes input injection. However, there is no explicit 'when to use this vs. alternatives' or a named downstream tool ('use device_uhid_input after this'), so guidance remains inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_uhid_destroyDevice UHID destroyADestructiveIdempotentInspect
Remove a virtual HID device registered via device_uhid_create.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UHID device id to destroy | |
| udid | Yes | Device serial number (UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false and openWorldHint=false, so the safety profile is covered. The description adds only that the target is a virtual HID device; it does not say what happens to an in-flight input stream, whether the id must currently exist, or whether removal is immediate. With annotations carrying the safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence that front-loads the verb and resource with zero waste. Nothing redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter teardown tool with full schema coverage and annotations declaring destructiveness and idempotency, the description is nearly complete. The only gap is that it does not state what the caller should expect on success or when the device does not exist, but that is minor given the annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with both parameters (udid, id) fully documented in the schema, so the baseline is 3. The description adds no extra syntax or format detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Remove) and resource (virtual HID device) and ties it to the lifecycle counterpart device_uhid_create, so the agent understands this is the teardown step. It distinguishes reasonably well from sibling tools like device_uhid_input or device_uhid_key_press, though it never explicitly says 'unlike those, this only unregisters.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'registered via device_uhid_create' implies the tool is used to clean up previously created virtual HID devices, which is useful implied guidance. However, there is no explicit when/when-not statement, no mention of preconditions (e.g., device must exist), and no named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_uhid_gamepad_stateDevice UHID gamepad stateAInspect
Set gamepad state via UHID (id=3). On first call, CREATE is sent automatically. lx/ly/rx/ry are u16 LE stick axes (0-65535, center=32767); lt/rt are u16 LE triggers (0-32767, 0=released). dpad is a u8 hat (1=N,2=NE,3=E,4=SE,5=S,6=SW,7=W,8=NW,0=center). buttons is a u16 LE bitmask. The pad presents as a DualShock 4, so the bit order is that controller's, NOT the browser Gamepad API order: bit0=X/square, bit1=A/cross, bit2=B/circle, bit3=Y/triangle, bit4=L1, bit5=R1, bit6=L2, bit7=R2, bit8=share/select, bit9=options/start, bit10=L3, bit11=R3, bit12=PS/guide, bit13=touchpad. Note the face buttons are rotated: square is bit0 and cross is bit1. Bits 14-15 have no effect. device_gamepad_state is the higher-level twin — W3C standard button/axis arrays plus a selectable controller profile, with the bit packing done for you. Prefer it unless you specifically need to send this exact raw report.
| Name | Required | Description | Default |
|---|---|---|---|
| lt | No | Left trigger (0-32767, default 0) | |
| lx | No | Left stick X (default 32767 = center) | |
| ly | No | Left stick Y (default 32767 = center) | |
| rt | No | Right trigger (0-32767, default 0) | |
| rx | No | Right stick X (default 32767 = center) | |
| ry | No | Right stick Y (default 32767 = center) | |
| dpad | No | D-pad hat value 0-8 (default 0 = center) | |
| udid | Yes | Device serial number (UDID) | |
| buttons | No | Button bitmask u16 (default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not destructive, not idempotent). The description goes well beyond that by disclosing a hidden side effect (implicit CREATE on first call) and a genuinely surprising behavior (DualShock 4 emulation means face buttons are rotated relative to the Gamepad API, square=bit0, cross=bit1; bits 14-15 are inert). This is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every clause carries load-bearing information — axis ranges, trigger ranges, hat mapping, bit order, and the alternative — with the verb and operation id front-loaded. There is no filler sentence, and the caveat about button rotation is emphasized in its own sentence where it matters most.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, no-output-schema tool that writes a raw HID report, the description covers the encoding scheme, lifecycle (implicit create), the emulated controller identity, and the routing decision versus the higher-level sibling. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description supplies meaning the schema lacks entirely: the button bitmask is undocumented per-bit in the schema (only 'Button bitmask u16') and the description enumerates all 14 bits including the rotated face buttons. It also gives the dpad hat direction mapping (1=N ... 8=NW, 0=center) and confirms the u16 LE encoding for the axes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Set gamepad state via UHID (id=3)', and immediately distinguishes itself from the sibling device_gamepad_state ('the higher-level twin ... Prefer it unless you specifically need to send this exact raw report'). An agent can tell this apart from device_uhid_input, device_uhid_create, and device_gamepad_state 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (device_gamepad_state) and states the exact condition that selects this tool: needing to send the raw report yourself. It also pre-empts a prerequisite question by noting 'On first call, CREATE is sent automatically', so the agent knows no separate create step is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_uhid_inputDevice UHID inputAInspect
Send a HID input report to a previously created UHID device (device_uhid_create). report is base64-encoded. Its byte-length must exactly match the reportLen declared at CREATE time. This is a generic raw-report primitive for any created UHID device (keyboard, mouse, gamepad) and is not text-aware. Prefer device_type to type a string; use this only when you need to compose the exact reports yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UHID device id (must match a prior device_uhid_create call) | |
| udid | Yes | Device serial number (UDID) | |
| reportBase64 | Yes | HID input report bytes as base64 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=false). The description adds substantive context beyond them: the base64 encoding requirement and the hard constraint that byte-length must exactly match the reportLen declared at CREATE time. It does not state what happens on a length mismatch (error vs. silent drop), 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the action and device relationship, followed by the payload constraint, the scope limitation, and the routing advice. Every sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema mutation primitive, the definition covers prerequisite, payload encoding, payload-length constraint, and when to prefer the alternative. The only minor gap is error/failure behavior on an invalid report length, which is not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description meaningfully enriches the parameters by explaining that reportBase64 is base64 and that its byte-length must match the CREATE-time reportLen — a cross-call constraint the schema cannot express. It adds real semantics beyond the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Send) and resource (HID input report) tied to a previously created UHID device, and names the sibling it depends on (device_uhid_create). It also distinguishes itself from device_type by declaring it is a 'generic raw-report primitive ... not text-aware.' An agent can place it precisely in the UHID tool family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Prefer device_type to type a string; use this only when you need to compose the exact reports yourself,' naming the alternative and the exact condition that selects this tool. It also states the prerequisite (prior device_uhid_create call), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_uhid_key_pressDevice UHID key pressAInspect
Send a key press/release via UHID keyboard (id=2). Uses the device control protocol's boot keyboard interface. On first call, CREATE is sent automatically. modifiers bitmask: bit0=LCtrl, bit1=LShift, bit2=LAlt, bit3=LMeta, bit4=RCtrl, bit5=RShift, bit6=RAlt, bit7=RMeta. keycode is the HID usage ID (0x04=a, 0x28=Enter, 0x29=Escape). Send keycode=0 with modifiers=0 to release. device_key is the higher-level twin: it accepts named keys (HOME, ENTER, ...) instead of raw usage IDs and falls back automatically when a key needs policy-level handling. Prefer device_key for normal automation; reach for this one only when injected key events are filtered.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| keycode | No | HID usage key code (default 0 = no key) | |
| modifiers | No | Modifier bitmask (default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/destructive/idempotent hints, but the description adds genuinely non-obvious behavior: CREATE is auto-sent on first call (implicit device instantiation) and the release protocol (keycode=0, modifiers=0). It does not mention cleanup/lifecycle pairing with device_uhid_destroy or failure modes, so a small gap remains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the routing advice closes the paragraph, with no filler sentences. The bitmask enumeration is dense but earns its place as the only reference for a bitmask parameter; a compact table would be marginally cleaner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param, no-output-schema tool with annotations covering the safety profile, the description supplies the protocol mechanics, parameter encoding, and sibling routing an agent needs to call it correctly. Lifecycle cleanup and error behavior are the only omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description goes well beyond it: it decodes the modifiers bitmask bit-by-bit, gives example HID usage IDs (0x04=a, 0x28=Enter, 0x29=Escape), and specifies the release convention. That is material meaning the schema does not supply, especially with zero enums defined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send a key press/release via UHID keyboard (id=2)') and immediately situates it within the device control protocol's boot keyboard interface. An agent can distinguish it from device_key and device_uhid_input 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes: 'Prefer device_key for normal automation; reach for this one only when injected key events are filtered.' It names the alternative and states both the default case and the narrow exception that selects this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_uhid_mouse_moveDevice UHID mouse moveAInspect
Move the virtual mouse and/or click buttons on an Android device. Hardware mouse input via the device control protocol (HID mouse id=1). On first call, CREATE is sent automatically then a 250ms delay is applied. dx/dy are signed relative deltas (-127..127). buttons bitmask: bit0=left, bit1=right, bit2=middle.
| Name | Required | Description | Default |
|---|---|---|---|
| dx | Yes | Relative X delta (-127..127) | |
| dy | Yes | Relative Y delta (-127..127) | |
| udid | Yes | Device serial number (UDID) | |
| wheel | No | Vertical scroll wheel delta (default 0) | |
| hWheel | No | Horizontal scroll wheel delta (default 0) | |
| buttons | No | Button bitmask (bit0=left, bit1=right, bit2=middle, default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic safety profile (not read-only, not idempotent, not destructive). The description adds genuinely useful behavior beyond that: first call auto-sends CREATE then waits 250ms, and the input travels over a specific HID protocol channel. It leaves open whether device_uhid_destroy must later be called.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and then the behavioral caveat and parameter semantics. No filler, though the bitmask restatement is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateful HID input tool with no output schema, the description covers the essential lifecycle fact (auto-CREATE + 250ms delay) and input encoding. The main remaining gap is the teardown story relative to device_uhid_destroy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (dx, dy, wheel, hWheel, buttons, udid) are already documented in the schema. The description's delta-range and button-bitmask notes duplicate that content rather than extending it, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (move/click) and resource (virtual mouse on an Android device), and the HID-mouse-id=1 channel distinguishes it from touch-based siblings like device_tap or device_swipe. It does not name those siblings explicitly, so differentiation relies on inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to prefer hardware mouse input over touch gestures (device_tap, device_swipe) or over the raw device_uhid_input sibling. Usage is only implied by 'hardware mouse input via the device control protocol', with no exclusions or prerequisites for the UHID lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_uninstall_appDevice uninstall appBDestructiveIdempotentInspect
Uninstall an app from an Android device by package name.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device serial number (UDID) | |
| packageName | Yes | Package name to uninstall (e.g. com.example.app) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the agent knows this mutates the device and is repeatable. The description adds nothing beyond that—it never states what is destroyed (app data, cache), whether the app must be stopped first, or that the operation may be irreversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with a clear verb-resource-target structure and zero filler. Nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with rich annotations and no output schema, the one-line description is minimally adequate. However, it omits practical context such as data-loss implications and the relationship to device_terminate_app, which an agent choosing between the two would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both udid and packageName are fully documented inline; baseline 3 applies. The phrase 'by package name' loosely echoes the packageName parameter but adds no format or syntax detail beyond the schema's own example (com.example.app).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (uninstall) and resource (app) and scopes it to 'an Android device by package name', which implicitly distinguishes it from the sibling ios_uninstall_app. The identification method (package name) also sharpens the purpose, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given. It does not explain how it differs from the closely related sibling device_terminate_app (terminate a running app vs. fully remove it), nor does it mention prerequisites such as the app being installed or a device being connected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_wait_for_elementDevice wait for elementARead-onlyIdempotentInspect
Poll the UI until an element with the given text or resource-id appears, or timeout. Returns element coordinates in PHYSICAL pixels (ready for device_tap).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Visible text or content-desc to wait for | |
| udid | Yes | Device serial number (UDID) | |
| timeout | No | Max wait time in ms (default: 10000) | |
| interval | No | Poll interval in ms (default: 1000) | |
| resourceId | No | Resource ID to wait for (e.g. com.android.settings:id/switch_widget) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's value-add is disclosing the polling behavior and the return contract: coordinates are in PHYSICAL pixels and directly consumable by device_tap. It stops short of describing what happens on timeout (error vs null), which would complete the picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two lean sentences with zero waste: the polling behavior and matching criteria come first, then the return contract. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by explaining the return value (element coordinates in physical pixels) and the downstream consumer (device_tap). The only gap is timeout/failure semantics for a tool whose primary risk is a negative result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so eaach parameter is already documented. The description reinforces the two match modes (text or resource-id) but adds no syntax or default information beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (poll) plus the resource and match criteria (element with given text or resource-id), and clarifies it waits until appearance or timeout. It implicitly distinguishes itself from device_find_element (which likely returns immediately), though it never names that sibling, keeping it just 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'poll... until... or timeout' implies this is the tool for waiting on asynchronous UI, but there is no explicit when-to-use versus device_find_element or device_scroll_to_element, nor any exclusions. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_frame_imageFigma frame imageARead-onlyIdempotentInspect
Render one Figma frame (or any node) to a PNG so you can look at the design. Pass the Figma link that includes node-id (right-click the frame in Figma → Copy link), or file_key + node_id. Optional width resizes the PNG to a target pixel width (e.g. the width of a device screenshot you want to compare against; max 2000); scale (0.5–4, default 2) controls how sharp Figma renders it. Returns the image plus one text line with the frame name, original size and returned size. Uses the calling user's stored Figma token; returns an actionable error if Figma is not configured. TIP: compare by eye against a device screenshot — a pixel diff against a mockup is not meaningful.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Figma link to the frame, including node-id (figma.com/design/<key>/...?node-id=12-34). | |
| scale | No | Render scale, 0.5–4 (default 2). | |
| width | No | Resize the PNG to this pixel width (100–2000), keeping aspect ratio. | |
| node_id | No | Node id, "12:34" or "12-34". Needed with file_key. | |
| file_key | No | Figma file key, when not passing url. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive). The description adds beyond them: it discloses the auth model ("calling user's stored Figma token"), the failure mode ("actionable error if Figma is not configured"), and the return shape (image plus a text line with frame name and sizes). That is meaningful context, though render latency/rate behavior is not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first clause, then packs inputs, return value, auth, and a practical tip. A few details (max 2000, 0.5–4 default 2) duplicate the schema verbatim, which is mild redundancy, but overall it is tight and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-required-param, no-output-schema render tool, it covers inputs, auth, error behavior, and a correctness caveat, which is close to complete. The only gap is the lack of explicit routing against the sibling figma_frame_spec, which shares the Figma domain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns more: it explains *why* width matters ("e.g. the width of a device screenshot you want to compare against") and that scale "controls how sharp Figma renders it" with default 2, adding intent beyond the schema's bare ranges.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Render one Figma frame (or any node) to a PNG". It adds the reason ("so you can look at the design") and distinguishes itself from the sibling figma_frame_spec by being the image-producing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: how to obtain the link (right-click → Copy link), the url vs file_key+node_id paths, and a tip about comparing by eye. However, it never names or excludes the sibling figma_frame_spec or visual_compare, so the agent must infer when an image is preferable to a spec dump.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_frame_specFigma frame specARead-onlyIdempotentInspect
Read the design details of a Figma frame as compact JSON: for each visible node its id, name, type, bounds (x/y/w/h relative to the frame, in design units), text, font (family/size/weight/lineHeight), solid fills and strokes as #RRGGBB, corner radius, auto-layout mode/padding/spacing, and applied style names. Use it to check copy, colours, fonts and spacing against what the device actually shows (page source / element bounds). Pass the Figma link including node-id, or file_key + node_id. max_depth (default 6) and max_nodes (default 400) bound the output; "truncated": true means more existed. Uses the calling user's stored Figma token. TIP: design units are points/dp at 1x — scale by the device pixel ratio before comparing bounds.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Figma link to the frame, including node-id. | |
| node_id | No | Node id, "12:34" or "12-34". Needed with file_key. | |
| file_key | No | Figma file key, when not passing url. | |
| max_depth | No | Tree depth below the frame (default 6). | |
| max_nodes | No | Max nodes returned (default 400). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description still adds real behavior: it uses the calling user's stored Figma token (auth requirement), discloses truncation semantics ('truncated': true means more existed), and states that design units are points/dp at 1x and must be scaled by the device pixel ratio. None of that is available from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned, then usage, then input shapes, then output bounds, and finally the pixel-ratio TIP. The long field enumeration is dense but each item carries information an agent needs to interpret the payload, so nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing return values and does so in detail, plus covers auth, truncation, and unit-scaling. Nothing an agent needs to call and correctly interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further: it clarifies the two accepted input shapes (a Figma link including node-id, or file_key + node_id) and explains what max_depth/max_nodes actually control and what truncation implies. It adds genuine cross-parameter meaning beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the design details of a Figma frame as compact JSON') and enumerates exactly what the payload contains (id, name, type, bounds, text, font, fills/strokes, corner radius, auto-layout, style names). This cleanly separates it from the sibling figma_frame_image, which returns a picture rather than structured design data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case: verify copy, colours, fonts and spacing against what the device actually shows (page source / element bounds). That is a clear 'when to use' context, but it never names figma_frame_image as the alternative nor states when not to reach for this tool, so it falls short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firebase_install_releaseFirebase install releaseAIdempotentInspect
Download a build from Firebase and install it on a connected device in one step. The build is also added to the user's app library, so installing it on further devices afterwards needs only app_install. Use firebase_list_releases to pick a releaseId — "the latest build" is the first entry it returns.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID to install on | |
| appId | Yes | Firebase app id, from firebase_list_apps | |
| releaseId | Yes | Release id from firebase_list_releases | |
| projectNumber | Yes | Firebase project number, from firebase_list_apps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply readOnlyHint=false, idempotentHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description still adds meaningful behavior: the build is added to the user's app library as a side effect, which is not inferable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and scope, followed by a useful provenance pointer. No wasted words, no repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete enough for a four-param, no-output-schema tool: the action, side effect, and the source of releaseId are covered. It doesn't specify whether the device must be a specific platform or what happens on install failure, but those are minor for this context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already names all four parameters and their sources. The description only adds hints for releaseId sourcing (firebase_list_releases), which is marginal value above the schema's own description 'Release id from firebase_list_releases'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound verb+resource: download a Firebase build and install it on a connected device in one step. It clearly distinguishes itself from the sibling app_install by note that the build becomes part of the app library and later installs only need app_install.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to firebase_list_releases for obtaining a releaseId, and clarifies 'the latest build' is the first entry it returns. This is actionable when-to-use guidance tied to the parameter source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firebase_list_appsFirebase list appsARead-onlyIdempotentInspect
List the Android and iOS apps in the connected Firebase account. Returns app id, display name, platform, and the package name / bundle id for each, plus the project number needed by the other Firebase tools. Call this first when the user names an app rather than an app id.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/open-world, so the safety profile is covered. The description adds the actual return contents and notes the project number is required by downstream Firebase tools, which is useful workflow context. It stops short of mentioning pagination or account/auth prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose, then output, then the calling rule. Nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and it does so well, listing app id, display name, platform, package/bundle id, and project number. Missing only edge details like pagination or the connected-account requirement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly adds no invented parameter guidance and instead spends its words on return shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the Android and iOS apps') and scopes it to the connected Firebase account, which distinguishes it from the device-level app_list / ios_list_apps / device_list_apps siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering rule: 'Call this first when the user names an app rather than an app id.' That is exactly the decision an agent needs to make before invoking id-based Firebase tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firebase_list_releasesFirebase list releasesARead-onlyIdempotentInspect
List recent builds distributed for one Firebase app, newest first. Returns release id, version, build number, binary type, release date, and release notes. Releases marked installable:false cannot be put on a device — the reason is included. Use firebase_list_apps to get appId and projectNumber.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | Firebase app id, e.g. "1:1234567890:android:abc123" | |
| limit | No | How many releases to return (1-100, default 25) | |
| projectNumber | Yes | Firebase project number, from firebase_list_apps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds real domain behavior beyond them: releases with installable:false cannot be put on a device and the reason is included. Return ordering (newest first) is also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool lists, then return fields, then the installable caveat, then the prerequisite lookup. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (release id, version, build number, binary type, date, notes) and the installable reason. Complete enough to call correctly, though no pagination or error behavior is mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so appId, projectNumber and limit are already documented in the schema. The description adds nothing about the limit parameter or format beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List recent builds distributed for one Firebase app') with scope ('newest first') and enumerates the returned fields. It is clearly distinguishable from firebase_list_apps and firebase_install_release.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to firebase_list_apps to obtain the required appId and projectNumber, which is the key prerequisite. It stops short of stating when NOT to use this tool versus firebase_install_release, 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.
flow_component_usageFlow component usageARead-onlyIdempotentInspect
List every test step that references a given component (fragment) via a live COMPONENT_REF. Backs the deletion guard: a component in use cannot be deleted. Returns the referencing recording id, display id, name, and step index. The component must be a fragment owned by the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| componentId | Yes | Component (fragment) recording ID to look up usage for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the full safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds value beyond them: it discloses the returned fields, the deletion-guard relationship, and an authentication/ownership requirement ('must be a fragment owned by the authenticated user').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action, then purpose, then return shape, then constraint. No filler; each sentence contributes distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-parameter query whose annotations already cover safety, the description supplies everything needed: the action, its purpose, the return fields (compensating for the absent output schema), and the ownership precondition. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single componentId parameter is already documented, setting a baseline of 3. The description goes further by constraining the parameter's validity (it must be a fragment owned by the authenticated user), adding meaning beyond the schema's generic 'recording ID' phrasing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (test steps referencing a component via a live COMPONENT_REF), which clearly distinguishes it from sibling mutation tools like flow_recording_insert_component or flow_recording_detach_component. An agent knows exactly what this returns 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the operational context well: it 'backs the deletion guard,' implying you call it to check whether a component is safe to delete. However, it does not explicitly name alternative tools or state when-not-to-use, so the routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_actionFlow recording actionAInspect
Perform and record one action step on the device. Performs the action and records it with automatic page source + element capture. Coordinates are in video / iOS-automation space — use flow_recording_start's windowSize as the reference.
Actions:
tap / doubleTap / longPress / swipe — gesture actions (require x,y; swipe also needs toX,toY)
sendKeys — type text into the focused field
keyPress — press an Android keycode (e.g. 3=HOME, 4=BACK)
wait — pause for waitMs milliseconds
pressButton — press a hardware button by name ('home', 'volumeUp', 'volumeDown', 'lock'). Performed live on the device during recording. Android maps to hardware keycodes; iOS invokes the native hardware-button command.
assert — record a UI assertion check (no device gesture). Identifies the target element at (x,y), then at replay time verifies the assertion condition. Assertion failures mark the step as FAILED and surface the mismatch in errorMessage. Makes the recording a real verifiable test. assertType 'visualMatch' is the exception: it takes no x/y and no expected, and at replay time compares the whole screen against the screenshot captured now.
scrollToElement — record a scroll-until-visible checkpoint (no device gesture). Binds the element at (x,y) now; at replay time it scrolls until that element is back on screen, searching downwards first and then upwards, and reports the element's live coordinates. Use it before acting on something whose position varies between runs (a row in a long list, a button below the fold). This FAILS the run if the element never comes into view, because the step exists to bring a target into view for the step that follows it. Note you do NOT need a separate step to resolve an element before acting on it — every element-bound action re-resolves its own target at replay; use scrollToElement only when the target is genuinely off screen, and assert/exists when its absence should fail the run.
appLaunch — launch an app mid-flow by appId (Android package name, iOS bundle id; optional appActivity on Android). Launches live during recording and relaunches the same app at replay time. Use it to switch apps or to return to the app under test after leaving it.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X coordinate (tap/doubleTap/longPress/swipe start; assert & scrollToElement target element) | |
| y | No | Y coordinate (tap/doubleTap/longPress/swipe start; assert & scrollToElement target element) | |
| toX | No | Swipe end X | |
| toY | No | Swipe end Y | |
| text | No | Text to type (sendKeys) | |
| appId | No | App to launch for an appLaunch step: Android package name, iOS bundle id. Required when action=appLaunch. | |
| action | Yes | Action type | |
| waitMs | No | Wait duration ms (for wait action) | |
| keyCode | No | Android keycode (keyPress, e.g. 3=HOME, 4=BACK) | |
| keyName | No | Hardware button name for pressButton (e.g. 'home', 'volumeUp', 'volumeDown', 'lock'). Required when action=pressButton. | |
| expected | No | Expected value (required for textEquals and textContains assertions). | |
| optional | No | Mark this step as one whose target is EXPECTED to be absent sometimes — a cookie banner, a first-run tutorial, an occasional interstitial. When the element cannot be found at replay the step is SKIPPED instead of failing, and no gesture is dispatched at the recorded position. Leave it off for anything whose absence is a bug: a step that is NOT optional now FAILS the replay when its element is missing, which is what tells a real regression apart from a banner that simply did not appear this run. | |
| attribute | No | Attribute to read for text assertions. iOS: label, value, name. Android: text, content-desc, resource-id. Defaults to the platform primary text attribute when omitted. | |
| assertType | No | Assertion type (required when action=assert). exists/notExists check element presence; textEquals/textContains compare an attribute value; visualMatch compares the whole screen against the screenshot captured now (takes no x/y and no expected). | |
| durationMs | No | Swipe/longPress duration ms (default 300) | |
| appActivity | No | Optional Android activity to launch with appId. Ignored on iOS. | |
| recordingId | Yes | Recording ID from flow_recording_start | |
| visionFallback | No | Let a vision model settle this assertion when the accessibility tree cannot find the element. Off by default, and only honoured for assertType 'exists' and 'notExists'. Turn it on for UI the tree cannot describe — canvas/WebGL screens, game engines, image-only controls with their text baked into the bitmap — where 'a person can see it' is the only check available. Leave it off for ordinary native UI: an assertion's value is that it reports what is really there, and a model asked to find something tends to find it. Ignored for text assertions, which compare exact strings that OCR cannot supply reliably. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, non-idempotent, non-destructive, but the description adds far more: actions execute live on the device during recording and re-execute at replay, assertions can FAIL a step and surface errorMessage, scrollToElement fails the run if the element never appears, and optional steps are SKIPPED rather than failed. This is behavior an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and coordinate-space caveat are front-loaded, then a clean bulleted action list follows. The assert, scrollToElement, optional, and visionFallback paragraphs are somewhat verbose and repeat the replay-time semantics, but for an 11-action tool the length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the recording-vs-replay contract, failure semantics, and per-action requirements thoroughly for a complex 18-param tool. The one notable gap is that, with no output schema, it never says what the call returns (e.g. a step id/index needed for flow_recording_delete_step or flow_recording_replace_step).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it maps each action to the params it requires (swipe needs toX/toY, pressButton needs keyName), documents the coordinate space relative to flow_recording_start's windowSize, notes durationMs defaults to 300, and explains the visualMatch exception that takes no x/y or expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: 'Perform and record one action step on the device,' which separates it from siblings like flow_recording_start, flow_recording_replay, and the low-level device_tap/device_swipe tools. The subsequent per-action enumeration makes the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use guidance for the tricky cases: use scrollToElement only when the target is genuinely off screen (and assert/exists when absence should fail the run), and no separate resolve step is needed because element-bound actions re-resolve at replay. visionFallback is scoped with 'turn it on for X, leave it off for ordinary native UI.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_cancelFlow recording cancelADestructiveIdempotentInspect
Cancel and discard an in-progress recording. All steps are lost — use flow_recording_save instead if you want to keep them.
| Name | Required | Description | Default |
|---|---|---|---|
| recordingId | Yes | Recording ID from flow_recording_start |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds the concrete consequence — 'All steps are lost' — which tells the agent exactly what is destroyed, a meaningful addition beyond the hint flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the destructive outcome stated first and the alternative second. Nothing is repeated from the name or annotations unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter cancellation tool with full annotation coverage, the description supplies the one thing annotations cannot: what happens to the recording's contents. No return value is needed since there is no output schema and the outcome is binary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema description coverage is 100%, with the schema itself explaining 'Recording ID from flow_recording_start'. The description adds no extra parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair ('cancel and discard') and resource ('an in-progress recording'), which is unambiguous against siblings like flow_recording_save or flow_recording_revert. An agent can identify the operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative ('use flow_recording_save instead') and the condition that selects it ('if you want to keep them'), turning the discard/keep decision into a direct routing rule. This is the key branch point for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_delete_stepFlow recording delete stepADestructiveIdempotentInspect
Delete one step from an in-progress recording (before flow_recording_save). Removes a mis-recorded step — e.g. an assert that bound to the wrong element or a stray tap — without discarding and re-recording the whole flow. Remaining steps are renumbered; the returned step list reflects the new 1-based indices. Deleting the appLaunch step (index 1) is rejected. Use the stepIndex from a flow_recording_action / flow_recording_get response.
| Name | Required | Description | Default |
|---|---|---|---|
| stepIndex | Yes | 1-based index of the step to delete | |
| recordingId | Yes | Recording ID from flow_recording_start |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing real behavioral consequences: remaining steps are renumbered, the returned list reflects new 1-based indices, and deleting the appLaunch step at index 1 is rejected. The annotations already flag destructiveHint/readOnlyHint, so this extra operational detail is genuine added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences; the core action and its constraint come first, followed by rationale, side effects, and parameter sourcing. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers the action, the edge case (index 1), renumbering, and where to get the index. It could briefly note whether a delete can be undone (e.g. via flow_recording_revert), but otherwise it is sufficient to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds provenance the schema lacks — telling the agent to source stepIndex from a flow_recording_action or flow_recording_get response, which prevents guessing an index.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete one step from an in-progress recording') and scopes it with 'before flow_recording_save', immediately distinguishing it from the save/list/get siblings. An agent can tell exactly what this tool mutates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context (fix a mis-recorded assert or stray tap 'without discarding and re-recording the whole flow') and the precondition that the recording is in progress. It does not, however, mention the close alternative flow_recording_replace_step, which an agent might prefer when editing rather than removing a step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_detach_componentFlow recording detach componentADestructiveInspect
Detach (materialize) a component reference in a test into private, editable copied steps. This replaces the live COMPONENT_REF step with a deep copy of the component's current steps and drops the linkage — future edits to the component no longer propagate to this test. One level only: a component that itself references another component cannot be detached. The test must belong to the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| stepIndex | Yes | 1-based index of the COMPONENT_REF step to detach | |
| recordingId | Yes | Test recording ID containing the component reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, but the description goes further: it explains exactly what is destroyed (the live linkage), the consequence (future component edits no longer propagate), and a real operational limit (only one level deep, nested references cannot be detached). That is substantial context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: the action, the behavioral consequence, and the constraints. The core purpose is front-loaded and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the definition covers action, effect, side effects, constraints, and auth requirement, while annotations carry the safety profile. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both recordingId and stepIndex are already documented in the schema, including the 1-based COMPONENT_REF semantics. The description reinforces the COMPONENT_REF context but adds no new parameter syntax or format detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (detach/materialize) applied to a precise resource (a component reference step in a test), and even clarifies the mechanism (replacing a live COMPONENT_REF step with a deep copy). This clearly distinguishes it from siblings like flow_recording_insert_component and flow_recording_delete_step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use it (converting a linked component into private, editable steps) and states a hard prerequisite (the test must belong to the authenticated user). It does not explicitly name alternative tools such as flow_recording_replace_step, so it falls short of full when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_getFlow recording getARead-onlyIdempotentInspect
Get a specific flow recording with all its steps. Verifies the recording belongs to the authenticated user. Returns recording metadata and the ordered list of steps with action types, coordinates, element info, and timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| recordingId | Yes | Flow recording ID (from flow_recording_list) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the safety profile is covered. The description adds non-obvious behavior: it verifies the recording belongs to the authenticated user (an implicit auth scoping/error condition) and enumerates the returned step fields, which the structured data does not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the auth constraint, then the return contents. With no output schema, the return-value sentence earns its place rather than repeating structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description usefully summarizes the returned metadata and ordered steps. It omits what happens when the recording is not owned by the user (error vs empty) and any pagination or size caveats, leaving a minor gap for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, and that description already points to flow_recording_list as the ID source. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (get) and resource (a flow recording with all its steps), and the schema note 'from flow_recording_list' implicitly separates it from the list sibling. It does not explicitly name which sibling to use instead, but the single-record scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: fetch one recording when you have its ID. There is no statement of when to prefer this over flow_recording_list, flow_recording_replay, or flow_recording_action, nor any prerequisite beyond ownership verification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_insert_componentFlow recording insert componentAInspect
Insert a LIVE reference to a reusable component (fragment) into a saved test, after a given step. The component is not copied — it stays linked, so editing the component later updates every test that references it. The reference is expanded to concrete steps at replay time. Optional paramBindings substitute {{name}} placeholders in the component steps. Both the test and the component must belong to the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| snippetId | Yes | Component (fragment) recording ID to reference | |
| recordingId | Yes | Target test recording ID to insert the component into | |
| paramBindings | No | Optional {{name}} → value substitutions applied to the component steps | |
| afterStepIndex | Yes | 1-based index of the step to insert after (0 to insert at the start) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (non-read-only, non-idempotent, non-destructive, closed-world). The description adds substantial behavioral context beyond that: the reference is live and linked rather than copied, editing the component updates all referencing tests, expansion happens at replay time, paramBindings perform placeholder substitution, and ownership of both recordings is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and then explains the live-link behavior, replay expansion, bindings, and ownership in five focused sentences. It is well structured and nearly every sentence earns its place, though it could be slightly tighter without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation tool with full schema descriptions and annotations covering safety, the description is nearly complete: it explains linkage, replay, bindings, and ownership. It leaves out error conditions (e.g., invalid step index or missing component) and any return behavior, but no output schema exists and the core call semantics are clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning by explaining that afterStepIndex is 'after a given step', that paramBindings substitutes {{name}} placeholders, and that both recordingId and snippetId must belong to the authenticated user. It does not add further format or edge-case detail for the ID parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: inserting a live reference to a reusable component into a saved test after a given step. It clearly explains the linkage semantics (not copied, stays linked) but never names or contrasts a sibling tool such as flow_recording_detach_component, so sibling differentiation is absent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use it: to insert a component reference after a step, with the prerequisite that both test and component belong to the authenticated user. It does not state when to avoid it or point to alternative tools, so no explicit exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_listFlow recording listARead-onlyIdempotentInspect
List flow recordings belonging to the authenticated user. Returns recording metadata including name, platform, device, step count, and timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Filter by device UDID | |
| limit | No | Max results to return (default: 50) | |
| offset | No | Pagination offset (default: 0) | |
| platform | No | Filter by platform | |
| searchQuery | No | Search recordings by name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds valuable return field information (name, platform, device, step count, timestamps), which is useful since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The primary purpose is front-loaded, followed by the return value summary. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with rich schema and annotations, the description covers what it does and what it returns. The only missing piece is explicit usage guidance versus sibling tools, but otherwise an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all five filter parameters. The description adds no additional parameter meaning beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('flow recordings'), and scopes to the authenticated user. It implicitly distinguishes from siblings like flow_recording_get by being a listing operation, but 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as flow_recording_get or flow_recording_replays. The description only states what it does, leaving usage context to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_replace_stepFlow recording replace stepADestructiveIdempotentInspect
Replace one step of an in-progress recording (before flow_recording_save) with a freshly-captured action, without changing its position. Performs the action live on the device — same as flow_recording_action — then overwrites the step at stepIndex instead of appending. Use this to fix a mis-recorded step (wrong element bound, wrong action) in place rather than deleting + re-recording + reordering. Replacing the appLaunch step (index 1) is rejected. Accepts the same action params as flow_recording_action.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X coordinate (tap/doubleTap/longPress/swipe start; assert & scrollToElement target element) | |
| y | No | Y coordinate (tap/doubleTap/longPress/swipe start; assert & scrollToElement target element) | |
| toX | No | Swipe end X | |
| toY | No | Swipe end Y | |
| text | No | Text to type (sendKeys) | |
| appId | No | App to launch for an appLaunch step: Android package name, iOS bundle id. Required when action=appLaunch. | |
| action | Yes | Action type | |
| waitMs | No | Wait duration ms (for wait action) | |
| keyCode | No | Android keycode (keyPress, e.g. 3=HOME, 4=BACK) | |
| keyName | No | Hardware button name for pressButton (e.g. 'home', 'volumeUp', 'volumeDown', 'lock'). Required when action=pressButton. | |
| expected | No | Expected value (required for textEquals and textContains assertions). | |
| optional | No | Mark this step as one whose target is EXPECTED to be absent sometimes — a cookie banner, a first-run tutorial, an occasional interstitial. When the element cannot be found at replay the step is SKIPPED instead of failing, and no gesture is dispatched at the recorded position. Leave it off for anything whose absence is a bug: a step that is NOT optional now FAILS the replay when its element is missing, which is what tells a real regression apart from a banner that simply did not appear this run. | |
| attribute | No | Attribute to read for text assertions. iOS: label, value, name. Android: text, content-desc, resource-id. Defaults to the platform primary text attribute when omitted. | |
| stepIndex | Yes | 1-based index of the step to replace | |
| assertType | No | Assertion type (required when action=assert). exists/notExists check element presence; textEquals/textContains compare an attribute value; visualMatch compares the whole screen against the screenshot captured now (takes no x/y and no expected). | |
| durationMs | No | Swipe/longPress duration ms (default 300) | |
| appActivity | No | Optional Android activity to launch with appId. Ignored on iOS. | |
| recordingId | Yes | Recording ID from flow_recording_start | |
| visionFallback | No | Let a vision model settle this assertion when the accessibility tree cannot find the element. Off by default, and only honoured for assertType 'exists' and 'notExists'. Turn it on for UI the tree cannot describe — canvas/WebGL screens, game engines, image-only controls with their text baked into the bitmap — where 'a person can see it' is the only check available. Leave it off for ordinary native UI: an assertion's value is that it reports what is really there, and a model asked to find something tends to find it. Ignored for text assertions, which compare exact strings that OCR cannot supply reliably. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true / idempotent=true, but the description adds real behavioral context: the action is performed LIVE on the device as a side effect, the step at stepIndex is overwritten rather than appended, and the index-1 appLaunch case is rejected. The one tension is that it advertises a live device side effect while idempotentHint=true claims repeat calls add no effect — not a direct contradiction (the recording state is idempotent) but worth noting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four front-loaded sentences, each carrying distinct information: what it does, how it differs mechanically, when to use it vs. the alternative, and the one validation constraint. No restatement of the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-param mutation tool with full annotation coverage and no output schema, the description supplies everything an agent needs: purpose, lifecycle placement, in-place overwrite semantics, the cross-reference to the action-param set, and the rejection rule. Return values are not required given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 19 params (baseline 3). The description adds meaning beyond the schema by cross-referencing 'Accepts the same action params as flow_recording_action' and by stating the validation rule tying stepIndex/action together (index 1 appLaunch rejected).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Replace one step of an in-progress recording ... with a freshly-captured action, without changing its position.' It also names the lifecycle boundary (before flow_recording_save) and the mechanism (overwrites the step at stepIndex instead of appending), which lets an agent distinguish it from flow_recording_action and flow_recording_delete_step without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('fix a mis-recorded step ... in place') and names the alternative workflow it replaces ('rather than deleting + re-recording + reordering'). It also gives a hard when-not constraint: 'Replacing the appLaunch step (index 1) is rejected.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_replayFlow recording replayBInspect
Replay a flow recording on a device. Executes each recorded step in order using element locators with coordinate fallback. Returns a full result summary with per-step pass/fail status. Validation failures are automatically skipped so the replay never blocks.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Device platform — auto-detected from recording if omitted | |
| timeoutMs | No | Max replay duration in ms (default: 300000 = 5 min) | |
| targetUdid | Yes | UDID of the device to replay on | |
| recordingId | Yes | Flow recording ID to replay (from flow_recording_list) | |
| validateElements | No | Use recorded element locators to find targets before acting (default: true; failures auto-skipped) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic flags (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the description carries real weight: it discloses ordered step execution, locator-then-coordinate fallback, per-step pass/fail reporting, and the non-obvious auto-skip of validation failures. It still omits prerequisites (device availability, whether prior steps' side effects persist) and whether the run is abortable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the action, then execution semantics, then return shape and failure policy. No filler, though the failure-handling sentence could have been merged without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param, no-output-schema tool, the description usefully compensates for the missing output schema by describing the per-step pass/fail summary. However, it leaves the agent without routing guidance inside a replay family of six siblings, which is the main completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (all five params documented, including the recordingId cross-reference to flow_recording_list and the validateElements default), so the schema already does the heavy lifting. The description adds no additional parameter meaning, which is the correct baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Replay a flow recording on a device') and the execution model (steps in order, locator with coordinate fallback). It does not distinguish itself from the crowded replay siblings (flow_replay_start, flow_replay_step, flow_recording_replays), so an agent cannot tell which entry point is correct from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no named alternative. Given six sibling tools in the replay family, the description never says whether this is the one-shot entry point, how it relates to flow_replay_start/status/abort, or what preconditions exist (session open, device free).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_replaysFlow recording replaysARead-onlyIdempotentInspect
List all replay runs of a saved recording — the run history. Returns one row per replay with id, status, totals, started/completed timestamps, and computed durationMs. Useful for trend analysis (pass rate over time) and finding the most recent failure to drill into. Filtered to the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max replays to return (default 25, newest first) | |
| recordingId | Yes | Flow recording ID (from flow_recording_list) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely useful context beyond that: one row per replay, the column set returned, user-scoped results, and the newest-first ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the return shape, then the use cases. Every sentence contributes and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 usefully names the returned fields (id, status, totals, timestamps, durationMs). Pagination/limit behavior is only in the schema, which is acceptable but leaves a small gap for an agent reasoning about large histories.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both recordingId and limit documented in the schema, so the baseline is 3. The description adds no format or syntax detail for the parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all replay runs of a saved recording') and frames itself as the run history, which separates it from triggering tools like flow_recording_replay. It does not explicitly name a sibling such as flow_replay_status, so it falls just short of the top mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases ('trend analysis (pass rate over time)', 'finding the most recent failure to drill into') plus the scoping condition ('filtered to the authenticated user'). It stops short of naming alternatives or stating 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.
flow_recording_revertFlow recording revertADestructiveInspect
Revert a test recording to a stored version snapshot: its steps and meta (name/category/tags) are restored from that version. A snapshot is written on every mutating save, keeping the last 10 versions. The recording must belong to the authenticated user; an unknown recording or version reports not-found.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Snapshot version number to restore | |
| recordingId | Yes | Recording ID to revert |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, so the bar is lower, yet the description adds real substance: it specifies that steps and meta are overwritten from the snapshot, that snapshots are written on every mutating save with a 10-version retention window, and that ownership is required. It omits whether the revert itself produces a new snapshot (i.e. whether it is undoable), which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and its effect, then retention policy, then auth and error behavior. No filler; each sentence adds a distinct operational fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return/error burden and does mention not-found behavior for both unknown recording and version. It leaves a small gap around whether the revert is itself snapshotted or reversible, which matters for a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: 'version' is bounded by the 10-version snapshot retention policy, and 'recordingId' must belong to the authenticated user. This gives the agent practical bounds on valid inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (revert) and resource (test recording) plus exactly what is restored: steps and meta (name/category/tags). This clearly separates it from siblings like flow_recording_save, flow_recording_get, and flow_recording_replay without needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when the tool applies (restoring a previously saved version) and states the ownership prerequisite and that unknown recording/version returns not-found. It stops short of naming explicit alternatives or when-not-to-use cases, e.g. inspecting the current state with flow_recording_get before reverting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_saveFlow recording saveInspect
Save a completed recording to the database. Waits for any pending background captures (page source + screenshots) to finish before persisting. When the user has a test-management system connected (TestRail, Jira/Xray, Azure DevOps), saving a test REQUIRES tmsLink: the TMS case this automates. Find it with testrail_find_cases, jira_search or azdo_search_work_items. If you omit it the save is rejected and the recording is kept, so you can retry with the link.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional new name (overrides the name set at start) | |
| tmsLink | No | The TMS test case this flow automates. REQUIRED when the user has a TMS connected (tests only; fragments never need it). | |
| recordingId | Yes | Recording ID from flow_recording_start |
flow_recording_startFlow recording startAInspect
Start recording a new scenario on a device. Automatically captures the initial app state and adds an appLaunch step. Returns a recordingId — pass it to flow_recording_action for each step, then flow_recording_save when done.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the recording | |
| udid | Yes | Device UDID to record on | |
| category | No | Recording category (default: test) | |
| platform | No | Platform — auto-detected from connected devices if omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, non-destructive operation. The description adds useful behavioral detail beyond annotations: it automatically captures initial app state, adds an appLaunch step, and returns a recordingId. It does not cover permissions or failure behavior, but it is informative for this operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, front-loaded with the main action and followed immediately by the required follow-up workflow. Every sentence contributes useful information with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no output schema, the description covers the key return value (recordingId) and the full follow-up workflow. Combined with annotations and the fully documented schema, an agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all four parameters, including the category and platform enums. The description adds no additional parameter meaning beyond what the schema provides, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Start recording a new scenario on a device.' It also names the downstream tools flow_recording_action and flow_recording_save, which helps an agent distinguish this start operation from the related recording lifecycle tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear workflow guidance: pass the returned recordingId to flow_recording_action for each step, then call flow_recording_save when done. It does not explicitly state when not to use this tool or name alternatives such as device_record_start or flow_recording_cancel, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_recording_wrap_in_conditionFlow recording wrap in conditionAInspect
Make a RANGE of already-recorded steps conditional: they run at replay only when a check on screen passes.
Record the steps normally FIRST, then wrap them. That is the order conditionals are actually discovered — you do not know a promo banner is intermittent until you have already recorded dismissing it. The wrapped steps are MOVED into the branch, so a step never exists twice, and the remaining steps are renumbered.
The condition is evaluated against the element at (x,y), which must be on screen NOW so its locators can be recorded — the same binding every other element-bound action uses.
Use it for anything that appears only sometimes: a cookie banner, a first-run tutorial, an occasional interstitial, a rating prompt.
NOTE: at replay a condition that cannot be decided is treated as FALSE (the else branch runs). Set timeoutMs to the realistic worst-case render time of the thing you are checking for — too small a budget judges a slow element absent, runs the wrong branch, and the run still reports success.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X of the element the CONDITION checks — not the element the wrapped steps act on. | |
| y | Yes | Y of the element the condition checks. | |
| check | Yes | What to check. exists/notExists test presence; textEquals/textContains compare an attribute. visualMatch is deliberately unavailable here — it is fail-safe by design, so as a branch selector it would silently always take the same branch. | |
| branch | No | Which branch the wrapped steps become. Default 'then' — run them when the check passes. | |
| expected | No | Expected value. Required for textEquals and textContains. | |
| attribute | No | Attribute to read for text checks. iOS: label, value, name. Android: text, content-desc, resource-id. | |
| timeoutMs | No | How long to wait for the check to become true before deciding it is false. Default 5000. | |
| recordingId | Yes | Recording ID from flow_recording_start | |
| toStepIndex | Yes | Last step to wrap (1-based, inclusive). | |
| fromStepIndex | Yes | First step to wrap (1-based). Step 1 is the appLaunch that seeds the start state and cannot be wrapped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false), and the description adds substantial behavior beyond them: wrapped steps are MOVED into the branch and never duplicated, remaining steps are renumbered, the condition element must be on screen now for locator recording, and at replay an undecidable condition defaults to FALSE. The timeoutMs warning about silently taking the wrong branch while still reporting success is exactly the kind of non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and ordering rule, and each paragraph earns its place by covering a distinct concern (ordering, semantics, use cases, replay caveat). It is longer than strictly necessary, but the length is justified by the complexity of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 10 parameters, no output schema, and no idempotency guarantee, the description covers ordering, branch semantics, element binding, replay defaults, and the timeout failure mode. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies that (x,y) refers to the element the condition checks rather than the wrapped steps, explains why visualMatch is excluded from check, and gives concrete guidance for timeoutMs (worst-case render time). These go beyond the schema's field definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (wrap) and resource (a range of already-recorded steps) and defines the effect precisely: the steps become conditional and run at replay only when a screen check passes. This is clearly distinguishable from siblings like flow_recording_insert_component or flow_recording_action without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong when-to-use guidance ('Use it for anything that appears only sometimes: a cookie banner, a first-run tutorial, an occasional interstitial, a rating prompt') and a critical ordering prerequisite ('Record the steps normally FIRST, then wrap them'). It does not explicitly name an alternative sibling, so it falls just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_replay_abortFlow replay abortADestructiveIdempotentInspect
Abort an in-flight replay started via flow_replay_start or flow_recording_replay. Forces the replay to a terminal 'aborted' state instead of leaving it wedged in status:"running" forever — use this when a replay stops making progress (e.g. after a device/control-connection error) rather than polling flow_replay_status indefinitely. A per-step watchdog (90s) and an overall watchdog (15min) also force termination automatically, so this tool is for cancelling sooner than that, or cancelling a replay you no longer need. No-op if the replay has already reached a terminal state. Note: because a single in-flight device call has no way to be interrupted mid-flight, flow_replay_status may take a few seconds (bounded by the current step's own timeout) to reflect 'aborted' after this call returns.
| Name | Required | Description | Default |
|---|---|---|---|
| replayId | Yes | Replay ID returned by flow_replay_start or flow_recording_replay |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true, readOnly=false; the description adds rich context beyond them: the replay is forced to a terminal 'aborted' state, the call is a no-op if already terminal, and flow_replay_status may lag a few seconds due to non-interruptible in-flight device calls. This is genuinely useful behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and its routing condition, and every sentence carries information (watchdog bounds, no-op semantics, status lag). It is somewhat long, but the detail is load-bearing rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter abort tool with no output schema, the description covers the full picture an agent needs: prerequisites (which tools started the replay), failure scenario, alternatives, idempotent no-op behavior, and eventual-consistency caveat on status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single replayId parameter is fully documented in the schema. The description only indirectly references the id ('started via flow_replay_start'), adding no format or syntax detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (abort) and resource (in-flight replay), and explicitly names the sibling tools that create the replay (flow_replay_start, flow_recording_replay). An agent can distinguish this from flow_replay_status and the watchdog behavior 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('when a replay stops making progress, e.g. after a device/control-connection error'), names the alternative it replaces ('rather than polling flow_replay_status indefinitely'), and clarifies the boundary vs. the automatic watchdogs (90s per-step, 15min overall) — this tool is for cancelling sooner or cancelling unneeded replays.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_replay_startFlow replay startAInspect
Kick off a flow replay in the background. Returns a replayId immediately — pass it to flow_replay_status to poll progress. Use this instead of flow_recording_replay when you want to monitor live or do other work while the replay runs. Validation failures are auto-skipped (MCP has no interactive input).
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Device platform — auto-detected from recording if omitted | |
| targetUdid | Yes | UDID of the device to replay on | |
| recordingId | Yes | Flow recording ID to replay (from flow_recording_list) | |
| resetAppData | No | Wipe the recorded app's data (Android `pm clear`) BEFORE replay so it starts from a clean first-run state. Use this for recordings of enrollment / first-run / logged-out flows (e.g. create-passcode) that will NOT reproduce against an already-enrolled or logged-in app. Destructive — erases the app's local data on the target device. Android only; default false. | |
| validateElements | No | Use recorded element locators to find targets before acting (default: true) | |
| visualCheckEnabled | No | Opt in to AI Visual Review: capture per-step baselines and run the end-of-replay visual-analysis phase. Slower; default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, non-idempotent), and the description adds real behavioral context beyond them: it runs in the background, returns a replayId immediately, and auto-skips validation failures because MCP has no interactive input. It does not mention that resetAppData wipes device data in prose, nor any auth/rate considerations, so it stops short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the action, then the return value, then the sibling routing, then the edge-case behavior. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the return-value burden and does so ('Returns a replayId immediately'). Combined with async semantics and sibling routing, an agent has everything needed to call and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters including resetAppData and visualCheckEnabled are already documented in the schema. The description adds no parameter-level detail beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Kick off a flow replay') and immediately scopes it as background/async, and explicitly distinguishes it from the sibling flow_recording_replay. An agent can tell exactly what this does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (flow_recording_replay) and the precise condition that selects this tool ('when you want to monitor live or do other work while the replay runs'), plus routes to flow_replay_status for polling. Explicit when-to-use and when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_replay_statusFlow replay statusARead-onlyIdempotentInspect
Poll the status of an in-progress or recently completed replay started via flow_replay_start. Returns current step index, completed step pass/fail, and overall status. Verifies the replay belongs to the authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
| replayId | Yes | Replay ID returned by flow_replay_start |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low. The description adds genuine value beyond them by disclosing return content (current step index, per-step pass/fail, overall status) and an authorization behavior (verifies the replay belongs to the authenticated user), though it omits polling cadence or terminal-state behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, zero filler, with the core purpose front-loaded and returns/authorization following in descending priority. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description covers purpose, when to call it, what it returns, and the authorization check. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is only one parameter, so the schema already documents replayId fully. The description's reference to 'started via flow_replay_start' adds provenance context but no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Poll the status') plus resource ('replay') with explicit scoping to 'in-progress or recently completed' replays. Clearly differentiated from flow_replay_start, which creates the replay rather than polling it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the context clearly: use it for replays started via flow_replay_start, covering both in-progress and recently completed cases. It does not, however, distinguish itself from nearby siblings like flow_replay_summary or flow_replay_step, so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_replay_stepFlow replay stepARead-onlyIdempotentInspect
Full data for ONE step of a replay: action type, recorded element + locators + coordinates, recorded page-source XML, live page-source XML captured during replay, locator actually used, scores, error message. Heavy — call selectively for steps you want to diagnose.
| Name | Required | Description | Default |
|---|---|---|---|
| replayId | Yes | Replay ID | |
| stepIndex | Yes | Step index (1-based, from flow_replay_summary) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds the non-obvious payload-weight warning and discloses that both recorded and live XML are returned, which is real behavioral context. It does not discuss cost limits or failure modes for invalid ids.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste: the payload contents are front-loaded and the heaviness caveat lands last where it most affects the call decision. The field list is dense but every item is information an agent needs to decide whether to call it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the return shape and the cost of calling it, which is what an agent needs here. Minor gap: no guidance on behavior when replayId or stepIndex is invalid/out of range.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both params are already documented, so the schema does the heavy lifting. The description only reinforces that stepIndex selects a single step of a replay; the note that it comes from flow_replay_summary is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Full data for ONE step of a replay') and enumerates exactly what is returned: action type, recorded element/locators/coordinates, both page-source XMLs, locator used, scores, error. The uppercase 'ONE' distinguishes it from flow_replay_summary, which covers all steps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Heavy — call selectively for steps you want to diagnose' gives a clear selection condition (targeted diagnosis rather than bulk retrieval), implicitly routing overview needs to flow_replay_summary. It stops short of naming that sibling or stating explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_replay_step_screenshotFlow replay step screenshotARead-onlyIdempotentInspect
Return the screenshot for one step of a replay as an image you can view directly. kind="recorded" is what was captured during recording; "live" is what the device showed during replay; "diff" is the visual diff overlay. Use selectively — not every step needs visual inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which image to load | |
| replayId | Yes | Replay ID | |
| stepIndex | Yes | Step index (1-based) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description adds genuine value beyond them: it says the return is a directly viewable image and explains what each kind value represents (captured during recording vs device during replay vs diff overlay), which the schema only labels as 'Which image to load'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and return type, then enum semantics, then usage restraint. No filler, though the kind explanation is necessarily a bit dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 correctly explains the return ('an image you can view directly'), and the required parameters are fully documented by the schema. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description earns above baseline by disambiguating the enum values for 'kind' (recorded/live/diff) in terms an agent can reason about, going beyond the schema's terse 'Which image to load'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Return the screenshot for one step of a replay as an image you can view directly.' This clearly separates it from step-data siblings like flow_replay_step, though it never names an alternative explicitly, so sibling differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use selectively — not every step needs visual inspection' gives a real restraint signal (when-not to overuse), but there is no explicit when-to-use context, no named alternative (e.g., flow_replay_step for textual step data), and no cost/rate rationale for the selectivity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_replay_summaryFlow replay summaryARead-onlyIdempotentInspect
Compact replay summary for analysis. Returns replay metadata (totals, passed/failed/skipped counts) + one row per step with status, action, duration, diff scores, and a short error excerpt. Always small — call this first when analyzing a replay, then use flow_replay_step for full per-step detail.
| Name | Required | Description | Default |
|---|---|---|---|
| replayId | Yes | Replay ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the description's marginal job is return behavior — which it does well by promising an 'Always small' payload and naming the fields returned. It does not mention error behavior when replayId is unknown or retention limits on older replays, so it stops 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler: purpose first, return contents second, routing instruction third. The size guarantee and the sibling hand-off are both front-loaded where an agent will read them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the return-value burden and discharges it by enumerating the payload shape, plus it guarantees payload size and points to the deeper sibling tool. For a single-param, read-only analysis tool, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage (albeit a thin 'Replay ID' label), so the schema carries the burden and the baseline of 3 applies. The description adds no format, source, or lookup guidance for replayId (e.g., where to obtain it, whether it comes from flow_recording_replays).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('compact replay summary for analysis') and enumerates exactly what the response contains (totals, per-status counts, per-step rows with status, action, duration, diff scores, error excerpt). This is clearly distinguishable from flow_replay_step and flow_replay_status 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly sequences usage: 'call this first when analyzing a replay, then use flow_replay_step for full per-step detail.' Both the when and the named alternative are given, with the condition (need full per-step detail) that selects the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_visual_reviewGet visual reviewARead-onlyIdempotentInspect
Get full detail for one AI Visual Review candidate (from list_visual_reviews), including the actual baseline, live, and diff images as images you can view directly. Use this to inspect a candidate and form your own verdict, then call resolve_visual_review with your decision.
| Name | Required | Description | Default |
|---|---|---|---|
| review_id | Yes | Review id from list_visual_reviews |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing what is returned: the actual baseline, live, and diff images as directly viewable images. It does not mention failure modes for a stale/invalid review_id, which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the purpose and the returned image content are front-loaded, and the workflow instruction follows. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description carries the return-value burden well by specifying the baseline/live/diff images are directly viewable, and it links this step to resolve_visual_review. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 100% for the single review_id parameter, the schema already documents the argument fully. The description only echoes that the id comes 'from list_visual_reviews', so it adds little beyond the structured field. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full detail for one AI Visual Review candidate') and immediately disambiguates it from siblings by naming the source tool (list_visual_reviews) and the follow-up tool (resolve_visual_review). An agent can distinguish this single-candidate fetch from list_visual_reviews and visual_compare 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('to inspect a candidate and form your own verdict') and what to do next ('then call resolve_visual_review with your decision'), and it names where the required id comes from. The workflow position is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insights_azdo_browseInsights Azure DevOps browseInspect
Resolve Azure DevOps names to ids for the Insights summaries. With no projectId it lists your projects. With a projectId it returns that project's teams, sprints (id, name, start/finish dates, timeFrame past|current|future, newest first) and test plans — pick the parts you need with include. Use it first when the user says "sprint 42", "the current sprint" or a team/plan by name, then pass the ids to insights_azdo_sprint_summary / insights_azdo_test_summary. Read-only. Needs Azure DevOps connected in Settings > Integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | No | Team id whose sprints to list. Default: the project's default team. | |
| include | No | Which lists to return for a project. Default: all three. | |
| allTeams | No | List sprints across ALL teams instead of one team (ids are then iteration paths). | |
| projectId | No | Azure DevOps project id (GUID). Omit to list projects. | |
| sprintLimit | No | How many sprints to return (default 12, newest first). |
insights_azdo_sprint_summaryInsights Azure DevOps sprint summaryRead-onlyIdempotentInspect
Pre-aggregated Azure DevOps sprint health, identical to the Insights sprint dashboard. USE THIS for "how is this sprint going", "compare sprint 41 vs 42" or any sprint chart — never count work items yourself. Pass sprints: the word "current" for the active sprint, and/or sprint ids from insights_azdo_browse (1-6 total; several = a comparison, returned side by side in the order given). One entry per sprint: dates and days remaining, work items by state, work items by type, and bug counts. Definitions: work-item states are normalised across process templates into new / active / resolved / closed / other (by_raw_state shows the original names); bugs.new_in_sprint counts bugs created on or after the sprint start, bugs.resolved_in_sprint those resolved during it, bugs.still_open the unresolved ones. A sprint with no work items yields zeros, not an error. Compare sprints by quoting the same field for each side, and note a different team can scope a different set of items. Chart the per-sprint rows with an ra-chart block and give the user the dashboard_url. Read-only; needs Azure DevOps connected in Settings > Integrations. The dashboard link is provided here, so insights_build_link (TestRail runs only) is not needed for sprints.
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | No | Team id to scope work items to. Default: the project's default team. | |
| sprints | No | "current" and/or sprint ids from insights_azdo_browse. Default: ["current"]. Pass 2+ to compare. | |
| projectId | Yes | Azure DevOps project id (GUID). Find it with insights_azdo_browse. |
insights_azdo_test_summaryInsights Azure DevOps test summaryRead-onlyIdempotentInspect
Pre-aggregated Azure DevOps test results, identical to the Insights test-reports dashboard. USE THIS for pass rate / failure counts / run comparisons on Azure DevOps Test Plans — never tally rows yourself. Pick ONE view: plan = a test plan (optionally one suite): rollup of its test points (latest outcome per point). runs = specific run ids (1-10): per-run counts, delta vs the previous run, and for 2+ runs a combined rollup that is DE-DUPLICATED by test case (the most recently executed result per case wins), so it will not equal the sum of the per-run rows. recent_runs = the newest runs (optionally of one plan): per-run counts for a pass-rate-per-run chart. To COMPARE two plans or run sets, call once per side. Outcomes are bucketed into the five statuses: failed includes aborted/error/timeout/warning; retest includes paused/in-progress/inconclusive; untested includes not-executed/none/not-applicable. Counts are per status: passed, failed, blocked, retest, untested (total = their sum). pass_rate_executed_pct = passed / (passed + failed + blocked + retest), so untested tests are EXCLUDED and a half-run suite can look better than it is; pass_rate_total_pct = passed / total, so untested tests count against it. Both are null when the denominator is 0. State which one you quote, and use the same one on both sides of a comparison. Chart per-run rows with an ra-chart block and give the user the dashboard_url. Read-only; needs Azure DevOps connected in Settings > Integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| view | Yes | `plan` needs planId; `runs` needs runIds; `recent_runs` takes optional planId. | |
| fresh | No | Bypass the short-lived cache. Only set when the user says results just changed. | |
| limit | No | recent_runs only: how many newest runs (default 10, max 30). | |
| planId | No | Test plan id (view=plan, or filter for recent_runs). | |
| runIds | No | Azure DevOps test run ids (view=runs). | |
| suiteId | No | view=plan only: restrict to one suite. | |
| projectId | Yes | Azure DevOps project id (GUID). Find it with insights_azdo_browse. |
insights_board_add_chartInsights board add chartInspect
Pin a new chart for the user AND place it on their board in one step. source is the same shape as a pinned chart: {tool, params, relative?, series}. Position is optional; when omitted it goes in the first free spot at the bottom-left without overlapping anything. Undo removes it from the board (the pinned chart itself stays in the user's chart list). After this call do NOT also print a separate ra-chart; just describe what was added (the pinned chart is live and refreshes). If you do print one, include the same source.
| Name | Required | Description | Default |
|---|---|---|---|
| h | No | ||
| w | No | ||
| x | No | ||
| y | No | ||
| scope | Yes | Tab: testrail | azdo:test-reports | azdo:sprint | azdo:backlog-defects | jira:sprint | jira:backlog-defects | automation. | |
| title | Yes | ||
| source | Yes | Chart data source {tool, params, relative?, series}. | |
| baseRev | Yes | The rev you read. | |
| boardId | No | ||
| chartType | Yes |
insights_board_apply_changesInsights board apply changesInspect
Change the user's Insights board: add, move, resize, restyle or remove items. Make ONE call per user request with a short human label; the user can undo it. Prefer moving over deleting, never remove items the user made unless asked, and locked items cannot be changed. Read the board first with insights_board_get and pass its rev as baseRev.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | Board ops, max 50. {op:"add", item:{kind:"panel"|"widget"|"text"|"sticky", x,y,w,h, config}} (id, z, stamps and, if x/y are omitted, a free spot are filled in for you; panel config {panelId}, widget {widgetId}, text {markdown}, sticky {text,color:yellow|blue|green|pink}) | {op:"update", id, patch:{x,y,w,h,z,config}} | {op:"remove", id} | {op:"setFilters", filters}. 1200px design width, 8px grid. Items with locked:true cannot be changed. | |
| label | Yes | Short description shown in the board history. | |
| scope | Yes | Tab: testrail | azdo:test-reports | azdo:sprint | azdo:backlog-defects | jira:sprint | jira:backlog-defects | automation. | |
| baseRev | Yes | The rev you read. | |
| boardId | No | From insights_board_get; null/omitted for an untouched default. |
insights_board_createInsights board createInspect
Create a new named board for a tab from the built-in layout and make it the one the user sees.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| scope | Yes | Tab: testrail | azdo:test-reports | azdo:sprint | azdo:backlog-defects | jira:sprint | jira:backlog-defects | automation. |
insights_board_getInsights board getRead-onlyIdempotentInspect
Read the user's Insights board layout for a tab: its items with positions and sizes, the panels that can be added, and the user's pinned charts you can place. Call this FIRST before any board change and pass the returned rev as baseRev. If the user has never edited the tab, boardId is null and rev is 0 (the built-in layout); your first change creates their own copy.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes | Tab: testrail | azdo:test-reports | azdo:sprint | azdo:backlog-defects | jira:sprint | jira:backlog-defects | automation. | |
| boardId | No | A specific board id; omit for the one the user is viewing. |
insights_board_save_templateInsights board save templateInspect
Save a board's layout (without pinned charts) as a reusable template of the user's own.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| boardId | Yes |
insights_board_undoInsights board undoInspect
Undo the assistant's most recent change to a board (only changes you made; the user's own edits are never undone by this).
| Name | Required | Description | Default |
|---|---|---|---|
| boardId | Yes | Board id from insights_board_get. |
insights_build_linkInsights build linkRead-onlyIdempotentInspect
Build a clickable Insights dashboard URL for a specific set of TestRail run IDs (optionally filtered by status). USE THIS when the user asks to view / open / show / explore test run data and you have concrete run IDs in mind (resolve names → IDs first via testrail_list_runs if needed). The returned URL is a relative path on this app — present it as a markdown link, e.g. [View dashboard](/insights?runs=47,103&status=failed). The tool validates every run ID exists via the caller's TestRail credential; a run the caller cannot read is reported as missing and the tool refuses to emit a URL containing only missing runs (clicking it would land on an empty dashboard, which reads as "agent gave me garbage"). This tool returns NO numbers. To answer with counts or pass rates call insights_testrail_summary (its result already carries a dashboard_url); use this tool when you want a status filter on the link or to confirm run IDs exist.
| Name | Required | Description | Default |
|---|---|---|---|
| runs | Yes | TestRail run IDs to include in the dashboard view. At least 1, up to 10. Single-run mode renders one dashboard; multi-run mode combines them. Use `testrail_list_runs` first if you don't know the IDs. | |
| status | No | Optional status filter applied to the dashboard. One of: passed | failed | blocked | retest | untested. Omit to show all statuses. |
insights_testrail_browseInsights TestRail browseInspect
Resolve TestRail names to ids for the Insights summaries. With no projectId it lists your TestRail projects; with a projectId it lists that project's milestones (id, name, completed, due date). Call this first when the user says "milestone X" or "project Y" by name, then pass the ids to insights_testrail_summary. Read-only. Needs TestRail connected in Settings > Integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | TestRail project id. Omit to list projects instead of milestones. |
insights_testrail_summaryInsights TestRail summaryRead-onlyIdempotentInspect
Pre-aggregated TestRail results, identical to what the Insights dashboard shows. USE THIS for any TestRail pass-rate, failure-count, run-comparison or "how is milestone X going" question or chart — never tally testrail_list_tests_for_run rows yourself. Pick ONE view: runs = specific run ids (1-10): per-run counts + pass rates, what changed vs each run's previous run, and, for 2+ runs, a combined rollup (counts are summed; a case present in two runs is counted twice) with the top failure signatures. project_runs = the newest runs of a project (optionally one milestone): per-run counts for a pass-rate-per-run chart, plus combined when the list is 2-10 runs. To COMPARE two runs/milestones, call this once per side and compare the numbers; do not mix sides in one call. Counts are per status: passed, failed, blocked, retest, untested (total = their sum). pass_rate_executed_pct = passed / (passed + failed + blocked + retest), so untested tests are EXCLUDED and a half-run suite can look better than it is; pass_rate_total_pct = passed / total, so untested tests count against it. Both are null when the denominator is 0. State which one you quote, and use the same one on both sides of a comparison. Per-run delta counts tests that newly failed / recovered / still fail compared with the run before it. Chart the per-run rows with an ra-chart block (add source with this tool, your exact params and the series mapping, e.g. path runs, label name, value pass_rate_executed_pct, so the user can pin it), and give the user the dashboard_url as a markdown link (use insights_build_link instead when you need a status filter). Read-only; needs TestRail connected in Settings > Integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| view | Yes | `runs` needs runIds. `project_runs` needs projectId (milestoneId optional). | |
| fresh | No | Bypass the short-lived cache. Only set when the user says results just changed. | |
| limit | No | project_runs only: how many newest runs to return (default 20, max 50). | |
| runIds | No | TestRail run ids (view=runs). | |
| projectId | No | TestRail project id (view=project_runs). Find it with insights_testrail_browse. | |
| milestoneId | No | Restrict project_runs to one milestone. Find it with insights_testrail_browse. |
ios_accessibility_auditiOS accessibility auditARead-onlyIdempotentInspect
Run an accessibility audit on the CURRENT screen of an iOS device — Apple's own accessibility audit engine (the same one Xcode's "Audit for Accessibility" button runs), so findings match what Apple reports. Audits whatever is in the foreground right now, so navigate to the screen you care about FIRST (ios_tap_by_label / ios_navigate_url), then call this. Reports contrast failures, tap targets under 44×44pt, missing/unhelpful labels, elements the accessibility engine cannot see, Dynamic Type and clipped-text problems, and wrong traits. Each issue carries the offending element's label, type and screen-point rect — the rect centre is directly tappable with ios_tap. Pass auditTypes to narrow the run (much faster on dense screens). TIMING: the audit sees the screen as it is at that instant — running it immediately after a launch or navigation, while the UI is still animating in, under-reports (measured on device: 4 issues mid-animation vs 5 once settled). Let the screen settle first. Requires iOS 17+ (errors on older) and an active iOS automation session (auto-starts if needed).
| Name | Required | Description | Default |
|---|---|---|---|
| rect | No | Narrow the result to a region in screen POINTS, skipping the label lookup. Takes precedence over `element`. A finding is kept when its centre falls inside this rect. | |
| udid | Yes | iOS device UDID | |
| element | No | Narrow the result to one element: its accessibility label, resolved on device the same way ios_tap_by_label resolves it. the platform audit engine can only audit a whole app, so this filters the findings to those inside that element's bounds — it cannot surface anything the full-screen audit did not already report. Errors if the label matches nothing, rather than silently returning the whole screen. | |
| auditType | No | Convenience alias for a single-entry auditTypes, e.g. "contrast". | |
| auditTypes | No | Audit types to run; omit for all of them. "contrast" = Text/background contrast below the WCAG threshold; "elementDetection" = Elements the accessibility engine cannot detect; "hitRegion" = Tap targets smaller than the 44×44pt minimum; "sufficientElementDescription" = Controls with a missing or unhelpful label; "dynamicType" = Text that does not scale with Dynamic Type; "textClipped" = Text clipped at larger content sizes; "trait" = Wrong or missing accessibility traits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuinely useful non-schema context: iOS 17+ requirement, session auto-start, and the foreground-only snapshot behavior with timing pitfalls. However the timing/animation detail is the main addition; return-shape detail beyond this is thin, so a solid 3 rather than higher.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what it does and the pre-condition, then uses explicit 'TIMING:' and requirements sections. It is long, but nearly every sentence carries actionable information (Xcode parity, tappable rects, iOS 17+, auto-start); a little could be trimmed but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still describes the return payload (per-issue label, type, screen-point rect), the failure modes (errors on pre-iOS 17, missing session), and pre-call sequencing. An agent has everything needed to invoke and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value: it explains that filtering by `element`/`rect` narrows findings rather than expanding the audit surface, that the rect centre is directly tappable via ios_tap, and that `auditTypes` speeds up dense screens. These are operational semantics the schema alone doesn't convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (run accessibility audit on current iOS screen) and pins the exact engine (Apple's own, same as Xcode's 'Audit for Accessibility'). It also enumerates the finding categories, making it unmistakably distinct from ios_voiceover and android_accessibility_audit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing guidance: navigate to the target screen first via ios_tap_by_label / ios_navigate_url, then call this. Adds a when-not caveat about timing (running mid-animation under-reports), with concrete before/after measurements, and notes auditTypes narrows/speeds up the run.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_actions_recording_readiOS actions recording readARead-onlyIdempotentInspect
Read a stored recording's entries in order. Each entry carries the channel it crossed (cdp or ws-rpc), whether it was a command or an event, the method, its payload, outcome and duration in ms, plus t_ms — milliseconds since the recording started, which is what makes the gaps between actions readable. Page through with limit/offset; narrow with channel or kind.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Recording id from ios_actions_record_stop or ios_actions_recordings | |
| kind | No | Only commands, or only events | |
| limit | No | Entries to return (default 500, max 5000) | |
| offset | No | Entries to skip | |
| channel | No | Only this channel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description goes beyond them by disclosing the exact shape of each returned entry (channel, kind, method, payload, outcome, duration, t_ms) and explaining that t_ms encodes inter-action gaps — real behavioral context, though nothing about ordering guarantees or error behavior for a bad id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then return shape, then filtering. The t_ms aside earns its place because it explains why the field matters, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so well, enumerating every entry field and the semantics of t_ms. It is only slightly short of complete: it does not say what happens on an unknown id or how entries are bounded/ordered beyond 'in order'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all five parameters are documented there, so the baseline is 3. The description's 'page through with limit/offset; narrow with channel or kind' only restates the schema and adds no format or edge-case detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a stored recording's entries in order') and immediately characterizes the unit being read, so it is distinguishable from the sibling ios_actions_recordings (which lists recordings) and the record_start/status/stop lifecycle tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing clause gives operational guidance on paging ('limit/offset') and narrowing ('channel or kind'), but there is no explicit when-to-use/when-not framing and no mention of which sibling produces the required id — that only appears in the schema description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_actions_recordingsiOS actions recordingsARead-onlyIdempotentInspect
List stored action recordings, newest first — id, device, label, when it ran and what it captured. Filter by device with udid.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Only recordings for this device | |
| limit | No | How many to return (default 50, max 500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered. The description adds genuinely new behavior — newest-first ordering and the returned field set — but says nothing about pagination interaction with `limit`, so the added value is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core listing behavior front-loaded and the filter hint trailing. Every clause carries information; no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a 2-param, all-optional, read-only tool at full schema coverage, the main remaining gap would be return shape — and the description enumerates the returned fields ('id, device, label, when it ran, what it captured'), compensating for the absent output schema. It does not mention session/prerequisite requirements, a minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both `udid` and `limit` are already documented in the schema. The description only restates the `udid` filter ('Filter by device with `udid`') and adds no syntax, format, or semantics beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List stored action recordings') plus the sort order and the fields returned, which distinguishes it from the sibling read-one tool ios_actions_recording_read. It never names that sibling explicitly, so the differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives filtered usage via `udid`, which tells the agent how to narrow results, but it never states when to use this list tool rather than ios_actions_recording_read or ios_actions_replay. Usage is implied, not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_actions_record_startiOS actions record startAInspect
Start recording every Web Inspector / CDP command and event for a device — what was sent, what came back, and how long each took. Spans all Safari tool calls until ios_safari_record_stop, across the one-shot sessions they each open. A DIAGNOSTIC trace, not a replayable script: CDP payloads carry session-scoped node and object ids that are meaningless in a later session, so use flow recording (which captures selectors) when you want playback. Payloads over 2000 chars are truncated (a screenshot command alone returns megabytes of base64) and the trace stops appending after 50,000 entries.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| label | No | Short name to find this recording by later. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-read-only, non-idempotent, non-destructive behavior, so the description adds significant value by disclosing that the trace is a diagnostic, not a replayable script, with specific truncation limits and a maximum entry count. It also explains that CDP payloads carry session-scoped ids that are meaningless in a later session, which is crucial context beyond the annotations. Minor gap: it does not mention potential performance impact of continuous recording.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary action, followed by scope, then usage guidance and limitations. Every sentence is informative and necessary; no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a recording tool with no output schema, the description covers the essential aspects: what is recorded, how to stop, limitations (truncation, entry cap), and why it's diagnostic rather than replayable. It also cross-references the alternative (flow recording) for replay use cases. This is complete for an agent to make an informed decision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (udid, label) are fully documented in the schema. The description adds no extra semantic detail about the parameters, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Start recording) and resource (every Web Inspector / CDP command and event for a device), with additional detail on what is captured (sent, returned, timing). The description also names the paired stop tool (ios_safari_record_stop) and distinguishes it from flow recording (which captures selectors) for replay, clearly separating it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'use flow recording (which captures selectors) when you want playback' versus the diagnostic purpose here. The tool's scope is delineated ('Spans all Safari tool calls until ios_safari_record_stop'), and the description warns that payloads are truncated and the trace stops appending after 50,000 entries, which are important operational limits for deciding whether to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_actions_record_statusiOS actions record statusARead-onlyIdempotentInspect
Report whether an action recording is running for a device, and what it has captured so far, without stopping it.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds useful context beyond that: it explicitly states the operation does not stop the recording and hints at return content ('what it has captured so far'), which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that states the purpose, scope, and key constraint with zero waste. No extraneous text or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, single-parameter status tool with rich annotations and no output schema, the description covers purpose and non-destructive behavior adequately. It stops short of describing return format or error conditions, but those are minor gaps for this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single required 'udid' parameter already documented as 'iOS device UDID'. The description adds no further syntax, format, or meaning for this parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and resource ('action recording status for a device'), and distinguishes itself from the stop sibling via 'without stopping it'. However, it does not name or contrast with the other related siblings such as ios_actions_recording_read or ios_actions_recordings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without stopping it' implies a usage context: check status without terminating the recording. But there is no explicit when-to-use, when-not-to-use, or named alternative tool, leaving the agent to infer that this is the non-destructive status check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_actions_record_stopiOS actions record stopAInspect
Stop the action recording for a device and return its id and what it captured — commands, events and errors across both channels.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is not read-only, not destructive, not idempotent, so the safety profile is covered. The description adds useful behavioral context beyond that: it tells the agent the call yields an id and the captured commands/events/errors, which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action first and the return payload second; no filler. Slight loss because 'across both channels' is vague and adds little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter stop tool with no output schema, the description covers what the tool does, its safety via annotations, and its return shape. It stops short of explaining what happens to the finalized recording (persistence, where to read it), which would fully close the loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) with 100% schema description coverage, so the schema already fully documents it. The description's 'for a device' merely restates this; the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Stop) and resource (action recording) plus the return payload (id and captured commands/events/errors). It implicitly contrasts with ios_actions_record_start, but never names or distinguishes itself from siblings like ios_actions_record_status or ios_actions_recording_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Stop the action recording' implies the lifecycle context (invoke after a recording has been started), so usage is inferable. However, there is no explicit when-to-use/when-not guidance and no reference to alternatives such as status or read tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_actions_replayiOS actions replayAInspect
Replay a stored recording against a device: each step's element is re-resolved from its recorded locators, then the recorded action is performed again. Reports per step which locator worked, whether it RECOVERED (the recorded one failed and an alternate matched — that step's locator needs attention before it fails outright), whether the element's accessible name drifted, and any state that changed since recording (a button now disabled, an element now hidden). Web steps only: native steps and steps recorded by coordinates come back unsupported rather than being replayed blind onto whatever now occupies that point.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID to replay against | |
| recordingId | Yes | Recording id from ios_actions_record_stop or ios_actions_recordings | |
| stopOnFailure | No | Stop at the first failed step. Default false — the second failure usually explains the first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false); the description adds substantial behavior beyond that: per-step locator resolution, RECOVERED signaling, accessible-name drift detection, state-change detection, and the unsupported fallback. It does not explicitly state that replaying mutates the target app's state, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that is front-loaded with the core action before moving into reporting semantics and the web-only limitation. Length is justified by the amount of behavioral information, though the RECOVERED/unsupported clauses are somewhat compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by enumerating what is reported per step. Combined with annotations covering the safety profile and full schema coverage of the 3 parameters, an agent has everything needed to call it correctly; only session prerequisites are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid, recordingId and stopOnFailure are already documented in the schema (including the recordingId provenance and the stopOnFailure rationale). The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (replay a stored recording against a device) and describes the mechanism: each step's element is re-resolved from recorded locators, then the action re-performed. This clearly distinguishes it from siblings like ios_actions_record_start/stop, ios_actions_recording_read and flow_recording_replay.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The web-steps-only restriction is an explicit boundary (native and coordinate steps return `unsupported`), which is genuine guidance. However, there is no statement of when to choose this over the flow-level replay siblings, what prerequisites exist (e.g. an active device session), or whether the recording must be stopped first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_active_appiOS active appARead-onlyIdempotentInspect
Get the currently active (foreground) app on an iOS device. Returns bundleId, name, and pid. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds a genuine behavioral constraint — the session prerequisite — that annotations do not convey, though it says nothing about failure modes when no session exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and return shape, then the prerequisite. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the return fields (bundleId, name, pid) and the session requirement. Only minor gap is the absence of any error/no-session behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single udid parameter, and the description adds no format or sourcing detail beyond the schema. Baseline 3 is appropriate when the schema does all parameter work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Get the currently active (foreground) app on an iOS device') with an explicit scope qualifier ('currently active/foreground') that separates it from launch/list siblings like ios_list_apps or ios_launch_app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the prerequisite clearly: 'Requires an active iOS automation session.' That tells the agent when the call is valid, but it does not name alternatives or note when-not-to-use this versus ios_list_apps or device_current_app.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_alert_respondiOS alert respondAInspect
Answer the alert currently on screen: accept it, dismiss it, or press a specific button by label. Use ios_alert_status first to read the available buttons — 'accept' and 'dismiss' press the alert's default controls, which is wrong for a prompt whose buttons are not a clean accept/dismiss pair (for example 'Allow Once' / 'While Using the App' / “Don’t Allow”), and button is how you answer those. text is typed into the alert's first text field before the button is pressed, for prompts that ask for input. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Type this into the alert's text field before pressing. | |
| udid | Yes | iOS device UDID | |
| action | No | Press the alert's default accept or dismiss control. Default 'accept'. | |
| button | No | Press this button label instead of the default control, e.g. "Allow Once". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-idempotent, non-destructive. The description adds real behavioral context beyond them: that accept/dismiss press the alert's DEFAULT controls (a semantic that determines correctness), and that an active iOS automation session is required. It does not cover failure modes when no alert is present, but the additions are substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first clause, then layers routing and parameter guidance. Slightly dense with em-dashes and a long example list, but each sentence carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and 4 params, it covers purpose, alternative tool, button-selection logic, text-input ordering, and the session prerequisite. The only gap is behavior when no alert is on screen, which is minor given the otherwise complete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes beyond the schema by explaining the interaction semantics: 'accept'/'dismiss' map to default controls, `button` overrides by label, and `text` is typed into the first text field BEFORE the button press. That ordering and precedence is not derivable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (answer) and resource (the alert currently on screen) and enumerates the three modes: accept, dismiss, or press a labeled button. It is cleanly distinguished from its sibling ios_alert_status, which it explicitly casts as the read step rather than the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: call ios_alert_status first, then explains exactly when 'accept'/'dismiss' are wrong (non-standard button triples like 'Allow Once' / 'While Using the App' / 'Don't Allow') and that `button` is the correct path for those. This is a when-to-use/when-not-to-use statement with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_alert_statusiOS alert statusARead-onlyIdempotentInspect
Check whether a system or app alert is currently blocking the iOS UI, and read its text and button labels in one call. An alert covers the screen and swallows taps aimed at whatever is behind it, so this is worth checking before trusting a tap that "succeeded". Absence is a normal answer, not an error: returns {"present": false} when nothing is open. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe read-only, idempotent, non-destructive profile, and the description adds real context on top: the absence case is explicitly not an error and returns {"present": false}, and it discloses the prerequisite of an active iOS automation session. That is exactly the kind of behavioral detail structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose, then rationale, then the absence semantics, then the session prerequisite. Each sentence supplies a distinct fact and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so partially: it names text and button labels as readable and gives the exact empty result. The shape of the present=true payload is not spelled out, but the agent has enough to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) exists and schema description coverage is 100%, so the schema fully documents it. The description adds no syntax, format, or device-selection detail beyond the schema, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource: checking whether a system or app alert is blocking the iOS UI and reading its text and button labels. This is clearly separable from the sibling ios_alert_respond, which acts on alerts rather than reporting their state, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use guidance: check before trusting a tap that 'succeeded', because an alert swallows taps aimed behind it. It does not name an alternative tool or state when this check is unnecessary, so it stops short of the explicit when/when-not/alternatives pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_app_launch_timeiOS app launch timeAInspect
Measure COLD app-launch time (ms) for a bundle id, averaged over N cold launches. Each run terminates + relaunches the app and times until it is running and idle. Uses the on-device automation agent (auto-started); the agent runner must include the device.perf.launchTime method.
| Name | Required | Description | Default |
|---|---|---|---|
| runs | No | Cold launches to average (default 3) | |
| udid | Yes | iOS device UDID | |
| bundleId | Yes | App bundle id to launch, e.g. com.apple.Preferences |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-readOnly, non-destructive, non-idempotent operation but do not explain why. The description fills that gap well: it discloses that each run terminates and relaunches the app, that timing runs until the app is 'running and idle', and that an auto-started on-device agent plus a required method are involved. This is meaningful side-effect and prerequisite disclosure beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct information (what is measured, how each run works, and the required environment). The core measurement is front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param tool with no output schema and full annotation coverage, the description supplies the measurement unit, the cold-launch procedure, and the agent prerequisite. Only the return shape (e.g., per-run vs aggregate values) and failure behavior are left implicit, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid, bundleId, and runs are already documented with defaults and bounds. The description reinforces 'N cold launches' and the ms unit but adds no syntax, format, or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+measurement unit ('Measure COLD app-launch time (ms) for a bundle id') and pins down the exact semantics (cold, averaged over N launches). An agent can distinguish it from ios_fps, ios_performance_snapshot, and android_app_launch_time 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an implied usage context (cold-launch benchmarking) and a prerequisite ('the agent runner must include the device.perf.launchTime method'), which is genuinely useful. However, it never states when to prefer this over siblings like ios_performance_record_start or ios_performance_snapshot, nor any when-not conditions, so usage is mostly inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_batteryiOS batteryARead-onlyIdempotentInspect
Get battery status of an iOS device: charge percent, temperature (°C and °F), charging state, battery health and cycle count. No automation session required. The normalised summary is the one to read — the raw power registry beside it reports temperature in hundredths of a degree and carries several different 'capacity' keys, only one of which is a percentage.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Include the full IOPMPowerSource registry alongside the summary (~60 keys). Default true; set false for just the summary. | |
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent profile, but the description adds two things annotations cannot: the absence of a session prerequisite (a setup/auth constraint) and the caveat that the `raw` registry is misleading (temperature in hundredths of a degree, multiple ambiguous 'capacity' keys). It stops short of 5 only because nothing is said about latency, failure modes, or when raw would be needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler: the capability and returned fields come first, the session-free note second, and the summary-vs-raw warning last. Every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: it lists the summary fields and warns about the raw payload's traps, and it clarifies the session prerequisite. Nothing essential for calling this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented in the schema, setting the baseline at 3. The description goes beyond it by explaining the interpretive consequences of `raw=true` (hundredths-of-a-degree temperature, ambiguous capacity keys) and by pointing the agent at `summary` as the value to read — genuine added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get battery status of an iOS device') and enumerates the exact fields returned (charge percent, temperature in both units, charging state, health, cycle count), so the agent knows precisely what it gets. The 'iOS' qualifier cleanly separates it from the Android-oriented device_battery sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'No automation session required', which is meaningful routing guidance in a toolset where most siblings need a session. It does not, however, name an alternative (e.g. device_battery for Android) or state exclusions, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_clear_locationiOS clear locationADestructiveIdempotentInspect
Clear the simulated GPS location so the iOS device returns to using its real CoreLocation fix. Counterpart to ios_set_location.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, but the description usefully clarifies what 'destructive' actually means here: it discards the mock GPS override and falls back to the real fix rather than deleting user data. That reframing is genuine added value, though it says nothing about failure modes or required device state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the effect front-loaded and the sibling relationship in the second. No filler, no restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter state-reset tool with no output schema, the description plus annotations cover everything needed: what is cleared, what the device falls back to, safety profile, and idempotency. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) and schema description coverage is 100%, so the schema fully documents it. The description adds no format or targeting detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (clear) plus specific resource (simulated GPS location), and it states the observable effect: the device returns to its real CoreLocation fix. It also names the counterpart tool ios_set_location, so an agent can distinguish it from the setter without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames the tool as the counterpart to ios_set_location, which gives clear context for when it is used (undoing an injected position). It does not spell out explicit when-not conditions or distinguish itself from related siblings like ios_get_location or ios_play_location_route, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_clear_textiOS clear textADestructiveIdempotentInspect
Clear a text field on an iOS device using the native element-clear command — reliable for any field length, unlike sending backspaces. Omit label to clear the currently-focused field (tap the field first to focus it); pass label to target a specific field. Pattern: tap field → ios_clear_text → ios_send_keys. Requires an active iOS automation session (auto-starts if needed).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Element type filter e.g. XCUIElementTypeTextField (used only when label is given). | |
| udid | Yes | iOS device UDID | |
| label | No | Accessibility label/text of the field to clear. Omit to clear the focused field. | |
| strategy | No | Element finding strategy to try first when a label is given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring destructiveHint=true and idempotentHint=true, the description adds useful behavioral context: it specifies the native element-clear command, claims reliability for any field length, describes the focused-field workflow, and notes that an active iOS automation session is required but auto-starts. It does not elaborate on the exact destructive consequences (e.g., whether cleared text is recoverable), but the annotations cover the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a tight paragraph with front-loaded purpose, followed by parameter behavior, a usage pattern, and a session prerequisite. Every sentence adds distinct value and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is complete enough for a four-parameter tool with full schema coverage and no output schema: it covers purpose, usage, pattern, and session requirements. It stops short of describing failure modes (e.g., what happens if no field is focused and no label matches), but those gaps are minor given the annotations and schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description adds only a small amount of meaning, notably the instruction to tap the field first when omitting `label`; it does not explain `strategy` or `type` beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Clear a text field on an iOS device') and distinguishes the native element-clear approach from sending backspaces. It also clarifies the two targeting modes (focused field vs. labelled field), making it easy to tell apart from sibling tools like ios_send_keys.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to omit `label` (clear the focused field after tapping it) versus when to pass `label` (target a specific field), and provides a usage pattern (tap → ios_clear_text → ios_send_keys). It also contrasts the method with backspacing, but does not explicitly state when not to use this tool or name a direct alternative clear tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_clipboard_get_hidiOS clipboard get HIDARead-onlyIdempotentInspect
Read the device clipboard (pasteboard) via the system clipboard service (no automation session needed, no app foregrounding). Returns the current UTF-8 text, or empty string. Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe, idempotent, non-destructive, closed-world read profile. Beyond that the description adds genuine behavioral detail: prerequisites (no session, no foregrounding), the return shape (UTF-8 text or empty string), and a version/environment failure mode ('no HID available' on iOS 17.x / no-tunnel). Only the error/limitation behavior is spelled out, not retry or rate considerations, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler: mechanism first, then return value, then the failure caveat. Every sentence carries distinct information and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the return contract (UTF-8 text, empty string, 'no HID available' failure), and it discloses prerequisites and an OS-version limitation. For a one-parameter read tool this is nearly complete; the only gap is the unresolved overlap with ios_get_pasteboard.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (udid) with 100% schema description coverage, so the schema already documents it fully. The description adds no syntax, format, or sourcing detail for udid, so the baseline of 3 for schema-covered parameters applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the device clipboard (pasteboard) via the system clipboard service'), so the operation is unambiguous. It does not, however, distinguish itself from the closely-named sibling ios_get_pasteboard (or device_clipboard_get), which an agent would have to guess between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies enabling context ('no automation session needed, no app foregrounding'), which implies the tool is usable without a session. But it never states when to prefer this over ios_get_pasteboard or ios_clipboard_set_hid, leaving the alternative-selection inference to the caller.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_clipboard_set_hidiOS clipboard set HIDAIdempotentInspect
Write the device clipboard (pasteboard) via the system clipboard service (no automation session needed, no app foregrounding). Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to place on the device clipboard | |
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false. The description adds genuine value beyond them: the explicit failure mode ('Returns "no HID available" on iOS 17.x / no-tunnel') and the no-session/no-foregrounding traits, which an agent could not learn from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core action is front-loaded and the error condition follows immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param idempotent write with no output schema, the annotations cover the safety profile and the description supplies the environment failure mode. Only the sibling disambiguation (set_pasteboard vs this HID variant) is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both udid and text documented inline), so the schema carries the parameter burden. The description adds no syntax, format, or constraint detail for either parameter; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Write the device clipboard (pasteboard)') plus the mechanism ('via the system clipboard service'). It does not name the obvious sibling alternative (ios_set_pasteboard), so an agent must infer the distinction from the mechanism phrase rather than a direct contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'no automation session needed, no app foregrounding' implies the usage context (call this when you lack a session) but the description never explicitly states when to prefer this over ios_set_pasteboard or ios_clipboard_get_hid. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_contact_hidiOS contact HIDAInspect
Press-and-HOLD a single contact down at (x,y) via direct HID input (no automation session needed) WITHOUT lifting — mouse-button-down / touch-down. The contact stays held until ios_release_hid. Use for hold-then-steer interactions the automation session cannot express. Coordinates are iOS screen points. Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate (screen points, or 0..1 fraction if norm=true) | |
| y | Yes | Y coordinate (screen points, or 0..1 fraction if norm=true) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=false), and the description adds genuinely useful context: no automation session is needed, the contact persists until ios_release_hid, and it returns 'no HID available' on iOS 17.x / no-tunnel. That error/environment disclosure goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and lifecycle, then tacks on the coordinate and error notes. Dense but every clause carries information; no wasted preamble.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation/input primitive with annotations and a named release companion, the description covers what the operation does, how long it persists, and a failure mode. No output schema exists, but the return-value note ('no HID available') is supplied anyway, leaving little missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so x, y, norm, and udid are already documented. The description repeats the coordinate-space fact ('Coordinates are iOS screen points'), which is baseline value and slightly understates the norm=true fraction mode the schema describes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — press-and-hold a single contact at (x,y) via direct HID — and explicitly notes it stays held without lifting. An agent can distinguish this from ios_tap and ios_contacts_hid directly from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the use case ('hold-then-steer interactions the automation session cannot express') and the lifecycle pairing (held until ios_release_hid), which routes the agent correctly. It stops short of explicit when-not-to-use or differentiating from ios_contacts_hid by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_contacts_hidiOS contacts HIDAInspect
Press-and-HOLD up to five contacts at once via direct HID input (no automation session needed), WITHOUT lifting. One call is one frame, so all fingers land at the same instant — call it repeatedly to steer them (a two-finger drag, two on-screen thumbsticks). Fingers stay held until ios_release_contacts_hid. Coordinates are iOS screen points. Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| points | Yes | Where each finger is, in order. Keep the order stable across calls: it is the finger identity. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful behavioral context beyond annotations: direct HID input without a session, persistent held state across calls, frame semantics, and the specific failure mode on iOS 17.x / no-tunnel. This is valuable state and error disclosure for a stateful input tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then immediately explains frame behavior, held state, coordinate system, and error behavior. Every sentence carries useful information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateful HID input tool with rich schema coverage and no output schema, the description covers the essential behavioral contract: multi-finger hold, repeated calls for steering, release requirement, coordinate space, and platform failure condition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents udid, points, ordering, and norm semantics. The description adds only that coordinates are iOS screen points, which is already covered by the norm parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: press-and-hold up to five contacts via direct HID input without lifting. It distinguishes itself from single-contact and release siblings by naming the release tool and explaining the multi-finger held-state behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains how to use it: one call is one frame, call repeatedly to steer, fingers stay held until ios_release_contacts_hid. It also notes no automation session is needed, but does not explicitly compare against alternatives such as ios_contact_hid or non-HID multi-touch tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_crash_analyticsiOS crash analyticsARead-onlyIdempotentInspect
List crash reports on an iOS device with aggregate analytics (total, per-app, per exception type, per-day timeline) plus groups: crashes deduped by signature, count desc, with exampleIds (a group flagged unsymbolicated is keyed on image+offset, not symbols). Telemetry and in-house automation processes are excluded. Use ios_crash_detail with a returned crash id for the full log. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds non-obvious behavior: telemetry and in-house automation crashes are excluded, groups are deduped by signature in count-desc order, and a group flagged unsymbolicated is keyed on image+offset rather than symbols. These are meaningful disclosures beyond the annotations, though permissions or pagination behavior are not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well front-loaded: purpose, output shape, dedup semantics, then the routing hint. Every sentence carries information, though the parenthetical enumerations of aggregate dimensions make it slightly heavy for a single-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining the return values (aggregate analytics and the groups structure with exampleIds) and the keyed-by-image+offset caveat. Nothing an agent needs to call this tool correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) exists and schema coverage is 100%, so the schema already documents it as 'iOS device UDID'. The description adds no format or sourcing detail beyond that, which is the expected baseline when structured fields carry the full param burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (crash reports on an iOS device), then enumerates the exact output shape (total, per-app, per exception type, per-day timeline) and the `groups` structure. It clearly distinguishes itself from ios_crash_detail by naming the full-log alternative, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to ios_crash_detail with a returned crash id for full logs and notes that no automation session is required, which is a real prerequisite signal. It does not, however, distinguish itself from other crash siblings such as ios_crash_list or ios_crash_symbolicate, leaving some selection ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_crash_detailiOS crash detailARead-onlyIdempotentInspect
Full parsed metadata + raw content of one crash report (by id from ios_crash_analytics). No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Crash report id (file name) from ios_crash_analytics | |
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds real value by disclosing that no automation session is required and by characterizing the payload as full metadata plus raw content, though it says nothing about payload size or truncation for potentially large raw crash files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence stating the payload, the keying parameter, and its source, followed by a short session-requirement clause. Zero waste and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly describes the return content ('full parsed metadata + raw content') and covers the session requirement and safety profile via annotations. It is nearly complete; only edge details like payload size limits or behavior on an unknown id are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (id, udid) are documented in the schema, so the baseline is 3. The description reinforces the id's provenance ('by id from ios_crash_analytics') but adds no format or constraint details beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('one crash report') and what it returns ('full parsed metadata + raw content'), and points to the sibling that produces the id (ios_crash_analytics). It does not explicitly distinguish itself from ios_crash_symbolicate, which is the nearest ambiguous alternative, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent learns the id comes from ios_crash_analytics and that no automation session is needed, which is genuinely useful context. However, there is no explicit when-to-use vs. when-to-use-symbolicate guidance or statement of prerequisites beyond the session note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_crash_listiOS crash listARead-onlyIdempotentInspect
List crash reports on an iOS device. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| pattern | No | Filter pattern (e.g. "*.ips") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds one useful behavioral fact beyond that (no session needed), but omits return format, ordering, or result volume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose front-loaded followed by the operative caveat. Nothing wasted and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with full annotation coverage and full schema coverage, this is largely sufficient. It still doesn't clarify how the output relates to ios_crash_detail or how filtering with pattern behaves, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (udid, pattern) are already documented in the schema. The description adds no syntax or filter semantics beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource: "List crash reports on an iOS device." An agent immediately knows this enumerates crash reports. However, it does not distinguish itself from close siblings like ios_crash_detail, ios_crash_analytics, or ios_crash_symbolicate, so the boundary is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"No automation session required" implies the usage context (works standalone, unlike session-bound tools), but there is no explicit when-to-use or when-to-prefer-a-different-tool guidance versus ios_crash_detail or ios_crash_analytics. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_crash_symbolicateiOS crash symbolicateARead-onlyIdempotentInspect
Symbolicate a crash report (by id from ios_crash_analytics): resolve stack frames from imageName + offset into symbol + offset (file:line) using atos and symbol binaries on the host. System/OS frames resolve from Xcode’s on-disk DeviceSupport symbols (when a device of that iOS build was prepared in Xcode). App frames resolve only when a matching .dSYM is provided via dsymPath (matched by Mach-O UUID). Unresolvable frames are returned as-is. By default only the faulting thread is symbolicated.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Crash report id (file name) from ios_crash_analytics | |
| udid | Yes | iOS device UDID | |
| dsymPath | No | Directory of .dSYM bundles for app-frame symbolication (matched by UUID) | |
| allThreads | No | Symbolicate every thread, not just the faulting one (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/destructive=false safety, and the description adds substantial operational context beyond them: mechanism (atos, host binaries), dSYM matching by Mach-O UUID, the fallback of returning unresolvable frames as-is, and the default of symbolicating only the faulting thread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each front-loading a distinct fact (action, resolution paths, failure fallback, thread default) with no redundant restatement of the name or title. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing return behavior (unresolvable frames returned as-is, only faulting thread by default). Combined with rich annotations, an agent has everything needed to call it correctly, including the environmental prerequisites for success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description goes further by explaining how dsymPath is matched (by Mach-O UUID), that allThreads defaults to faulting-thread-only, and that id is a crash file name from ios_crash_analytics. This meaningfully enriches the schema's terse parameter docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Symbolicate a crash report') and immediately names the source of the input id ('by id from ios_crash_analytics'), which no sibling duplicates. It also clarifies the transformation performed (imageName+offset -> symbol+offset(file:line)), leaving no ambiguity about what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear prerequisites: app frames only resolve with a dsymPath, system frames need prepared DeviceSupport, and the id must come from ios_crash_analytics. It doesn't name an alternative tool or when-not-to-use case, but no sibling performs symbolication, so the context is sufficient for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_device_infoiOS device infoARead-onlyIdempotentInspect
Get detailed device info from an iOS device (no automation session required). Returns activation state, serial, product type, iOS version, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful context beyond that: the no-session prerequisite and the shape of the returned data. It does not cover error cases (e.g. offline or untrusted device) or response format, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, zero filler, with the core action and the key precondition front-loaded before the return-value list. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description compensates by naming representative return fields, which is enough for an agent to know what it will get. Minor gaps remain around device-state prerequisites and failure modes, but nothing essential for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required 'udid' parameter already documented in the schema. The description adds no syntax, format, or sourcing guidance for the UDID, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (device info from an iOS device) and enumerates what is returned (activation state, serial, product type, iOS version). It is clear on its own, but it does not distinguish itself from close siblings like device_info, ios_diagnostics, or ios_lock_status, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(no automation session required)' is a real usage condition, telling the agent this can be called without an established session. However, there is no explicit when-to-use versus alternatives such as ios_diagnostics or the generic device_info, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_diagnosticsiOS diagnosticsARead-onlyIdempotentInspect
Get device diagnostics (battery, HDMI, WiFi) from an iOS device. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds a genuine prerequisite disclosure not present in annotations — that no automation session is needed — which materially changes how an agent should sequence the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the verb and resource, with the session-prerequisite caveat appended. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent, single-parameter tool with full annotation coverage and a fully described schema, the definition supplies what is needed: what it returns and that no session is required. The absence of any note on output shape is a minor gap since there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single udid parameter is fully documented in the schema, so the baseline is 3. The description adds no format, targeting, or constraint detail about udid beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (device diagnostics) and enumerates the categories returned (battery, HDMI, WiFi) on an iOS device. It is clear on its own, but it does not distinguish itself from overlapping siblings such as ios_battery, ios_device_info, or ios_performance_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'No automation session required' gives one real usage cue — the agent knows it can call this without an active session, which is valuable given the many session-scoped siblings. However, there is no guidance on when to prefer this over ios_battery or ios_device_info, so the when-to-use picture is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_dismiss_keyboardiOS dismiss keyboardAInspect
Dismiss the software keyboard on an iOS device if it is visible. Requires an active iOS automation session (auto-starts if needed).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only, non-destructive, non-open-world action, but the description adds genuinely new operational facts: the call is a conditional no-op when no keyboard is shown, and a session is required with auto-start fallback. That auto-start/session detail is exactly the kind of behavior annotations cannot express. It does not describe what happens if no keyboard is present beyond the conditional framing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the action and its condition front-loaded before the session prerequisite. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool with annotations covering the safety profile, the description supplies the two missing pieces — the visibility condition and the session requirement. Return behavior is unspecified, but with no output schema that is a minor gap for a fire-and-forget UI action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (udid) and the schema already documents it at 100% coverage, so the baseline is 3. The description adds nothing about the device identifier that the schema does not already say.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (dismiss) and a specific resource (the software keyboard on an iOS device), a combination that is unique among the ~250 sibling tools — no other entry touches keyboard visibility. An agent cannot confuse it with ios_send_keys, device_type, or ios_tap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the selecting condition ("if it is visible") and the prerequisite (an active iOS automation session), which tells the agent when this tool applies and what must already be true. It stops short of naming an explicit alternative or a when-not-to-use case, so it is strong context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_drag_dropiOS drag dropAInspect
Drag-and-drop on an iOS device: hold at (x1,y1) for holdMs to grab, then move to (x2,y2) over durationMs. Distinct from ios_swipe (no explicit hold). Use for home-screen icon reorder, drag-into-folder, slide-to-confirm. Coordinates are screen points. Works without an automation session when the direct input path is available; falls back to one otherwise (see input).
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start X (screen points) | |
| x2 | Yes | End X (screen points) | |
| y1 | Yes | Start Y (screen points) | |
| y2 | Yes | End Y (screen points) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| holdMs | No | Hold-in-place duration before motion in ms (default: 500) | |
| durationMs | No | Motion duration from start to end in ms (default: 400) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the minimal safety annotations (readOnlyHint=false, destructiveHint=false), the description discloses non-obvious runtime behavior: the 'auto' path tries direct input first and falls back to a session, direct-input-only devices report an error rather than silently switching, and the response indicates which path ran. This is exactly the kind of behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly five sentences, front-loaded with the action mechanics before alternatives and input-path details. It is dense and each sentence carries information, though the input-path sentence is long and the density could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter gesture tool with no output schema and full schema coverage, the description covers mechanics, coordinate semantics, use cases, sibling differentiation, and fallback behavior. It stops short of describing failure modes (e.g., no element at coordinates) or the response shape beyond noting it reports which input path ran.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning by assigning temporal roles to the parameters — x1/y1 are the grab point held for holdMs, x2/y2 are the target reached over durationMs — which the schema does not express. It also reinforces that coordinates are screen points, though that partially repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Drag-and-drop on an iOS device') and describes the exact mechanics: hold at (x1,y1) for holdMs to grab, then move to (x2,y2) over durationMs. It explicitly distinguishes itself from the ios_swipe sibling ('Distinct from ios_swipe (no explicit hold)'), so an agent can route between them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names concrete use cases ('home-screen icon reorder, drag-into-folder, slide-to-confirm') and explicitly contrasts with the nearest alternative, ios_swipe, giving the condition that selects this tool (explicit hold required). The input-path guidance further clarifies when the direct path vs session path applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_drag_hidiOS drag HIDAInspect
Drag-and-drop via the direct input path (no automation session needed): press-and-HOLD at from, move to to as one continuous contact, then release. Unlike ios_swipe_hid it holds at BOTH ends — holdStartMs lets the app pick the item up, holdEndMs lets the drop/snap register (a bare swipe often fails to grab or to land the drop). Use for reordering, sliders, and canvas drag-and-drop (jigsaw pieces, cards). Pass norm=true to give from/to/waypoints as 0..1 fractions (pixelInScreenshot ÷ screenshotSize — precise, matches the frontend). Single-contact only. Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Drop point (screen points, or 0..1 fraction if norm=true) | |
| from | Yes | Grab point (screen points, or 0..1 fraction if norm=true) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| holdEndMs | No | Settle dwell at the drop before release, ms (default 250) | |
| waypoints | No | Optional intermediate points for a curved/steered drag (same space as from/to) | |
| durationMs | No | Total travel time, ms (default 500) | |
| holdStartMs | No | Grab dwell before moving, ms (default 250) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it as a non-read-only, non-destructive, non-idempotent mutation. The description goes well beyond that: it discloses single-contact-only behavior, the reason both dwell parameters exist, the norm-based coordinate mode, and a concrete failure mode ('no HID available' on iOS 17.x / no-tunnel).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then the swipe contrast, then use cases, then the normalization flag and the failure mode. Dense with parentheticals but each clause carries information; only the jigsaw/cards examples feel slightly expendable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 8 fully documented parameters, the description still covers the essential gaps an agent would hit: coordinate space, hold semantics, contact count, and the platform/tunnel failure case. Remaining omission is minor (no guidance on durationMs tuning or fallback when HID is unavailable).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the norm=true formula (pixelInScreenshot ÷ screenshotSize), why holdStartMs/holdEndMs matter (pick up the item vs. register the drop), and that waypoints live in the same coordinate space as from/to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('drag-and-drop via the direct input path') plus the operational distinction that no automation session is needed. It explicitly differentiates itself from the sibling ios_swipe_hid by contrasting hold behavior at both ends, so an agent can pick it without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases (reordering, sliders, canvas drag-and-drop with jigsaw pieces/cards) and explains why it beats a bare swipe (grab/land failures). It does not mention when NOT to use it or name other drag-capable siblings such as ios_drag_drop or device_drag_drop, so alternatives are only partially routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_elements_in_regioniOS elements in regionARead-onlyIdempotentInspect
List addressable elements whose bounding box INTERSECTS the given rectangle. Counterpart of device_elements_in_region. Returns each element with its attributes, bounds, centre and ranked locators, sorted SMALLEST-FIRST so the most specific element comes back first. Use to enumerate a region (tab bar, dialog, list section) without reading the whole tree. Coordinates are iOS screen POINTS, the same space as ios_tap. Zero-area elements are kept — iOS tab-bar labels often report 0x0 and are still tappable by label. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Left edge of the region (screen points) | |
| x2 | Yes | Right edge of the region (screen points) | |
| y1 | Yes | Top edge of the region (screen points) | |
| y2 | Yes | Bottom edge of the region (screen points) | |
| udid | Yes | iOS device UDID | |
| limit | No | Cap on returned elements (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description layers on real behavioral detail: INTERSECTS semantics, smallest-first sort so the most specific element returns first, zero-area elements retained because iOS tab-bar labels report 0x0, and the requirement for an active iOS automation session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core operation comes first, then the ordering guarantee, the zero-area caveat, the coordinate-space note, and the session prerequisite. Every sentence carries information, though it runs long enough that it is not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, no output schema, and a read-only annotation set, the description compensates fully by describing the returned fields (attributes, bounds, centre, ranked locators), the sort order, and the session prerequisite. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the coordinates, udid, and limit are already documented in the schema. The description adds the useful clarification that coordinates are iOS screen POINTS, the same space as ios_tap, but says nothing extra about limit or ordering interactions with the cap. Baseline 3 applies when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) plus resource (addressable elements intersecting a rectangle) and scope (bounding-box intersection, not containment). It also explicitly names itself as the counterpart of device_elements_in_region, so an agent can place it against the platform sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case (enumerate a tab bar, dialog, or list section without reading the whole tree) and contrasts with device_elements_in_region. It lacks explicit when-not guidance relative to ios_page_source or ios_find_element, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_end_sessioniOS end sessionBIdempotentInspect
End a iOS automation session on an iOS device, releasing resources.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the full safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false, openWorldHint=false), so the bar is low. The description does add one piece of context beyond them: that the call "releas[es] resources," telling the agent something is freed rather than merely flagged. It does not say what happens to in-flight automation or whether the device is left in a clean state, and nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It loses a point for minor redundancy and awkwardness — "a iOS" and "on an iOS device" restates the resource already named in "iOS automation session."
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lifecycle tool with 100% schema coverage and annotations carrying the safety profile, the description covers purpose and the resource-release effect. Remaining gaps (error behavior when no session exists, ordering relative to ios_start_session) are minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is only one parameter (udid), which the schema documents as "iOS device UDID." The description mentions the device but adds no syntax, format, or sourcing detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("End a iOS automation session"), so an agent knows exactly what it does. However it never references its natural counterpart ios_start_session or the other teardown siblings (session_quit, ios_release_hid, device_release), so sibling differentiation is absent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no exclusions. With several other teardown tools in the sibling list (ios_release_hid, ios_release_contacts_hid, ios_record_cleanup, device_release), the agent gets no help deciding which teardown to call or in what order.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_fast_screenshotiOS fast screenshotARead-onlyIdempotentInspect
Take a screenshot of an iOS device (no automation session required). Returns PNG image. Alternative to ios_screenshot when the iOS automation session is not running: it needs no session, but captures fresh from the device on every call, so it is slower per shot than ios_mjpeg_screenshot (which is fast only because a session is already streaming frames).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and idempotentHint=true, so the safety profile is covered. The description adds genuinely new behavioral context: no session prerequisite, a fresh device capture on every call, and the resulting per-shot latency relative to mjpeg. It does not discuss error behavior when the device is unreachable, which keeps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and its key differentiator, then the return type, then the sibling tradeoffs. No redundant or filler clauses; every segment carries selection-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return format ('Returns PNG image'), the session prerequisite, and the performance tradeoff against alternatives. Combined with full schema coverage on the single parameter, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single parameter with 100% description coverage ('iOS device UDID'), so the schema already carries the parameter semantics. The description adds no format or sourcing detail for udid beyond that. Baseline 3 applies when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Take a screenshot of an iOS device') and immediately scopes it with the distinguishing property '(no automation session required)'. It names and contrasts against both siblings, ios_screenshot and ios_mjpeg_screenshot, so an agent can select it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the selection condition: use this instead of ios_screenshot when the automation session is not running. It also explains the counter-case against ios_mjpeg_screenshot, noting mjpeg is fast only because a session is already streaming frames. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_copyiOS file copyADestructiveInspect
Duplicate ONE file to another path on an iOS device. The copy happens on the device side, so the bytes never travel to the server and back — prefer this over pull-then-push when both paths are in the same root. Directories are refused, because the file-transfer service has no recursive copy and reporting success after copying nothing would be worse than an error; walk the tree with ios_file_list and copy the files.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Absolute destination path within the same root | |
| udid | Yes | iOS device UDID | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| remotePath | Yes | Absolute path of the source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds valuable context beyond them: the copy is device-side so bytes never travel to the server, directories are refused because there is no recursive copy, and failing is preferred over false success. That rationale for the error path is exactly the kind of behavioral disclosure annotations cannot provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: operation and scope first, routing advice second, directory-raison d'être third. It is front-loaded and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderate-complexity file copy with a fully described schema and rich annotations, the description supplies the remaining decision-relevant context: same-root preference, directory restriction, and the alternative workflow. It does not need to explain return values because no output schema exists and the operation reports straightforward success/failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the same-root constraint that the schema already gives for "to", but adds no extra meaning for udid, bundleId, or remotePath beyond what the schema documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Duplicate") and resource ("ONE file") with scope ("to another path on an iOS device"), which cleanly distinguishes it from ios_file_move, ios_file_pull, and ios_file_push. An agent can tell it is a same-root, single-file copy 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: prefer this over pull-then-push when both paths are in the same root, and it names the exclusion (directories are refused). It also gives the corrective workflow (walk the tree with ios_file_list and copy the files), so when-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_deleteiOS file deleteADestructiveIdempotentInspect
Delete a file or directory tree on an iOS device. Directories are removed recursively. Same bundleId root selection as ios_file_list — the usual use is clearing an app's cached state between test runs. Returns deleted (true when everything went) plus failed, the paths that could not be removed. Set force to continue past individual failures instead of stopping at the first. This is destructive and has no undo. Camera photos and videos, their folders, and the on-device media databases are REFUSED: deleting one removes the file while the photo library keeps its record of it, leaving that library pointing at something that no longer exists. Files you pushed yourself are always deletable, including ones you put in the camera folder.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| force | No | Continue past individual failures and report them (default false) | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| remotePath | Yes | Absolute path of the file or directory to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/readOnly annotations by disclosing recursive semantics, the media-library refusal rule and the reason for it (dangling library records), that files pushed by the agent are always deletable, and that force controls failure handling. It also flags that the operation has no undo, which is the key risk fact an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, return shape, force semantics, and the destructive/refusal warnings. Every sentence carries information, though the refusal explanation is slightly verbose. Efficient for the amount of behavior it must convey.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description documents the return values (deleted plus failed paths), covers the destructive nature, and explains the media refusal edge case. Combined with full schema coverage and annotations, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, which sets baseline 3, but the description adds real meaning: how force alters failure handling, how bundleId selects the root container versus the shared media directory, and the refusal scope applied to remotePath targets. This is above the schema-only baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a file or directory tree on an iOS device') plus the scope nuance that directories are removed recursively. It also anchors itself to the sibling ios_file_list via the shared bundleId root selection, so an agent can place it in the file-manipulation family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context ('the usual use is clearing an app's cached state between test runs') and explains the force parameter's role in continuing past failures. It does not name alternative file tools (e.g. when to prefer move or stat over delete), so it stops short of explicit alternatives/exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_findiOS file findARead-onlyIdempotentInspect
Search an iOS device subtree for files and folders whose NAME matches a query. The walk runs on the device side, so this is the right way to locate a file — far cheaper than listing directories one by one. query is a case-insensitive substring, unless it contains *, ? or [, in which case it is treated as a glob (e.g. *.log, app-?.db). Results carry both the path within the root and the real absolute path on the device. truncated: true means the limit stopped the walk — report it as "the first N matches", not as everything that exists. Same bundleId root selection as ios_file_list.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| limit | No | Maximum matches to return (default 200) | |
| query | Yes | Name substring, or a glob if it contains * ? or [ | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| maxDepth | No | Maximum depth to descend (default unlimited) | |
| remotePath | Yes | Absolute path of the subtree to search |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds genuinely useful behavior beyond them: results carry both relative and absolute paths, and truncated:true means the walk was stopped by the limit and must be reported as 'first N matches'. This is real disclosure the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tightly packed sentences, front-loaded with the core purpose and the query semantics, then result semantics, then the truncation caveat. No filler; every sentence conveys a distinct fact an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 correctly compensates by describing the return payload (relative + absolute paths) and the truncation flag. Combined with 100% schema coverage and safety annotations, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds meaning the schema lacks: it states the match is case-insensitive, gives glob examples (*.log, app-?.db), and clarifies the limit's interaction with results. It does not explain maxDepth or udid beyond the schema, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search an iOS device subtree for files and folders whose NAME matches a query') and explicitly positions it against the sibling ios_file_list ('far cheaper than listing directories one by one'). An agent can distinguish it from ios_file_list and device_file_find without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this is the right choice over directory-by-directory listing, and points to ios_file_list for the shared root-selection semantics. It stops short of explicit when-not-to-use guidance (e.g. searching a single known directory), so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_listiOS file listARead-onlyIdempotentInspect
List files and directories on an iOS device. Returns each entry with its name, type (file/dir/link), size and modification time. Pass bundleId to browse a specific app's own container — that is where an app under test keeps its database, caches and logs — or omit it to browse the shared media directory (photos, downloads). Use depth above 1 to recurse. An entry that could not be read comes back with type: null and an error, so one bad child never hides the rest of the listing.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| depth | No | Recursion depth (default 1 = the directory itself) | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| remotePath | Yes | Absolute path within the chosen root, e.g. "/Documents" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description earns credit for going further: it discloses the return fields and, notably, the failure semantics — an unreadable entry returns `type: null` with an `error` rather than failing the whole listing. That partial-failure behavior is real context an agent could not infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with purpose and return shape, then parameter guidance, then failure behavior. Every sentence carries information and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers the return fields itself, plus error handling, parameter selection and container semantics, against annotations that carry the safety profile. An agent has everything needed to call this correctly without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains that `bundleId` targets the app's own container where an app under test keeps its database, caches and logs, and that `depth` above 1 triggers recursion. This gives the agent a reason to pick each parameter rather than just its format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List files and directories on an iOS device") and enriches it with the return shape (name, type, size, mtime), making the scope distinct from a single-file stat or a search. However, it never names a sibling such as ios_file_find or ios_file_stat, so the differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for the key choice: pass `bundleId` to browse an app's own container, omit it for the shared media directory, and use `depth` above 1 to recurse. It lacks explicit when-not guidance or a pointer to the alternative listing/search tools, so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_mkdiriOS file mkdirAIdempotentInspect
Create a directory on an iOS device, parent directories included. Safe to call when it already exists — the reply distinguishes the two (created vs existed) instead of failing, so staging a temp folder needs no existence check first. Same bundleId root selection as ios_file_list.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| remotePath | Yes | Absolute path of the directory to create |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so the description isn't carrying the safety burden alone. It still adds genuine context the annotations don't: the reply distinguishes `created` vs `existed` instead of failing, and it recursively creates parents. No permission or error-path detail beyond that, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences; the core action leads, the idempotency benefit is front-loaded as the reason it saves a check, and the sibling reference closes it out. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param, no-output-schema filesystem tool with full schema coverage and clear annotations, the description covers what's needed to call it correctly, including the idempotent return distinction. Only minor gaps remain, such as what errors occur on invalid paths or device unavailability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains udid, bundleId (with its container semantics) and remotePath. The description only re-references bundleId via 'Same bundleId root selection as ios_file_list', adding no syntax or value detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a directory on an iOS device') and adds the recursive scope ('parent directories included'), which is a meaningful behavioral detail rather than a restatement of the name. It also points at sibling ios_file_list for the bundleId root-selection convention, giving an anchor for distinguishing it from other file tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent it can call this without a prior existence check ('staging a temp folder needs no existence check first'), which is real usage guidance. It stops short of naming alternatives or when-not-to-use conditions relative to the other ios_file_* / device_file_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_moveiOS file moveADestructiveInspect
Rename or move a file or directory on an iOS device. Both paths are inside the SAME root (the same bundleId selection as ios_file_list) — moving between an app container and the shared media directory is an ios_file_pull followed by an ios_file_push, not this. Missing parent directories of the destination are created.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Absolute destination path within the same root | |
| udid | Yes | iOS device UDID | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| remotePath | Yes | Absolute path of the file or directory to move |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=false, and readOnly=false. The description adds one genuine behavioral detail beyond them — that missing destination parent directories are auto-created. However, it omits the most important mutation semantics for a destructive move: whether an existing destination is overwritten or the call fails, which the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, then the scoping constraint, then the side effect. Every sentence carries information, though the parenthetical comparison to sibling tools is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description covers scope, the cross-root exclusion, and parent-directory creation. The main remaining gap is overwrite/failure behavior when the destination exists, which an agent would want before invoking a destructive move.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented, including the 'within the same root' note on `to`. The description reinforces the same-root constraint for both paths but adds no syntax, format, or edge-case meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (rename/move) and resource (file or directory on an iOS device), and explicitly distinguishes itself from ios_file_list, ios_file_pull, and ios_file_push. An agent can tell what this does and what it is not 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-not rule: cross-root moves (app container <-> shared media) must use ios_file_pull + ios_file_push instead. It also anchors the bundleId selection to ios_file_list. It does not contrast with ios_file_copy or ios_file_delete, so the routing picture is slightly incomplete, but the key exclusion is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_pulliOS file pullAInspect
Read a file off an iOS device and return its contents as base64. Same bundleId root selection as ios_file_list. Oversized files are REFUSED rather than truncated — the error reports the actual size, so narrow the path or raise maxBytes (there is a hard ceiling). This matters: a silently clipped database or log is indistinguishable from a corrupt one. Check size first with ios_file_stat when unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| maxBytes | No | Raise the size limit for this call (default 5 MB, capped at 25 MB) | |
| remotePath | Yes | Absolute path of the file to read |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior well beyond the annotations: oversized files are REFUSED rather than truncated, the error reports the actual size, and there is a hard ceiling. This is exactly the kind of non-obvious behavior an agent needs. It stops short of stating session/auth prerequisites or whether the pulled content is cached, and the annotations' readOnlyHint=false is not explained by the description, but no direct contradiction exists since the description never asserts the absence of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, front-loaded with the core action and followed by scope, failure mode, and a pre-check. The 'This matters' sentence earns its place by motivating the refusal semantics, and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly notes the return is base64, and it covers the significant failure mode, the sibling to check first, and container selection. Only minor gaps remain (no mention of required session/auth state or call cost for large files).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented (including 'default 5 MB, capped at 25 MB'), setting the baseline at 3. The description's 'raise maxBytes / narrow the path' adds workflow context but no syntax or semantics the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a file off an iOS device') plus the return representation ('base64'). It also differentiates itself from the two adjacent siblings it names, ios_file_list (root selection) and ios_file_stat (size pre-check).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Check size first with ios_file_stat when unsure', and prescribes the recovery path when the read is refused ('narrow the path or raise maxBytes'). Alternatives are named by name, not left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_pushiOS file pushADestructiveInspect
Write a file onto an iOS device from base64 content, creating parent directories as needed. Same bundleId root selection as ios_file_list — pass it to seed an app's own container with fixture data, a config file or a test database before launching it. Overwrites an existing file at that path.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| content | Yes | File content as a base64 string | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| remotePath | Yes | Absolute destination path within the chosen root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the bar is lower. The description still adds real behavioral detail beyond them: it creates parent directories automatically and overwrites any existing file at the destination path, which tells the agent exactly what state it is about to clobber.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the core action front-loaded, followed by the use-case rationale and then the destructive overwrite warning. No filler, no repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with full annotation coverage and no output schema, the description covers the essential what, why, and the overwrite caveat. It does not mention error/failure behavior or permission requirements, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents udid, content, bundleId, and remotePath in detail, making 3 the baseline. The description only cross-references bundleId root selection to ios_file_list and frames it by use case; it adds no syntax or format detail the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Write a file onto an iOS device from base64 content'), names the content format, and clearly separates it from the reverse-direction sibling ios_file_pull and the shared device_file_push family. An agent can identify the operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use scenario (seeding an app's own container with fixture data, config, or a test database before launching) and routes the agent to ios_file_list for bundleId root semantics. It does not explicitly name the inverse tool or state when NOT to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_file_statiOS file statARead-onlyIdempotentInspect
Get metadata for one file or directory on an iOS device — type, size and modification time. Cheaper than listing a directory when you already know the path, and the way to check a file's size before pulling it. Same bundleId root selection as ios_file_list.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| bundleId | No | Bundle id of an app whose OWN container to browse (Documents/, Library/, tmp/) — the files the app itself reads and writes. Omit to use the shared media directory (photos, downloads) instead. Only apps built for testing expose a container; store-installed apps cannot. | |
| remotePath | Yes | Absolute path within the chosen root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds a comparative cost trait ('cheaper than listing'), which is useful behavioral context beyond the annotations, though it says nothing about the shape of the metadata returned or error behavior for missing paths.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the first defines the operation and output, the second gives usage rationale, the third anchors the root-selection semantics. The primary purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only metadata tool with full schema coverage and complete annotations, this is sufficient. Without an output schema, the description helpfully enumerates the returned fields (type, size, modification time) so the agent knows what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema. The description adds only a cross-reference ('Same bundleId root selection as ios_file_list') rather than new syntax or format detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get metadata for one file or directory on an iOS device') and enumerates the returned fields (type, size, modification time). It also distinguishes itself from the sibling ios_file_list by framing itself as the targeted single-path alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions: 'cheaper than listing a directory when you already know the path' and 'the way to check a file's size before pulling it.' This directly routes the agent between ios_file_stat, ios_file_list, and ios_file_pull.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_find_elementiOS find elementRead-onlyIdempotentInspect
Find a UI element on an iOS device by its accessibility label or text. Returns the element center coordinates (x, y), bounds, and which strategy matched. On no match, returns similar visible labels to retry with. Prefer this (or ios_tap_by_label) over eyeballing coordinates from a screenshot. Requires an active iOS automation session (auto-starts if needed). On a device set to direct-input-only it needs no session: it answers from the screen's accessibility tree in well under a second and returns the element's label, type, value and match score, but NO coordinates. Pass input:"session" to force the session lookup.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Element type filter e.g. XCUIElementTypeButton, XCUIElementTypeCell (optional, used in class chain) | |
| udid | Yes | iOS device UDID | |
| input | No | Lookup path. 'auto' (default) follows the device's mode: direct-input-only devices look up without a session (no coordinates returned). 'session' forces the automation-session lookup, which returns coordinates. 'hid' forces the session-free lookup. | |
| label | Yes | Accessibility label or visible text of the element to find | |
| match | No | How to match `label`. Default "contains" — strict, and the only modes that act without interpretation. "fuzzy" tolerates typos and word-order drift, and is tried ONLY after strict finds nothing; it REFUSES when two candidates are too close rather than guessing between them (e.g. "Sign" vs Sign In / Sign Out), and reports which attribute it matched. | |
| strategy | No | Element finding strategy to try first. Defaults to trying class chain → predicate string → accessibility id → name → xpath in order. |
ios_fpsiOS FPSARead-onlyIdempotentInspect
Sample on-device rendering FPS (Core Animation frames-per-second) for a physical iOS device over a short window, returning mean/min/max FPS plus GPU/renderer/tiler utilization when available. This is the iOS counterpart to android_fps. No automation session required. FPS reflects whatever is on screen during the window — drive the app first for a meaningful reading.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| durationMs | No | Sampling window in milliseconds (default 3000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/idempotent, so the safety bar is lower. The description adds genuinely useful behavior: it requires a physical device, samples over a short bounded window, and notes GPU/renderer/tiler utilization is only available 'when available' — a meaningful caveat about partial results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the tool's function front-loaded, followed by the return shape, the session-independence note, and the prerequisite caution. No filler; every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the returned metrics (mean/min/max FPS plus GPU/renderer/tiler utilization). Combined with the physical-device requirement and the on-screen caveat, an agent has everything needed to invoke and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so udid and durationMs are already documented with bounds and a default. The description only alludes to a 'short window' without adding format or default details beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (sample), resource (on-device rendering FPS via Core Animation), and the exact metric set returned. It explicitly names android_fps as the counterpart, so an agent can distinguish this iOS tool from its 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage context: 'No automation session required' and 'drive the app first for a meaningful reading.' It does not spell out when to prefer this over generic performance tools (e.g. ios_performance_snapshot), but the preconditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_gamepad_disconnectiOS gamepad disconnectAIdempotentInspect
Release every input the virtual game controller is holding on an iOS device, so nothing stays pressed after you finish. Also drops any controller being streamed from a live viewer of this device — otherwise that one re-sends its frame a moment later and the release looks like it silently failed. Call this when finished.
By default the controller STAYS CONNECTED with nothing held: apps still see a gamepad, and the next call reuses it instead of waiting ~5 s for the device to adopt a new one. Pass unplug:true to remove it outright — the honest choice when handing the device back, since a phantom controller changes how games behave for whoever gets it next. The cost of unplugging is paid later, not now: re-registering waits out the adoption again, and the device keeps a permanent entry for every controller ever registered, which nothing can remove.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| unplug | No | Remove the controller from the device instead of just releasing its inputs (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the annotations (readOnly=false, destructive=false, idempotent=true), it discloses that the controller stays connected by default, that the next call reuses it and avoids a ~5 s adoption wait, that a streamed controller is also dropped, and that the device retains a permanent per-controller registry entry nothing can remove. These are exactly the operational traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in the first sentence, then the viewer-controller caveat, then the unplug tradeoff. It is longer than average but nearly every sentence carries non-redundant consequence; only mild verbosity keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only two params, the description fully covers the behavioral surface: what is released, what stays connected, what unplug removes, the reconnect cost, and the permanent registry side effect. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning for 'unplug' beyond the schema's one-liner: it is framed as the honest choice when returning the device, with the future re-registration cost and permanent-registry consequence spelled out. It lacks formal syntax detail, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource+scope: 'Release every input the virtual game controller is holding on an iOS device.' It also clarifies an otherwise non-obvious side effect (dropping a controller streamed from a live viewer), which distinguishes this from sibling tools like ios_gamepad_state and ios_gamepad_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger ('Call this when finished') and explicitly frames the default-vs-unplug decision with a recommendation for handing a device back. It does not name sibling tools as alternatives, so it falls short of a 5, but the when-and-why guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_gamepad_stateiOS gamepad stateAInspect
Present a REAL game controller to an iOS device and set its state. The device registers a virtual DualShock 4 and receives genuine controller HID, so NATIVE apps see a GCExtendedGamepad and a web page sees a W3C standard-mapping pad in navigator.getGamepads(). It shows up in Settings > General > Game Controller. No Safari page is required.
HOW TO FIRE INPUT PROPERLY:
• One call = ONE frame = one instant in time. A button stays pressed until you send a frame WITHOUT it, so every press needs a matching release frame — exactly like keydown then keyup. Sending press after press just holds them all down.
• For anything that should look played rather than stepped — mashing, combos, a stick sweep — pass frames instead of calling repeatedly. The device plays the whole sequence out at intervalMs (default 33 ms ≈ 30 fps). A round trip per frame cannot reach that cadence, so a rapid sequence built out of single calls will always read as held buttons.
• Alternate press and release inside frames: [{buttons:[1]}, {}, {buttons:[0,1]}, {}] is tap A, release, tap A+B, release.
• Axes are [leftX, leftY, rightX, rightY], -1..1. Sweep them across frames to roll a stick; omitted axes read as 0.
• READ THIS BEFORE REPORTING A STICK BUG: a stick axis can only express RIGHT and UP on axes[0..1], because the report's joystick fields are unsigned. The left stick's full 360-degree analog push IS delivered, but it arrives on the D-PAD — buttons[12..15], and GCExtendedGamepad.dpad.xAxis/yAxis for native apps, which are bipolar. Reconstruct it as x = right - left, y = down - up. Pushing left and reading axes[0] === 0 is the EXPECTED, structural behaviour, not a fault to debug.
• While a sequence is playing, this call owns the pad — a controller streamed from a live viewer is paused and resumes on its own shortly after.
• Confirm the pad EXISTS with ios_gamepad_status; confirm VALUES in the app under test.
Input routes to whatever holds focus, so foreground the app under test first — measuring while Settings or another app is in front reads as "nothing works".
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | IGNORED. Accepted so older callers do not break. The controller is a real device on the phone and its identity is fixed when it is registered, so passing an id here does NOT re-attach it as that controller and does NOT change what a tester displays — it is silently discarded. Read the current identity with ios_gamepad_status. Button mapping is always W3C standard order regardless. | |
| axes | No | Axis values -1..1: [leftX, leftY, rightX, rightY]. Omitted axes read as 0. | |
| udid | Yes | iOS device UDID | |
| reset | No | Register a FRESH controller before sending this frame, instead of reusing the one already there. Use ONLY when the controller has stopped responding — the usual sign is that calls keep succeeding while the app under test sees nothing, and ios_gamepad_status still reports one as registered. Two costs, so do not pass it routinely: the call takes several seconds while the device adopts the new controller, and every registration leaves a permanent extra entry under Settings > General > Game Controller that the device never expires. | |
| frames | No | Play a SEQUENCE of frames at intervalMs instead of setting one state. This is how you produce real gameplay input: include the release frames (an entry with no buttons releases everything). Capped at 300 frames. Overrides axes/buttons when present. | |
| buttons | No | Button values 0..1 in W3C standard order (0-3 face, 4/5 shoulders, 6/7 triggers, 12-15 d-pad, 16 home, 17 touchpad on a DualShock). >= 0.5 counts as pressed. An empty/omitted entry releases everything. | |
| intervalMs | No | Gap between frames in ms (default 33). Lower = faster mashing; 33 ms matches a 30 fps controller poll. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), yet the description discloses far more: press persists until a release frame, sequences own the pad and pause a live-viewer stream, `reset` costs seconds and leaves permanent Settings entries, and the focus-routing behavior. It also warns which readings are expected (unsigned joystick fields) rather than bugs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but front-loaded with the core behavior and organized into labeled bullets where each sentence carries non-redundant operational information (frame timing, sequence format, stick quirk, reset cost, focus prerequisite). For a tool with this much footgun potential, nothing reads as filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent how to verify results (ios_gamepad_status for existence, the app under test for values) and covers registration side effects, cancellation behavior, and prerequisites. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description meaningfully extends it: frames-to-intervalMs relationship and 300-frame cap, release semantics of an empty entry, the axes order and -1..1 range, the d-pad reconstruction formula for sticks, and the idle-passing `id` parameter. This is well beyond baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: present a REAL game controller to an iOS device and set its state, plus what native apps and browsers observe. It is clearly distinct from the sibling ios_gamepad_status (which only confirms existence) and ios_gamepad_disconnect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance for every mode: single call for one frame, `frames` for played sequences, `reset` only when the controller has stopped responding, and foregrounding the app under test first. It also routes confirmation work to ios_gamepad_status and the app under test.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_gamepad_statusiOS gamepad statusARead-onlyIdempotentInspect
Report whether a virtual game controller is currently registered on an iOS device. The pad is a REAL HID device (apps see a GCExtendedGamepad and it appears in Settings > General > Game Controllers), so this reads the device rather than a web page and stays true with no browser open. Look at the gamepad field: registered tells you a pad exists, and the surrounding HID surfaces tell you input can reach the device at all. It reports presence, not the last axes/buttons you sent — confirm values in the app under test.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and non-open-world, so safety is covered. The description adds genuine value beyond them: the pad is a REAL HID device visible in Settings, this reads the device rather than a web page and works with no browser open, and the return is presence-only rather than last-sent input. It stops short of 5 because it does not describe failure/permission behavior when no pad is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and each subsequent sentence carries distinct information (HID truth, browser independence, presence vs. values, what the return field means). It runs slightly long with some emphatic repetition ('REAL HID device', 'rather than a web page'), which is the only thing keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully explains the key return surface by telling the agent to inspect the `gamepad` field and its `registered` subfield. It leaves the rest of the output shape ('the surrounding HID surfaces') vague, so an agent cannot fully predict the response, but for a one-parameter read tool with full annotation coverage it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (udid) with 100% schema description coverage, so the schema fully documents it. The description adds no syntax, format, or sourcing guidance for udid, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reporting whether a virtual game controller is currently registered on an iOS device. It also functionally distinguishes itself from the value-reporting sibling (ios_gamepad_state) by stating 'It reports presence, not the last axes/buttons you sent.' An agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear: this is a device-level truth check that 'stays true with no browser open,' and the agent is told to read the `gamepad`/`registered` field to decide whether a pad exists. However, it never names an alternative tool (e.g. ios_gamepad_state, ios_gamepad_disconnect) or states explicit when-not conditions, so the routing guidance stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_gesture_pathiOS gesture pathAInspect
Replay a freeform stroke as ONE continuous touch on an iOS device — the polyline lands exactly as given, so use it for curves, arcs, signatures, unlock patterns, or any gesture a straight ios_swipe cannot express. points is an ordered list of {x, y, t?} screen points; t is ms from touch-down (omit to auto-space evenly, which also controls speed → momentum for a fast flick). Minimum 2 points. Works without an automation session when the direct input path is available; falls back to one otherwise (see input).
| Name | Required | Description | Default |
|---|---|---|---|
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| points | Yes | Ordered waypoints of the stroke (first = touch-down, last = lift) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, destructive=false, idempotent=false). The description goes well beyond them, disclosing that it works without an automation session when the direct path is available, that it falls back otherwise, that direct-input-only devices report an error rather than silently switching, and that 'hid' fails on iOS 17.x or without a tunnel.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, with the parameter semantics and input-path details following. It is dense and slightly long, but every sentence carries information an agent needs, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, no-output-schema tool, the description covers the stroke format, timing semantics, minimum points, and the input-path fallback and error behavior. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies that omitting `t` auto-spaces points and that spacing controls speed/momentum for a fast flick, plus the minimum of 2 points. This is useful interpretation beyond the raw schema field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replay a freeform stroke as ONE continuous touch on an iOS device') and immediately differentiates from the sibling ios_swipe by naming the gestures a straight swipe cannot express. An agent can distinguish this from ios_swipe, ios_tap, or ios_drag_drop 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes usage to curves, arcs, signatures, and unlock patterns, and names ios_swipe as the alternative for straight gestures. It also explains the input-path selection policy (auto/hid/session) including the direct-input-only error case, so the agent knows when and how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_get_browser_urliOS get browser URLARead-onlyIdempotentInspect
Get the current URL loaded in Safari on an iOS device. Returns the URL string. Requires an active iOS automation session (auto-starts if needed).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the auto-start behavior for the automation session and the returned value shape ('Returns the URL string').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler; the core action is front-loaded and the return value and session precondition follow in order of importance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description covers the action, the returned value, and the session precondition. Only minor edge-case behavior (e.g., no active Safari tab) is left unspecified, which is acceptable at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) with 100% schema description coverage, so the schema fully documents it. The description adds no semantics beyond 'iOS device' for that parameter, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get the current URL loaded in Safari) plus the platform (iOS device), and it states the return value. It reads clearly against mutation siblings like ios_navigate_url, though it does not explicitly name an alternative to route away from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a precondition ('Requires an active iOS automation session (auto-starts if needed)'), which is real usage context. However, there is no explicit guidance on when to use this versus ios_navigate_url or the Safari DevTools siblings; usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_get_locationiOS get locationARead-onlyIdempotentInspect
Read the iOS device's current GPS location. Returns the simulated value when ios_set_location is active (no automation session needed to read it), otherwise the device's real CoreLocation fix.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior beyond that: the returned value depends on whether ios_set_location is active, and reading requires no automation session. It doesn't cover failure modes (e.g. location services disabled), so it is not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core action is front-loaded before the conditional return-value detail. Every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does partially describe the return (simulated value vs real CoreLocation fix), which is the key ambiguity for this tool. It omits the actual payload shape (coordinates, accuracy, timestamp), leaving a minor gap for a simple single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (udid) with 100% schema description coverage, so the schema already documents it fully. The description adds no meaning about the parameter (e.g. whether it accepts a booted simulator UDID or a real device UDID), which is the expected baseline of 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 iOS device's current GPS location') and explicitly distinguishes this tool's behavior from the sibling ios_set_location, so an agent can separate it from ios_clear_location, ios_play_location_route and device_get_location without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear operating condition: the simulated value is returned when ios_set_location is active and no automation session is required to read it. That is useful context, but it never states when to prefer this tool over alternatives such as ios_play_location_route or the Android/device equivalents, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_get_pasteboardiOS get pasteboardARead-onlyIdempotentInspect
Get the clipboard (pasteboard) text copied on an iOS device. Returns the copied text (empty string if the pasteboard has none). Requires an active iOS automation session; the automation agent must be foregrounded to read the pasteboard.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description adds genuine behavioral context: it returns an empty string when the pasteboard is empty and requires an active foregrounded session. This is useful disclosure beyond the structured annotations, though return format nuances (truncation, encoding) are unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core action front-loaded, followed by return behavior and prerequisites. No filler, though the parenthetical pasteboard gloss is slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return value (copied text, empty string fallback) and the session/foreground requirement. Adequate for a simple one-param read tool, with only minor gaps around error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage, so the schema fully documents 'udid'. The description adds nothing about the parameter beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get the clipboard (pasteboard) text') and clarifies the pasteboard concept. However, it does not distinguish itself from close siblings like ios_clipboard_get_hid or device_clipboard_get, leaving the agent to infer which clipboard reader to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides prerequisites (active iOS automation session, foregrounded agent) which is real usage context, but offers no explicit when-to-use guidance or comparison against the alternative clipboard-reading siblings. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_hid_statusiOS HID statusARead-onlyIdempotentInspect
Report whether direct HID input (host-driven, no automation session needed) is available on an iOS device, plus its display size. Use to decide between the hid tools and the session-backed ios tools. Does NOT require an automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral context beyond them: input is host-driven and 'Does NOT require an automation session', which materially changes how an agent should sequence its calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose, then routing guidance, then the key constraint. No filler and nothing repeated from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description does summarize the return (HID availability plus display size) and the session requirement, so an agent knows what it gets back. Adding the failure mode (what it reports when HID is unavailable) would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single udid parameter, so the schema already documents the only input. The description adds no syntax, format, or constraint detail beyond it, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Report whether direct HID input ... is available on an iOS device') and adds the secondary output (display size). It also distinguishes itself from the mass of sibling tools by naming the two families it mediates: the *_hid tools and the session-backed ios_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to decide between the *_hid tools and the session-backed ios_* tools' gives clear context for when to reach for this tool. It stops short of stating exclusions (e.g. when a session is already open this check is unnecessary), so it is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_install_appiOS install appAInspect
Install an IPA or .app on an iOS device. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to .ipa file or .app folder on the server | |
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false, openWorld=false, so the safety profile is covered. The description adds one real behavioral fact beyond the annotations (no automation session needed), but omits whether an existing install is overwritten, whether the device must be unlocked/trusted, or any error conditions for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core action front-loaded and the session caveat immediately after. Nothing could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with a complete schema and annotations covering the safety profile, the description supplies the essential action plus the session-free usage note. A brief note on reinstall/overwrite behavior would close the remaining gap, but nothing critical for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two required parameters (path, udid), both fully documented in the schema. The description adds no syntax, format, or constraint details beyond what the schema already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (install) and resource (IPA or .app on an iOS device), which is more precise than the generic sibling app_install. It does not explicitly contrast itself with app_install or ios_uninstall_app, but the iOS-specific artifact types make its domain clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'No automation session required' implies a usage context (callable outside a session), which is genuinely useful routing information. However, it gives no explicit guidance on when to prefer this over app_install, app_upload, or ios_launch_app, leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_key_hidiOS key HIDAInspect
Send raw HID keyboard usage codes as real hardware keypresses — the ONLY way to inject true keypresses, modifiers and shortcuts (the typing tools can only type into a focused field). usages is an ordered list of USB HID Keyboard/Keypad usage-page codes (e.g. 0x04=a … 0x1D=z, 0x28=Return, 0x2A=Backspace; modifiers 0xE0=LeftCtrl…0xE3=LeftGUI); send them together to press a chord. usages [74] is the keyboard Home key: it wakes the device and clears a passcode-free Lock Screen without closing whatever app was open — this is NOT the Home button (ios_press_button 'home'), which leaves the app. The keys are pressed AND released as one action, so nothing stays held after the call. Pass an empty list to force-release anything a previous caller left held. Returns "no HID available" on older iOS or when the device has no active input channel.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| usages | Yes | Ordered USB HID Keyboard/Keypad usage codes to press together (numbers, e.g. [0x04] for "a"). Empty list = release any keys left held. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false) the description discloses that keys are pressed AND released as one action so nothing stays held, that an empty list force-releases prior held keys, and that it returns 'no HID available' on older iOS or when no active input channel exists. That is meaningfully more than the safety hints provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded — the core capability and its unique value lead, followed by code examples and edge cases. Every sentence carries information, though the code table and the Home-key digression make it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the return burden, and it does: the success semantics (one atomic press+release) and the failure string ('no HID available') are both documented. For a 2-parameter, 100%-covered tool this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds substantial meaning: it enumerates usage-page codes (0x04=a, 0x1D=z, 0x28=Return, 0x2A=Backspace, modifiers 0xE0–0xE3), explains that codes sent together form a chord, and specifies the empty-list semantics. This goes beyond the schema's terse usages description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (send raw HID keyboard usage codes as real hardware keypresses) and immediately scopes it against siblings: 'the ONLY way to inject true keypresses... (the typing tools can only type into a focused field).' An agent can distinguish it from ios_send_keys, device_type, ios_press_button, and ios_release_hid 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (true keypresses, modifiers, shortcuts that typing tools cannot do), names the alternatives it is not (typing tools; ios_press_button 'home'), and gives a conditional usage: empty list to force-release anything left held. Nothing 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.
ios_kill_appiOS kill appADestructiveIdempotentInspect
Kill an app on an iOS device by bundle ID, process ID, or process name. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | No | Process ID to kill | |
| udid | Yes | iOS device UDID | |
| bundleId | No | App bundle ID to kill | |
| processName | No | Process name to kill |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false and openWorldHint=false, so the safety profile is covered. The description adds the useful session-independence fact, but says nothing about impact on app data, whether a running session is disrupted, or what happens if the identifier matches nothing — a meaningful gap for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, and the core action plus its accepted identifiers are front-loaded ahead of the session note. Nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and full annotation/schema coverage, the description covers the basics for a destructive one-shot call. What it omits is the disambiguation from ios_terminate_app and any note on failure modes, which an agent selecting among ~250 siblings would likely need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all four parameters (pid, udid, bundleId, processName) are documented in the schema, so the baseline is 3. The description restates the three identifier options but adds no precedence rules, mutual-exclusion constraints, or format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (kill), resource (an app on an iOS device), and the three accepted identifiers (bundle ID, process ID, process name), so the action is unambiguous. However, it does not distinguish itself from the closely-named sibling ios_terminate_app (or device_terminate_app), which appears to do the same thing — an agent cannot tell them apart from this text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'No automation session required' gives one clear precondition for use, which is real guidance. But there is no statement of when to prefer this over ios_terminate_app, nor what to do if multiple identifiers are supplied or the app is already dead. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_launch_appiOS launch appAInspect
Launch/activate an app on an iOS device by bundle ID. With no arguments it ACTIVATES — resuming the app in place and keeping its state — using the automation session when one is up and the direct device transport otherwise. Pass arguments to force a COLD relaunch with that argv instead (launch arguments are ignored on an already-running process, so the app is killed first). Arguments land in the process's argv, which is where NSUserDefaults reads its argument domain from, e.g. ["-AppleLanguages", "(fr)"] or your own debug flags; the override lives for that launch only.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| bundleId | Yes | App bundle ID to launch | |
| arguments | No | Optional launch arguments (argv). Omit for a plain activate; supplying any forces a cold relaunch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, but the description adds substantial behavior beyond them: the app is killed first when arguments are supplied, the activation path uses the automation session when available and the direct device transport otherwise, and the argv override lasts only for that launch. Missing are failure semantics (e.g., app not installed) and auth/permission prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and resource, then layers the activate/relaunch distinction before the argv detail. Dense and mostly waste-free, though the final clause about NSUserDefaults is long and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no output schema, the description covers mode selection, kill-before-launch behavior, transport selection, and argument lifetime. It does not describe what the call returns (e.g., PID) or error conditions, which are the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description genuinely enriches the `arguments` parameter: it explains that values land in the process argv, that NSUserDefaults reads its argument domain from there, gives concrete examples (["-AppleLanguages", "(fr)"]), and states the override is per-launch only. udid and bundleId are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Launch/activate an app on an iOS device by bundle ID') and immediately splits the two distinct modes of operation (activate vs. cold relaunch). An agent can distinguish this from ios_launch_app_in_language, ios_kill_app, and ios_terminate_app 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional guidance: omit `arguments` to activate and preserve state, supply `arguments` to force a cold relaunch. It also explains the underlying rule (launch arguments are ignored on a running process, so the app is killed first). It stops short of naming sibling alternatives such as ios_launch_app_in_language or ios_kill_app.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_launch_app_in_languageiOS launch app in languageAInspect
Launch an iOS app forced into a specific language / locale, without changing the device's system settings. Useful for QA testing app localization (e.g. open the app in Spanish without flipping the whole device to Spanish). Override is per-launch — relaunching the app outside this tool reverts to system language. Works whether or not an automation session is already open: it reuses an open automation session when there is one and launches the app directly when there is not, and says which path it used. The target app must use NSLocalizedString / Bundle.main.localizedStringForKey at runtime (modern apps do; some legacy apps cache locale on first cold launch — kill via ios_kill_app and re-call this tool to force re-read).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| locale | No | Optional BCP-47 / POSIX locale (defaults to <language>_<UPPER(language)>), e.g. "fr_FR", "es_US" | |
| bundleId | Yes | App bundle ID, e.g. com.apple.Preferences | |
| language | Yes | ISO 639-1 language code, e.g. "fr", "es", "en", "ja" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (only a false readOnlyHint), so the description carries the full burden and does so well: it discloses the per-launch override that reverts on relaunch, the session-reuse vs direct-launch branching and that the tool reports which path it used, the runtime NSLocalizedString requirement, and the legacy cold-launch caching workaround.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and benefit before the caveats, and each sentence carries actionable information. It is slightly long with a parenthetical example and two related caveat sentences, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a launch-with-override tool with no output schema, the description covers purpose, scope, side effects, session behavior and failure modes (legacy locale caching) including its output claim of reporting which launch path was used. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid, bundleId, language and locale are already documented with examples and the default locale derivation. The description alludes to the language/locale relationship but adds no syntax or format detail beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (launch), resource (iOS app) and a precise qualifier (forced into a specific language/locale without changing device settings). This clearly distinguishes it from the plain ios_launch_app and the system-wide ios_set_device_language siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case (QA testing app localization, e.g. Spanish without flipping the device) and contrasts against changing system settings, plus a remediation note (kill via ios_kill_app and re-call). It stops short of naming the specific alternative sibling tools an agent should pick between, but the when-to-use context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_list_appsiOS list appsARead-onlyIdempotentInspect
List the apps installed on an iOS device — user apps AND system apps like Settings and Safari, which the raw listing's default hides. Returns bundleId, name and type. Internal bundles are excluded: iOS reports 264 installed bundles on a typical iPad, of which ~51 are apps and the rest are XPC helpers and view services (MediaRemoteUIService, AAUIViewService, SpringBoard). Pass includeInternal to see those too. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| includeInternal | No | Include hidden system bundles — view services, XPC helpers, SpringBoard — and return the raw Info.plist dicts. Default false. Very large output. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it explains that internal bundles (XPC helpers, view services, SpringBoard) are excluded by default, quantifies the difference (~264 bundles vs ~51 apps on a typical iPad), warns includeInternal produces raw Info.plist dicts and very large output, and notes no automation session is needed. This is exactly the context an agent needs to avoid a bloated or misread call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the inclusion/exclusion rules, then the optional flag. The bundle-count statistic is somewhat verbose but earns its place by justifying why the default filter exists. Slightly dense but no wasted filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (bundleId, name, type), fully covering both parameters and their effects, and disclosing the no-session prerequisite. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real semantic depth for includeInternal — what it turns on (view services, XPC helpers, SpringBoard, raw Info.plist dicts) and that output is very large. udid semantics are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the apps installed on an iOS device') and immediately scopes it to user AND system apps, which distinguishes it from generic siblings like device_list_apps or app_list. The agent knows exactly what this returns 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: system apps are included by default, internal bundles are hidden unless includeInternal is passed, and notably 'No automation session required' tells the agent it can call this without setup. It does not name the sibling alternatives (device_list_apps, ios_tv_apps) it competes with, so the routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_locators_foriOS locators forARead-onlyIdempotentInspect
Generate ranked locator strategies for one element. Counterpart of device_locators_for. Pass either coordinates (x, y — picks the SMALLEST element containing the point) OR a label substring. Returns accessibility id, predicate string, class chain and XPath, best first, each with a note on why it ranks where it does. Use these to fill page-object selectors when generating test scripts instead of re-deriving them. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X of the element in screen points (use with y) | |
| y | No | Y of the element in screen points (use with x) | |
| udid | Yes | iOS device UDID | |
| label | No | Label / name substring to look up instead of coordinates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real context beyond them: the session prerequisite, the exact return contents (accessibility id, predicate string, class chain, XPath) with ranking notes, and the tie-break rule that coordinates select the SMALLEST element containing the point. Failure behavior when no element matches is not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, front-loaded with purpose and input modes, then return shape, then the usage rationale and prerequisite. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully documented 4-param schema, rich annotations and no output schema, the description supplies everything an agent needs: what it produces, how inputs are interpreted, the session precondition, and when to reach for it. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: coordinates resolve to the smallest containing element, and x/y versus label are mutually exclusive input modes. It also frames the udid requirement via the active-session prerequisite.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate ranked locator strategies for one element') with a clear scope limit of one element, and positions itself against the cross-platform sibling by naming device_locators_for as its counterpart. An agent can distinguish it from ios_find_element or ios_page_source without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context ('Use these to fill page-object selectors when generating test scripts instead of re-deriving them') plus the input-mode choice (coordinates OR label) and the prerequisite of an active iOS automation session. It does not name a competing tool to prefer in other situations, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_lock_statusiOS lock statusARead-onlyIdempotentInspect
Check if an iOS device screen is locked. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the session prerequisite, but says nothing about the return value (boolean? device state?) or failure modes when no session is active.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose front-loaded, prerequisite second. No filler; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial single-parameter read tool with full annotations and full schema coverage, the description is adequate. A note on the return shape or behavior without an active session would have closed the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'udid' parameter, so the schema already carries the parameter meaning. The description adds nothing beyond it, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Check if an iOS device screen is locked.' An agent can tell it is a read-only status query. It does not, however, distinguish itself from the sibling ios_unlock, which is the natural paired operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a prerequisite ('Requires an active iOS automation session'), which is useful context, but it never states when to use this versus alternatives like ios_unlock or a screenshot, nor what to do if the session is inactive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_long_pressiOS long pressAInspect
Long press at (x,y) on an iOS device screen. Triggers context menus, peek/pop, drag handles. Distinct from ios_swipe (has motion) and ios_drag_drop (hold + motion). Coordinates are screen points. Works without an automation session when the direct input path is available; falls back to one otherwise (see input).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate (screen points) | |
| y | Yes | Y coordinate (screen points) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| duration | No | Hold duration in ms (default: 800) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, non-destructive, non-idempotent, but the description adds genuinely new context: the tool can work without an automation session via a direct input path and falls back otherwise, with the response indicating which path ran. It stops short of stating the failure/error semantics in full, leaving that to the `input` param.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and target, then differentiation, then the coordinate note, then the session caveat. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a gesture tool with no output schema and full param coverage, the description covers action, differentiation, coordinates, and session/fallback behavior. Minor gap: the timing semantics of duration and the response contents when a fallback occurs are not spelled out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema itself richly documents x/y, norm, input, and duration. The description only restates the coordinate system ('screen points') already present in the schema and defers `input` details to the parameter, so it adds little beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (long press) and resource (iOS device screen at x,y), and immediately names the two siblings it must not be confused with. An agent can distinguish ios_long_press from ios_swipe and ios_drag_drop purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts against alternatives: ios_swipe has motion, ios_drag_drop is hold + motion, while this is a stationary hold. Also lists the outcomes it triggers (context menus, peek/pop, drag handles), giving the agent a clear signal of when this is the right gesture.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_mjpeg_screenshotiOS MJPEG screenshotARead-onlyIdempotentInspect
PREFERRED fast screenshot of an iOS device via the MJPEG stream. Returns the JPEG image PLUS a text block with the image pixel size and the device POINT size, and the exact formula to convert a pixel you read off the image into iOS screen points for the HID/tap tools (the image is NOT 1:1 with device points — guessing that scale is the #1 cause of missed taps). Much faster than ios_screenshot; use it for routine per-action checks. Auto-wakes on a black frame. Requires an active iOS automation session, because the speed comes from reading the frame stream that session is already running — with no session, use ios_fast_screenshot instead.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description layers on real behavioral context: the return shape (JPEG plus a text block with pixel and point size and a conversion formula), the auto-wake-on-black-frame behavior, and the session dependency that explains the speed. With no output schema, this disclosure is essential and it is delivered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the 'PREFERRED fast screenshot' signal, and the scale-conversion warning, speed comparison, and session requirement each carry weight. It is dense and slightly long, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only screenshot tool with no output schema, the description covers return format, the pixel-to-point conversion caveat, precondition (active session), and fallback tool. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single udid parameter, so the schema already documents it fully. The description adds nothing about the parameter itself, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('fast screenshot of an iOS device via the MJPEG stream') and explicitly distinguishes itself from siblings ios_screenshot ('much faster than') and ios_fast_screenshot. An agent can pick it out 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('use it for routine per-action checks'), the alternative when the precondition is unmet ('with no session, use ios_fast_screenshot instead'), and the precondition itself ('requires an active iOS automation session'). Nothing 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.
ios_notifications_captureiOS notifications captureARead-onlyIdempotentInspect
Watch which notifications an iOS device receives and return them. Use this to confirm an app actually got a push or alert — for example waiting for a one-time passcode to arrive after triggering a login. Reports WHICH app was notified, WHEN, whether the notification contained a one-time code, and whether it was actually shown or silently suppressed. It CANNOT return the notification text: the device keeps the title and body private. To read the words, capture while the banner is on screen and use ios_page_source. By default it returns as soon as the first notification arrives, so trigger the action first and call this straight after (or run it while the action happens). No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| seconds | No | How long to wait at most (default 30, max 45) | |
| bundleId | No | Only notifications for this app, e.g. "com.example.app" (exact match) | |
| oneTimeCode | No | Detect whether each notification contains a one-time passcode. Off by default because it makes the device report far more detail and costs noticeably more; turn it on for OTP tests. | |
| waitForFirst | No | Return as soon as the first matching notification arrives (default true). Set false to collect everything for the whole window. | |
| oneTimeCodeOnly | No | Only return notifications containing a one-time code. Implies oneTimeCode. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, idempotent, non-destructive); the description adds materially more: the hard privacy limitation that notification title/body cannot be returned, the default early-return behavior, and that no automation session is required. This is exactly the behavioral context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then the privacy limitation, then timing — a logical order. It runs long at roughly eight sentences, but each carries distinct information (limitation, fallback tool, default timing, session requirement), so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and six parameters, the description compensates by enumerating what is reported (which app, when, OTP presence, shown vs suppressed) and what is deliberately withheld (title/body). An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (seconds, bundleId, oneTimeCode, waitForFirst, oneTimeCodeOnly) is already documented. The description's mention of 'which app was notified' and 'whether the notification contained a one-time code' loosely maps to bundleId/oneTimeCode but adds no syntax or default detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Watch which notifications an iOS device receives and return them') and immediately scopes it against the sibling ios_page_source for reading notification text. An agent can distinguish this from device_notifications, ios_syslog_capture, and ios_page_source without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger scenario (confirming a push or OTP arrived after a login), timing instructions ('trigger the action first and call this straight after'), and names the alternative tool (ios_page_source) for the case where the text is needed. Both when-to-use and when-to-use-something-else are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_orientationiOS orientationAIdempotentInspect
Set the screen orientation of an iOS device. LANDSCAPE picks whichever landscape rotation the session lands on by default (LANDSCAPE_LEFT); ask for LANDSCAPE_LEFT/LANDSCAPE_RIGHT explicitly when the direction matters. The device auto-rotates on its own too, and orientation lock (if on) can make this a no-op — the reply always reports the device's ACTUAL resulting orientation, re-read after the attempt (including FACE_UP/FACE_DOWN if it is lying flat), which may differ from what was requested. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| orientation | Yes | Orientation: PORTRAIT, LANDSCAPE (either landscape direction), or LANDSCAPE_LEFT / LANDSCAPE_RIGHT for a specific one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, idempotent=true, destructive=false): it discloses that orientation lock can make the call a no-op, that the device auto-rotates independently, and that the response reports the ACTUAL re-read orientation (including FACE_UP/FACE_DOWN when flat), which may differ from the request. This is exactly the kind of behavioral context annotations can't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the caveats, and every sentence carries information. The session requirement sits at the end after the behavioral nuances, which would be more discoverable earlier, but overall it is tight and waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation with no output schema, the description covers prerequisites, the default-resolution ambiguity, failure modes (lock/auto-rotate), and the shape of the returned value, so an agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented; the description still adds genuine meaning by explaining that LANDSCAPE resolves to whichever rotation the session lands on (default LANDSCAPE_LEFT) and when to prefer the explicit directional values. Marginal but real value over the enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Set the screen orientation of an iOS device') and covers scope well. It does not differentiate from the near-neighbor siblings ios_rotate / device_orientation / device_rotate, so an agent cannot tell from the text alone why it should pick ios_orientation over ios_rotate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: use the generic LANDSCAPE when direction doesn't matter, ask for LANDSCAPE_LEFT/RIGHT when it does, and notes an active iOS automation session is required as a prerequisite. No explicit when-not or named-alternative routing, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_orientation_get_hidiOS orientation get HIDARead-onlyIdempotentInspect
Read the device orientation and whether the iOS orientation lock is on, without touching the screen (no automation session needed). Returns JSON {orientation, non_flat_orientation, locked}: orientation can be faceUp/faceDown when the device lies flat, and non_flat_orientation is the last upright one, which is what the UI is laid out for. The lock can be read but not changed here. Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety hints, but the description adds substantial behavioral context beyond them: the exact JSON return shape, field meanings (faceUp/faceDown, non_flat_orientation), the read-only lock limitation, and the 'no HID available' failure mode on iOS 17.x/no-tunnel. This is exactly the kind of detail an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose/benefit first, then return format, then a key limitation, then an error condition. No filler, front-loaded, easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one parameter, rich annotations, and no output schema, the description fully covers what the agent needs: what it returns, how to interpret fields, what it cannot do, and when it fails. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) and schema coverage is 100%, so the schema already fully documents it. The description adds no parameter-specific meaning, which is acceptable given the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read the device orientation and whether the iOS orientation lock is on') and immediately distinguishes itself from session-based siblings with 'without touching the screen (no automation session needed)'. The scope and mechanism are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use when no automation session is desired, and notes the lock cannot be changed here. It does not name specific alternative tools or state when *not* to use it, but the primary usage condition is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_orientation_set_hidiOS orientation set HIDAIdempotentInspect
Put the device in an exact orientation (no automation session needed; works even while the iOS orientation lock is on). orientation: portrait | portraitUpsideDown | landscapeLeft | landscapeRight | faceUp | faceDown. Returns JSON {orientation, non_flat_orientation, locked} as the device now reports it. An iPhone does not draw its Home screen upside down, so portraitUpsideDown may leave the screen portrait. Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| orientation | Yes | The orientation to put the device in |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotent, non-destructive, closed-world), the description discloses real behavioral traits: it works despite the OS orientation lock, returns {orientation, non_flat_orientation, locked} as the device reports it, that portraitUpsideDown may be a no-op on iPhone Home screens, and the exact error string on unsupported versions. This is unusually rich transparency for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the key differentiator, followed by enum, return shape, and caveats in a tight sequence. Almost every clause earns its place; the only mild redundancy is re-listing enum values already present in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only two params, the description compensates fully: it documents the response object, version-dependent failure modes, and a surprising platform quirk. Nothing an agent needs to call or interpret this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum values are already enumerated in the schema, so the description's restatement of the orientation values adds little beyond confirming the accepted set. The 'udid' parameter is not discussed at all. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Put the device in an exact orientation') and immediately distinguishes itself from session-based rotation siblings with 'no automation session needed; works even while the iOS orientation lock is on'. An agent can tell it apart from ios_orientation/ios_rotate without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this tool is the right choice (no automation session, orientation lock on) and a failure condition ('no HID available' on iOS 17.x / no-tunnel). It does not explicitly name a sibling alternative or say when to prefer ios_orientation instead, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_page_sourceiOS page sourceARead-onlyIdempotentInspect
Get the UI hierarchy (page source) of an iOS device — THE single source of truth for element coordinates (physical screen points). Default format is "description": a compact list of visible named elements as Type: "name" @ (cx,cy) WxH, where (cx,cy) is the element CENTER and the exact tap point; when the visible text differs from the name (an app that sets accessibility identifiers) it is appended as label="…", and the element holding focus is flagged [focused] — on an Apple TV that is the element tvos_select/tvos_focus acts on. Prefer acting on these labels via ios_tap_by_label rather than tapping raw coordinates. Elements with 0-width/height bounds (e.g. bottom-tab labels) are flagged [zero-area] — they cannot be tapped by coordinate; use ios_tap_by_label instead. FINDING THINGS IN LONG LISTS: pass search to grep the WHOLE hierarchy (including elements scrolled off-screen) — matches below the fold are flagged [off-screen]; bring them into view with ios_scroll_to_element, don't swipe blindly. To disambiguate duplicate labels, filter by type or use ios_find_element (strategy "accessibility id"). Use format "xml" to JUDGE FROM THE TREE instead of trusting a coordinate: with label it returns the COMPLETE SUBTREE of that element (a sign-in dialog is ~15 lines, where the whole tree is ~185k characters and will not fit in a response), and without it the tree comes back with anonymous layout containers pruned — nothing findable is ever hidden behind a pruned ancestor. Reach for the subtree whenever you need attributes the compact format omits: value, placeholderValue, focused, enabled. Requires an active iOS automation session (auto-starts if needed).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter (description format): only this element type, prefix optional e.g. "Button" or "XCUIElementTypeButton". | |
| udid | Yes | iOS device UDID | |
| label | No | Filter: only return elements matching this label/name | |
| format | No | Output format: "description" (default, compact readable summary) or "xml" (full hierarchy) | |
| search | No | Case-insensitive substring searched across the WHOLE hierarchy — type AND label — INCLUDING elements scrolled off-screen. Use this to locate an item in a long list (e.g. "Safari" in Settings) without swiping; off-screen hits are flagged [off-screen] so you can ios_scroll_to_element to them. Overrides visibleOnly. | |
| visibleOnly | No | Filter: exclude elements outside the current viewport (default: true; ignored when search is set) | |
| tappableOnly | No | Filter (description format): only interactive control types (Button, Cell, Link, TextField, Switch, Tab, etc). Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them: default output format, exact coordinate semantics (center point), [focused]/[zero-area]/[off-screen] flagging, xml pruning of anonymous containers, subtree return when label is set, and that a session auto-starts if needed. This is rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and format defaults, and nearly every clause carries information an agent needs. It is dense and long, with some over-explanation (repeated emphasis on zero-area and off-screen handling), but waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the burden of explaining return values — and it does so thoroughly for both formats, including size caveats (185k chars) and which attributes the compact format omits. Nothing needed to invoke or interpret the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema — e.g. that `search` greps the WHOLE hierarchy including off-screen hits and overrides visibleOnly, and that `label` with format 'xml' returns the complete subtree. These clarify interaction effects between parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the UI hierarchy (page source) of an iOS device') and immediately distinguishes itself as 'THE single source of truth for element coordinates', positioning it against coordinate-tapping siblings. An agent can differentiate it from ios_safari_get_dom, device_page_source, and ios_find_element from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: prefer ios_tap_by_label over raw coordinates, use ios_scroll_to_element instead of blind swiping for off-screen matches, use ios_find_element (strategy accessibility id) to disambiguate duplicates, and choose format 'xml' to judge from the tree. Each alternative is paired with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_pcap_startiOS PCAP startAInspect
Start a device-wide NATIVE network packet capture on an iOS device. Captures REAL packets at the network layer, mostly TLS-encrypted, so there are NO HTTP bodies — the result is a Wireshark .pcapng for packet-level analysis. One capture per device. Optionally filter by process (process name, e.g. mobilesafari / backboardd) or interfaceName (e.g. en0), and auto-stop after packets frames. End with ios_pcap_stop. (For Safari HTTP traffic with bodies, use ios_safari_capture_network instead.)
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| packets | No | Stop automatically after N packets (optional; default: until ios_pcap_stop) | |
| process | No | Only capture packets for this process name (optional) | |
| interfaceName | No | Only capture this interface, e.g. en0 (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring readOnlyHint=false and destructiveHint=false, the description goes well beyond them: it discloses that packets are overwhelmingly TLS-encrypted with no HTTP bodies, that output is a Wireshark .pcapng, and that only one capture may run per device. It does not spell out permissions or auth requirements, which keeps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries information: capture scope, encryption caveat, output format, concurrency limit, filter parameters, lifecycle, and the alternative routing. It is front-loaded with the core purpose and wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description states the return artifact (.pcapng), the filtering options, the concurrency limit, and the required termination call via ios_pcap_stop. An agent has everything needed to start and correctly conclude a capture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description contributes concrete example values (mobilesafari / backboardd for `process`, en0 for `interfaceName`) and clarifies `packets` as an auto-stop threshold. That is real added meaning beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a device-wide NATIVE network packet capture on an iOS device') and immediately scopes what is captured (real packets, no HTTP bodies). An agent can distinguish it from ios_safari_capture_network and ios_traffic_start 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the condition that selects it ('For Safari HTTP traffic with bodies, use ios_safari_capture_network instead'), states the lifecycle constraint ('One capture per device', 'End with ios_pcap_stop'), and notes when auto-stop applies. Nothing 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.
ios_pcap_statusiOS PCAP statusARead-onlyIdempotentInspect
Report the active native packet capture on an iOS device: whether it is running and how many bytes have been captured so far.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds the useful fact that it reports both running state and bytes captured, which matters since there is no output schema, but says nothing about behavior when no capture is active.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One well-formed sentence, front-loaded with the verb and resource, with no redundant or filler text. Every clause earns its place by naming the resource and the two pieces of returned data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial one-param read tool with no output schema, the description usefully enumerates the returned fields (running state, byte count). It stops short of describing the no-active-capture case, but that gap is minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter 'udid' with 100% schema description coverage, so the schema carries the semantics. The description adds no format or constraint detail beyond the schema, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Report') and resource ('active native packet capture on an iOS device') plus what the report contains. The 'native packet capture' wording helps distinguish it from ios_traffic_status and ios_safari_capture_network, though it doesn't name those siblings outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the 'status' framing — check whether a capture is running — but there is no explicit when-to-use, when-not, or pointer to ios_pcap_start/ios_pcap_stop as the alternatives. Adequate but leaves the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_pcap_stopiOS PCAP stopAInspect
Stop the active native packet capture on an iOS device and return the capture as a pcapng. Small captures (<1 MB) are returned inline as base64; larger ones are written to a .pcapng file on the RDS host and the path is returned. Open the pcapng in Wireshark.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not destructive, not idempotent). The description adds real behavioral context the annotations lack: the dual return mechanism (inline base64 under 1 MB vs a .pcapng path written on the RDS host) and the Wireshark follow-up. It still omits failure behavior when no capture is active.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and result, then the two output branches, then a one-line usage tip. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the return-format burden by explaining the inline-vs-file split. It is nearly complete for a one-parameter stop tool, missing only error/edge behavior (e.g., stopping when no capture is active, whether capture resources are freed).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'udid' parameter, so the schema already does the documentation work. The description adds no parameter-level meaning beyond what is in the schema, which is the expected baseline here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Stop the active native packet capture on an iOS device') plus the return artifact ('return the capture as a pcapng'), which cleanly separates it from ios_pcap_start and ios_pcap_status without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'the active ... capture' implies this runs after a capture has been started, but the description never names ios_pcap_start as the prerequisite or says what to do if no capture is running. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_performance_record_startiOS performance record startAInspect
Start recording per-process CPU/memory over time (like screen recording, for metrics). Drive the app, then call ios_performance_record_stop with the returned sessionId to get the full time-series + summary. Focus one app with bundleId, else records the top processes by CPU.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| bundleId | No | Focus one app (bundle id / name); else top processes by CPU | |
| intervalMs | No | Sample interval ms (default 1000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the agent knows this is a non-idempotent stateful write. The description adds the lifecycle detail the annotations cannot: a sessionId is returned and stop must be called to collect results, which is essential for correct use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with what the tool does, followed by the required follow-up call and the targeting rule. No filler and nothing repeated unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return, and it does so by naming the sessionId. Combined with the stop-tool handoff, an agent has enough to call and complete the flow; the only minor gap is the time-series payload shape, which is delegated to the stop tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid, bundleId, and intervalMs are already documented in the schema, including the bundleId fallback behavior. The description restates the bundleId rule but adds no new syntax, defaults, or constraints, matching the baseline for fully covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (start recording) and resource (per-process CPU/memory over time), and the parenthetical 'like screen recording, for metrics' pins the mental model precisely. It implicitly contrasts with ios_performance_snapshot (single-point vs time-series), so the agent can distinguish it from 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear workflow: drive the app, then call ios_performance_record_stop with the returned sessionId. It also states the selection rule for bundleId vs default (top processes by CPU). It does not explicitly say when to prefer this over ios_performance_snapshot, so a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_performance_record_stopiOS performance record stopAInspect
Stop a performance recording started with ios_performance_record_start and return the full time-series + a per-process summary (avg/peak CPU, peak memory). Each process also carries derived facts: memory slope (MB/min) and fit quality, a leak-suspected flag, CPU/memory spike episodes, and a one-line verdict. Each process also carries energy impact: avgPower / peakPower (sysmon powerScore; 50+ average = high energy impact) and diskWrittenBytes. Also a thermal block with battery temperature sampled every ~15 s ({startC, endC, peakC, riseC, samples}) and a verdict phrase when the device warmed notably. iOS reports no throttling state. Recordings of 60 s or more also carry a baseline: peak memory, CPU, temperature rise and power against the median of your last runs of the same app on the same device model. Also a frames block (fps over time from the Core Animation graphics feed; DEVICE-WIDE, not per app) and, in the baseline, fps medians. Battery drain is not measured (fleet devices are always charging).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session id from ios_performance_record_start |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, idempotent=false, destructive=false); the description goes far beyond by disclosing the exact return payload, the powerScore threshold semantics ('50+ average = high energy impact'), thermal sampling cadence, that frames are DEVICE-WIDE not per-app, that baselines require 60 s+ recordings, and that battery drain is deliberately not measured.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause and the remaining text is dense but earns its place because no output schema exists to document the return shape. It is a single unbroken block with no grouping or bullets, which hurts scannability for a payload this complex.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the entire burden of documenting the response, and it does so thoroughly: time-series, per-process summary, derived leak/spike facts, energy impact, thermal block, baseline, and frames. Nothing an agent needs to interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage, so the schema already documents it fully. The description adds no format or constraint detail beyond what the schema states, which matches the baseline-3 rule for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause states a specific verb and resource ('Stop a performance recording') and names the sibling that must precede it ('started with ios_performance_record_start'), letting an agent distinguish it from the start tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite (a recording started via ios_performance_record_start), which is clear usage context. It does not, however, route the agent between this and alternatives such as ios_performance_snapshot or android_performance_record_stop, so no exclusions are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_performance_snapshotiOS performance snapshotARead-onlyIdempotentInspect
Snapshot per-process CPU %% and memory for a physical iOS device. Returns the top processes by CPU, or just one app when bundleId is given. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| topN | No | Limit to the top-N processes by CPU (default 15) | |
| udid | Yes | iOS device UDID | |
| bundleId | No | Focus a single app by bundle id (or app/process name), e.g. com.apple.mobilesafari |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new context: it explains the return varies with bundleId and that no automation session is needed, which is not encoded in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and metric, then return behavior, then the session prerequisite. Every sentence earns its place with no filler (the stray '%%' rendering is a cosmetic artifact only).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description responsibly describes what comes back (top processes by CPU vs a single app) and notes the session prerequisite; annotations cover safety. It stops short of defining field-level detail (memory units, exact columns), leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents udid, bundleId and topN. The description restates bundleId's focusing behavior ('just one app when bundleId is given') but adds no syntax or format detail beyond the schema, which is baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: snapshot per-process CPU and memory for a physical iOS device, and clarifies the return shape (top processes by CPU, or one app when bundleId is given). This distinguishes it from ios_fps (frame rate) and ios_ps by naming exactly the metrics captured, though it never explicitly names a sibling tool to differentiate against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The note 'No automation session required' gives one useful operational condition for calling it, but there is no explicit when-to-use guidance and no mention of alternatives such as ios_fps, ios_ps, or the record start/stop tools. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_pinchiOS pinchAInspect
Two-finger pinch-to-zoom centred at (x,y) on an iOS device. scale > 1 zooms IN (fingers spread), scale < 1 zooms OUT (fingers converge); ~2 doubles, ~0.5 halves. Both fingers ride a vertical axis through the centre and are auto-clamped on-screen. Use on Maps, Photos, Safari, camera. Coordinates are screen points. Works without an automation session when the direct input path is available; falls back to one otherwise (see input).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Pinch centre X (screen points) | |
| y | Yes | Pinch centre Y (screen points) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| scale | Yes | End/start finger-separation ratio: >1 zoom in, <1 zoom out (0.2–5) | |
| durationMs | No | Gesture duration in ms (default: 250) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, destructive=false), leaving the description to carry real behavior. It does: fingers ride a vertical axis, are auto-clamped on-screen, the direct input path is tried first with a documented fallback, direct-input-only devices error rather than silently switching, and 'the response says which one ran.' That is substantial disclosure beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and coordinate centre, then scale semantics, then usage contexts, then the input-path caveat. Five dense sentences with no filler; each clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 cover behavior, and it does — including that the response reports which input path ran. With schema descriptions covering all 7 parameters, nothing needed for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description nevertheless adds meaning beyond the schema by giving concrete scale semantics ('~2 doubles, ~0.5 halves', 'fingers spread/converge') and restating that coordinates are screen points, which reinforces the norm/points distinction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Two-finger pinch-to-zoom centred at (x,y) on an iOS device.' An agent can distinguish it from gesture siblings like ios_two_finger_swipe or ios_gesture_path by the pinch-specific semantics. It never explicitly names a sibling alternative, so it stops short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete application contexts ('Use on Maps, Photos, Safari, camera') so the agent knows where the gesture is appropriate, and the input-path sentence explains the session/no-session conditions. There is no explicit when-not-to-use guidance or named alternative gesture.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_play_location_routeiOS play location routeAInspect
Replay a moving GPS route on an iOS device — the device's location walks the waypoints in order, so an app under test sees travel rather than a teleport. Give waypoints (at least two lat/lon pairs) with secondsPerLeg for the pace, or gpxPath for a GPX file that already exists on the server. Returns as soon as playback starts; poll ios_get_location to watch it advance and call ios_clear_location to stop it (the last point stays simulated until you do). iOS 17+.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| gpxPath | No | Path to an existing GPX file ON THE SERVER. Mutually exclusive with waypoints. | |
| waypoints | No | Route to walk, in order. At least two points. Mutually exclusive with gpxPath. | |
| secondsPerLeg | No | Seconds spent travelling between consecutive waypoints. Default 2. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: the call returns immediately (async playback), the simulated location persists until ios_clear_location is called, and the tool requires iOS 17+. These are exactly the non-obvious traits an agent needs, and none contradict destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with zero filler: behavior first, then the two input modes and pace, then the lifecycle and platform requirement. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining that it returns as soon as playback starts and how to observe progress via ios_get_location. For a non-idempotent, non-destructive mutation tool, nothing material is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents udid, gpxPath, waypoints and secondsPerLeg including mutual exclusivity. The description restates pace and ordering but adds no syntax or format detail the schema lacks, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replay a moving GPS route on an iOS device') and immediately distinguishes the behavior from a static set ('an app under test sees travel rather than a teleport'), which is exactly the axis on which it differs from sibling ios_set_location.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two mutually exclusive input modes (waypoints vs gpxPath) and the lifecycle: poll ios_get_location to watch progress, call ios_clear_location to stop. It never explicitly names ios_set_location as the alternative for a static position, so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_press_buttoniOS press buttonAInspect
Press a hardware or keyboard button on an iOS device. Hardware: home, volumeUp, volumeDown. Keyboard submit: return, go, done, search. Editing: backspace (delete-left), delete (delete-right alias — iOS soft keyboard treats both the same in most contexts). Whitespace: tab. home is the Home BUTTON: it goes to the Home screen and leaves whatever app was open. To wake the device or clear a Lock Screen WITHOUT leaving the app, use ios_unlock or the keyboard Home key (ios_key_hid with usages [74]) instead. (On an Apple TV, press remote keys with ios_tv_button and change volume with ios_tv_volume — the hardware/keyboard buttons here are unavailable there.) Works without an automation session when the direct input path is available; falls back to one otherwise (see input). Note: for reliable backspace, ensure the soft keyboard is actually raised (visible) before pressing — a tap that visually focuses a field may not yet have raised the keyboard, in which case key events are dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| button | Yes | Button name: home, volumeUp, volumeDown, return, go, done, search, backspace, delete, tab |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare those safety traits, so the bar is lower, yet the description still adds real context: `home` leaves the current app, input paths auto/hid/session fall back with reported behavior, and key events are silently dropped if the keyboard isn't raised. The only gap is not describing the response payload beyond 'the response says which one ran'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and button list, then layered caveats. It is long and contains some parenthetical density, but nearly every sentence carries actionable information (sibling routing, keyboard-raised prerequisite); only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, it covers the salient behaviors: side effects of `home`, fallback semantics of `input`, and the backspace precondition. It could do slightly more on what a failure versus a fallback result looks like, hence not a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds semantic value beyond it: it clarifies that `delete` is a delete-right alias that the soft keyboard treats identically to backspace, and that `home` is the Home BUTTON with app-exiting semantics. This goes past the schema's flat name list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Press a hardware or keyboard button on an iOS device') and enumerates the supported button classes (home/volume, submit, editing, whitespace). It explicitly distinguishes itself from ios_key_hid, ios_unlock, ios_tv_button, and ios_tv_volume, so an agent can route correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use-elsewhere rules: use ios_unlock or ios_key_hid usages [74] to wake or clear the Lock Screen without leaving the app, and ios_tv_button / ios_tv_volume on Apple TV where these buttons are unavailable. It also states the prerequisite for reliable backspace (soft keyboard must be raised).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_psiOS psARead-onlyIdempotentInspect
List running processes on an iOS device. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds a genuine operational fact beyond annotations: no automation session is needed, which materially affects how an agent can invoke it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose and followed by the key operational constraint. Nothing is wasted and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with one fully documented parameter and no output schema, the description covers what it does and the main invocation constraint. It omits any hint of what the process listing contains or how it is scoped, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) and schema description coverage is 100%, so the schema fully documents it. The description adds no extra meaning about the udid beyond what the schema already provides, making 3 the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List running processes') scoped to an iOS device, which is more precise than the sibling ios_diagnostics or ios_device_info. It does not explicitly contrast with those near-neighbors, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'No automation session required' gives a real usage condition (callable without an active session), which is useful context among session-dependent iOS tools. However, it never states when to prefer this over related tools like ios_diagnostics or ios_crash_analytics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_rebootiOS rebootADestructiveInspect
Reboot an iOS device. DISRUPTIVE and NOT REVERSIBLE: the device is unreachable for roughly a minute, the automation session and the stream go down, and anything in progress on the device is lost. Requires confirm=true — there is no default. Do NOT reach for this to recover from a flaky tool call; try ios_end_session first, which resets the automation session without touching the device. Reboot only when the device itself is wedged and a human has asked for it. No automation session required. The Android counterpart is device_reboot.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| confirm | Yes | Must be exactly true. Acknowledges the device will restart and the session will be lost. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description goes well beyond them: device unreachable ~1 minute, session and stream drop, in-progress work is lost, and no automation session is required. This is exactly the behavioral context an agent needs before an irreversible action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then a capitalized disruptive/irreversible warning, then routing guidance and the counterpart note. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param, no-output-schema destructive tool, the description covers impact, duration, prerequisites (confirm), session requirements, and alternatives. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema, with confirm already const:true and required. The description reinforces that confirm must be set with no default, adding marginal value, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reboot an iOS device') and explicitly distinguishes itself from siblings by naming ios_end_session and device_reboot. An agent can tell immediately what this does and which tools it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not ('Do NOT reach for this to recover from a flaky tool call'), an alternative with rationale (ios_end_session resets the session without touching the device), and the narrow when-to-use condition (device wedged and a human asked). Nothing 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.
ios_record_cleanupiOS record cleanupADestructiveIdempotentInspect
Delete a finished iOS recording mp4 from disk. Pass the httpPath returned by ios_record_stop. Idempotent — deleting a non-existent file is not an error. Refuses to delete recordings that are still being written (call ios_record_stop first).
| Name | Required | Description | Default |
|---|---|---|---|
| httpPath | Yes | httpPath returned by ios_record_stop (e.g. /recordings/rec-ios-<uuid>.mp4) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new behavior: the concrete meaning of idempotency (a missing file is not an error) and a guard condition (it refuses to delete recordings still being written), which the annotations do not express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and resource, then the input requirement, then the two behavioral caveats. No filler; each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive one-parameter tool with annotations covering the safety profile and no output schema, the description covers action, input, idempotency, and the write-in-progress guard. Only minor gaps remain, such as what an error response looks like if deletion is refused.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single httpPath parameter, and the schema description already states it comes from ios_record_stop. The description reinforces that provenance but adds no new syntax, format, or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a finished iOS recording mp4 from disk') with scope qualifier 'finished', which cleanly separates it from ios_record_stop (which produces the file) and generic file deleters like ios_file_delete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('call ios_record_stop first') and an exclusion (refuses in-progress recordings), plus the required input provenance. It does not explicitly route the agent away from generic alternatives such as ios_file_delete, but the lifecycle framing is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_record_startiOS record startAInspect
Start a screen recording on an iOS device. Captures the per-device MJPEG broadcast and remuxes server-side into an H.264 mp4 written under /recordings/. An iOS session must already be running (call ios_start_session first). The recording auto-stops after maxDurationSec (default 300, max 600) so a forgotten stop call cannot fill the disk. Returns a recordingId to pass to ios_record_stop. Only one recording per device at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Input MJPEG framerate hint (default 24). Higher = smoother but larger files. | |
| udid | Yes | iOS device UDID | |
| maxDurationSec | No | Hard cap on recording duration in seconds (default 300, max 600). Recording auto-stops if exceeded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, destructive=false, idempotent=false): it discloses the server-side remux, the /recordings/ output location, the auto-stop safety cap that prevents disk fill, the returned recordingId, and a concurrency limit of one recording per device. These are exactly the operational facts an agent needs before invoking a stateful start.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five dense sentences, each carrying distinct information (what it does, how it works, prerequisite, safety cap, return value, concurrency), with the action front-loaded and no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the return value (recordingId) and its consumer (ios_record_stop); it also covers prerequisites, failure-prevention (auto-stop), and concurrency. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents udid, fps, and maxDurationSec with defaults and ranges. The description restates maxDurationSec's default/max but adds no syntax or semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Start a screen recording on an iOS device') and then explains the actual capture pipeline (MJPEG broadcast remuxed server-side to H.264 mp4). An agent can distinguish it from ios_record_stop, ios_record_cleanup, ios_actions_record_start, and device_record_start without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite ('An iOS session must already be running (call ios_start_session first)') and routes the agent forward to ios_record_stop via the returned recordingId. It also flags the single-recording-per-device constraint, but never contrasts itself with the other record-start siblings (ios_actions_record_start, ios_performance_record_start), leaving that choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_record_stopiOS record stopAInspect
Stop an iOS screen recording started by ios_record_start. Sends SIGTERM to the remux pipeline so the mp4 has a valid moov atom. Returns hostPath, sizeBytes, durationMs, and codec.
| Name | Required | Description | Default |
|---|---|---|---|
| recordingId | Yes | recordingId returned by ios_record_start |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, but the description adds genuinely non-obvious behavioral detail: it sends SIGTERM to the remux pipeline specifically so the mp4 gets a valid moov atom. That explains the shutdown semantics beyond what annotations convey, though it says nothing about failure modes or repeat-call behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the operation and its prerequisite, followed by the mechanism and the return fields. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 fields (hostPath, sizeBytes, durationMs, codec) is valuable and closes the biggest gap; annotations cover safety. It stops short of describing error behavior for invalid or already-stopped recordingIds, which would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — recordingId is already documented as "recordingId returned by ios_record_start" — so the schema carries the full burden. The description only indirectly reinforces this via the ios_record_start reference and adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Stop) and resource (an iOS screen recording) and ties it directly to its counterpart ios_record_start, which lets an agent distinguish it from the many other stop/record siblings (ios_actions_record_stop, ios_performance_record_stop, device_record_stop).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes the precondition clearly — the recording must have been started by ios_record_start — which is the main context an agent needs. It does not, however, mention alternatives or edge cases such as calling it without an active recording, or when to use ios_record_cleanup instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_release_contacts_hidiOS release contacts HIDAIdempotentInspect
Lift held contacts placed by ios_contacts_hid. Every finger lifts in ONE frame — releasing them one at a time would leave the others down between reports, which the device reads as the gesture continuing. Coordinates are where each finger ends. Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| points | Yes | Where each finger is when it lifts, in the same order as ios_contacts_hid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only say non-readonly, idempotent, non-destructive) by disclosing the atomic one-frame lift requirement and the reason releasing one at a time breaks the gesture, plus the concrete failure mode 'no HID available' on iOS 17.x/no-tunnel. This is real behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose, then the non-obvious behavioral constraint, then coordinate meaning and error case. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation HID tool with no output schema, the description supplies the critical atomicity constraint, coordinate interpretation, and the documented failure return. Combined with full schema coverage and annotations, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid, points, ordering, and norm semantics are already documented in the schema. The description's 'Coordinates are where each finger ends' largely restates the schema's 'Where each finger is when it lifts', adding no new parameter meaning; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Lift held contacts') that explicitly names its counterpart tool ios_contacts_hid, so an agent can distinguish release from placement without opening a schema. The scope (contacts placed by that sibling) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly establishes when to use it by anchoring to ios_contacts_hid ('contacts placed by ios_contacts_hid'), giving clear operational context. It does not state explicit exclusions or name alternative release tools such as ios_release_hid, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_release_hidiOS release HIDAIdempotentInspect
Lift the held contact at (x,y) via direct HID input (no automation session needed) — mouse-button-up / touch-up. Pairs with ios_contact_hid. Coordinates are iOS screen points. Returns "no HID available" on iOS 17.x / no-tunnel.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate (screen points, or 0..1 fraction if norm=true) | |
| y | Yes | Y coordinate (screen points, or 0..1 fraction if norm=true) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the bar is lower. The description adds genuinely useful behavioral context beyond them: no automation session is required, and it discloses a specific failure mode ("no HID available" on iOS 17.x / no-tunnel), which an agent needs to interpret a failed call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight paragraph, front-loaded with the action and its HID mechanism, then the pairing, coordinate convention, and failure mode. Every clause carries information; the em-dash phrasing is slightly dense but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param, no-output-schema input tool, the description covers the essential operational facts: what it does, its partner tool, the coordinate convention, and the known error condition. It is complete enough to invoke correctly, with the only gap being the norm fraction mode already handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents udid, x, y and the norm fraction mode. The description only restates that coordinates are iOS screen points and omits the norm=true fractional mode the schema defines, so it adds little and is marginally less complete than the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: lifting the held contact via direct HID input, with the concrete equivalent (mouse-button-up / touch-up) spelled out. It explicitly names its counterpart tool ios_contact_hid, so an agent can place it in the press/release pair without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Pairs with ios_contact_hid" and "no automation session needed" give clear context for when this tool applies — after a held contact, without a session. There is no explicit statement of when not to use it or which alternative to prefer if HID is unavailable, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_rotateiOS rotateAInspect
Two-finger rotation (twist) about (x,y) on an iOS device — the gesture maps, photo editors and canvas apps listen for. Positive degrees turns clockwise on screen, negative anticlockwise. The fingers follow the ARC of a circle rather than a straight line, which is what a rotation recogniser needs. Coordinates are screen points. IN HID MODE (iOS 18+) the rotation is centred exactly on (x,y) and any angle up to 360° works. OTHERWISE it falls back to the native rotate gesture, which turns the ACTIVE APP about its own centre: (x,y) is ignored there. Any angle works on both paths. Fine for a full-screen map or canvas. auto (the default input) now takes the precisely-centred path whenever it is available, falling back to the app-centred one only when it is not — check ios_hid_status first if you need to know which one a call will get.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Rotation centre X (screen points) | |
| y | Yes | Rotation centre Y (screen points) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| degrees | Yes | Turn in degrees; positive is clockwise on screen | |
| durationMs | No | Gesture duration in ms (default: 400) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behaviour beyond the annotations (readOnly=false, destructive=false, idempotent=false): the HID-vs-session branching, the app-centred fallback where (x,y) is ignored, and the 'response says which one ran' detail. The internal wording 'any angle up to 360°' followed later by 'Any angle works on both paths' is mildly muddled but does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core gesture definition, which is good, but the paragraph is long and repeats itself (angle limits stated twice, the auto/fallback explanation restated in the closing sentence). Several clauses could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 7 parameters, the description supplies the branching logic, prerequisites, and fallback semantics an agent needs to call it correctly. It is nearly complete, lacking only explicit sibling differentiation and a note on any session/HID permission requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the 3 baseline applies, but the description genuinely enriches the `input` enum by explaining what auto/hid/session each do and how a forced-forced path reports errors. It also reinforces the clockwise-positive sign convention for `degrees`, adding value over the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific gesture (two-finger twist) and resource (iOS device) with the sign convention and path shape made explicit. It does not, however, differentiate itself from closely related siblings like ios_pinch, ios_two_finger_swipe, or device_rotate/ios_orientation, which an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: HID mode vs native fallback, when (x,y) is honoured vs ignored, and the concrete recommendation to check ios_hid_status first when the path matters. It stops short of naming a sibling alternative for overlap cases, so guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_capture_networkiOS Safari capture networkARead-onlyIdempotentInspect
Capture network requests made by a Safari page on an iOS device over a time window. Collects Network.requestWillBeSent, Network.responseReceived, Network.loadingFinished, and Network.loadingFailed events and returns merged records. Returns { records, bodiesOmitted? } in summary format, or a HAR 1.2 document when format="har". Each record: { requestId, method, url, requestHeaders?, status?, statusText?, mimeType?, resourceType?, responseHeaders?, encodedDataLength?, state, errorText?, startTimestamp?, endTimestamp?, body?, bodyTruncated?, bodyError? }. Set includeBodies=true to fetch response bodies for completed text-like responses (json|text|xml|javascript|html|css|svg|x-www-form-urlencoded); per-body cap: 10 000 chars (bodyTruncated=true when hit); total cap: 200 000 chars (excess records counted in bodiesOmitted). Body fetch failures set bodyError on that record. Set throttle to emulate bandwidth for the capture window only (best-effort; cleared afterwards): slow-3g (51 200 B/s) or fast-3g (209 715 B/s). NOTE: throttle="offline" is NOT supported on iOS — WebKit only has bandwidth throttling; use android_devtools_capture_network for offline. When throttle was active, a top-level throttle field appears in the output. Returns at most limit records (default 100, most-recent first) so heavy pages stay within the token budget — filter with urlSubstring / onlyErrors; total/returned appear when records were dropped. Default window: 5 000 ms. Maximum: 30 000 ms. Omit pageId to auto-pick the active page. Pass url to navigate inside the capture session and record the full page-load waterfall (pass the current URL to reload). NOTE: some iOS versions report no request timings to a remote inspector. The result then says timestamped=false, startTimestamp/endTimestamp are omitted and no duration can be derived — what each request was and how it answered is still accurate, so do not read speed from a capture that reports it.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Navigate the page to this URL inside the capture session to record the full page-load waterfall (pass the current URL to reload) | |
| udid | Yes | iOS device UDID | |
| limit | No | Max records to return, most-recent first (default 100). Heavy pages make hundreds of requests; the default keeps the response within the MCP token budget. total/returned are included when records were dropped. | |
| format | No | Output format: "summary" (default) returns { records, bodiesOmitted? }; "har" returns a HAR 1.2 document | |
| pageId | No | CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab | |
| throttle | No | Emulate bandwidth for the capture window only (best-effort; cleared afterwards). slow-3g: 51 200 B/s. fast-3g: 209 715 B/s. offline is NOT supported on iOS — use android_devtools_capture_network instead. | |
| triggerJs | No | JavaScript run INSIDE the capture window (after the collector attaches) to trigger requests race-free — e.g. "fetch('/api/x')" or a click. For a full-page navigation prefer the `url` param. Both avoid the attach-race of triggering from a separate call. | |
| durationMs | No | Collection window in milliseconds (default: 5000, max: 30000) | |
| onlyErrors | No | Only failed / 5xx records | |
| urlSubstring | No | Only records whose URL contains this substring — target the requests you care about | |
| includeBodies | No | Fetch response body for completed text-like responses (default: true). Request bodies (postData) are always captured. Set false to skip response bodies for a lighter payload. Per-body cap: 10 000 chars. Total cap: 200 000 chars. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial behavioral context beyond them: per-body and total body caps with bodyTruncated/bodiesOmitted flags, throttle being best-effort and cleared afterwards with a top-level throttle field, and the important timestamped=false caveat where timings are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, output shape and record fields, then parameter behavior and NOTE caveats. It is dense and slightly redundant with the schema on throttle and includeBodies, but nearly every sentence carries actionable information and the NOTE markers aid scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden of explaining return values (summary vs HAR, per-record field list, caps and omission flags) plus the platform limitation that timings may be absent. An agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes further by explaining the rationale for limit (token budget, total/returned on drops), the includeBodies caps and bodyError behavior, and the throttle field appearing in output when active — details not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: capturing network requests from a Safari page on an iOS device over a time window, and enumerates the CDP events merged. It is clearly distinguishable from ios_pcap_start, ios_traffic_flows and ios_safari_trace, and even names the Android counterpart for the offline case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete routing guidance: omit pageId to auto-pick the active page, prefer url for full-page navigation vs triggerJs for race-free triggers, and use android_devtools_capture_network when offline throttling is needed. It lacks an explicit when-not against other capture siblings (ios_traffic_flows, ios_pcap_start), but the context given is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_close_tabiOS Safari close tabAIdempotentInspect
Close Safari tabs on an iOS device by title, or list what is open. Safari's tab overview is the only way to close a tab — the Web Inspector protocol behind ios_safari_list_pages cannot do it — so this drives the native UI. Call with no title to list the open tabs and close nothing. Titles match case-insensitively on any part of the title. Note this sees MORE tabs than ios_safari_list_pages, which only reports pages that are loaded and inspectable. Requires Safari in the foreground and an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Close every tab matching `title` instead of only the first. Default false. | |
| udid | Yes | iOS device UDID | |
| title | No | Close tabs whose title contains this text. Omit to just list the open tabs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), yet the description adds substantial context beyond them: that this sees MORE tabs than ios_safari_list_pages, that titles match case-insensitively on any part of the title, and that Safari must be foregrounded with an active session. This is rich behavior disclosure that the structured fields do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all substantive and front-loaded with the primary action followed by the listing mode and caveats. It is dense but every sentence earns its place; slightly wordier than strictly necessary for the alternative-protocol rationale.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and full param coverage, the description supplies the operational requirements (foreground Safari, active automation session), the matching semantics, and the relationship to the sibling list-pages tool. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema by specifying 'Titles match case-insensitively on any part of the title' and describing the list-vs-close behavior of an omitted title. It does not restate the 'all' flag semantics, which remain in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Close Safari tabs on an iOS device') and immediately distinguishes the listing mode ('list what is open'). It also names the sibling ios_safari_list_pages and explains the boundary between them, so the agent can identify the right tool without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: 'Call with no title to list the open tabs and close nothing.' It further explains why native UI is required ('the Web Inspector protocol behind ios_safari_list_pages cannot do it') and states the preconditions (Safari in foreground, active automation session), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_console_logsiOS Safari console logsARead-onlyIdempotentInspect
Collect console logs, exceptions, and log entries from a Safari page on an iOS device over a time window. Enables the Runtime and Log domains, then listens for Runtime.consoleAPICalled, Runtime.exceptionThrown, and Log.entryAdded events, and returns an array of { level, text, url?, line?, source? }. This is a LIVE-WINDOW collector: it only captures events fired AFTER it attaches (plus the buffered history WebKit replays on enable), so triggering the logging from a SEPARATE tool call races the attach and is missed. To capture logs from an action, pass triggerJs (run inside the window). Default window: 5 000 ms. Maximum: 15 000 ms. Omit pageId to auto-pick the active page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| pageId | No | CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab | |
| triggerJs | No | JavaScript run INSIDE the collection window (after the listeners attach) so the logs it produces are captured race-free — e.g. "location.reload()" or "document.querySelector('#go').click()". Prefer this over triggering from a separate call. | |
| durationMs | No | Collection window in milliseconds (default: 5000, max: 15000) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial behavior the annotations cannot carry: it enables Runtime and Log domains, subscribes to three specific events, returns a typed array, only captures events fired AFTER attach (plus replayed buffer), and defaults to a 5 000 ms window capped at 15 000 ms.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by mechanism, the critical timing caveat, and parameter defaults in that order. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still supplies the return shape ({ level, text, url?, line?, source? }), the collection window bounds, and the page-selection default — everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents udid, pageId, triggerJs, durationMs, and why platformVersion is ignored. The description restates the default/max window and the triggerJs race semantics rather than adding new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Collect console logs, exceptions, and log entries from a Safari page on an iOS device over a time window' — and names the exact event domains (Runtime, Log) it drives. An agent can immediately distinguish it from session_console_logs, web_console_messages, and android_devtools_console_logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use rules: it is a LIVE-WINDOW collector, so triggering logging from a separate call races the attach and is missed; instead pass triggerJs to run inside the window. It also states the pageId auto-pick default and when to override it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_cookiesiOS Safari cookiesARead-onlyIdempotentInspect
Get cookies for a Safari page on an iOS device via the Web Inspector (Page.getCookies), including httpOnly / secure / sameSite / domain / path / expiry — useful for debugging auth/session state. Falls back to document.cookie (non-httpOnly only) if the CDP call is unavailable. Omit pageId to auto-pick the active Safari page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| pageId | No | CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered; the description adds real value beyond that by disclosing the fallback path (document.cookie, non-httpOnly only) when the CDP call is unavailable and the auto-pick behavior for the active page. This warns the agent that results may be incomplete, which is meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary action and resource, then mechanism, fallback and the one parameter caveat. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields (httpOnly/secure/sameSite/domain/path/expiry) and the fallback degradation, which is enough for an agent to interpret results. Minor gaps (e.g. no explicit note on missing-cookie or empty-result behavior) keep it just under complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents udid, pageId and the ignored platformVersion in detail. The description's pageId note restates the schema's own wording rather than adding syntax or constraints beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Get) plus resource (cookies) scoped to a Safari page on an iOS device, with the underlying mechanism (Web Inspector / Page.getCookies) named. An agent can distinguish it from siblings like ios_safari_evaluate or webpage_clear_cookies without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use context ('useful for debugging auth/session state') and direct parameter guidance ('Omit pageId to auto-pick the active Safari page'). It does not, however, explicitly name an alternative tool or state when-not-to-use (e.g. reach for ios_safari_evaluate for arbitrary JS), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_elementsiOS Safari elementsARead-onlyIdempotentInspect
Extract locator-friendly element data from a Safari page for building Playwright/Selenium locators. For each element (interactive/meaningful elements by default, or those matching selector) returns: tag, trimmed text, key attributes (id/name/type/role/aria-label/placeholder/href/value/data-testid + any data-*), classes, bounding box {x,y,w,h} and a visibility flag. USE suggested — the locator worth writing (id, then test-id, name, aria-label, placeholder), each verified unique before it is offered, with playwright giving the same target in getByRole/getByTestId form. css and xpath are diagnostic fallbacks, not recommendations: the CSS path is an nth-of-type chain over layout classes and does not belong in a page object. When suggested is null nothing stable exists — act via ref and treat the missing test-id as the real finding. Set includeStyles=true to also return a curated set of computed styles per element. Omit pageId to auto-pick the active Safari page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| limit | No | Max elements to return (default 150) | |
| pageId | No | CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab | |
| selector | No | CSS selector to scope extraction (default: interactive/meaningful elements) | |
| includeStyles | No | Include a curated set of computed styles per element (default false) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, and the description adds substantial behavior beyond them: each `suggested` locator is verified unique before being offered, the CSS path is an unstable nth-of-type chain unsuitable for page objects, a null `suggested` means no stable locator exists so the caller should act via `ref`, and includeStyles returns a curated style set. This is rich, decision-relevant disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries substantive guidance about the returned locator fields. It is dense and long, with heavy emphasis on the suggested-vs-css/xpath distinction, but that content is justified by the tool's complexity and little is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden by enumerating the return shape (tag, trimmed text, key attributes, classes, bounding box, visibility, suggested/playwright/css/xpath). For a complex extraction tool this covers everything an agent needs to invoke and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description restates the key behaviors (selector default, includeStyles, pageId auto-pick) with roughly the same information the schema provides rather than adding syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+intent: 'Extract locator-friendly element data from a Safari page for building Playwright/Selenium locators.' This clearly distinguishes it from DOM-dump siblings like ios_safari_get_dom and generic finders like ios_find_element. An agent can tell immediately what it is for and what it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational guidance: USE `suggested`, treat `css`/`xpath` as diagnostic fallbacks only, set includeStyles=true when styles are wanted, and omit pageId to auto-pick the active page. It does not explicitly name sibling alternatives (e.g. ios_safari_get_dom) and when to prefer them, so it falls short of the 5 bar for explicit when-not/alternatives routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_evaluateiOS Safari evaluateADestructiveInspect
Evaluate a JavaScript expression in the context of a Safari page on an iOS device via the Web Inspector. Uses Runtime.evaluate internally. Returns the result as a string (JSON-stringified for objects), followed by a second block naming the tab it actually ran on, read live from that page — check it if a result looks like it came from the wrong page. Omit pageId to auto-pick the frontmost Safari tab. An expression that evaluates to a promise IS awaited, so fetch(...).then(r => r.json()) returns the parsed body rather than an empty object; a promise still pending when the call times out is reported as such instead of being silently returned empty. WAITING: UI frameworks paint a frame or two AFTER the click that triggers them, so an evaluate fired immediately can read the DOM before the menu/overlay/row exists. Use waitForSelector to block until an element appears (and waitMs to let it settle) INSTEAD of splitting the work into a separate poll call — both wait inside this same call on the same tab. DO NOT CLICK WITH THIS TOOL. A click dispatched from JavaScript — .click(), or dispatchEvent of a MouseEvent — is an untrusted event (isTrusted false). Component frameworks and anything gated on a real user gesture (file pickers, clipboard, autoplay, anti-bot checks) may ignore it, so the evaluate SUCCEEDS and the page does nothing — a failure that looks like a passing call. Use webpage_click instead: it has the device tap its own screen at the element, delivering a real trusted touch (pointerdown, touchstart, mousedown, click). Same for typing — webpage_type.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| pageId | No | CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab | |
| waitMs | No | Settle delay applied just before evaluating (and AFTER waitForSelector matches, when both are given). Use for animations that have started but not finished. Maximum 10000 ms | |
| expression | Yes | JavaScript expression to evaluate | |
| waitTimeoutMs | No | How long waitForSelector may poll. Default 5000 ms, maximum 15000 ms | |
| platformVersion | No | Ignored (kept for compatibility) | |
| waitForSelector | No | CSS selector to wait for BEFORE evaluating. Polls until it matches, then runs the expression. Errors if it never appears within waitTimeoutMs — it will not evaluate anyway and hand back a null that reads like a real answer |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior well beyond the annotations: promises are awaited, a pending-promise-at-timeout is reported rather than returned empty, a second block names the tab the expression actually ran on, and the untrusted-event failure mode where a JS click 'SUCCEEDS and the page does nothing'. These are exactly the non-obvious traits annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, then organized into clear constraint blocks (WAITING, DO NOT CLICK). Every section carries a specific gotcha, but the prose is dense and long enough that it tips past minimal, keeping it out of the top band.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex evaluate tool with no output schema, the description fully covers the return format (string, JSON-stringified objects, tab-name block), timing behavior, and the critical trusted-vs-untrusted input pitfall. An agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents udid, pageId, waitMs, waitTimeoutMs, and waitForSelector in detail. The description restates the auto-pick/tab-selection behavior for pageId and the wait semantics but adds little syntax beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (evaluate) and resource (JavaScript expression in a Safari page on an iOS device), and names the mechanism (Web Inspector / Runtime.evaluate). An agent can distinguish it from ios_safari_elements, ios_safari_get_dom, and webpage_cdp_command without opening the schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance: 'Use waitForSelector ... INSTEAD of splitting the work into a separate poll call', 'DO NOT CLICK WITH THIS TOOL ... Use webpage_click instead', and 'Same for typing — webpage_type'. It names when to use the tool, when not to, and the concrete alternatives, satisfying the highest bar for this dimension.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_get_domiOS Safari get DOMARead-onlyIdempotentInspect
Get the outer HTML of a Safari page (or a CSS-selector-matched element) on an iOS device via the Web Inspector. Executes document.documentElement.outerHTML, or document.querySelector(selector)?.outerHTML when a selector is provided. Output is capped at 100 000 characters; a truncation notice is appended when the limit is hit. Omit pageId to auto-pick the active Safari page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| pageId | No | CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab | |
| selector | No | Optional CSS selector — returns outerHTML of the first matching element, or null if not found | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, but the description adds genuine value beyond them: the exact mechanism (document.documentElement.outerHTML), the 100 000-character output cap with an appended truncation notice, and the page auto-selection fallback. These are concrete behavioral traits an agent needs, though no auth/permission or performance caveats are given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose, then mechanism, output cap, and page-selection default. Efficient and scannable, with only mild redundancy between the prose and the schema on the selector behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations carrying the safety profile and the description covering mechanism, output cap, and page selection, an agent has nearly everything needed. The absence of an output schema is compensated by the description explaining the returned outerHTML and truncation notice, though error/edge behavior beyond truncation is not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented, including the selector's null-if-not-found behavior and the ignored platformVersion. The description restates the selector semantics and pageId auto-pick but adds little the schema does not already carry, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get outer HTML), the resource (Safari page or CSS-selector-matched element), and the platform (iOS device via Web Inspector). This is clearly distinguishable from siblings like ios_safari_elements, ios_safari_evaluate, or webpage_get_dom 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides targeted guidance for pageId ('Omit pageId to auto-pick the active Safari page'), which helps correct invocation. However, it never states when to choose this tool over ios_safari_elements (element enumeration) or ios_safari_evaluate (arbitrary JS), leaving the core selection decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_heap_snapshotiOS Safari heap snapshotAIdempotentInspect
Take a JavaScript heap snapshot of a Safari page on an iOS device and write it to a file on the RDS host, returning { nodeCount, edgeCount, bytes, path }. The file is a V8-format .heapsnapshot that loads directly in Chrome DevTools → Memory → "Load profile", so it can be handed to a human to open. Snapshots are multi-MB, which is why the content is never returned inline. Use it to find what a page is retaining: take one, exercise the leak, take another, and compare nodeCount/edgeCount — a count that climbs and never comes back down across repetitions of the same interaction is the signal. Garbage is collected first by default so unreachable objects do not read as a leak; pass collectGarbage=false only when you deliberately want to measure uncollected garbage. Omit pageId to use the active tab. Requires Web Inspector enabled: Settings → Safari → Advanced → Web Inspector.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| pageId | No | Target page id from ios_safari_list_pages (default: active tab) | |
| collectGarbage | No | Run garbage collection before snapshotting (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) cover the safety profile, and the description adds substantial context beyond them: the return shape, that multi-MB content is never returned inline, that GC runs first by default and why, and the Web Inspector prerequisite. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and return value are front-loaded, and every sentence carries information. It is on the longer side, but the extra sentences (workflow, GC caveat, prerequisite) earn their place rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by spelling out the returned fields and the on-disk artifact. Combined with the prerequisite and workflow guidance, an agent has everything needed to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for collectGarbage ('pass collectGarbage=false only when you deliberately want to measure uncollected garbage') and confirms pageId omission semantics. This goes beyond the schema's terse parameter docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Take a JavaScript heap snapshot of a Safari page on an iOS device') plus the side effect (writes a V8 .heapsnapshot file to the RDS host). This clearly distinguishes it from siblings like ios_safari_trace or ios_performance_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow: 'take one, exercise the leak, take another, and compare nodeCount/edgeCount — a count that climbs and never comes back down... is the signal.' It also names the condition that flips the collectGarbage default and references ios_safari_list_pages for pageId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_list_pagesiOS Safari list pagesARead-onlyIdempotentInspect
List inspectable Safari pages on an iOS device via the Web Inspector CDP bridge. Returns index, pageId (the CDP target id), url, title, type, active, and state per page, plus a top-level currentActiveTab (the pageId on screen, or null when none is). index is positional within THIS listing and is not stable across calls — resolve it to a pageId here, then pass that pageId. iOS shows exactly ONE tab at a time, so every ios_safari_* tool called WITHOUT pageId drives the active tab and refuses a backgrounded one — you do NOT need to list pages and thread an id just to act on the current tab, only to target a DIFFERENT one. state says what each page is doing, and the distinction matters because the fixes are opposite: "foreground" = the tab on screen (at most one, and it is the active: true one); "background" = alive but not visible, because another tab or another app is in front — pass its pageId explicitly to drive it anyway; "unresponsive" = the page answers nothing, either because it is suspended (device asleep or locked) or because a dialog (alert/confirm/prompt) is open and blocking the page — those look identical from here, so take a screenshot to tell them apart rather than assuming the device is asleep; "unprobed" = past the probe cap, nothing was measured. Pages "background" with no foreground means Safari is not frontmost. safariFrontmost answers that directly when the device can be asked: false means Safari is NOT the app on screen, so NO tab here is what the device is showing — the tabs are still alive and drivable, but do not read one as "what the user sees", and do not mistake a tab left over from earlier work for the one you just opened. It is omitted when it could not be determined, never guessed. Confirming state costs one bounded check per page (run in parallel), so this is a little slower than a bare listing and never fails the whole call just because nothing is in the foreground. Requires Web Inspector enabled: Settings → Safari → Advanced → Web Inspector.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial operational context beyond them: confirming state costs one bounded check per page run in parallel, the call never fails just because nothing is foregrounded, `safariFrontmost` is omitted rather than guessed when undeterminable, and Web Inspector must be enabled in Settings. It even warns against misreading state (suspended vs. dialog-blocked look identical) and prescribes a screenshot to disambiguate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the purpose and the returned fields, and most sentences carry real information. However it runs to several dense paragraphs with visible redundancy — the 'one tab at a time / at most one foreground tab' point is made twice — and unbroken prose makes it harder to scan than the content warrants.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the full return contract, and it does: it enumerates every field (index, pageId, url, title, type, active, state, currentActiveTab, safariFrontmost) and defines each state value and its implications. Nothing needed to interpret the response or the environment prerequisites is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and only two parameters exist, one of which is explicitly 'Ignored (kept for compatibility)' in the schema itself. The description's pageId discussion concerns a returned value, not an input parameter, so it adds no meaning beyond what the schema already documents — the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List inspectable Safari pages on an iOS device via the Web Inspector CDP bridge') and immediately enumerates the returned fields, so an agent knows exactly what it gets. It also distinguishes itself from the rest of the ios_safari_* family by explaining that those tools drive the active tab without needing this listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when this tool is NOT needed: 'you do NOT need to list pages and thread an id just to act on the current tab, only to target a DIFFERENT one.' It also gives a concrete usage path (resolve `index` to a pageId here, then pass that pageId) and names the alternative behavior of the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_mock_addiOS Safari mock addAInspect
Add (or update in place, when id matches an existing route) a mock/abort rule for Safari/WKWebView requests on this device. mode "mock" (default) serves the given status/headers/body without the request leaving the device; mode "abort" fails it so the page sees a network error. Routes apply immediately and survive navigation. WEB CONTENT ONLY: this intercepts requests made by browser/WebView pages. Requests made by native app code are NOT intercepted and never will be by this tool. Nothing device-wide is changed and no certificate is installed — the effect is scoped to the page. For requests made by native app code use ios_traffic_mock_add instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Route id to update in place; omit to auto-generate a new one | |
| body | No | Response body for mode "mock" (text, or base64 when bodyEncoding is "base64") | |
| mode | No | "mock" serves a canned response (default); "abort" fails the request | |
| udid | Yes | Device id (Android serial or iOS UDID) | |
| method | No | Optional HTTP method filter (e.g. "GET"/"POST"); matches any method when omitted | |
| pageId | No | Pin routing to a specific page id (from the *_list_pages tool). Omit to follow the active page automatically across navigations and new tabs — recommended. | |
| status | No | HTTP status to serve for mode "mock" (default 200) | |
| delayMs | No | Latency injected before responding/failing, in ms (clamped to 60s) | |
| enabled | No | Whether the route is active (default true) — disabled routes are kept but ignored | |
| headers | No | Response headers for mode "mock", as {headerName: value} — e.g. {"content-type": "application/json"}. On iOS a `charset` in content-type is NOT applied to the response: an HTML body with non-ASCII characters must declare it in the document (e.g. <meta charset="utf-8">) or it will be decoded with the default encoding and render as mojibake. | |
| matchUrl | Yes | URL pattern to match against the request's full URL | |
| matchType | No | How matchUrl is interpreted against the request URL (default "contains") | |
| bodyEncoding | No | Encoding of `body` (default "text") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly false, destructive false, not idempotent), and the description adds genuinely new behavioral context: routes apply immediately and survive navigation, nothing device-wide changes, and no certificate is installed because the effect is page-scoped. These are non-obvious traits an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then modes, then the scoping caveat and sibling pointer. Dense but no filler sentences; slightly long, though every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter mutation tool with no output schema, the description covers scope, modes, and sibling routing well. It does not say what the call returns (e.g. the generated route id, which an agent would need for the update-in-place workflow), a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema by explaining what mode "mock" actually does (serves given status/headers/body without the request leaving the device) and what mode "abort" produces (page sees a network error). The id-based update-in-place behavior is also clarified narratively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (add/update a mock or abort rule for Safari/WKWebView requests), disambiguates update-in-place via `id`, and explicitly distinguishes itself from ios_traffic_mock_add. An agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the when/when-not: WEB CONTENT ONLY, native app code will never be intercepted, and names the alternative tool (ios_traffic_mock_add) for that case. Also names the conditions selecting mock vs abort modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_mock_cleariOS Safari mock clearADestructiveIdempotentInspect
Remove ALL Safari/WKWebView routes for this device and un-arm interception. Call this when finished — it restores completely normal networking for the browser on that device.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real value beyond that by naming what is destroyed (all routes) and the resulting state (normal networking restored, interception un-armed).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the destructive scope before the usage cue. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one fully documented parameter, no output schema needed, and annotations covering destructiveness and idempotency, the description supplies everything an agent needs to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) with 100% schema description coverage, so the schema fully documents it and the description need not repeat it. Baseline is 4 for a zero/single-param tool with full coverage; no added syntax beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Remove), resource (ALL Safari/WKWebView routes for this device) and side effect (un-arm interception). The scope word 'ALL' distinguishes it from sibling ios_safari_mock_remove, which implies single-route removal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call it ('when finished') and what it achieves ('restores completely normal networking'). It does not explicitly name ios_safari_mock_remove as the partial alternative, but the ALL/finished framing makes the choice inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_mock_listiOS Safari mock listARead-onlyIdempotentInspect
List the Safari/WKWebView mock/abort routes currently registered for this device, in match order (first match wins). WEB CONTENT ONLY: this intercepts requests made by browser/WebView pages. Requests made by native app code are NOT intercepted and never will be by this tool. Nothing device-wide is changed and no certificate is installed — the effect is scoped to the page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely new behavioral context: the web-content-only interception scope, that nothing device-wide changes, and that no certificate is installed. That scope/certificate clarification is exactly the kind of context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action before the scoping caveats, which is correct ordering. It is slightly verbose in the emphatic negation ('are NOT intercepted and never will be by this tool'), but the extra clauses earn their place by preventing a common misinterpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description conveys what is returned (registered routes in match order). It does not describe the shape/fields of each returned route, but otherwise an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single 'udid' parameter, so the schema already documents it fully. The description only alludes to the device via 'for this device' and adds no syntax or format detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Safari/WKWebView mock/abort routes registered for this device) plus the ordering semantics ('match order, first match wins'). An agent can immediately distinguish this read operation from the sibling mock_add/mock_remove/mock_clear/mock_status tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly scopes when the tool is relevant ('WEB CONTENT ONLY', intercepts browser/WebView page requests) and gives an explicit exclusion (native app code is NOT intercepted). It stops short of naming alternative tools or stating a when-to-inspect workflow (e.g., after mock_add), so it is clear context without full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_mock_removeiOS Safari mock removeADestructiveIdempotentInspect
Remove one Safari/WKWebView route by id. When the last route is removed the device is automatically un-armed, so no traffic is paused for nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Route id to remove (from *_mock_list) | |
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the mutation profile is covered. The description adds genuinely new behavioral context the annotations cannot carry: removing the final route auto-un-arms the device and stops pausing traffic. It does not, however, describe the response or error behavior for a non-existent id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler: the core action leads, and the side-effect note follows. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two fully-documented required params, no output schema, and annotations covering the safety profile, the description supplies what an agent needs: what is removed and what happens as a side effect. It stops just short of explaining state preconditions or failure modes, which is why it is not a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – both 'id' (route id from *_mock_list) and 'udid' are documented in the schema itself. The description repeats 'by id' but adds no format, source, or validation detail beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove'), a precise resource ('one Safari/WKWebView route'), and the selector ('by id'). The word 'one' implicitly distinguishes it from the bulk-removal sibling (ios_safari_mock_clear), so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this is the targeted-removal option versus mock_clear, but the description never explicitly says when to prefer this tool or what preconditions apply (e.g. an armed device with existing routes). No named alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_mock_statusiOS Safari mock statusARead-onlyIdempotentInspect
Report whether Safari/WKWebView interception is currently armed on this device, which page target it is attached to, the active routes, and live hit counters (paused/mocked/aborted/passedThrough/errors). Check the counters to confirm a mock is actually firing — a route that never matches shows mocked: 0.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the burden is low. The description adds real behavioral value by naming the output fields and their semantics (paused/mocked/aborted/passedThrough/errors) and the 'mocked: 0' interpretation, which no structured field provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the core purpose and followed by the actionable diagnostic tip. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by listing the reported state, target, routes, and counter fields. For a single-parameter read-only status tool, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single udid parameter, so the schema already documents it fully. The description adds no additional parameter meaning, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Report whether Safari/WKWebView interception is currently armed,' then enumerates exactly what is reported (target, active routes, counters). This cleanly distinguishes it from ios_safari_mock_add/clear/list/remove siblings, which change state rather than report it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear diagnostic context ('check the counters to confirm a mock is actually firing — a route that never matches shows mocked: 0'), which tells the agent when this tool is useful. It stops short of naming alternatives (e.g., ios_safari_mock_list) or stating exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_set_input_filesiOS Safari set input filesAIdempotentInspect
Set the files on a file-upload input () in Safari on an iOS device, WITHOUT opening the device's file picker. This is the only way to test an upload flow end to end on iOS: tapping an upload control opens a native sheet that automation cannot drive. Provide file content inline, or name a file already on the device (see ios_file_push / ios_upload_targets) to have it read from there. Fires the input and change events afterwards so framework bindings and validation run, then reads the input back and reports the file names and sizes the PAGE actually sees — so a silent no-op can't pass as success. Total content limit 2 MB.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| files | Yes | Files to attach. Pass several only for a multiple-file input | |
| index | No | Which match to use when the selector matches several (0-based, default 0) | |
| pageId | No | CDP target id. Omit to use the page ios_safari_navigate last landed on | |
| selector | Yes | CSS selector for the file input. Must resolve to an <input type="file"> element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare non-readOnly, idempotent, non-destructive), the description discloses that the native picker is bypassed, that input and change events fire so framework bindings run, that the input is read back to verify what the page actually sees, and a hard 2 MB content limit. That is substantial operational context an agent cannot get from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core capability and its unique value are front-loaded in the first sentence, followed by the practical constraint, the content-source options, the event/verification behavior, and the size limit. Every sentence carries information; none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so ('reports the file names and sizes the PAGE actually sees'), plus the failure-mode caveat about silent no-ops. For a 5-parameter tool with a 2 MB limit, the constraints, alternatives, and result semantics are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description earns extra credit by explaining the inline-vs-device-path choice for file content and cross-referencing ios_file_push and ios_upload_targets for the devicePath option. It does not add detail for selector, index, or pageId beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource (set files on an `<input type="file">` in iOS Safari) and immediately distinguishes itself from the obvious alternative behavior by noting it works WITHOUT opening the native file picker. An agent can tell exactly what this does versus ios_upload_targets or ios_file_push.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use rationale ('the only way to test an upload flow end to end on iOS') and names the conditions under which alternatives apply ('name a file already on the device — see ios_file_push / ios_upload_targets'). No exclusions are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_safari_traceiOS Safari traceAInspect
Record a Performance trace of a Safari page on an iOS device over a time window and write it to a file on the RDS host, returning { eventCount, durationMs, bytes, path }. The file loads directly in Chrome DevTools → Performance → "Load profile", so it can be handed to a human to read the flame chart. Traces are multi-MB, so the content is never returned inline. Captures main-thread work (tasks, script execution, style, layout, paint) together with a JavaScript CPU sample run, so the flame chart shows which functions the time went to. Use it for "why is this page slow/janky" — long tasks and repeated layout show up as wide bars. Pass url to navigate INSIDE the recording and capture the full page load, or triggerJs to fire an interaction inside the window (both are the usual way to trace something specific rather than idle time). Set screenshots=true to include a filmstrip (roughly doubles the file size). Default window: 5 000 ms. Maximum: 30 000 ms. Omit pageId to use the active tab. NOTE: on some iOS versions WebKit reports no elapsed time to a remote inspector, and every event is then stamped 0. The recorded work and its nesting are still real, but durations and the flame chart timeline are not; the result says timestamped=false when this happens, so do not read timings from a trace that reports it. Requires Web Inspector enabled: Settings → Safari → Advanced → Web Inspector.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Navigate the page to this URL inside the recording to capture the full page load | |
| udid | Yes | iOS device UDID | |
| pageId | No | Target page id from ios_safari_list_pages (default: active tab) | |
| triggerJs | No | JavaScript to evaluate inside the recording window to trigger the work being traced | |
| durationMs | No | Recording window in milliseconds (default: 5000, max: 30000) | |
| screenshots | No | Include a filmstrip (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is non-read-only, non-idempotent, non-destructive; the description adds far more: the trace is written to a file rather than returned inline because it is multi-MB, the return keys, the Chrome DevTools load path, the default and maximum window, the file-size cost of screenshots, and the Web Inspector prerequisite. The timestamped=false WebKit caveat is exactly the kind of failure mode an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, side effect and return value, then the usage guidance, then the critical timestamped=false warning. It is dense and mostly earns its length, though the middle passages on flame-chart interpretation and the DevTools handoff are more explanation than an agent needs to invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation-ish tool with no output schema, the description covers everything needed: what is captured, where output goes, the return fields, default/max duration, prerequisite setup, and the silent-failure mode with its sentinel field. Nothing material is left for the agent to discover at call time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description still adds real meaning: url navigates 'INSIDE the recording' to capture the full page load, triggerJs fires work inside the window, omitting pageId uses the active tab, and screenshots 'roughly doubles the file size'. It largely restates the schema's wording for url/triggerJs, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Record a Performance trace of a Safari page on an iOS device') plus the side effect (writes a file on the RDS host) and the return shape. This cleanly separates it from device-level siblings like ios_performance_record_start and ios_safari_heap_snapshot without the agent needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit context ('Use it for "why is this page slow/janky" — long tasks and repeated layout show up as wide bars') and tells the agent how to make the trace meaningful: pass url to capture a full page load or triggerJs to fire an interaction 'rather than idle time'. It never names a competing tool to use instead, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_screenshotiOS screenshotARead-onlyIdempotentInspect
Take a HIGH-FIDELITY screenshot of an iOS device (slow full-fidelity path). Returns base64 PNG image. For routine per-action screen checks prefer ios_mjpeg_screenshot — it is much faster; reserve ios_screenshot for when you need a crisp, full-fidelity frame. If the device is asleep (black frame) it auto-wakes and retries once. Requires an active iOS automation session (auto-starts if needed) — when no session is running and you do not want to start one, ios_fast_screenshot captures without one, at a higher per-call cost.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses useful side effects (auto-wakes and retries once on a black frame; auto-starts an iOS automation session if needed), but these are environment modifications that directly contradict the annotation readOnlyHint=true. Because the description contradicts the structured safety signal, this dimension scores 1 per the annotation-contradiction rule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and slow-path qualifier, then adds return format, sibling preference, edge-case behavior, and session requirement in a tight sequence. Every sentence adds distinct operational information with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter screenshot tool with no output schema, the description covers the return format (base64 PNG), session prerequisite, auto-start behavior, wake retry, and two alternatives. Nothing an agent needs to invoke it correctly is missing, aside from the annotation mismatch noted above.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single udid parameter, and the description adds no parameter-level detail such as UDID format, acquisition, or constraints. Baseline 3 applies when the schema fully documents the parameter and the description does not enrich it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Take a HIGH-FIDELITY screenshot of an iOS device'), names the exact output ('base64 PNG image'), and distinguishes itself from siblings ios_mjpeg_screenshot and ios_fast_screenshot by its full-fidelity slow path. An agent can select this over alternatives 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: prefer ios_mjpeg_screenshot for routine per-action checks, reserve ios_screenshot for crisp full-fidelity frames, and use ios_fast_screenshot when no session should be started. The when-to-use and when-not-to-use conditions are fully stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_scroll_to_elementiOS scroll to elementInspect
Scroll the screen until a UI element with the given label becomes visible, then return its coordinates. Eliminates multi-swipe guesswork for off-screen content. Requires an active iOS automation session (auto-starts if needed). On a device set to direct-input-only it needs no session: it scrolls to the named element and reports verified (whether the landing was confirmed; treat false as unconfirmed and screenshot) but returns NO coordinates. Pass input:"session" to force the session path.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| input | No | Scroll path. 'auto' (default) follows the device's mode: direct-input-only devices scroll without a session (no coordinates returned). 'session' forces the automation-session scroll, which returns coordinates. 'hid' forces the session-free scroll. | |
| label | Yes | Accessibility label or text of the element to scroll to | |
| direction | No | Scroll direction (default: down) |
ios_send_keysiOS send keysAInspect
Type text into the FOCUSED field on an iOS device — tap a text field first. Use \n in text to press the Return/Go key (e.g. "user@example.com\n" to submit). Refuses when nothing is focused instead of reporting a success it cannot back: the device accepts the keystrokes either way, so with no focused field the text goes nowhere and the old behaviour still said it was typed. Pass force:true to send anyway (rare — for surfaces where the active element is not reported). On a device set to direct-input-only this types over the direct input path (no automation session), and the focused-field check above is skipped there since it cannot be checked without one — tap the field first regardless. Otherwise requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type. Use \n to press Return/Go key. | |
| udid | Yes | iOS device UDID | |
| force | No | Send even when no focused field is reported (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations, which only declare this is not read-only/idempotent/open-world. It discloses refusal semantics with a rationale, the force bypass, the direct-input path that skips the focused-field check, and the requirement of an active iOS automation session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the focus precondition, and nearly every clause carries information. The aside explaining the previous buggy behaviour ('the old behaviour still said it was typed') is longer than needed to justify the refusal, costing a little tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only three documented parameters, the description supplies everything an agent needs: the session precondition, the focus precondition, the refusal/force path, and the direct-input exception. Nothing material is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: force:true is scoped to 'surfaces where the active element is not reported' and framed as rare, and the \n-as-Return behaviour is restated with a concrete example ('user@example.com\n' to submit).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource+target: typing text into the FOCUSED field on an iOS device. It implicitly separates itself from raw-input siblings such as ios_key_hid and from generic typing tools by stating the focus precondition up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (tap a text field first), an explicit failure mode and why it exists (refuses when nothing is focused rather than falsely reporting success), the escape hatch (force:true, flagged as rare), and the direct-input-only exception with the note that the check is skipped there.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_set_device_languageiOS set device languageAIdempotentInspect
Change the iOS device's system language and / or locale (persistent, affects every app). iOS may relaunch SpringBoard to apply the change — expect a 5-10s flicker, and the value can take a few seconds to read back. Pass a BASE language code ("fr", not "fr-CA"): iOS reports a region-qualified language but refuses to set one, so a regional code is split into its base language plus a locale automatically. For per-app testing without changing the whole device, prefer ios_launch_app_in_language.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| locale | No | POSIX locale, e.g. "fr_FR", "es_US" | |
| language | No | ISO 639-1 language code, e.g. "fr", "es", "en" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, and the description layers on genuinely useful behavior: persistence across apps, SpringBoard relaunch with a 5-10s flicker, and delayed read-back of the value. These are side effects annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, front-loaded with the core effect and persistence warning, then the timing caveat, then the code-format constraint, ending with the alternative tool. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema needed for a setter, all three parameters documented, and the disruptive/async side effects disclosed, an agent has everything required to invoke this correctly and to set expectations about timing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the literal field meanings are already documented. The description still adds non-obvious semantics: language must be a base code ("fr", not "fr-CA") because iOS refuses region-qualified languages and auto-splits a regional code into base language plus locale.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Change the iOS device's system language and / or locale" gives a specific verb (change) plus the exact resource and scope (persistent, affects every app). It is clearly distinguishable from per-app launch variants and from locale-clearing siblings like device_clear_app_locale.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: "For per-app testing without changing the whole device, prefer ios_launch_app_in_language." That names the alternative and the condition that selects it, which is the strongest form of usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_set_locationiOS set locationAIdempotentInspect
Set the iOS device's GPS location for testing location-aware apps. Needs no automation session: it drives the device's own developer location-simulation service, and falls back to the automation agent's route only if that is unavailable. Stays in effect until ios_clear_location, a device reboot, or a restart of the device service (the simulation is a held connection on iOS 17+ — the reply's transport says which route ran). SCOPE: only affects apps that read CoreLocation (CLLocationManager, Safari navigator.geolocation). Does NOT affect apps using IP-based geolocation, Wi-Fi/cell-tower triangulation, or anti-fraud detection paths.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| latitude | Yes | Latitude in decimal degrees, e.g. 37.7749 | |
| longitude | Yes | Longitude in decimal degrees, e.g. -122.4194 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover idempotency/safety; the description adds substantial behavior beyond them: no automation session required, the fallback route if the developer service is unavailable, a held connection on iOS 17+, the conditions that end the effect, and the reply's `transport` field. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scoping constraint, and every sentence carries information. It is dense with parentheticals (iOS 17+ held connection, transport field), which slightly taxes readability but not enough to call it padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining the reply's `transport` field, and it covers the persistence and scope caveats an agent needs to call and reason about the result correctly. Nothing material is missing for a 3-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so udid, latitude and longitude are already documented with examples. The description adds no syntax or format detail beyond the schema; the only extra field mentioned (`transport`) is a return value, not a parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (set the iOS device's GPS location) plus the purpose (testing location-aware apps), and the mechanism distinguishes it from siblings like ios_play_location_route and ios_get_location. An agent can tell exactly what this does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case (testing location-aware apps) and states the persistence lifetime, naming ios_clear_location as the counterpart. The SCOPE paragraph gives explicit when-it-applies/when-it-does-not boundaries (CoreLocation vs IP-based geolocation, Wi-Fi/cell triangulation, anti-fraud paths).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_set_pasteboardiOS set pasteboardAIdempotentInspect
Set the clipboard (pasteboard) content on an iOS device. On a device set to direct-input-only this writes over the direct input path (no automation session, same as ios_clipboard_set_hid); otherwise requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| content | Yes | Text content to set on clipboard |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a write (readOnlyHint=false), idempotent, non-destructive, and not open-world. Beyond that, the description discloses the two operational modes and the session precondition, which is genuinely useful context not present in structured fields. It does not describe failure behavior when no session exists, keeping it out of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the primary action is front-loaded before the mode-specific caveat. Every clause carries information an agent needs to decide how to invoke it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and the annotations cover the safety profile, so the description only needs to carry preconditions and modes, which it does. It could be slightly more complete by noting what happens on failure (e.g., no active session), but nothing essential to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two simple parameters (udid, content), so the schema fully documents them and the 3 baseline applies. The description adds no formatting or size constraints on 'content' beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the clipboard (pasteboard) content on an iOS device') and explicitly names the sibling it behaves like in one mode (ios_clipboard_set_hid). An agent can distinguish this tool from ios_get_pasteboard and the generic device_clipboard_set 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear conditional context: on direct-input-only devices it writes over the direct input path with no session, otherwise an active iOS automation session is required. It stops short of saying when to prefer this over ios_clipboard_set_hid or device_clipboard_set, so it is context-rich but has no explicit routing advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_settingsiOS settingsAInspect
Get or update iOS automation settings on an iOS device. Call without settings to get current values. Pass settings object to update. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| settings | No | Settings to update (e.g. {"mjpegServerScreenshotQuality": 25}). Omit to get current settings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description usefully adds the session requirement and the mode-switching behavior. However it omits what happens on update (merge vs replace), whether changes are reversible, and which settings keys are valid, so it adds only moderate context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, zero filler, and the core get/update contract is front-loaded before the session prerequisite. Slightly choppy but well-sized for a two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description never indicates what the get mode returns (shape or example of current settings). Combined with no enumeration of supported settings keys, an agent must probe blindly, though the core contract is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both udid and the settings object with an example, so the description's omit/pass explanation largely repeats structured data. No extra syntax or key enumeration is provided beyond the schema example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (get/update) and resource (iOS automation settings) and there is no sibling that does the same thing, so the agent can distinguish it immediately. The dual-mode nature is stated up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains the two calling modes ('call without settings to get', 'pass settings object to update') and the prerequisite of an active iOS automation session. It does not name any alternative tool, but no sibling competes for this task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_siriiOS SiriAInspect
Ask Siri on an iOS device or Apple TV by TEXT, exactly as if the request had been spoken (e.g. "what time is it", "open Settings", "set a timer for 5 minutes"). Use this for Siri — nobody can speak to the device microphone remotely. Returns once Siri has taken the request; take a screenshot (ios_mjpeg_screenshot / ios_fast_screenshot) a second or two later to read the answer. Works on an Apple TV as well as phones and tablets. Requires an active iOS automation session (auto-starts if needed).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | What to ask Siri, as you would say it | |
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, openWorld, non-idempotent, non-destructive). The description adds genuinely useful behavior beyond that: it returns as soon as Siri has accepted the request rather than the answer, and an active session is required (auto-starts if needed). It doesn't mention failure modes or rate limits, so 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and parenthetical examples, then follow-up guidance, then device/session caveats. Every sentence carries information, though the multi-clause structure is slightly dense for its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs for a 2-param, no-output-schema tool: input style, device scope, asynchronous return semantics, required session, and the downstream step to read the answer. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented (text as 'What to ask Siri, as you would say it', udid). The description adds spoken-style examples ('set a timer for 5 minutes') that clarify the expected input format, but this is marginal against an already-complete schema — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (ask) and resource (Siri on iOS/Apple TV) plus the crucial mechanism — text input standing in for speech. It clearly distinguishes itself from screen/input siblings like ios_tap_by_label or ios_send_keys by naming the Siri conduit explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a strong when-to-use rationale ('nobody can speak to the device microphone remotely') and prescribes the follow-up workflow (screenshot ios_mjpeg_screenshot / ios_fast_screenshot a second or two later). It does not explicitly state when NOT to use it or name a competing input tool, so it stops just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_start_sessioniOS start sessionAInspect
Start a iOS automation session on an iOS device . Must be called before any iOS control commands. Takes ~10-30s to launch. The reply includes a best-effort "Device: ..." line summarizing model, OS version, orientation + window size, the foreground app, and appearance (light/dark) — read it before making separate calls for the same info; any field that could not be read quickly is simply left out, and the line is omitted entirely if none of it came back in time.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, destructible=false, openWorld=false, idempotent=false); the description adds real operational context the annotations can't: 10-30s launch latency, the best-effort 'Device: ...' reply line, and the fact that unavailable fields are silently omitted rather than erroring. It doesn't say whether the session consumes a device slot or must be released, which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and prerequisite, then latency and return-value guidance. The Device-line sentence is somewhat dense with repeated clauses ('best-effort', 'read it before making separate calls', 'omitted entirely'), but every sentence carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 appropriately spends effort describing what comes back (the Device line and its fields, plus the possibility that it is absent). It still omits session lifecycle details such as needing ios_end_session and whether the returned session handle is required by subsequent calls, leaving a modest gap for a state-creating tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter (udid) at 100% schema description coverage, so the schema already fully documents it. The description never references the parameter, adding nothing beyond structured data; this is the baseline 3 case for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Start an iOS automation session on an iOS device') with an explicit prerequisite ('must be called before any iOS control commands') that cleanly separates it from the ~200 sibling iOS control tools and from ios_end_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition (call first, before any iOS control command) and steers the agent to read the returned Device line instead of issuing extra calls for the same data. It does not warn about calling it repeatedly (annotations mark idempotentHint=false), nor mention the ios_end_session counterpart, so it falls 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.
ios_supported_languagesiOS supported languagesARead-onlyIdempotentInspect
List the languages and locales this iOS device accepts, plus what it is set to now. Read this before ios_set_device_language rather than guessing a code: an unsupported value is rejected with a bare "SetProhibited" that names no reason. Note the asymmetry — the current language reads back region-qualified (e.g. "en-CA") but only the BASE codes listed in languages can be set; the region belongs in the locale.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds real behavioral context beyond them: the error shape on failure and the readback asymmetry (region-qualified current language vs. settable base codes). It stops short of describing pagination or the exact response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary action, then the precondition, then the non-obvious asymmetry. No filler; every clause carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 characterize the return values, and it does (accepted languages/locales plus the current setting, with the region-qualified caveat). Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter (udid) with 100% schema description coverage, so the schema already documents the input. The description's detail concerns output semantics rather than the parameter, so it adds nothing for udid; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the languages and locales this iOS device accepts, plus what it is set to now'), which an agent can immediately distinguish from the mutation sibling ios_set_device_language.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Read this before ios_set_device_language rather than guessing a code', and explains the cost of skipping it (a bare 'SetProhibited' with no reason). Both the when and the why are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_swipeiOS swipeAInspect
Swipe from (x1,y1) to (x2,y2) on an iOS device screen. Coordinates are in physical screen points. (On an Apple TV, use ios_tv_button arrows or ios_tv_swipe to move focus — a coordinate swipe is unavailable there.) Works without an automation session when the direct input path is available; falls back to one otherwise (see input).
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start X coordinate | |
| x2 | Yes | End X coordinate | |
| y1 | Yes | Start Y coordinate | |
| y2 | Yes | End Y coordinate | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| duration | No | Swipe duration in ms (default: 500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, destructive=false, idempotent=false), the description discloses the dual input-path behavior: it runs without an automation session when the direct path is available and falls back otherwise. That is genuinely useful operational context, though detail on failure modes is deferred to the schema's `input` param.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and coordinate semantics before the TV caveat and input-path note. Three sentences, all earning their place, though the input-path sentence is slightly dense and references the schema rather than fully explaining.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-param gesture tool with full schema coverage and no output schema, the description covers purpose, coordinate units, TV alternative, and the session-vs-direct input mechanism. Nothing critical is missing, though return-value and failure reporting are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 parameters including norm, input, and duration. The description restates the coordinate meaning (physical screen points), which is a minor clarification over the schema's default, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (swipe) and resource (iOS device screen) with explicit from/to coordinate semantics. It also differentiates itself from the TV siblings by naming ios_tv_button and ios_tv_swipe as the correct tools when the target is an Apple TV.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-not-to-use case (Apple TV, where coordinate swipes are unavailable) and points at the alternatives. It stops short of routing between other iOS swipe-like siblings such as ios_two_finger_swipe, ios_drag_drop, or device_swipe, so context is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_syslog_captureiOS syslog captureARead-onlyIdempotentInspect
Capture the iOS device's live system log for a few seconds and return the lines. This is the device log (os_log/syslog) — where crashes on launch, permission denials and app startup failures appear. Not app console logs: for a web page use ios_safari_console_logs. Filter with process and/or contains — an idle device produces hundreds of lines per second, so an unfiltered capture is mostly noise. Run the action you want to debug WHILE the capture is running, or capture right after it. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| level | No | Minimum severity: "error" = Error+Fault only, "notice" excludes Debug/Info. Default all | |
| process | No | Only lines from this process/image, e.g. "SpringBoard" (case-insensitive substring) | |
| seconds | No | How long to collect for (default 5, max 60) | |
| contains | No | Only lines containing this text (case-insensitive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnly, non-destructive, non-open-world), and the description adds genuinely useful operational context: bounded duration of a few seconds, the fact that an idle device emits hundreds of lines/second so unfiltered capture is noise, and that no session is needed. It does not describe return shape or failure modes if the device is unreachable. Note: idempotentHint=true is questionable for a live capture, but the description does not assert idempotency, so this is an annotation quirk rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, front-loaded with the purpose, then disambiguation, then filtering guidance, then timing, then the session note. Every sentence adds decision-relevant information and none restates the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter capture tool with no output schema, the description covers what it does, when to run it, how to filter, and roughly what comes back ('return the lines'). It stops short of describing the response format (line array vs. text, truncation behavior) and the 60s cap, which the schema covers but the agent must still discover.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description goes beyond the schema by naming the two filter parameters (`process`, `contains`) and supplying the rationale that filtering is required to avoid noise on an idle device. `level` and `seconds` are left entirely to the schema, which documents them adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Capture the iOS device's live system log ... return the lines') and pins down what the log contains (os_log/syslog: launch crashes, permission denials, startup failures). It explicitly disambiguates from the closest sibling, ios_safari_console_logs, so an agent can choose correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions (debugging crashes on launch, permission denials, app startup failures), names the alternative for web content, prescribes filtering via `process`/`contains` and explains why, and states the timing rule ('run the action you want to debug WHILE the capture is running'). It even removes a prerequisite ambiguity with 'No automation session required.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tapiOS tapAInspect
Tap at (x,y) on an iOS device screen — the FALLBACK for when an element has no usable label. Prefer ios_tap_by_label (taps by accessibility label via the automation session, no coordinate math, works even on zero-area elements) whenever the target has a name in ios_page_source. Coordinates here are in physical screen points and must come from ios_page_source (the authoritative source), NOT eyeballed from a screenshot. (On an Apple TV, which has no touchscreen, this is unavailable — select an element with tvos_select or tvos_focus instead.) Works without an automation session when the direct input path is available; falls back to one otherwise (see input).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in screen points (from ios_page_source element center) | |
| y | Yes | Y coordinate in screen points (from ios_page_source element center) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| duration | No | Tap hold duration in ms (default: 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive, non-open-world; the description goes further by disclosing that it works without an automation session when the direct input path is available, that it silently falls back otherwise, that direct-input-only devices report an error rather than switching, and that 'hid' fails on iOS 17.x or with no tunnel. That is meaningful operational context beyond the annotations, though it doesn't cover latency or partial-failure semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the fallback role before the coordinate-sourcing rule and the tvOS aside. It is dense and long, but every clause carries routing, sourcing, or fallback information; the parenthetical tvOS sentence is the only part that could arguably be moved to a sibling description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation tool with no output schema, the description covers what the agent needs: when it applies, where coordinates come from, what the input-path fallback does, and which tools replace it on non-touchscreen platforms. Nothing essential to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real guidance the schema does not: coordinates must originate from ios_page_source and must not be eyeballed from a screenshot, and it points the reader to the `input` parameter for path-selection semantics. It reinforces rather than duplicates the schema's coordinate origin note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('Tap at (x,y) on an iOS device screen') and immediately positions itself against its sibling ios_tap_by_label and against the tvOS alternatives. An agent can distinguish it from ios_tap_by_label, ios_two_finger_tap, and tvos_select 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool ('the FALLBACK for when an element has no usable label'), when to prefer the alternative ('Prefer ios_tap_by_label ... whenever the target has a name in ios_page_source'), and what to use instead on Apple TV ('select an element with tvos_select or tvos_focus instead'). Both routing conditions and exclusions are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tap_by_labeliOS tap by labelInspect
PREFERRED way to tap on iOS: find a UI element by its accessibility label and tap it in one call via the automation session. No coordinate math, and it works on zero-area elements (e.g. bottom-tab labels) where ios_tap(x,y) would miss. Use this before falling back to ios_tap with raw coordinates. If the element is off-screen it auto-scrolls to bring it into view first (disable with autoScroll:false). On no match, returns similar labels (incl. off-screen) to retry with. If neither the accessibility tree nor auto-scroll finds it, it falls back to reading the screen with OCR and taps the matching on-screen text; the reply says when OCR was used. Requires an active iOS automation session (auto-starts if needed). On a device set to direct-input-only it needs no session: it scrolls the element into view, reads the visible text on the screen to find where it is, taps there, and reports changed (whether the screen changed afterwards). That path needs the label to be visible text; an icon-only control fails fast, so use input:"session" for those.
| Name | Required | Description | Default |
|---|---|---|---|
| near | No | Direct-input path only: text of a neighbouring element, to pick between several look-alike labels. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| label | Yes | Accessibility label or visible text of the element to tap | |
| match | No | How to match `label`. Default "contains" — strict, and the only modes that act without interpretation. "fuzzy" tolerates typos and word-order drift, and is tried ONLY after strict finds nothing; it REFUSES when two candidates are too close rather than guessing between them (e.g. "Sign" vs Sign In / Sign Out), and reports which attribute it matched. | |
| autoScroll | No | Scroll the element into view if off-screen before tapping (default: true) |
ios_terminate_appiOS terminate appADestructiveIdempotentInspect
Terminate an app on an iOS device. If no bundleId provided, terminates the current foreground app. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| bundleId | No | App bundle ID to terminate (default: current foreground app) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description usefully adds the session prerequisite and the default-target behavior, but says nothing about whether app data/state is preserved, which is the key behavioral question separating terminate from clear-data tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core action first and the default behavior and precondition following. Every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 full annotation coverage, the description supplies purpose, default, and prerequisite. The only real gap is sibling differentiation against ios_kill_app, which matters given how many overlapping terminate/kill tools exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented there, including the exact 'default: current foreground app' note the description repeats. The description adds no syntax, format, or resolution detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Terminate an app on an iOS device'), which is clearer than the bare title. However, it makes no attempt to distinguish itself from near-identical siblings like ios_kill_app and device_terminate_app, so an agent cannot route between them from this text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the precondition ('Requires an active iOS automation session') and the fallback behavior when bundleId is omitted, which is genuine usage context. It gives no guidance on when to prefer this over ios_kill_app or device_terminate_app, so the choice among overlapping terminate tools 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.
ios_traffic_flowsiOS traffic flowsARead-onlyIdempotentInspect
Snapshot recent DECRYPTED HTTPS flows (request/response) captured since ios_traffic_start. Each flow: method, url, host, status, contentType, req/resp sizes, durationMs. Set includeBodies to also return headers + (truncated) request/response bodies. Filter by urlSubstring or onlyErrors. Returns the most recent limit flows.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| limit | No | Max flows to return, most recent first-matched (default 100) | |
| onlyErrors | No | Only 5xx / connection-error flows | |
| urlSubstring | No | Only flows whose URL contains this substring | |
| includeBodies | No | Include headers + bodies (each body capped at 32000 chars). Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/idempotent/non-destructive behavior, so the description is free to add the traits that matter here: only DECRYPTED HTTPS traffic is visible, bodies are truncated (32,000 chars), and results are ordered most-recent-first. It stops short of saying what happens if no capture is active or whether the snapshot is a live buffer or a drain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences: capture scope and precondition first, returned fields second, filter/limit controls last. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract itself by enumerating every field (method, url, host, status, contentType, sizes, durationMs) plus the conditional headers/bodies, and it covers all five parameters and the session prerequisite.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by tying includeBodies to a concrete effect (headers plus truncated bodies appear in the output) and by restating the limit semantics as 'most recent limit flows' with urlSubstring/onlyErrors as alternative narrowing levers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (snapshot) and resource (recent DECRYPTED HTTPS request/response flows), and explicitly ties the data to a prior ios_traffic_start, which separates it from ios_traffic_status, ios_pcap_start, and ios_safari_capture_network.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the precondition clearly ('captured since ios_traffic_start') and explains which filters to apply for narrower queries, but never names an alternative tool (e.g., ios_traffic_status for capture state or android_traffic_flows for the other platform) or says when this tool is the wrong choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_traffic_mock_addiOS traffic mock addAInspect
Add (or update in place, if id matches an existing route) a mock/abort rule that short-circuits future matching HTTPS requests on this device inside the TLS-inspecting proxy — the request never reaches the real server. mode "mock" (default) returns the given status/headers/body; mode "abort" kills the connection so the app sees a network failure. Requires TLS capture to already be running on this device (ios_traffic_start) — routes are stored per-device and take effect live, no restart needed. Certificate-pinned apps cannot be intercepted at all (same limit as capture itself), so a route targeting pinned traffic will simply never match.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Route id to update in place (replaces the existing route); omit to auto-generate a new one | |
| body | No | Response body to inject for mode "mock" (text, or base64 when bodyEncoding is "base64") | |
| mode | No | "mock" injects a canned response (default); "abort" kills the connection | |
| udid | Yes | iOS device UDID | |
| method | No | Optional HTTP method filter (e.g. "GET"/"POST"); matches any method when omitted | |
| status | No | HTTP status to inject for mode "mock" (default 200) | |
| delayMs | No | Latency to inject before responding/aborting, in ms (clamped to 60s server-side) | |
| enabled | No | Whether the route is active (default true) — disabled routes are kept but ignored | |
| headers | No | Response headers to inject for mode "mock", as {headerName: value} — e.g. {"content-type": "application/json"} | |
| matchUrl | Yes | URL pattern to match against the request's full URL | |
| matchType | No | How matchUrl is interpreted against the request URL (default "contains") | |
| bodyEncoding | No | Encoding of `body` (default "text") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, destructive=false, openWorld=false, idempotent=false), the description discloses substantial behavioral context: routes are stored per-device, take effect live with no restart, the 'abort' mode kills the connection so the app sees a network failure, and certificate-pinned apps can never be intercepted so such routes silently never match. These are exactly the operational traits an agent needs and cannot derive from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense paragraph, front-loaded with the core verb and the add-or-update behavior before moving to mode semantics, prerequisites, and limitations. There is mild redundancy with the schema on mode defaults, but for a 12-parameter mutation tool the length is justified and every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, the description supplies the missing context: the prerequisite capture session, per-device live-effect storage, the two mode behaviors, and the pinning limitation. Nothing critical to invoking it correctly is absent; only the exact return payload is unspecified, which is acceptable without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning by explaining the mock-vs-abort mode semantics (status/headers/body only apply to mock), the in-place update behavior when `id` matches, and that routes are per-device. It stops short of detailing matchType or delayMs syntax, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (add/update in place) and resource (a mock/abort rule for HTTPS traffic in the TLS-inspecting proxy), and clearly distinguishes this from plain capture by explaining that matching requests never reach the real server. An agent can immediately tell this apart from ios_traffic_flows or ios_traffic_start 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite explicitly ('Requires TLS capture to already be running on this device (ios_traffic_start)') and explains the two operating modes with their effect. It does not, however, name the sibling tools an agent would use to inspect or remove routes (ios_traffic_mock_list / ios_traffic_mock_remove) or give explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_traffic_mock_listiOS traffic mock listARead-onlyIdempotentInspect
List the mock/abort routes currently configured for this device (see ios_traffic_mock_add).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds that the listed items are 'mock/abort routes' scoped to the current device, which is genuine extra context, but it says nothing about whether an active traffic session is required or what the returned route entries contain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with the sibling reference placed at the end as a secondary pointer. No filler words and nothing that needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with full annotation coverage, the description is minimally sufficient but leaves gaps: there is no output schema, so the description could have sketched what a listed mock/abort route looks like or noted the need for an active traffic session. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (udid) with 100% schema description coverage, so the schema already documents it fully. The description adds no syntax, format, or sourcing guidance for the UDID beyond the schema, so the baseline of 3 for high schema coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and a specific resource (mock/abort routes configured for this device), and adds semantic detail beyond the name by clarifying these are mock/abort routes rather than general traffic. It cross-references the sibling ios_traffic_mock_add, but does not distinguish itself from ios_traffic_flows, ios_traffic_mock_remove, or ios_safari_mock_list-type siblings, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(see ios_traffic_mock_add)' points at the sibling that creates these routes, implying the list/inspect use case, but there is no explicit when-to-use vs when-not, and no guidance relative to ios_traffic_status or ios_traffic_flows. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_traffic_mock_removeiOS traffic mock removeADestructiveIdempotentInspect
Remove one mock/abort route by id, or every route on this device when all is true. Returns the resulting route list.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Route id to remove (from ios_traffic_mock_add or ios_traffic_mock_list) | |
| all | No | Remove every route configured for this device instead of a single one | |
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=false, so the safety profile is covered. The description adds only the return value ('resulting route list'), which is genuinely useful since there is no output schema, but no detail on error behavior or what happens if the id does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the primary action and the two modes front-loaded, and the return value disclosed last. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter destructive tool with no output schema, the description covers the action, both modes, and the return shape. It could say more about failure behavior when an id is not found, but nothing essential for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, all, and udid in detail. The description restates the id/all semantics without adding format or edge-case detail, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') and resource ('mock/abort route'), plus the two operating modes (single by id, or all routes on the device). It is immediately clear what the tool does, though it never names the sibling remove tools (ios_safari_mock_remove, android_traffic_mock_remove) to differentiate itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use each mode ('by id' vs 'when all is true'), which is useful routing within the tool. However, there is no explicit when-to-use versus when-not, no mention of prerequisites, and no reference to alternative tools despite many mock siblings existing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_traffic_startiOS traffic startAInspect
Start TLS inspection on a physical iOS device: brings up a per-device TLS-inspecting proxy and installs a CA-trust + HTTP-proxy config profile, so subsequent HTTPS traffic is DECRYPTED and captured (works for native apps too, unlike Safari DevTools). Then drive the app and read flows with ios_traffic_flows. Defaults to the supervised SILENT install (zero on-device interaction); if no supervision keybag is configured it falls back to a prompt install (user taps Install on the device). Certificate-pinned apps will not decrypt.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| silent | No | Supervised silent install (default true). Set false to force the on-device prompt install. Silent requires the device to be supervised and a supervision keybag to be configured on the server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (which only say non-read-only, non-idempotent, non-destructive): it discloses that it installs a trust profile, that traffic is decrypted, that the default silent path depends on supervision/keybag configuration and falls back to a user-tap prompt, and that certificate-pinned apps will not decrypt. These are exactly the operational caveats an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single front-loaded paragraph that leads with the action and mechanism before caveats; every sentence carries information. It is dense, but the length is justified by the number of caveats (fallback install, pinning, follow-up tool).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what the call produces (decrypted HTTPS traffic captured) and how to consume it (ios_traffic_flows). Limitations, defaults, and prerequisites are all covered, so nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameter descriptions already document udid and the silent/supervision semantics; the description restates the silent default and fallback without adding new syntax or constraints. Baseline 3 is appropriate since the schema carries the parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (start TLS inspection on a physical iOS device) and describes the mechanism (per-device proxy + CA-trust/HTTP-proxy profile). It explicitly distinguishes itself from Safari DevTools and routes the agent to ios_traffic_flows, so it is separable from ios_pcap_start/ios_traffic_stop siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear sequencing ('Then drive the app and read flows with ios_traffic_flows') and explains the default-vs-fallback install path. It does not explicitly contrast with ios_pcap_start or say when packet capture is preferable to TLS decryption, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_traffic_statusiOS traffic statusARead-onlyIdempotentInspect
Report whether TLS inspection is running for a device and how many flows are buffered.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered; the description adds real value by disclosing the two returned data points (running state and buffered flow count). It stops short of describing error conditions or how the flow count is scoped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that delivers the purpose and the returned information with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only status tool with full schema coverage and complete safety annotations, the description is nearly sufficient; it even compensates for the absent output schema by naming what is reported. Minor gaps remain around failure/not-running behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) with 100% schema description coverage, so the schema already documents it fully. The phrase 'for a device' loosely implies the udid but adds no format or validity detail beyond the schema, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Report') and a precise resource (TLS inspection running state plus buffered flow count) for a device. This clearly separates it from ios_traffic_flows (which lists flows) and ios_traffic_start/stop, though it does not name 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the read-side counterpart to ios_traffic_start/stop, but the description never states when to call it (e.g. before starting inspection, or to poll progress) or what happens if inspection is not running.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_traffic_stopiOS traffic stopAInspect
Stop TLS inspection for a device from THIS (AI) consumer only. If the workspace UI (or another agent) also has capture open on the same device, the TLS-inspecting proxy and CA/proxy profile are left running for them — the response includes stillRunning: true in that case. Only when every consumer has stopped are the profile removed, the proxy killed, and buffered flows discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety hints; the description goes well beyond them by disclosing the ref-counted shutdown model, the stillRunning: true response field (especially valuable with no output schema), and exactly what cleanup entails (profile removed, proxy killed, buffered flows discarded). The 'buffered flows discarded' detail sits in mild tension with destructiveHint=false, but this is the tool's own transient capture buffer, not user resource destruction, so it is not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no filler: scope first, concurrent-consumer behavior second, full-teardown condition third. Each sentence adds a distinct operational fact; nothing is restated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool, it covers everything an agent needs: what is stopped, what remains running for other consumers, the stillRunning response signal, and when full teardown occurs. No meaningful gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single udid parameter at 100% schema description coverage, so the schema already carries its meaning. The description adds no format or syntax detail for udid beyond the schema, and the 'consumer only' semantics describe the caller rather than the parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Stop TLS inspection for a device') and immediately scopes it to 'THIS (AI) consumer only', which distinguishes it from capture-management siblings like ios_traffic_start and ios_traffic_status 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for the tool's effect: call it to release this consumer's capture, and note that other consumers (workspace UI or another agent) keep the proxy/profile alive. It does not explicitly name a sibling alternative to use instead, but the when-to-use context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_appsiOS TV appsARead-onlyIdempotentInspect
List the apps installed on an Apple TV as its remote sees them (bundle id and display name). ios_list_apps reports more about the same TV — versions and sizes — so prefer that unless you specifically want what the remote can address. To bring an app to the foreground use ios_launch_app: the remote protocol has a launch call of its own that reports success and silently does nothing on tvOS 27.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Apple TV UDID or name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real context beyond that: the remote's view of apps (bundle id and display name) and the non-obvious tvOS 27 failure mode where the remote's own launch call reports success but silently does nothing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each load-bearing and front-loaded: what it lists, the preferred alternative, and the launch caveat. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming what is returned (bundle id and display name). Combined with clear alternative routing and the tvOS 27 caveat, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) and schema description coverage is 100%, so the schema already documents it as 'Apple TV UDID or name'. The description adds nothing about the parameter, so baseline 3 applies; the parenthetical about bundle id/display name describes return values, not the input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the apps installed on an Apple TV') and immediately distinguishes itself from the sibling ios_list_apps, clarifying it returns what the remote can address rather than the fuller host-side view. An agent can pick between the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names two alternatives with their selection conditions: use ios_list_apps unless you want what the remote can address, and use ios_launch_app to foreground an app. Both when-to-use and when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_buttoniOS TV buttonAInspect
Press a button on an Apple TV remote: the d-pad (up/down/left/right), select (the centre click), menu (back), home, or a playback/volume key. action makes it a double tap or a held press. TWO THINGS THAT SURPRISE CALLERS, both measured on tvOS 27: menu pops a navigation stack, so it does NOT leave an app that was launched programmatically — home does. And a press lands on whatever currently has focus, which nothing reports back, so take a screenshot before pressing select: pressing blind on the TV home screen can reach the top shelf, whose rows include purchase flows.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Apple TV UDID or name | |
| wake | No | Wake the TV first if it is asleep (default: true). Waking navigates to the home screen. | |
| action | No | How to press it (default: singletap) | |
| button | Yes | Which remote button to press |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply the generic safety profile (readOnly=false, idempotent=false, destructive=false, openWorld=false); the description adds the non-obvious behavior that matters: focus is invisible so blind presses can land anywhere, the top shelf contains purchase flows, and menu/home differ in navigation-stack semantics on tvOS 27. That is exactly the kind of side-effect disclosure annotations cannot express, and nothing here contradicts them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the button list, then the two high-value surprises; every sentence carries information an agent needs. The all-caps 'TWO THINGS THAT SURPRISE CALLERS' framing and the slightly essayistic final clause cost it a point, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 parameters at full schema coverage and no output schema, the description need not document returns, and it does cover the surprising side effects, the wake-to-home behavior, and a safe-press workflow. It omits failure modes (unreachable/asleep TV with wake=false, pairing requirements implied by ios_tv_pair_begin) and any hint of what a call reports back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns an extra point by attaching semantics to specific enum values: it explains that action turns a press into a double tap or hold, and that the `menu` value pops a navigation stack while `home` exits the app. These are behavioral meanings of the parameter values, not restatements of the enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Press a button on an Apple TV remote') and enumerates the full button surface (d-pad, select, menu, home, playback/volume), so the agent knows exactly what scope this covers. It does not, however, resolve overlap with siblings like ios_tv_volume (whose keys also appear here as volume_up/volume_down) or tvos_select, so the boundary against alternatives 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real operational guidance: 'take a screenshot before pressing select' because focus is unreported, and explains that menu does not exit a programmatically launched app while home does — a concrete when-to-use-which rule. It stops short of naming sibling alternatives (ios_tv_swipe, tvos_select, ios_tv_volume) or stating prerequisites such as a paired/sessioned device.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_listiOS TV listARead-onlyIdempotentInspect
List the Apple TVs reachable from this host, with the name and identifier to address each one by and whether it is already paired. Start here when a remote call reports that a TV could not be found: a TV has to be awake and on this network for its remote to answer, even when the device itself is otherwise reachable. Unpaired TVs need ios_tv_pair_begin first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, and non-open-world behavior. The description adds meaningful context beyond that: the TV must be awake and on the same network for its remote to answer, and unpaired TVs require ios_tv_pair_begin first. This explains failure modes and prerequisites that annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: the first states the action and return fields, the second gives the troubleshooting trigger and network condition, the third gives the pairing prerequisite. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter discovery tool with no output schema, the description covers what is returned, when to call it, and the pairing prerequisite. Annotations cover the safety profile, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and schema coverage is 100%, so the baseline is 4. The description does not need to explain parameters, though it helpfully describes the return fields (name, identifier, paired status) since no output schema exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb (List) and resource (Apple TVs reachable from this host), and states the returned fields (name, identifier, paired status). It distinguishes this discovery tool from the remote-control siblings that act on an already-addressed TV.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to start here when a remote call reports a TV cannot be found, explains the awake/on-network condition, and names ios_tv_pair_begin as the required next step for unpaired TVs. This covers when to use it and what alternative/prerequisite applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_pair_beginiOS TV pair beginAInspect
Start pairing with an Apple TV. This puts a 4-digit PIN on the TV's own screen; read it off the screen and pass it to ios_tv_pair_finish to complete the handshake. Pairing is required before any other remote call works, and it persists across restarts, so it is a one-time step per TV.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Apple TV UDID, name, or an identifier from ios_tv_list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation/idempotency profile (readOnlyHint=false, idempotentHint=false). The description adds real behavioral context beyond them: a 4-digit PIN appears on the TV's own screen, the call is a prerequisite for all other remote calls, and pairing persists across restarts. It stops short of describing failure modes (timeout, PIN rejection, re-pairing an already-paired TV).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct load: what it does, the PIN handoff, and the prerequisite/persistence constraint. The action and its sequencing constraint are front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter stateful handshake step with no output schema, the description covers everything an agent needs: the trigger, the out-of-band PIN it must read, the tool that consumes that PIN, and the fact that pairing is a persistent prerequisite. No return-value explanation is needed since the meaningful output appears on the TV screen.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter's accepted forms (UDID, name, or identifier from ios_tv_list) are documented in the schema itself. The description adds no further parameter semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Start pairing with an Apple TV') and immediately distinguishes itself from the sibling that completes the operation, ios_tv_pair_finish. An agent can tell this apart from ios_tv_button, ios_tv_status, etc. 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the precondition ('Pairing is required before any other remote call works') and the follow-up tool with its required input ('read it off the screen and pass it to ios_tv_pair_finish'). It also tells the agent this is a one-time step per TV, which directly informs when NOT to call it again.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_pair_finishiOS TV pair finishAInspect
Finish pairing with an Apple TV using the PIN shown on its screen by ios_tv_pair_begin. Pass the SAME identifier that call was given. On success the credentials are stored and every other remote tool starts working for that TV.
| Name | Required | Description | Default |
|---|---|---|---|
| pin | Yes | The 4-digit PIN displayed on the TV | |
| udid | Yes | The same identifier passed to ios_tv_pair_begin |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-idempotent, non-destructive write with openWorldHint=false. The description adds real value beyond them: it discloses the side effect (credentials stored) and the downstream consequence (every other remote tool starts working for that TV). It does not cover failure behavior, which is the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying distinct information (action, identifier constraint, success effect), front-loaded with the action and with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema tool, the description covers the prerequisite, the required input linkage, and the success outcome. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description nonetheless adds a semantic constraint the schema does not encode: the udid must be the same identifier passed to ios_tv_pair_begin, which is a cross-call relationship rather than a field definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Finish pairing with an Apple TV') and explicitly ties itself to the sibling ios_tv_pair_begin, so an agent can distinguish it from the begin step and from the other ios_tv_* remote tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly establishes the prerequisite sequence (PIN comes from ios_tv_pair_begin) and the calling constraint ('pass the SAME identifier that call was given'). It does not state what to do on failure or whether it can be retried, but the when-to-use context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_poweriOS TV powerAInspect
Wake an Apple TV or put it to sleep. "off" is sleep, not a power cut. The reported power state is read back after the call, because the box can already report itself off while its panel is still showing the screensaver.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Apple TV UDID or name | |
| state | Yes | on = wake, off = sleep |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: 'off' is a sleep state, not a power cut, and the power state is read back after the call because the box can report itself off while still showing a screensaver. This is exactly the kind of latency/state-lag disclosure annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the semantic clarification, then the readback caveat. Each sentence earns its place, though the final clause is slightly wordy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately explains the readback behavior after the call, giving the agent enough to interpret results. For a two-parameter enum tool, this is nearly complete; only pairing/device prerequisites are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents both parameters including 'off = sleep'. The description reinforces the 'off' semantics and adds the 'not a power cut' nuance, but does not go materially beyond the schema's own parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Wake an Apple TV or put it to sleep') with unambiguous scope, clearly distinguishing it from siblings like ios_tv_button, ios_tv_status, and ios_tv_swipe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clarifies the meaning of the 'off' state but never states when to prefer this tool over alternatives or any preconditions (e.g. paired device required). Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_statusiOS TV statusARead-onlyIdempotentInspect
Report an Apple TV: whether it is paired, whether it is awake, the foreground app, and what is playing. Cheap, and the right first call — nothing else here works on an unpaired TV. The features block is what the DEVICE claims it supports and is reported as-is including when it is wrong, so treat it as a hint that saves a round trip, not a promise. power_state is whether the BOX is awake and says nothing about whether a display is attached — those come apart, so a screenshot can fail on a TV this reports as On.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Apple TV UDID or name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/idempotent/non-destructive, so the description correctly spends its budget on subtler behaviour: the `features` block is the device's claim reported as-is, possibly wrong, and `power_state` describes the box, not display attachment. The explicit warning that a screenshot can fail on a TV reported as On is exactly the kind of non-obvious detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the summary of what is reported, then ranks the two gotchas (untrustworthy `features`, `power_state` vs display). Every clause carries information; there is no boilerplate or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must name the returned fields — it does (paired, awake, foreground app, playing, features, power_state) and flags the failure modes of each. For a single-parameter read tool this is fully sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter and 100% schema description coverage ('Apple TV UDID or name'), the schema already carries the semantics, so a 3 baseline is appropriate. The description adds no further guidance on resolving the udid/name argument.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Report an Apple TV') and enumerates exactly what is reported: pairing state, awake state, foreground app, and current playback. This cleanly separates it from the many neighbouring ios_tv_* tools (ios_tv_power, ios_tv_apps, ios_tv_button) that act on a TV rather than report on it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Cheap, and the right first call — nothing else here works on an unpaired TV' tells the agent when to reach for this tool first and why it is a prerequisite for the sibling ios_tv_* calls. It stops short of naming a specific alternative to use instead, so the when-not side is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_swipeiOS TV swipeAInspect
Swipe across the Apple TV remote's TOUCHPAD to move focus. Coordinates are the touchpad's own 0-1000 space — they are NOT screen pixels, and there is no coordinate tapping on a TV to scale them to. Verified on both axes: a left-to-right swipe moves focus exactly as the right button does, so prefer ios_tv_button for single steps and use this for longer runs.
| Name | Required | Description | Default |
|---|---|---|---|
| endX | Yes | End X on the touchpad (0-1000) | |
| endY | Yes | End Y on the touchpad (0-1000) | |
| udid | Yes | Apple TV UDID or name | |
| wake | No | Wake the TV first if it is asleep (default: true) | |
| startX | Yes | Start X on the touchpad (0-1000) | |
| startY | Yes | Start Y on the touchpad (0-1000) | |
| durationMs | No | Swipe duration in ms (default 300) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it as a non-read-only, non-destructive, non-idempotent input action, and the description adds genuinely non-obvious context: the coordinates are the touchpad's own 0-1000 space, not screen pixels, with no tap-to-coordinate mapping available. It stops short of describing failure modes or how durationMs affects gesture behavior, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and effect, then coordinate semantics, then routing advice. The em-dash aside about 'no coordinate tapping on a TV' is slightly awkward but carries disambiguating value, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with full schema coverage and no output schema, the description covers purpose, coordinate interpretation, and alternative-tool routing. It omits anything about durationMs behavior or failure handling, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema's bare 'Start X on the touchpad (0-1000)' by clarifying the coordinate space and explicitly warning it is not screen pixels. That disambiguation is exactly the semantic gap the schema leaves open.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (swipe), a specific surface (the Apple TV remote's touchpad), and the effect (move focus). It also distinguishes itself from the sibling ios_tv_button by naming it, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit rule: prefer ios_tv_button for single steps, use this tool for longer runs. The alternative is named and the condition selecting each is spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_textiOS TV textAInspect
Read or write the text field an Apple TV currently has FOCUSED — the on-screen keyboard's buffer, so a field has to actually be focused on the TV first (navigate to it with ios_tv_button). The reply separates two states that look alike: text: "" with focused: true is a focused empty field, while text: null with focused: false means the write went nowhere. A null buffer is usually a DISPLAY problem rather than a keyboard one — a focused field stops existing when the TV has no display attached. Deliberately does not wake the TV, because waking navigates to the home screen and away from the field being typed into.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | get = read the buffer, set = replace it, append = add to it, clear = empty it | |
| text | No | The text, for set and append | |
| udid | Yes | Apple TV UDID or name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse (readOnlyHint false, no destructive specifics), so the description carries heavy burden and delivers: it distinguishes focused-empty (text:"" focused:true) from failed-write (text:null focused:false), explains null is typically a display-attachment problem, and discloses that it won't wake the TV to avoid losing focus. This is exactly the behavioral context the annotations don't provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each earning its place: purpose, the focused-field prerequisite, the null/empty distinction, and the no-wake rationale. Front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covered thoroughly for a 3-param tool with no output schema. Return-shape ambiguity (text vs focused) is the main source of agent error and it's addressed explicitly; the no-wake behavior and display caveat complete the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the schema already documents op (get/set/append/clear), text, and udid. The description adds no parameter-level detail beyond what the schema provides. Baseline 3 per the coverage rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read or write) on a specific resource (the focused text field / on-screen keyboard buffer on an Apple TV). It distinguishes itself from siblings by naming ios_tv_button as the navigation prerequisite, and from device_type/ios_send_keys which operate on iOS devices generally.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the precondition: a field must actually be focused, and directs the agent to ios_tv_button to get there. It also explains it deliberately doesn't wake the TV. It stops short of explicitly routing between get/set/append/clear alternatives, though the schema enum descriptions cover those.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_tv_volumeiOS TV volumeAInspect
Change an Apple TV's volume. Use up and down — they are the remote's volume keys and are the ones that work. get and set address an absolute level that a TV connected over HDMI does not have: audio leaves over HDMI, so the television or receiver owns the volume. Measured on tvOS 27, the box accepts the up/down keys while reporting the absolute controls as unavailable, so get returning 0 and set failing are expected there rather than a fault. Do not build a level slider on get. Does not wake the TV: the key goes to whatever owns the volume, and that television can be on while the box sleeps.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | up/down press the volume keys; get/set need an absolute level | |
| udid | Yes | Apple TV UDID or name | |
| level | No | Target level 0-100, for set |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false and destructiveHint=false; the description goes well beyond by disclosing that get returning 0 and set failing are expected on tvOS 27 rather than faults, and that the call does not wake the TV because the key goes to whatever owns the volume. This is exactly the non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the recommended ops are front-loaded in the first two clauses, and each later sentence carries non-obvious diagnostic value. It is dense rather than padded, though the tvOS-27 measurement sentence is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and full param coverage, the description covers everything needed: which ops work, why the others may report failure, and the power/wake side effect. No material gap remains for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real meaning: it explains why `get`/`set` are unreliable, what the ops map to (remote keys vs absolute level), and how `level` is interpreted contextually. The enum semantics are enriched beyond the schema's one-line summaries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource ('Change an Apple TV's volume'), and the surrounding siblings (ios_tv_button, ios_tv_power, ios_tv_swipe) make the volume scope unambiguous. An agent can distinguish this tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly directs the agent to `up`/`down` as 'the ones that work', explains that `get`/`set` target an absolute level a HDMI-connected TV does not own, and warns against building a level slider on `get`. That is concrete when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_two_finger_swipeiOS two finger swipeAInspect
Two-finger swipe from (x1,y1) to (x2,y2) on an iOS device — a two-finger scroll/pan. Both fingers travel the vector in parallel, offset perpendicular to it so one never runs through the other. Use where a one-finger swipe does the wrong thing: tilting a map into 3D, scrolling inside a web view that pans with one finger, or dismissing a two-finger-aware sheet. Coordinates are screen points. Works without an automation session when the direct input path is available; falls back to one otherwise (see input).
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start X (screen points) | |
| x2 | Yes | End X (screen points) | |
| y1 | Yes | Start Y (screen points) | |
| y2 | Yes | End Y (screen points) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| durationMs | No | Gesture duration in ms (default: 400) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (not read-only, not destructive), but the description adds meaningful behavior: exact gesture mechanics, screen-point coordinates, and the session/no-session execution model including fallback to an automation session and what happens on direct-input-only devices. That is substantial context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and coordinate semantics, then usage scenarios, then the execution-path caveat. Every sentence carries distinct information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description fully covers gesture mechanics, coordinate units, when to choose it, and the input-path/fallback behavior for this complex gesture tool. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters, and the description adds only marginal meaning (screen points, the `input` fallback referenced by name). Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (two-finger swipe on an iOS device) and defines the motion precisely (a two-finger scroll/pan with fingers offset perpendicular to the vector). An agent can distinguish it from ios_swipe and ios_two_finger_tap 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it ('where a one-finger swipe does the wrong thing') and enumerates three concrete scenarios: tilting a map into 3D, scrolling a web view that pans with one finger, dismissing a two-finger-aware sheet. This is explicit when-to-use guidance against the one-finger alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_two_finger_tapiOS two finger tapAInspect
Two-finger tap at (x,y) on an iOS device — zooms OUT one step in Maps, acts as a secondary click in web views, and is the accessibility gesture in several Apple apps. Both fingers land either side of the point and lift without moving. holdMs turns it into a two-finger press-and-hold. Coordinates are screen points. Works without an automation session when the direct input path is available; falls back to one otherwise (see input).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Tap centre X (screen points) | |
| y | Yes | Tap centre Y (screen points) | |
| norm | No | If true, x/y (and path points) are 0..1 FRACTIONS of the screen — pass `pixelInScreenshot ÷ screenshotSize` directly (scale-free, matches the frontend, avoids point-guessing). Default false = iOS screen points. | |
| udid | Yes | iOS device UDID | |
| input | No | Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked. | |
| holdMs | No | Hold both fingers down this long before lifting (default: 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), which the description does not contradict. Beyond that the description discloses real behavior: both fingers land either side of the point and lift without moving, the direct input path works without a session and falls back otherwise, and an unusable direct path on a direct-input-only device is reported as an error rather than silently switching. It does not describe failure modes such as off-screen coordinates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five dense sentences, front-loaded with what the gesture does before moving to mechanics, variants and input-path behavior. Every sentence carries information, though the input-path sentence is long and could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a gesture tool with no output schema and full schema coverage, the description covers purpose, mechanics, variant behavior and input-path fallback, and notes that the response reports which path ran. Nothing critical is missing, though it could note coordinate bounds or failure behavior for invalid points.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description nonetheless adds meaning beyond the schema: it clarifies that coordinates are screen points, that holdMs converts the tap into a two-finger press-and-hold, and it explains the runtime consequences of the `input` enum values and the auto-fallback order.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource (two-finger tap at x,y on an iOS device) and immediately disambiguates it from generic taps by naming its semantic effects: zoom out in Maps, secondary click in web views, accessibility gesture in Apple apps. It also distinguishes the holdMs variant, so an agent can tell it apart from ios_tap and ios_two_finger_swipe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this gesture applies and when to use holdMs instead, plus the condition under which the direct input path vs the automation session is used. It stops short of explicitly routing to siblings (e.g., 'use ios_tap for a single-finger tap'), so it is strong but not a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_uninstall_appiOS uninstall appADestructiveIdempotentInspect
Uninstall an app from an iOS device by bundle ID. No automation session required.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| bundleId | Yes | App bundle ID to uninstall |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered by structured data. The description adds one genuinely useful behavioral fact not in the annotations ('No automation session required'), but says nothing about whether app data/containers are removed, error behavior when the app is absent, or whether the device must be unlocked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the action and target front-loaded and the operational caveat placed second. Nothing here needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema tool whose annotations carry the destructive/idempotent profile, the description covers what the agent needs to call it correctly, including the session-free calling condition. It stops short of explaining post-uninstall state or failure modes, but those gaps are minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only two parameters, both documented in the schema, so the baseline is 3. The description's 'by bundle ID' merely restates the bundleId schema description and adds no format or syntax detail (e.g., reverse-DNS form, case sensitivity).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Uninstall an app from an iOS device') and narrows the target to a bundle ID, which is enough to separate it from generic device tools. It does not, however, explicitly differentiate from close siblings like ios_kill_app, ios_terminate_app, or device_uninstall_app, so the agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'No automation session required' is real usage context: it tells the agent this can be called without an active session, which matters in a toolset where most ios_* tools need one. Beyond that there is no guidance on when to prefer this over ios_kill_app/ios_terminate_app or what prerequisites (device connected, app installed) apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_unlockiOS unlockAInspect
Wake the device with the keyboard Home key: it lights a dark display and clears a passcode-free Lock Screen without closing whatever app was open, so it is safe to call at ANY time — even on an already-awake device, since it never navigates away from the foreground. Needs NO automation session, because the automation runner itself cannot launch while the Lock Screen is frontmost. If that wake could not be sent at all (older iOS, or no active input channel), an alternate wake-and-swipe is used instead; dismissLockScreen additionally forces that alternate swipe for a caller who can see the Lock Screen is still showing (DANGER: this swipe goes to the Home screen on an already-unlocked device). The reply reports only what it can observe (display dark or lit); it cannot confirm whether a Lock Screen is still showing. A passcode is never bypassed.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| dismissLockScreen | No | Force an additional wake-and-swipe dismiss even when the keyboard wake was sent — set when you can see the Lock Screen is still showing. On an already-unlocked device this swipe goes to the Home screen. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag it as non-read-only/non-destructive/non-idempotent; the description goes far beyond them, disclosing that it never closes the foreground app, that it works with no automation session, the internal fallback path, the DANGER of dismissLockScreen navigating to Home on an unlocked device, and that it never bypasses a passcode. This is exactly the behavioral context an agent needs for a mutation-adjacent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose (wake/safe-anytime) before the fallback and DANGER detail, and each clause adds distinct information. It is dense and long but not padded, which is justified by the tool's branching behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating the reply's limits (reports only dark/lit display, cannot confirm Lock Screen state). Combined with the safety and fallback disclosure, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents udid and dismissLockScreen, but the description adds real meaning: it explains the purpose of dismissLockScreen, when to set it, and the DANGER of its side effect. That exceeds the baseline-3 credit for a fully covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (wake the device / clear a passcode-free Lock Screen) and names the exact mechanism (keyboard Home key) and its scope. An agent can distinguish this from ios_lock_status, ios_press_button, or ios_key_hid 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions: safe to call at ANY time, even on an already-awake device, and explains that it needs NO automation session. It also tells the caller when to set dismissLockScreen (when you can see the Lock Screen is still showing). It stops short of naming sibling tools as alternatives, so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_upload_targetsiOS upload targetsARead-onlyIdempotentInspect
Find where to push a file so a FILE PICKER on the device can select it — for driving an upload in Safari or in an app under test. Call this before ios_file_push when the file is meant to be chosen by a picker, because writing a file and a picker seeing it are not the same thing: the shared media directory is writable but NO picker reads it (a JPEG pushed to /DCIM does not enter the Photos library, verified on iOS 26.6 even across a reboot, and the media Downloads folder is not the Files app's Downloads). Returns app containers with pickable_from: ["files_app"] means that app declares UIFileSharingEnabled, so its Documents/ is listed under "On My iPad" in the Files app — which is what Safari's "Choose File" browses. An empty pickable_from means the push still works and the app itself can read the file, but no picker will show it. Pickable targets sort first; push to targets[0].push_path. If nothing is pickable, advice says what to change.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent, read-only, non-open-world operation, and the description still adds substantial behavioral context beyond them: the concrete failure mode (a JPEG pushed to /DCIM never enters Photos, verified on iOS 26.6 across reboot; the media Downloads folder is not the Files app's Downloads), the meaning of an empty `pickable_from`, and the guarantee that the push still works even when nothing is pickable. This is exactly the extra context the lower annotation bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The actionable instruction (call before ios_file_push, push to targets[0].push_path) is front-loaded and the rest is dense justification. It is longer than typical descriptions, and the parentheticals about iOS 26.6 verification could be trimmed, but nearly every sentence carries information an agent would misuse the tool without.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still documents the return shape (`pickable_from` values, `targets[0].push_path`, `advice`), the sort order (pickable first), and the interpretation of each `pickable_from` state. Given a single required parameter and no structured output contract, nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (`udid`) and schema description coverage is 100%, so the schema already documents it and the description adds no syntax or format detail. Per the high-coverage rule this sits at the baseline even though the description provides rich semantics for the returned structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (find where to push a file so a picker can select it) and immediately qualifies the scope to picker-driven uploads in Safari or an app under test. The distinction from the sibling ios_file_push is made explicit and the description makes clear this is a discovery step, not the push itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this before ios_file_push when the file is meant to be chosen by a picker' and supplies the negative case (writing a file and a picker seeing it are not the same thing, so ordinary pushes do not need this). It also explains what to do when no target is pickable via the `advice` field, so the agent has a full when/when-not/next-step path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_video_streamiOS video streamAInspect
Get a LIVE video-stream link for an iOS device that a human can open in a browser to watch the screen in real time (unlike ios_screenshot, which is one frame). Returns a short-lived, single-device viewer URL — open it directly; no login or session required for ~5 minutes. Use this to let a person supervise what the agent is doing on the device.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is non-read-only, non-destructive, non-idempotent, and not open-world. The description adds valuable behavioral context beyond that: the URL is short-lived (~5 minutes), single-device, and requires no login or session for the viewer. It does not explain what the non-read-only side effect is, which is a minor 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and output, followed by the key contrast and usage condition. Every sentence carries distinct information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single required parameter and no output schema, the description fully covers what the tool returns (a viewer URL), how to use it (open directly, no login/session), and its lifetime. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter, 'udid', already documented as 'iOS device UDID.' The description adds no extra syntax or format details beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get a LIVE video-stream link for an iOS device.' It explicitly distinguishes this tool from ios_screenshot ('unlike ios_screenshot, which is one frame') and makes the iOS scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use condition: 'Use this to let a person supervise what the agent is doing on the device.' It also names the alternative use case via the ios_screenshot contrast, so an agent can choose correctly between live viewing and a single frame.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_vnc_close_hidiOS vnc close HIDAIdempotentInspect
Release this server's hold on the device's live view (opened by ios_vnc_open_hid). Viewers still connected keep watching -- the view only ends once nobody is connected. Safe to call when nothing is open.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, but the description goes further by explaining what 'close' actually means: connected viewers keep watching and the view only ends when nobody is connected. That is real behavioral context beyond the structured hints, plus an explicit safety statement for the idle case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and the sibling reference, followed by the two facts an agent needs (partial-close semantics, idle safety). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema close tool, the description covers the action, the linking opener tool, the nuanced effect on connected viewers, and safe invocation when nothing is open. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) with 100% schema description coverage, so the schema already carries the semantics. The description adds nothing about the parameter, which is acceptable at this coverage level but earns no bonus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Release this server's hold on the device's live view') and explicitly ties it to the sibling that creates that state (ios_vnc_open_hid). An agent can distinguish it from ios_release_hid, ios_vnc_open_hid, and other release tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the condition under which the tool applies (a live view opened by ios_vnc_open_hid) and adds a safety note for the no-op case. It doesn't enumerate when-not-to-use beyond that, but the parenthetical opener reference gives clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_vnc_open_hidiOS vnc open HIDAInspect
Open a live, interactive view of an iOS device for the USER -- they see the screen and can tap, swipe and type on it. Returns JSON {viewerUrl, viewerExpiresInSeconds, websocketUrl, width, height, expiresInSeconds, localVncUrl}. GIVE THE USER viewerUrl (or open it in the IDE's built-in browser): a ready page that shows the device scaled to fit, never larger than its real screen, and takes their input. Like the live-view links, it self-authenticates for ~5 minutes from now (once opened, the page keeps working for 30 minutes and reconnects after a drop) and only for the user currently holding this device -- share with care. websocketUrl is the raw RFB-over-WebSocket stream (noVNC-compatible, subprotocol "binary") with its own short-lived ticket, for a client that brings its own viewer; localVncUrl (vnc://…) only opens on the device host itself, and is omitted when the device is attached to another host (the other URLs still work: this server forwards them). width/height are the screen in points; they swap when the device rotates. The view stays open while anyone is connected; call ios_vnc_close_hid when you no longer need it held. To LOOK at the screen yourself, use ios_vnc_snapshot_hid instead.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly=false, idempotent=false, destructive=false); the description adds substantial behavior the annotations cannot: the self-authenticating ~5-minute link window, 30-minute page lifetime with reconnect after a drop, per-user audience restriction ('share with care'), the view staying open while anyone is connected, and localVncUrl being omitted when the device is attached to another host.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary action and the key instruction ('GIVE THE USER viewerUrl') before the return-shape and lifetime details. It is dense and the authentication window is stated twice in slightly different forms, but nearly every sentence carries distinct, decision-relevant information about the three URLs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain return values and does so field by field (viewerUrl, websocketUrl, localVncUrl, width/height, expiry fields), plus rotation behavior and lifecycle. Nothing needed to call and manage this session-opening tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (udid) at 100% schema description coverage, so the schema already documents it fully. The description adds no parameter-level detail beyond what the schema provides, which is the baseline-3 case for a well-covered single-param tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open a live, interactive view of an iOS device for the USER') with the human-facing intent spelled out. It explicitly distinguishes itself from siblings by naming ios_vnc_snapshot_hid for agent-side viewing and ios_vnc_close_hid for release, so an agent can pick correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'To LOOK at the screen yourself, use ios_vnc_snapshot_hid instead' and 'call ios_vnc_close_hid when you no longer need it held.' It also states who the view is for (the user currently holding this device) and the condition for using the raw websocketUrl (a client bringing its own viewer).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_vnc_snapshot_hidiOS vnc snapshot HIDARead-onlyIdempotentInspect
See the iOS device's screen yourself: returns the current screen as an image (plus {width, height} in points). It is the exact picture VNC viewers are being sent, read from memory -- cheap enough to call after every action. Does not need ios_vnc_open_hid first.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real context beyond them: the image is read from memory, it is exactly what VNC viewers receive, and it is cheap enough for frequent polling. It does not discuss latency, size, or failure modes, but the added cost/source detail is genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool returns, followed by cost/source context and the prerequisite note. No filler; each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only snapshot tool with full annotation coverage, the description supplies the return shape, the source of the image, the cost profile, and the prerequisite clarification. Nothing needed to invoke it correctly is missing, and no output schema is required for an image-returning tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single udid parameter, so the schema already documents it fully. The description adds no syntax, format, or meaning beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('returns the current screen as an image') plus the return shape ({width, height} in points). It names one sibling (ios_vnc_open_hid) to clarify prerequisites, but does not distinguish itself from the many other screenshot siblings (ios_screenshot, ios_fast_screenshot, ios_mjpeg_screenshot, device_screenshot), which is the main clarity gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Cheap enough to call after every action' gives a concrete usage cadence, and 'Does not need ios_vnc_open_hid first' removes a prerequisite the agent might otherwise assume. It offers no explicit when-not or alternative-selection guidance against the other screenshot tools, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_voiceoveriOS VoiceOverAInspect
Drive iOS VoiceOver on a real device and read where its cursor lands. Actions: 'status' (is it on), 'start' / 'stop' (turn VoiceOver on or off — a few seconds each; 'enable' / 'disable' are accepted as the same, matching android_talkback), 'next' / 'previous' (move to the next or previous element), 'activate' (VoiceOver's double tap on the current element), 'back', 'home', 'rotor' (change the rotor setting — Headings, Links, Words…; pass direction), 'rotor_item' (previous / next item of the current rotor setting; pass direction), 'read_all' (read from the top for duration seconds, then pause). Each move returns text — the accessibility label of the element VoiceOver settled on, plus its focus (label, frame in points, app). The exact spoken sentence (roles, hints) is redacted by iOS; the label is what is available — an element VoiceOver reports without a label (some search fields) shows as "(no label)" even if its page-source entry has a label or placeholder, so check ios_page_source before calling it unlabelled. text is null when VoiceOver did not report a new position (end of the screen, or an activate — an activate usually works but the new position is not reported until the next move, and its note says so); right after start there is no cursor yet, so a first move that lands nowhere is retried once and then carries a note — move once more. read_all reads at speaking pace, a few seconds per item, so its list holds only what was reached in duration seconds (the reply echoes the duration used); the list can miss the first item, so use next / previous for a complete transcript; its final position is the last item listed. If a move reports no position and VoiceOver has switched itself off (a system prompt it cannot reach may be showing), the reply says enabled: false. On a device seeing VoiceOver for the first time, iOS shows a one-time "VoiceOver changes the gestures" sheet that holds the cursor until someone answers Use VoiceOver. While VoiceOver is on, taps and swipes behave differently (one tap selects, a double tap activates), so stop it when done. The device is kept silent automatically while VoiceOver is on, unless someone is watching it in a browser, who hears it instead.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID | |
| action | Yes | What to do. 'status' changes nothing. | |
| duration | No | For 'read_all' only: seconds to read for. Default 30. | |
| direction | No | For 'rotor' and 'rotor_item' only. Default 'next'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (which only state readOnly=false, destructive=false, idempotent=false): it discloses the one-time 'VoiceOver changes the gestures' sheet blocking the cursor, null `text` on end-of-screen or activate, retry-then-note behavior after start, silent-device behavior, and enabled:false when a system prompt intervenes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action inventory, then caveats, so an agent gets the essentials first. It is dense and long, but nearly every sentence carries operational detail; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-action tool with no output schema, it fully describes return shape (`text`, `focus` with label/frame/app, notes), failure modes, and prerequisite state. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema documents udid/action/duration/direction. The description adds real semantic value over baseline by explaining each action's effect, that 'status' changes nothing, that duration governs read_all pacing, and that direction applies to rotor/rotor_item.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Drive iOS VoiceOver on a real device and read where its cursor lands') and enumerates every action with its meaning. It explicitly distinguishes itself from siblings by noting 'enable'/'disable' mirror android_talkback and by routing unlabelled-element checks to ios_page_source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: use next/previous for a complete transcript instead of read_all, check ios_page_source before calling an element unlabelled, move once more after a start retry, and stop VoiceOver when done because taps/swipes behave differently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_voiceover_previewiOS VoiceOver previewARead-onlyIdempotentInspect
Approximate what VoiceOver would announce for each element on the CURRENT screen, and flag announcements a blind user could not act on — unlabelled controls that speak only as "button", labels that read as code identifiers, tappable elements with no Button/Link trait, controls VoiceOver cannot reach at all, and duplicate labels that cannot be told apart by ear. IMPORTANT: this is a RECONSTRUCTION from element attributes, not a transcript. Real VoiceOver speech can only be read from the device on iOS 27+; below that the system cannot be asked what it would say. The accessibility HINT is never included (Apple does not expose it to the audit engine at all), role words are the English defaults, and reading ORDER is document order, which is not VoiceOver's geometric order. Treat the wording as indicative and the flagged issues as real. Complements ios_accessibility_audit, which reports Apple's own findings. Requires an active iOS automation session (auto-starts if needed).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID | |
| element | No | Narrow to one element by accessibility label, resolved the same way ios_tap_by_label resolves it. | |
| onlyIssues | No | Return only elements with a flagged problem, skipping ones that announce fine. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe read-only, idempotent, closed-world operation, and the description adds unusually rich behavioral context beyond that: it is a reconstruction not a transcript, the accessibility hint is never included, role words are English defaults, reading order is document order not VoiceOver's geometric order, and true speech is only readable on iOS 27+. This is exactly the kind of caveat an agent needs to trust and interpret the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the flagged-defect list are front-loaded, followed by caveats; the structure is logical and every sentence carries real information. It is dense and long, but the length is justified by the number of genuine caveats rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, no-output-schema analysis tool, the description covers purpose, defect taxonomy, output interpretation limits, session prerequisites, and sibling relationship. An agent has everything needed to call it correctly and interpret the result without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (udid, element, onlyIssues) are already documented in the schema. The description reinforces scoping ("each element on the CURRENT screen") but adds no syntax or resolution detail beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — approximating VoiceOver announcements for each element on the current screen — and enumerates the exact defect classes it flags. It explicitly distinguishes itself from the sibling ios_accessibility_audit ("which reports Apple's own findings"), so an agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it operates on the CURRENT screen, complements rather than duplicates ios_accessibility_audit, and auto-starts an automation session if needed. It stops short of an explicit when-not-to-use rule (e.g., use ios_accessibility_audit alone when you want Apple's verdict), but the differentiation is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_wait_for_elementiOS wait for elementARead-onlyIdempotentInspect
Wait until an element appears on screen, polling the accessibility tree. Counterpart of device_wait_for_element. Matches a case-insensitive SUBSTRING against label, name, value and placeholder. Returns { found, waitedMs, element? }. found=false is a normal answer, not an error — it means the element did not appear within the timeout, which is often the assertion you wanted. Matches elements the tree reports whether or not they are on screen, so a hit does NOT prove visibility; check element.visible. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Restrict to an element type, e.g. Button (XCUIElementType prefix optional) | |
| udid | Yes | iOS device UDID | |
| label | Yes | Substring to wait for, matched against label / name / value / placeholder | |
| timeout | No | Max wait in ms (default 10000) | |
| interval | No | Poll interval in ms (default 500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint, idempotentHint), and the description goes well beyond them: substring matching semantics, the important caveat that a hit does not prove visibility and that element.visible must be checked, that found=false is a normal result rather than an error, and that a session must be active. This is exactly the extra behavioral context structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, all front-loaded with the core action, then return contract, then the false-positive caveats, then the precondition. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by spelling out the return shape ({ found, waitedMs, element? }) and the meaning of found=false. Combined with the visibility caveat and session precondition, an agent has everything needed to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline would be 3; the description adds real meaning on top by explaining that the label parameter is a case-insensitive substring matched against label/name/value/placeholder, which the schema only states tersely. Timeout/interval/type semantics remain schema-only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Wait until an element appears on screen, polling the accessibility tree') and explicitly distinguishes itself from the sibling device_wait_for_element, which it names as its counterpart. An agent can tell it apart from ios_find_element and ios_elements_in_region without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: useful when the timeout result is the assertion you wanted, and states the prerequisite of an active iOS automation session. It names the counterpart tool but does not explicitly say when to prefer this over ios_find_element, so it falls just short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ios_window_sizeiOS window sizeARead-onlyIdempotentInspect
Get the screen width of an iOS device from the iOS automation session. Use these dimensions for tap/swipe coordinates. Requires an active iOS automation session.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | iOS device UDID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the session prerequisite, which is genuinely useful, but does not disclose the return shape (width alone vs width+height), which is the main behavioral unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose, then usage, then prerequisite. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with full annotation coverage and no output schema, the description covers purpose, usage and prerequisite adequately. The only remaining gap is clarifying whether the result is width only or full window dimensions, which the name/description mismatch leaves open.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'udid' parameter is documented in the schema, so the description need not repeat it. The description adds no extra syntax or format detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get the screen width of an iOS device') and scopes it to the automation session, so an agent can identify it among the many ios_* siblings. However, it says 'screen width' while the name/title say 'window size', leaving some ambiguity about whether only width or both dimensions are returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear intended use ('Use these dimensions for tap/swipe coordinates') and a prerequisite ('Requires an active iOS automation session'). No alternative tool is named, but the context for using it is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_create_issueJira create issueAInspect
Create a new Jira issue. Returns the new issue key and browse URL. ALWAYS confirm with the user before calling — this is a mutating operation. If the user mentions "PROJ-X" they want a comment, not a new issue. Use jira_get_issue first to ensure you have the right project context. Defaults issueType to "Task" if not specified.
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | Optional labels to attach. Each label must be a single token (no spaces). | |
| summary | Yes | Short issue title. Keep under 200 chars; longer summaries get truncated by Jira. | |
| issueType | No | Issue type name (e.g. "Bug", "Task", "Story"). Defaults to "Task" if omitted. Must match a type available in the target project. | |
| projectKey | Yes | Jira project key (e.g. "ACME", "PROJ"). All uppercase letters/digits/underscore. | |
| description | No | Issue body. Plain text — markdown is not interpreted. Convert markdown to plain prose before passing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false and destructiveHint=false, so the safety profile is known. The description adds genuinely useful non-annotation context: it is mutating and requires user confirmation, and it discloses the return payload (issue key + browse URL). It does not mention auth/permission requirements or failure modes, so it stops 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, front-loaded with the action and return value, then the confirmation requirement, then the disambiguation rule, then the prerequisite. Every sentence carries a distinct instruction and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the action, the return value, the confirmation requirement, the default, and the sibling disambiguation. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented with format and constraint details. The description only restates the issueType default ('Task'), which the schema already specifies, so it adds essentially no new parameter meaning. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and resource (a new Jira issue) and immediately names what it returns (issue key and browse URL). It is trivially distinguishable from siblings jira_get_issue and jira_search, which read rather than create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use guidance: confirm with the user first, treat 'PROJ-X' mentions as comment intent rather than issue creation, and call jira_get_issue first to establish project context. This is unusually complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_issueJira get issueRead-onlyIdempotentInspect
Fetch a single Jira issue by key (e.g. "ACME-123"). Returns key, browse URL, summary, description, issue type, status, priority, assignee, reporter, labels, project, timestamps, acceptanceCriteria (plain text, one line per item; null when the instance has no Acceptance Criteria field or it is empty), and links (URLs from the description and the issue's web links, deduped; each has a kind — "figma" marks a design mockup). TIP: links with kind 'figma' are design mockups — open them with figma_frame_image / figma_frame_spec to check the build against the design. Uses the calling user's stored Jira credential — does not accept inline credentials. Returns an actionable error if Jira is not configured.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Jira issue key in the form PROJECT-NUMBER (e.g. "ACME-123" or "PROJ-4567") |
jira_searchJira searchARead-onlyIdempotentInspect
Search Jira issues with a JQL query. Returns up to 50 matching issues with the same projection as jira_get_issue (minus links — URLs stay inline in the description; call jira_get_issue for the structured list). Narrow the JQL if you need more — the hard cap exists to keep agent context bounded. Common JQL examples: project = ACME AND status = "In Progress", assignee = currentUser() AND created >= -7d, text ~ "login bug".
| Name | Required | Description | Default |
|---|---|---|---|
| jql | Yes | Jira Query Language query. See https://confluence.atlassian.com/jirasoftwarecloud/advanced-search-reference-jql-fields | |
| maxResults | No | Max issues to return (default 20, hard cap 50). Increase only when you need a wider sweep. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds genuinely new behavior: a hard cap of 50 results, the rationale (bounding agent context), and the projection shape relative to jira_get_issue.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and result shape, then examples. All sentences earn their place, though the parenthetical about links/URLs is slightly awkward to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by describing count (up to 50) and projection relative to jira_get_issue. Adequate for a two-parameter search tool; nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes beyond the schema by supplying three concrete JQL examples and explaining the purpose of the result cap. It doesn't add syntax detail for maxResults beyond the schema's own default/hard-cap note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search Jira issues with a JQL query') and explicitly distinguishes the result projection from the sibling jira_get_issue, noting it omits `links`. An agent can pick this versus jira_get_issue without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for narrowing the JQL when more results are needed and routes the agent to jira_get_issue for the structured links list. It lacks explicit when-not guidance (e.g. single known issue), but the routing to alternatives is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_visual_reviewsList visual reviewsARead-onlyIdempotentInspect
List AI Visual Review candidates — flow-replay steps where the perceptual pixel-diff flagged a change against the approved baseline. Returns summaries with image URLs/refs only (not the images themselves — use get_visual_review for that). Defaults to pending (unreviewed) candidates. Owner-scoped to your account.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Review status to filter by. Defaults to "pending". | |
| replay_id | No | Optional — narrow to candidates from one specific replay run only. Use this when you were asked to review a particular replay so you never touch pending candidates from other runs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds meaningful context beyond them: the return payload is summaries with image URLs/refs and not the images, and results are owner-scoped to the caller's account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool lists, then what it returns, then the default and scope. Every clause earns its place and nothing is repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the missing return-shape information (summaries with image URLs/refs, not images). Defaults and ownership scoping are also covered, leaving nothing an agent needs in order to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the replay_id description already explains its narrowing intent in detail, so the schema carries the load. The description's 'defaults to pending' restates the status enum default rather than adding new semantics, warranting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus a precisely described resource (AI Visual Review candidates = flow-replay steps where perceptual pixel-diff flagged changes against an approved baseline). It also explicitly differentiates itself from get_visual_review, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the default behavior (pending/unreviewed candidates) and names the sibling to use when the images themselves are needed, which is clear contextual guidance. It stops short of stating when-not-to-use it (e.g. vs visual_compare or flow_replay_summary), so it is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_visual_verdictRecord visual verdictAInspect
Record the AI Visual Review classification of a candidate (from list_visual_reviews / get_visual_review) WITHOUT approving or rejecting it. Call it for every candidate you inspect, including ones you leave pending for a person. category "dynamic_noise" means the whole difference is benign (clocks, timestamps, ads, carousels, anti-aliasing); any other category is a regression type: layout, missing_element, color, text, new_content. Optionally mark regions (fractions 0-1 of the live image) and give each its own category when the diff mixes noise with a real change. A future replays learn to ignore an area only when your verdicts call it benign across several replays and its content really changed each time. Restricted to the automated AI review pass; other callers are refused. Owner-scoped to your account.
| Name | Required | Description | Default |
|---|---|---|---|
| regions | No | Areas that changed. Omit when you cannot localise them. | |
| summary | Yes | One short sentence describing what changed. | |
| category | Yes | Overall classification of the difference. | |
| severity | No | ||
| review_id | Yes | Review id from list_visual_reviews |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false / destructiveHint=false / idempotentHint=false. The description adds context the annotations cannot: restricted caller set, owner scoping, and the downstream consequence (future replays learn to ignore an area only when benign verdicts recur across replays while content truly changed). That is meaningfully beyond structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the not-approve/not-reject boundary; every sentence carries information. It is a dense single block without visual structure and the replay-learning sentence runs long, which slightly reduces scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so no return-value documentation is owed. For a non-idempotent write tool the description supplies the pieces an agent needs: what it records, when to call it, category semantics, region guidance, access restriction, and account scoping.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is already 3. The description goes further by explaining the semantic weight of category values ("dynamic_noise" = wholly benign diff vs. any other value = a regression type) and by clarifying that regions are fractions 0-1 of the live image and take their own category when noise is mixed with real change. severity's semantics are left to the enum, a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific act (record the AI Visual Review classification of a candidate), names the source tools it draws from (list_visual_reviews / get_visual_review), and explicitly delimits scope by saying it does NOT approve or reject. That boundary is what separates it from the approval path, so an agent can tell it apart from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ("call it for every candidate you inspect"), covers the edge case (candidates left pending for a person), and states a hard access boundary (automated AI review pass only; other callers refused). When-to-use and who-may-use are both nailed down.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_visual_reviewResolve visual reviewAInspect
Resolve an AI Visual Review candidate after inspecting it (via get_visual_review): "approve" means the change is expected/benign — it promotes the live capture to the new approved baseline for future comparisons. "reject" means it is a confirmed visual regression — it fails the owning replay run. Owner-scoped to your account.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional short rationale for your decision — logged for traceability, not stored on the record. | |
| decision | Yes | Your verdict on this candidate. | |
| review_id | Yes | Review id from list_visual_reviews |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it spells out the concrete consequence of each decision (approve promotes the live capture to the new approved baseline; reject fails the owning replay run) and adds an auth scoping note ('owner-scoped to your account'). The mutation/non-idempotent flags are already in annotations, and irreversibility is left implicit, so it's strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense but front-loaded sentence that places the action, the prerequisite, the two decision meanings, and the scoping constraint in priority order. No filler, and the quoted decision tokens make the branching scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-readonly, non-idempotent mutation tool with no output schema, the description covers the key effects, prerequisites, and scoping an agent needs. It doesn't state the return shape or error behavior, but the essential decision-making context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic meaning by defining what 'approve' and 'reject' actually do, which the bare enum labels do not convey. It does not describe the 'note' parameter, but the schema already documents it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (resolve) and resource (visual review candidate) and immediately distinguishes itself from the read-side siblings by naming get_visual_review as the inspection step and implying list_visual_reviews supplies the id. An agent can tell what this does versus visual_compare or get_visual_review without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the workflow: resolve only 'after inspecting it (via get_visual_review)', which names the prerequisite tool. It clearly maps the two decisions to outcomes, but offers no exclusion ('don't call before inspecting') beyond the implied ordering, so it lands just short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
secret_variables_listSecret variables listARead-onlyIdempotentInspect
List the names of secret variables the user has stored for this account. Returns NAMES + updated timestamps — never the values. Use this BEFORE asking the user for any URL, credential, or API key to see if a relevant one is already saved (e.g. "alice-test-account", "staging-url"). The actual values are substituted at tool-call execution time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds the fact that matters most for an agent: only names and updated timestamps are returned, never values, and values are substituted at tool-call execution time. That is real behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is returned, then the recommended usage pattern, then the value-substitution note. Every sentence carries distinct information with no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description fully covers what an agent needs: the return shape (names + timestamps), the security property (no values), and when to reach for it. Nothing material is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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; per the baseline for 0-param tools this sits at 4. The schema is empty and consistent with the description's account-scoped listing behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the names of secret variables') and immediately bounds the scope: names plus timestamps, never values. No sibling tool overlaps this function, and the description makes the resource unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit, actionable trigger: use it BEFORE asking the user for any URL, credential, or API key, with concrete examples of the variable names to expect. It does not name an alternative tool or state a when-not condition, so it falls short of a 5, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_backSession backAInspect
Go back one entry in the history of a WebDriver session — the browser's Back for a browser session, the platform back action for a mobile session. Addressed by sessionId. There is no forward counterpart on this surface: for a desktop grid page use web_back and web_forward (by pageId), and on a real device use webpage_back or device_key (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the agent already knows this mutates external state and isn't repeatable. The description adds domain-specific behavior the annotations cannot convey: that it moves the session's history pointer and that the underlying action differs between browser and mobile sessions. It does not say what happens when there is no history to go back to, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action before the routing detail. Dense but every clause (platform semantics, addressing key, alternatives) carries information; the sibling list is long but justified given the many near-duplicate back/navigation tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should ideally indicate what a successful back returns (e.g., the new current URL/page), and it does not. Otherwise it is complete for a one-parameter navigation tool: action, scope, addressing, and alternatives are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage, so the schema already documents sessionId as 'Session ID'. The description adds only that the tool is 'addressed by sessionId', which is a baseline restatement rather than new syntax or format meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and effect ('Go back one entry in the history of a WebDriver session') and disambiguates the semantics per platform: browser Back vs. the mobile platform back action. An agent can tell exactly what this does and how it differs from sibling navigation tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternatives and the condition that selects each: no forward counterpart here, use web_back/web_forward by pageId on a desktop grid page, webpage_back or device_key by udid on a real device. This is direct routing guidance, not implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_clickSession clickAInspect
Click an element found by session_find_element, addressed by its elementId together with the sessionId that found it. The click goes through the WebDriver protocol, so it lands where the element is — no coordinates and no scrolling to arrange first. Works on browser and mobile sessions alike. Errors when the element is not interactable, or has gone stale because the page changed since it was found: re-find it and retry. The coordinate-based equivalents on a real device are device_tap and ios_tap (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | Element ID from session_find_element | |
| sessionId | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false, idempotentHint=false and openWorldHint=true, but the description adds real behavioral value beyond them: WebDriver-mediated dispatch (no coordinates or scrolling needed), applicability to both browser and mobile sessions, and two concrete failure modes (not interactable, stale element) with the recommended recovery of re-finding and retrying.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, purpose front-loaded, then mechanism, platform scope, failure handling, and alternatives. No filler or restated name/title content; each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-param action with no output schema, the description covers preconditions, dispatch semantics, platform coverage, and error recovery, which is enough to invoke it correctly. It stops short of noting what a successful click returns or whether the action triggers navigation, but that gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the parameters are already documented, but the description adds the non-obvious coupling that elementId must be paired with the sessionId that produced it. That constraint is not expressed in the schema and prevents a plausible cross-session misuse.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (click) and the exact resource (an element returned by session_find_element), plus the addressing scheme (elementId + sessionId). It also names the sibling family it is not for (coordinate-based device_tap / ios_tap), so an agent can select it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions: the element must come from session_find_element with its owning sessionId, and points to device_tap / ios_tap for coordinate/udid-based taps. It does not explicitly contrast with web_click or webpage_click, so routing among the sibling click variants is only partly resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_console_logsSession console logsARead-onlyIdempotentInspect
Read the browser CONSOLE logs for a browser session (DevTools console — JS errors, warnings, console.log output). Captured automatically; returns the most recent entries. Use this to diagnose page errors the user is seeing. Takes the same sessionId as the rest of this family. (Browser sessions only; returns nothing for mobile/native device sessions.)
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Filter to a single level. Pass "error" to see only errors. | |
| limit | No | Max entries to return (most recent first-shown). Default 50, max 500. | |
| sessionId | Yes | Browser session ID (same id used by the other session_* tools) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description only needs to add context. It does: capture is automatic, only the most recent entries are returned, and it silently yields nothing on mobile/native sessions — a non-obvious empty-result behavior worth flagging.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core verb+resource before use case and caveats. Every sentence adds information; nothing is redundant with the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still conveys the return shape (most recent console entries) and filtering behavior. Combined with the fully documented schema and rich annotations, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with level and limit fully documented (including defaults and max) in the schema itself. The description only adds that sessionId is shared across the session_* family, so the schema does the heavy lifting — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (browser console logs), then clarifies the artifact is the DevTools console covering JS errors, warnings, and console.log output. The mention of network logs' sibling territory and 'the rest of this family' lets an agent place it without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('diagnose page errors the user is seeing') and an explicit exclusion ('Browser sessions only; returns nothing for mobile/native device sessions'). It does not name a specific alternative sibling (e.g. session_network_logs) for the non-console case, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_createSession createAInspect
Open a W3C WebDriver session on the testing grid — a browser session (Selenium) or a mobile-device session, decided by what you pass: a browserName such as chrome, firefox or MicrosoftEdge for a browser; an empty browserName plus platformName ANDROID or IOS and a device UDID in capabilities for a device. Returns the sessionId every other session_* tool takes, and the capabilities the grid actually negotiated. This is the automation-protocol surface — reach for it when the work needs element handles or mirrors existing WebDriver code. To drive a desktop browser page without a WebDriver session use the web_* tools (addressed by pageId); to drive the browser on a real phone use the webpage_* tools (addressed by udid). Leave platformName and browserVersion off unless you must pin them: literal 'any' or 'latest' is strict-matched against node stereotypes, which advertise concrete values, and fails to match anything.
| Name | Required | Description | Default |
|---|---|---|---|
| browserName | Yes | Browser name (chrome, firefox, MicrosoftEdge) or empty for a mobile session | |
| capabilities | No | Additional W3C capabilities (e.g. automation-engine settings, device UDID) | |
| platformName | No | Platform (ANDROID, IOS, linux, etc.) | |
| browserVersion | No | Browser version |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-readonly, non-idempotent, open-world, non-destructive operation, so the safety profile is covered. The description adds real behavioral value beyond that: it states the return payload (sessionId plus the grid's negotiated capabilities) and the strict-match semantics of 'any'/'latest'. It does not disclose session lifecycle (that the session persists and later needs session_quit) or any auth/quota requirements, which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and mode-selection rule, then returns, then alternative routing, then the non-obvious pitfall. Four sentences, each carrying distinct information with no repetition of the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param creation tool with no output schema, it covers mode selection, return values (sessionId, negotiated capabilities), sibling routing, and a matching pitfall. The remaining gap is lifecycle/teardown and any environment prerequisites, but nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description meaningfully adds semantics the schema lacks: an empty browserName is what triggers a device session, capabilities carries the device UDID, and platformName/browserVersion should be omitted unless pinning because literal 'any'/'latest' is strict-matched against concrete node stereotypes. That is genuine parameter guidance beyond the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open a W3C WebDriver session on the testing grid') and immediately splits the two modes (browser via browserName vs. device via empty browserName + platformName/UDID). It explicitly distinguishes itself from the web_* and webpage_* sibling families, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('needs element handles or mirrors existing WebDriver code') and when-not, naming the two concrete alternatives with their addressing keys (web_* by pageId, webpage_* by udid). It also adds a prerequisite-style caveat about leaving platformName/browserVersion off to avoid strict-match failures.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_executeSession executeADestructiveInspect
Run JavaScript in the page of a browser session and return its value. The script runs as a FUNCTION BODY, so it must return what you want back — a script with no return yields null, which is the usual reason this looks like it did nothing. args are passed through as the script's arguments. Browser sessions only. Addressed by sessionId. Use it for what the protocol has no verb for: reading a computed style, clearing an input before session_send_keys, scrolling an element into view. The equivalents elsewhere are web_evaluate (desktop grid page, by pageId) and ios_safari_evaluate / android_devtools_evaluate (real device browser, by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments to pass to the script | |
| script | Yes | JavaScript code to execute (e.g. "return document.title") | |
| sessionId | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and readOnlyHint=false, so the mutation risk is covered structurally. The description adds genuinely non-obvious behavior: the script runs as a function body, must `return` to produce a value, and silently yields null otherwise — a real failure-mode disclosure. It stops short of discussing sandboxing, thrown exceptions, or execution limits, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and resource, then the critical return-value gotcha, then scope, then use cases, then alternatives. Dense but every clause carries information an agent needs; no filler or repetition of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value contract itself (returned value vs. null) and explains args plumbing, addressing, environment scope, and sibling alternatives. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by clarifying that `script` is evaluated as a function body (not a bare expression) and that `args` become the script's arguments — semantics the schema's terse one-liners do not convey. sessionId gets no added context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run JavaScript in the page of a browser session') and immediately distinguishes itself from sibling evaluators by naming web_evaluate, ios_safari_evaluate, and android_devtools_evaluate with their addressing keys. An agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes usage to 'what the protocol has no verb for' and gives concrete triggering examples (reading computed style, clearing an input before session_send_keys, scrolling into view). It also states the constraint 'Browser sessions only' and names the three alternative tools with their environments, so when-not is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_find_elementSession find elementARead-onlyIdempotentInspect
Find one element in a WebDriver session and return the elementId that session_click and session_send_keys take. using selects the strategy — "css selector", "xpath", "id", "name", "link text", "partial link text", "tag name" or "class name" — and value is the query for it. Returns the FIRST match only, and errors rather than returning empty when nothing matches, so treat an error as 'not on the page yet' and retry after the page settles. Works on browser sessions and on mobile sessions, where the same strategies address native elements. Addressed by sessionId; the coordinate-free equivalents on a real device are device_find_element / ios_find_element (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| using | Yes | Locator strategy (e.g. "css selector", "xpath", "id") | |
| value | Yes | Locator value (e.g. "#login-btn", "//button[@id='submit']") | |
| sessionId | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial behavior beyond them: only the FIRST match is returned, an error is raised rather than an empty result when nothing matches, and the same strategies work on native mobile elements. These error and matching semantics are exactly what an agent needs and are not in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with purpose and return value before secondary details, and every sentence carries information (strategies, first-match semantics, error behavior, platform scope, alternatives). It is dense and somewhat long, but nothing reads as filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return value (elementId) and the failure mode, and covers cross-platform applicability and the sessionId addressing. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value the schema does not: it enumerates the complete set of `using` strategies (the schema only offers 'e.g.' examples) and clarifies that `value` is the query for the chosen strategy. That elevates it above the schema-only baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Find one element in a WebDriver session') and immediately says what it returns ('the elementId that session_click and session_send_keys take'), tying it to the callers that consume its output. This distinguishes it from sibling find tools without requiring the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: use this for WebDriver sessions (browser and mobile), and use device_find_element / ios_find_element for coordinate-free access on a real device by udid. It also gives an explicit error-handling heuristic ('treat an error as not on the page yet and retry after the page settles'), which is genuine 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.
session_get_titleSession get titleARead-onlyIdempotentInspect
Return the title of what a WebDriver session is currently showing — the document title for a browser session, the foreground activity name for a mobile session. Cheap, and the usual way to confirm a navigation landed where you expected before reading the whole page with session_page_source. Addressed by sessionId; on a real device the same question is device_current_app or ios_active_app (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds value beyond them: the 'cheap' cost signal, the cross-platform return semantics, and the sessionId-addressed scope. It stops short of stating latency or failure behavior when no session/navigation exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core return contract, then the usage rationale, then the sibling routing. Every sentence carries information, though the parenthetical enumeration of platform behavior is slightly dense for a one-line lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 takes on the burden of describing the return value — and does so precisely (document title vs foreground activity name). Given a 1-param, no-output-schema tool, an agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (sessionId) and schema coverage is 100%, so the schema already documents it fully. The phrase 'Addressed by sessionId' merely restates the schema and offers no format, sourcing, or validity guidance. Baseline 3 for a fully covered single param.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Return the title of what a WebDriver session is currently showing') and immediately differentiates return semantics per platform (document title for browser, foreground activity name for mobile). An agent can distinguish this from session_page_source or screenshot 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case ('confirm a navigation landed where you expected before reading the whole page with session_page_source') and routes to the correct alternatives on a real device (device_current_app or ios_active_app, keyed by udid). Both when-to-use and when-to-use-something-else are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_listSession listARead-onlyIdempotentInspect
List the WebDriver sessions currently open on the testing grid, with their ids and negotiated capabilities. Use it to recover a sessionId you lost track of, or to see what is still holding a node before opening another session. Covers browser and mobile sessions alike. This is not a device list — for the phones and tablets available to drive, use device_list.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the full safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower; the description adds real value by disclosing what is returned (ids and negotiated capabilities) and the coverage breadth (browser and mobile). It does not discuss auth requirements, node/session limits, or rate behavior on the grid, which would be the remaining useful additions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the purpose, then the use cases, then the scope note, then the disambiguation. Every sentence carries distinct information; none restates the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey return content, and it does ('ids and negotiated capabilities'). Scope, use cases, and sibling routing are all covered, so an agent has everything needed to call this zero-arg read tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4 per the rubric. The description correctly spends no space on parameter syntax and instead clarifies what the (empty-input) call yields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('List the WebDriver sessions currently open on the testing grid') with an explicit scope statement ('Covers browser and mobile sessions alike') and an explicit negation of a lookalike sibling ('This is not a device list'). An agent can separate it from device_list and the session_* action tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete triggering scenarios ('recover a sessionId you lost track of', 'see what is still holding a node before opening another session') and names the alternative tool with the condition that selects it ('for the phones and tablets available to drive, use device_list'). Nothing 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.
session_network_logsSession network logsARead-onlyIdempotentInspect
Read the NETWORK requests for a browser session (DevTools Network tab — method, URL, status, type, timing, size). Captured automatically; returns the most recent requests. Use to find failing (4xx/5xx) or slow requests. Takes the same sessionId as the rest of this family. Response/request BODIES are not available. (Browser sessions only.)
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by resource type, e.g. "xhr", "fetch", "document", "script", "stylesheet", "image". | |
| limit | No | Max requests to return (most recent). Default 50, max 500. | |
| sessionId | Yes | Browser session ID (same id used by the other session_* tools) | |
| failuresOnly | No | When true, only show requests that failed or returned status >= 400. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world behavior, so the bar is lower. The description adds genuine context beyond that: data is captured automatically rather than on demand, only the most recent requests are returned, and response/request bodies are deliberately not available.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, front-loaded with purpose and return fields, then usage, then constraints. Every clause carries information (fields returned, automatic capture, use case, session family, body limitation, platform scope); nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by listing exactly what the response contains and what it omits (bodies). Combined with the sessionId-family note and the browser-only constraint, an agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so type, limit, sessionId and failuresOnly are already documented in the schema itself. The description only reinforces sessionId reuse across the family and hints at the failuresOnly use case; it adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read network requests for a browser session), enumerates the returned fields (method, URL, status, type, timing, size), and scopes it to browser sessions, which separates it from the device/android/ios devtools capture siblings. An agent can identify the tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('find failing (4xx/5xx) or slow requests') and states the precondition that it takes the same sessionId as the rest of the family, plus the exclusions that bodies are unavailable and it is browser-only. It stops short of naming a specific alternative sibling for the non-browser case, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_page_sourceSession page sourceARead-onlyIdempotentInspect
Return what a WebDriver session is currently showing as markup: the rendered DOM as HTML for a browser session, the native view hierarchy as XML for a mobile session. This is the WHOLE document — it can be very large, so prefer session_find_element when you only need one element, and reach for this when you need to see the structure or search it yourself. Addressed by sessionId; the device-side equivalents are device_page_source and ios_page_source (by udid), which return the on-screen hierarchy without a WebDriver session.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered. The description adds real behavioral context beyond them: the payload is the WHOLE document and 'can be very large,' and the serialization differs by platform (HTML vs XML). It stops short of describing pagination, truncation, or how the source is framed in the response, which is the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all earning their place, with the core purpose and the size warning front-loaded ahead of the alternative-tool routing. Slightly dense but no filler; the platform-format clause could arguably be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return-value burden — and it does, stating the content is rendered DOM as HTML or native view hierarchy as XML and that it is the full document. Combined with the size caveat, addressing key, and sibling routing, an agent has everything needed to call it correctly and anticipate the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (sessionId) and schema description coverage is 100%, so the schema already carries the parameter. The description adds marginal meaning by implying sessionId is a WebDriver session identifier as opposed to the udid used by the device-side equivalents. That is a small semantic gain over the schema, consistent with the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Return what a WebDriver session is currently showing as markup') and immediately scopes the output: HTML for browser sessions, XML for mobile sessions. It names the siblings it is not (session_find_element, device_page_source, ios_page_source) and the key that distinguishes them (sessionId vs udid), so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not: prefer session_find_element 'when you only need one element,' and use this 'when you need to see the structure or search it yourself.' It also states the alternative family (device_page_source / ios_page_source) and the condition selecting it (udid-addressed, no WebDriver session). Nothing 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.
session_quitSession quitAIdempotentInspect
End a session created by session_create and release the browser or device it holds. Takes the sessionId, not a udid. Always call it when finished — an abandoned session keeps its grid node until the grid times it out, which blocks the next caller. Calling it twice on the same id returns the grid's 'no such session' error rather than a silent success, so it is safe to confirm.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session ID to quit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: the consequence of abandonment (a held grid node blocking the next caller) and the exact outcome of a second call (the grid's 'no such session' error instead of silent success). That is useful for an agent deciding whether to confirm cleanup. Minor gap: the description asserts safety of re-calling while the annotation declares idempotentHint=true, and it never states whether the session can be recreated or what permissions are required; not an outright contradiction, but the two statements should be read together.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying distinct load: what it does, which identifier to pass, when to call it and why, and what happens on a repeat call. The purpose and the identifier rule are front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
One required parameter, no output schema, and annotations already covering the safety profile — so the remaining burden is guidance and side-effect disclosure, both of which the description supplies (grid-node blocking, double-call error). Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns extra credit by disambiguating the parameter against a plausible confusion: 'Takes the sessionId, not a udid.' That prevents a real mis-invocation that the schema alone would not flag.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('End') and resource ('a session created by session_create'), and immediately ties it to the sibling that produces the resource. An agent can distinguish it from session_list, session_get_title, or ios_end_session 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit directive with the reason: 'Always call it when finished — an abandoned session keeps its grid node until the grid times it out, which blocks the next caller.' That is when-to-use plus the cost of not using it, which is stronger than most sibling definitions in this set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_screenshotSession screenshotARead-onlyIdempotentInspect
Capture what a WebDriver session is currently showing — the browser viewport for a browser session, the device screen for a mobile session — as a base64 PNG. Addressed by sessionId, which is what separates it from its neighbours: web_screenshot takes a desktop grid page by pageId, webpage_screenshot takes the browser on a real device by udid, and device_screenshot / ios_screenshot take the device screen itself by udid.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description adds real behavioral value beyond that: it says the output is a base64 PNG and that the captured surface varies by session type (viewport vs device screen), which the annotations do not convey. It stops short of noting size limits or latency, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the opening clause, and the second sentence is a single dense routing list where every clause maps one sibling to its addressing key. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one fully documented parameter and no output schema, the description carries the return-format burden and does so (base64 PNG, surface depends on session type). Nothing needed to invoke it correctly is missing, though error behavior for an invalid or expired sessionId is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the schema itself only says 'Session ID'. The description adds genuine meaning: sessionId identifies a WebDriver session and is the addressing key that distinguishes this tool from pageId- and udid-addressed siblings. No format or validity details are given, keeping it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — capture what a WebDriver session is currently showing, viewport for browser sessions, device screen for mobile — and names the return format (base64 PNG). It also explicitly enumerates the sibling tools it is not (web_screenshot, webpage_screenshot, device_screenshot, ios_screenshot), so an agent can pick it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a positive selection rule (addressed by sessionId, which is the differentiator) and maps each alternative sibling to its own addressing key: pageId for web_screenshot, udid for webpage_screenshot/device_screenshot/ios_screenshot. This is effectively explicit when-to-use and when-to-use-something-else routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_send_keysSession send keysAInspect
Type text into an element found by session_find_element, addressed by its elementId. It APPENDS — W3C Element Send Keys does not clear the field first, so a second call on the same input concatenates rather than replaces. Clear it yourself (session_execute setting value to an empty string, or a select-all before typing) when you mean to replace. Takes the sessionId that found the element. Works on browser and mobile sessions. Errors when the element is not editable, or when it has gone stale because the page navigated since it was found — re-find it and retry.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type into the element | |
| elementId | Yes | Element ID from session_find_element | |
| sessionId | Yes | Session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the single most surprising behavioral trait — W3C Element Send Keys APPENDS and does not clear, so repeat calls concatenate — which no annotation conveys. It also enumerates failure modes: element not editable, and stale element after navigation, with the recovery step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the append caveat follows immediately after the core action, and remedy plus error conditions come last. Slightly long, but nearly every clause carries decision-relevant information; the parenthetical alternatives could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutating session tool with no output schema and no annotation coverage of semantics, the description covers action, side effects, workaround, session coupling, cross-platform scope, and error recovery. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real constraints beyond the schema: sessionId must be the session that found the element, and elementId refers to an element whose editability and staleness affect success. Only the 'text' parameter gets no extra treatment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Type text into an element') and pins the element identity to the sibling producer session_find_element via elementId. An agent can distinguish it from session_click, session_execute and session_find_element without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use it (typing into an element already located by session_find_element), the condition that changes the approach (replace vs append), and names the alternative tool for clearing (session_execute setting value to an empty string). Nothing about choosing 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.
submit_tool_feedbackSubmit tool feedbackAInspect
Report feedback about the robot-actions MCP device-control tools THEMSELVES (not about the app under test). Use this to tell the maintainers when a tool was confusing, missing a capability you needed, behaved like a bug, or worked well and confirmed something you were unsure about. Be specific and actionable: name the tool_name, describe the concrete situation/inputs, and what you expected vs. what happened. This call is fire-and-forget — it is not shown to the end user, it only records feedback for maintainers to triage later.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The feedback itself — be specific and actionable about what happened and why it mattered. | |
| category | Yes | Kind of feedback being reported. | |
| severity | No | How much this impacted the task, if applicable. | |
| tool_name | No | Name of the MCP tool this feedback concerns, e.g. "device_tap". | |
| reproduction | No | Steps/inputs that reproduce the issue, if this is a bug report. | |
| suggested_fix | No | A concrete suggestion for how the tool could be improved. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, idempotent=false, destructive=false). The description adds critical behavior not in the annotations: the call is fire-and-forget, is never shown to the end user, and merely records feedback for later triage. That is exactly the context an agent needs to understand the side effect's invisibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no filler; purpose and the tool-vs-app distinction lead. Minor length in the final sentence, but every clause carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage, no output schema, and annotations covering safety, the description supplies the remaining essentials: what counts as feedback, how to phrase it, and that it is silent and non-user-facing. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes slightly beyond the schema by prescribing how to compose the message (name the tool_name, give concrete inputs, state expected vs. actual), which materially improves parameter quality.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (report) plus a precisely scoped resource (feedback about the MCP device-control tools THEMSELVES), with an explicit exclusion of the app under test. An agent can immediately tell this apart from app-oriented tools like automation_report or get_visual_review.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Enumerates concrete trigger conditions (confusing, missing capability, behaved like a bug, worked well) and states a when-not ('not about the app under test'). Nothing is left to inference about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_add_attachment_to_caseTestRail add attachment to caseAInspect
Attach a file from your /workspace to a TestRail case. The file must already exist at the given workspace path (write it first if needed). ALWAYS confirm with the user via a chat bubble before calling — this writes to the customer's TestRail. Returns the new attachment_id on success.
| Name | Required | Description | Default |
|---|---|---|---|
| caseId | Yes | TestRail case id | |
| workspacePath | Yes | Path INSIDE your /workspace mount, e.g. "/workspace/screenshots/step4.png". The file must exist. | |
| displayFilename | No | Override the filename shown in TestRail. Defaults to the basename of workspacePath. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, idempotent=false, destructive=false), and the description adds genuinely useful context beyond them: the write targets the customer's TestRail instance, user confirmation is required, and it returns the new attachment_id. 'This writes' is consistent with destructiveHint=false since a write is not necessarily destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the core action, followed by the precondition and the mandatory confirmation. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a mutation tool: it covers the precondition, the required user confirmation, the target system, and the return value (attachment_id) despite there being no output schema. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters including the workspace path format and displayFilename override. The description reinforces that the file must exist but adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (attach) plus resource (file to a TestRail case) and scope (from the /workspace path). The name and description together clearly distinguish it from siblings like testrail_get_attachment and testrail_list_attachments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides strong preconditions: the file must already exist at the workspace path and must be written first if needed. It also mandates confirming with the user before calling. It does not name sibling alternatives, but the when-to-use context is otherwise explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_create_caseTestRail create caseAInspect
Create a new TestRail test case under the given sectionId. Returns the new case id + browse URL. ALWAYS confirm with the user via a chat bubble before calling — this writes to the customer's TestRail project. Use customStepsSeparated for BDD-shaped tests (each step gets action + expected result), customSteps for plain-text. Set refs to the originating Jira/AzDO story key (e.g. 'PROJ-123') so TestRail shows the linkback chip.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | No | Comma-separated reference keys (e.g. "PROJ-123,PROJ-124") shown as chips | |
| title | Yes | Case title (max 250 chars, will be trimmed) | |
| typeId | No | Case type_id (tenant-specific; omit for default) | |
| sectionId | Yes | TestRail section id to create the case under | |
| priorityId | No | Priority id (1-4 in stock TestRail; tenants may customise) | |
| customSteps | No | Plain-text steps (TestRail "Text" template) | |
| customPreconds | No | Preconditions text | |
| customStepsSeparated | No | Structured steps (TestRail "Steps + Expected Result" template) — preferred for BDD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-idempotent, non-destructive write, but the description adds valuable context the annotations cannot: the mandatory chat-bubble confirmation, that it writes to the customer's TestRail project, and the return shape (new case id + browse URL).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all front-loaded: action, return value, safety gate, then parameter selection guidance. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, it covers the operation, the return value, the confirmation prerequisite, and the two non-obvious parameter choices. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics: customStepsSeparated produces action+expected pairs for BDD while customSteps is plain text, and refs should carry the source Jira/AzDO key to render a linkback chip. That is meaningfully beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new TestRail test case') and the anchor parameter ('under the given sectionId'), which cleanly separates it from sibling reads/updates like testrail_get_case and testrail_update_case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: use customStepsSeparated for BDD-shaped tests, customSteps for plain-text, and set refs to the originating Jira/AzDO key. It also mandates user confirmation before the call. It stops short of naming the sibling it replaces (testrail_update_case) for edit-vs-create disambiguation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_find_casesTestRail find casesARead-onlyIdempotentInspect
Search a TestRail project for cases whose title contains the given text (case-insensitive substring), walking ALL pages server-side. USE THIS — not testrail_list_cases — to check whether a case already exists before calling testrail_create_case, because it cannot be fooled by a truncated page. Returns only matching cases plus scanned/capReached so a "no matches" answer can be trusted. Narrow with sectionId/suiteId to scan less.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Text to look for inside case titles (case-insensitive substring) | |
| compact | No | Return only id + title per match instead of all 7 fields | |
| suiteId | No | Optional suite scope | |
| projectId | Yes | TestRail project id | |
| sectionId | No | Optional section scope |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds non-obvious behavior: it walks ALL pages server-side and returns scanned/capReached so a 'no matches' result is trustworthy. That pagination/trust disclosure is exactly the value beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with purpose then routing then scope-narrowing; no sentence is filler. Sizing is appropriate for a tool with a subtle correctness advantage over its sibling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the return shape (only matching cases plus scanned/capReached). Combined with the routing and narrowing guidance, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a reason beyond the schema's terse 'Optional suite scope'/'Optional section scope' by explaining that sectionId/suiteId narrow the scan. It also reinforces the substring semantics of query, though that partly repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search/find), resource (TestRail cases), and matching semantics (case-insensitive substring on titles), and explicitly distinguishes itself from testrail_list_cases. An agent can identify the right tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: 'USE THIS — not testrail_list_cases — to check whether a case already exists before calling testrail_create_case,' plus the reason (not fooled by a truncated page) and a narrowing tip. Both the when and the alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_get_attachmentTestRail get attachmentARead-onlyIdempotentInspect
Download a TestRail attachment by id. Returns filename, contentType, and the file content base64-encoded inline. Capped at 10MB — if you expect a larger file, list first and ask the user before downloading. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| attachmentId | Yes | Attachment id from testrail_list_attachments |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, so the safety profile is covered. The description still adds genuine behavioral context beyond that: the inline base64 return shape and the 10MB cap with a fallback workflow. It doesn't detail error behavior for missing or inaccessible ids.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then return shape, then the size constraint and fallback. Every sentence carries distinct information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (filename, contentType, inline base64 content) and the size limit. An agent has everything needed to call it correctly and handle oversized files.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is already documented as 'Attachment id from testrail_list_attachments'. The description only restates 'by id', adding no format or sourcing detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Download a TestRail attachment by id.' The TestRail prefix and the resource distinguish it clearly from sibling tools like testrail_list_attachments, and the agent knows exactly what it retrieves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete conditional: 'if you expect a larger file, list first and ask the user before downloading,' which routes the agent to testrail_list_attachments and specifies a user-confirmation step. It lacks general when-not guidance, but the key edge case is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_get_caseTestRail get caseARead-onlyIdempotentInspect
Read a TestRail test case by id. Returns the full case detail: title, refs, steps, custom fields, labels (if TestRail 7.5+). Read-only — safe to call without user confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| caseId | Yes | TestRail case id (the C-number, e.g. 14344) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the safety profile is covered; the description's restatement of 'read-only' is largely redundant. It does add genuinely new behavioral context, however: it enumerates the returned fields and flags the version-conditional 'labels (if TestRail 7.5+)' behavior, which the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler; the identity and scope lead, the return payload follows, and the safety note closes. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (title, refs, steps, custom fields, labels) and the version caveat, which is enough for an agent to call and consume it. It omits error behavior for a missing/invalid case id and any auth or project-scoping requirement, which keeps it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single caseId parameter, and the schema already documents the C-number format, so the description's 'by id' adds nothing beyond it. Baseline 3 is appropriate when the schema carries the full parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 a TestRail test case') and scopes it with 'by id', which implicitly separates it from the collection-oriented siblings testrail_list_cases, testrail_list_all_cases, and testrail_find_cases. It never names those alternatives explicitly, so the differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'by id' — fetch one case when you already have its identifier — but there is no explicit guidance about when to reach for this versus testrail_find_cases (search) or testrail_list_cases (enumerate). No prerequisites or exclusions are given, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_list_all_casesTestRail list all casesARead-onlyIdempotentInspect
List EVERY case in a TestRail project/suite/section, walking all pages server-side so the caller never handles offsets. Returns compact id+title rows by default because the full form overruns the output limit on real projects — pass compact:false only for a narrow sectionId. Capped at 20 pages (5000 cases); check capReached. If you only need to know whether one specific case exists, use testrail_find_cases instead — it is far cheaper.
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | Defaults to true (id + title only). Set false for all 7 fields — only safe on a small section. | |
| suiteId | No | Optional suite scope | |
| projectId | Yes | TestRail project id | |
| sectionId | No | Optional section scope |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly/idempotent/non-destructive), and the description layers on the behaviors that matter: server-side pagination so the caller never handles offsets, a default compact output mode with a stated reason (full form overruns the output limit), a hard cap of 20 pages/5000 cases, and a capReached signal to check. This is substantive context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and scope, then the output/pagination caveat, then the alternative-tool pointer. Every clause carries decision-relevant information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still characterizes the return shape (compact id+title rows by default), the cap, and the capReached indicator, so an agent knows what to expect and how to detect truncation. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains WHY compact defaults to true (output-limit overrun) and constrains compact:false to a narrow sectionId. The scoping params (projectId/suiteId/sectionId) are only echoed from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List EVERY case in a TestRail project/suite/section') and immediately distinguishes itself from the paginated sibling by noting it walks all pages server-side. An agent can tell it apart from testrail_list_cases and testrail_find_cases 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives: use testrail_find_cases for an existence check because it is 'far cheaper', and use compact:false 'only for a narrow sectionId'. Both when-to-use and when-not conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_list_attachmentsTestRail list attachmentsARead-onlyIdempotentInspect
List all attachments on a TestRail case. Returns id, filename, size, created_on, user_id per attachment. Read-only — safe without user confirmation. Use this to find attachment ids before calling testrail_get_attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| caseId | Yes | TestRail case id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the 'Read-only — safe without user confirmation' line largely restates structured data. The useful addition is the per-attachment return fields (id, filename, size, created_on, user_id), which go beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, then the return shape, then the follow-up routing. Every sentence earns its place with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the definition covers purpose, return fields, safety profile, and workflow linkage. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (caseId) with 100% schema description coverage, so the schema already documents it fully. The description adds no format, range, or sourcing guidance for caseId, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List all attachments on a TestRail case') and notes the scope is a single case. It distinguishes itself from the related testrail_get_attachment sibling by naming it as the follow-up, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this 'to find attachment ids before calling testrail_get_attachment,' which gives a concrete when-to-use and points at the alternative. It stops short of stating when-not to use it or any prerequisites, but the workflow context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_list_casesTestRail list casesARead-onlyIdempotentInspect
List test cases in a TestRail project, optionally scoped to a suite and/or section. Use this to discover case ids before calling testrail_get_case, or to check what already exists before creating a new case with testrail_create_case. Returns { cases: [...], paging: {...} }, where each case is a compact summary (id, title, section_id, suite_id, priority_id, type_id, refs) — call testrail_get_case for full step detail on a specific case. Results are NOT auto-paged: TestRail caps a page at 250, so always check paging.hasMore and re-call with offset=paging.nextOffset before concluding a case does not exist. Prefer scoping with sectionId/suiteId over paging the whole project.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max cases to return in this page (TestRail default 250) | |
| offset | No | Row offset for paging past the first page | |
| compact | No | Return only id + title per case instead of all 7 fields. Roughly 15x smaller — use when scanning for whether a case exists, then call testrail_get_case for detail. | |
| suiteId | No | Suite id — required for multi-suite projects, optional for single-suite | |
| projectId | Yes | TestRail project id | |
| sectionId | No | Section id — scope results to cases directly inside this section |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the return envelope ({ cases, paging }), the exact fields per case, and critically that results are NOT auto-paged with a hard cap of 250 — instructing the agent to check paging.hasMore and re-call with offset=paging.nextOffset. This is behavior an agent cannot infer from readOnlyHint/idempotentHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then usage, then return shape, then the pagination caveat. Dense but every sentence carries non-redundant operational guidance; nothing could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the return structure and paging fields, plus the compact-summary nature of results. Combined with the parameters and annotations, an agent has everything needed to call and page correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real semantic value on top: it states that sectionId/suiteId scoping is preferred over paging the whole project and ties offset to paging.nextOffset, clarifying intended parameter usage beyond the raw schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (test cases in a TestRail project) with its optional scoping. It distinguishes from testrail_get_case and testrail_create_case by naming them, but never distinguishes itself from the close siblings testrail_find_cases or testrail_list_all_cases, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context: discover case ids before testrail_get_case, or check existence before testrail_create_case. It also advises preferring sectionId/suiteId over paging the whole project. However, it offers no exclusion against testrail_find_cases or testrail_list_all_cases, so sibling selection remains ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_list_projectsTestRail list projectsARead-onlyIdempotentInspect
List TestRail projects accessible to the caller's TestRail account. Use this as the first step when the agent doesn't yet know which projectId to target for a new test case. Returns id + name + announcement + suite_mode for each project.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing the returned fields (id, name, announcement, suite_mode), which the annotations and empty schema do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: purpose, routing guidance, and return shape. The most decision-relevant information (what it lists) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the return fields, which is the main thing missing otherwise. Minor gaps remain (no mention of pagination or whether all projects or a filtered set is returned), but for a simple list tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. The baseline for a parameterless tool is 4, and the description does not confuse matters by implying hidden inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list TestRail projects) plus the scope (accessible to the caller's account). It also positions itself against siblings by naming its role as the entry point for discovering projectId, so an agent can distinguish it from testrail_list_suites, testrail_list_runs, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this as the first step when the agent doesn't yet know which projectId to target, which is concrete when-to-use guidance. It stops short of naming when NOT to use it or pointing at an alternative path once the projectId is already known, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_list_runsTestRail list runsARead-onlyIdempotentInspect
List TestRail runs for a project, newest first. Returns { runs: [...], paging: {...} } — run id (R-number), name, created_on, completed_on, and pass/fail counts. Results are NOT auto-paged: TestRail caps a page at 250, so check paging.hasMore and re-call with offset=paging.nextOffset before concluding a run does not exist. Use milestoneId or createdAfter (epoch seconds) to filter to a release or window instead of paging through history.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max runs to return in this page (TestRail default 250) | |
| offset | No | Row offset for paging past the first page | |
| projectId | Yes | TestRail project id | |
| milestoneId | No | Optional milestone filter | |
| createdAfter | No | Optional epoch-seconds lower bound on created_on |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, but the description adds important behavioral context beyond them: the return shape, the 250-item page cap, the fact that results are NOT auto-paged, and the exact recovery pattern via paging.hasMore and offset=paging.nextOffset. This is exactly the kind of operational detail an agent needs before concluding a run is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then follows with return shape, pagination caveat, and filtering advice. Every sentence adds distinct operational value, with no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with five parameters, rich annotations, and no output schema, the description covers purpose, return shape, pagination behavior, and filtering guidance. An agent has enough information to call it correctly and interpret results without needing an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, which sets a baseline of 3, but the description adds meaning beyond the schema by tying offset to paging.nextOffset and explaining the practical use of milestoneId and createdAfter for release- or window-based filtering. It does not explain limit semantics beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List TestRail runs') and scopes it to a project with ordering ('newest first'). The resource is clearly distinct from sibling tools like testrail_list_tests_for_run, which lists tests within a run rather than runs themselves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage guidance for pagination and filtering: check paging.hasMore and re-call with offset=paging.nextOffset, and use milestoneId or createdAfter to avoid paging through history. It does not name when to prefer this over a sibling tool or state when not to use it, so it falls short of full 5-level routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_list_sectionsTestRail list sectionsARead-onlyIdempotentInspect
List sections (folders) inside a TestRail project. For multi-suite projects, suiteId is REQUIRED (TestRail rejects the call without it). For single-suite projects, suiteId is optional. Returns id + name + parent_id + depth so the agent can render the section tree to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| suiteId | No | Suite id — required for multi-suite projects, optional for single-suite | |
| projectId | Yes | TestRail project id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds genuine value beyond that: it discloses the failure mode ('TestRail rejects the call without suiteId') and, since there is no output schema, it discloses the return shape (id + name + parent_id + depth). It omits pagination or ordering behavior, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core purpose front-loaded and the conditional requirement and return shape following in priority order. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description covers purpose, the conditional parameter rule, and the return fields — enough for correct invocation. It does not mention whether sections are returned sorted or paginated, which is the only remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the suiteId schema description already states 'required for multi-suite projects, optional for single-suite', so the description largely repeats structured data. It adds only the consequence of omission, which is useful but marginal against a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource — listing sections inside a TestRail project — and disambiguates the domain term by equating sections with folders. It is distinguishable from siblings like testrail_list_suites and testrail_list_cases, but the description never names those siblings or clarifies the hierarchy relationship between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a conditional rule for suiteId (required for multi-suite, optional for single-suite), which is real usage context, but it offers no guidance on when to call this tool versus testrail_list_suites or testrail_list_cases, nor any ordering/preconditions for traversal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_list_suitesTestRail list suitesARead-onlyIdempotentInspect
List suites for a TestRail project. Most projects are single-suite (returns exactly one suite). Multi-suite projects return many. Returns id + name + description + is_master + is_baseline.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | TestRail project id (from testrail_list_projects) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description goes beyond them by disclosing the cardinality behavior (single-suite vs multi-suite) and the returned fields, which is genuinely useful since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, purpose first, then the cardinality caveat, then the return shape. No filler or repetition; every sentence carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with full annotation coverage, the description supplies the missing return-value information in lieu of an output schema. It omits ordering/pagination details, which is a minor gap for this scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter and 100% schema description coverage, the schema already fully documents projectId and its origin. The description adds no format, validation, or sourcing detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list suites) scoped to a TestRail project, and adds a useful nuance that most projects are single-suite while multi-suite projects return many. It does not explicitly contrast itself with the other testrail_list_* siblings, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent can infer this is for enumerating suites within a known project, and the schema points to testrail_list_projects as the source of projectId. There is no explicit when-to-use/when-not-to-use guidance or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_list_tests_for_runTestRail list tests for runARead-onlyIdempotentInspect
List EVERY test inside a TestRail run, walking all pages server-side so the caller never handles offsets. Returns each test with its T-id (test instance, e.g. T1234), C-id (underlying case_id — feed this to testrail_get_case), title, and status_id. Filter by statusIds (TestRail status: 1=passed, 2=blocked, 3=untested, 4=retest, 5=failed) to e.g. list only failed tests when triaging. Capped at 20 pages (5000 tests); check capReached before concluding a test is not in the run.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | TestRail run id (R-number) | |
| statusIds | No | Optional status filter — e.g. [5] for failed only, [2,5] for blocked+failed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, openWorld, non-destructive), yet the description adds substantial operational context beyond them: server-side pagination the caller never handles, a hard cap of 20 pages / 5000 tests, and the capReached flag that warns against concluding a test is absent. This is exactly the kind of behavior an agent needs and cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that is front-loaded with the core action and pagination guarantee, then the return shape, then filtering, then the cap caveat. Every sentence carries distinct, non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to describe the returned fields (T-id, C-id, title, status_id) and the capReached flag. Combined with the two-parameter schema and rich annotations, an agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value: it enumerates the status code mapping (1=passed, 2=blocked, 3=untested, 4=retest, 5=failed) that is absent from the schema (0 enum parameters), and gives example filter values. It does not restate runId semantics, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List EVERY test inside a TestRail run') and immediately distinguishes itself from sibling list tools like testrail_list_cases by scoping to a run. The mention that the underlying case_id should be fed to testrail_get_case clarifies its place in the tool chain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use scenario ('list only failed tests when triaging') and routes the caller onward via the C-id to testrail_get_case. It lacks explicit when-not-to-use guidance or a direct contrast with testrail_list_cases / testrail_list_runs, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testrail_update_caseTestRail update caseADestructiveIdempotentInspect
Update an existing TestRail test case. Any field omitted is left unchanged. ALWAYS confirm with the user via a chat bubble before calling — this writes to the customer's TestRail. IMPORTANT: labels is a REPLACE, not a merge. To add a label without losing existing ones, FIRST call testrail_get_case, READ existing labels, MERGE, THEN call this with the full new array.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | No | New refs string (e.g. "PROJ-123,PROJ-124") | |
| title | No | New title (max 250 chars) | |
| caseId | Yes | TestRail case id (C-number) | |
| labels | No | Full new label set (REPLACE — read existing first if you want to add without removing). TestRail 7.5+ only. | |
| typeId | No | Change type_id | |
| priorityId | No | Change priority_id | |
| customSteps | No | New plain-text steps | |
| customPreconds | No | New preconditions | |
| customStepsSeparated | No | New structured steps (BDD-preferred). Replaces existing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds context annotations cannot convey: that this writes to the customer's live TestRail, that confirmation is required first, and that labels behave as a replace rather than a merge with a recovery procedure. This is meaningful behavioral disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then ordered constraints (partial update, confirmation, label replace). Emphasis is used sparingly and each sentence carries an actionable rule; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the critical decision points: confirmation, partial-update semantics, and the label replace workflow. It stops short of describing the response or validation limits (e.g., title length, typeId/priorityId validity), though the schema already carries most field-level detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description rises above it by explaining the omitted-field semantics (partial update) and the non-obvious REPLACE behavior of labels with the get-merge-call sequence, which materially changes how the agent should populate that array.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update an existing TestRail test case") and clarifies the partial-update contract ("Any field omitted is left unchanged"), which cleanly distinguishes it from testrail_create_case and the read-only testrail_get_case siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and a mandatory precondition ("ALWAYS confirm with the user via a chat bubble before calling"), plus an explicit alternative workflow that names the sibling testrail_get_case for the label-merge pattern. Nothing 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.
test_suite_add_itemTest suite add itemAInspect
Add an item to a suite. itemType 'test' references a flow recording (category='test'); 'testPlan' references a plan. orderIndex controls position (appended to the end if omitted).
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Item id — a flow recording id (itemType='test') or plan id (itemType='testPlan') | |
| suiteId | Yes | Suite id to add the item to | |
| itemType | Yes | What itemId points at | |
| orderIndex | No | Position within the suite (appended if omitted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds the default-append behavior of orderIndex, which is useful, but it does not disclose whether repeated adds create duplicates or what permissions are required. With annotations carrying the main burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler; the core action leads and the parameter clarifications follow. It is well front-loaded and appropriately sized, though it could be marginally tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool with no output schema and full schema coverage, the description is adequate. It omits whether duplicate items are allowed, ordering collisions, and failure behavior, which leaves some gaps for a non-idempotent write operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, which sets a baseline of 3, and the description exceeds it by clarifying that itemType 'test' references a flow recording (category='test') and 'testPlan' references a plan, plus the orderIndex default. This adds genuine meaning beyond the schema's terse field notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Add an item to a suite') and elaborates on the itemType semantics, so the agent knows exactly what the tool does. It does not, however, explicitly contrast itself with siblings like test_suite_create or test_suite_run, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the itemType explanation ('test' = flow recording, 'testPlan' = plan), which tells the agent which value to pass for which scenario. There is no explicit when-to-use vs alternatives guidance, no prerequisites, and no exclusions, so it remains minimum-viable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_suite_createTest suite createAInspect
Create a test suite — an organizational grouping of tests and test plans. Suites nest via parentSuiteId. Returns the created suite (id, displayId like S001, name).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Suite name (required) | |
| description | No | Optional suite description | |
| parentSuiteId | No | Parent suite id to nest this suite under (omit for a top-level suite) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-destructive, non-idempotent, closed-world write, so safety is covered. The description adds genuinely new information by disclosing the return payload (id, displayId such as S001, name) in the absence of an output schema, plus the nesting behavior via parentSuiteId. It does not mention duplicate-name handling or permission requirements, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero filler: the first defines purpose, the second covers nesting, and the third covers the return value. Front-loaded with the verb and resource, and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with no output schema, the description covers purpose, nesting, and return-value shape, which is most of what an agent needs. The remaining gap is error and precondition behavior (nonexistent parent, duplicate names, required permissions), which is minor against fully documented parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, description, and parentSuiteId. The description's nesting note ('Suites nest via parentSuiteId') largely restates what the parentSuiteId schema description already says ('Parent suite id to nest this suite under (omit for a top-level suite)'). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create a test suite) and goes further by defining what a suite is ('an organizational grouping of tests and test plans'). This makes it unmistakable against siblings like test_suite_list, test_suite_run, and test_suite_add_item, which are all non-creating operations on the same resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: you call this when you need a new organizational grouping, and the nesting note hints that parentSuiteId is only for child suites. However, there is no explicit when-to-use guidance, no precondition (e.g., whether the parent suite must already exist), and no named alternative such as reusing test_suite_list to check for an existing suite first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_suite_listTest suite listARead-onlyIdempotentInspect
List the authenticated user's test suites. Pass suiteId to fetch a single suite together with its ordered items (tests + plans). Pass parentSuiteId to list only that suite's direct children; omit both to list every suite.
| Name | Required | Description | Default |
|---|---|---|---|
| suiteId | No | Fetch this single suite and include its items (tests + plans) | |
| parentSuiteId | No | List only suites whose parent is this id (use '' or omit for all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so safety is covered. The description adds behavioral value beyond that by disclosing what suiteId returns (an ordered set of items: tests + plans) and what parentSuiteId scopes to. It stops short of mentioning pagination or result limits, which would be the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, each earning its place, with the default behavior front-loaded before the two parameter-driven modes. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only listing tool with no output schema, the description covers scope and return content adequately. It does not address pagination or result volume, which is the only meaningful omission for a list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds semantics the schema does not: that suiteId's result includes ordered items, and that omitting both parameters lists every suite. The interaction between the two parameters is clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the authenticated user's test suites') and then enumerates the three distinct modes of operation, so an agent can tell exactly what the tool returns in each case. It is clearly separable from siblings like test_suite_create, test_suite_add_item, and test_suite_run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps each parameter to a usage mode: suiteId for a single suite with items, parentSuiteId for direct children, and omitting both to list everything. This is a complete when-to-use-which-mode guide with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_suite_runTest suite runAInspect
Run every test in a suite (and its plans + one level of child suites) SEQUENTIALLY on a device. Returns the run id immediately — the run executes in the background. Poll test_suite_run_status(runId) for progress and the rollup report.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional label for this run | |
| udid | Yes | UDID of the device to run all resolved tests on | |
| suiteId | Yes | Suite id to execute |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, and the description adds real context beyond them: execution is sequential, non-blocking, and returns a run id immediately rather than results. It doesn't cover permissions, device-state side effects, or failure behavior, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, front-loaded with the action and scope before the async return behavior and the follow-up polling call. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async fire-and-forget run tool with no output schema, the description supplies what the agent needs: what runs, how it runs, what is returned, and how to follow up. It omits auth requirements and behavior on partial failure, which would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics for suiteId by explaining that the suite is resolved to include plans and one level of child suites, and ties udid to where the tests execute. The optional 'name' label is not mentioned, so it isn't a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run every test in a suite') and precisely defines scope: the suite plus its plans plus one level of child suites, executed SEQUENTIALLY on a device. That scope detail distinguishes it from siblings like test_suite_run_status and flow_replay_start without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames the async workflow: the run happens in the background and the agent must poll test_suite_run_status(runId) for progress and the rollup report. It gives no explicit when-not or comparison to other run/execution siblings (e.g., flow_replay_start), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_suite_run_statusTest suite run statusARead-onlyIdempotentInspect
Poll a suite run. Returns the run aggregate (status, passed/failed test counts) plus a TestRail-style rollup: per-test status + step counts, an overall summary, and component-step attribution (componentAttributionAvailable is false until the M2 attribution column lands).
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | Run id returned by test_suite_run |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the read-only, idempotent, non-destructive profile, so the bar is lower. The description adds real value by disclosing the return payload (run aggregate, per-test status, step counts, summary) and a forward-looking caveat that component attribution is unavailable until the M2 column lands.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, no filler. The second sentence is dense but every clause describes a distinct part of the returned data, so it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return values, and it does so thoroughly, including the attribution caveat. The only gap is the absence of polling/termination guidance, which is minor for a read-only status tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (runId) with 100% schema description coverage, which already documents that it comes from test_suite_run. The description adds no additional meaning about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (poll) and resource (suite run), and describes the payload it returns (run aggregate, per-test rollup). It is distinguishable from test_suite_run (which starts a run), though it never names that sibling explicitly to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Poll a suite run' implies the polling context, and the caveat about componentAttributionAvailable gives a data-freshness warning. However, there is no explicit guidance on when to call this versus test_suite_run, nor on polling cadence or when to stop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tms_gap_reportTms gap reportInspect
Where the chain TMS test case -> automation -> run -> result is broken for this user: tests with no TMS case, links whose case went missing or moved, runs that carry no case link, linked runs not yet written back to the TMS, and mapped cases with no recent run. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window for runs in days, default 30 |
tvos_focustvOS focusAInspect
Apple TV only. Move focus to the element whose label or accessibility identifier matches label, stepping the focus ring until it holds focus, then press Select unless select:false. The TV equivalent of tapping by label — no coordinates, and it reaches an element that is not yet on screen (a coordinate cannot). Read ios_page_source for the label to pass; a home-screen tile carries the app in its label="…". Remote keys (arrows, menu, home, playpause) go through ios_tv_button; type into a focused field with ios_tv_text.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Apple TV UDID or name | |
| label | Yes | Label or accessibility identifier of the element to focus | |
| select | No | Press Select once focused (default true); false just moves focus |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive. The description adds real behavioral detail beyond them: it steps the focus ring until focus holds, presses Select by default unless select:false, and is Apple TV-only. It does not describe failure behavior when no matching label exists, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the platform constraint then the core action, followed by the alternative-routing tail. Dense but nearly every clause carries actionable information; the comparison and routing sentences are justified for a fleet of near-sibling tvOS/ios tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fully covers the tool's contract: platform scope, mechanism, default behavior of select, and how to source the label. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema: where to obtain the `label` value (ios_page_source, home-screen tile label="…") and that label matches either a label or an accessibility identifier, plus the practical effect of select:false.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: move focus to the element matching `label` on Apple TV, and clarifies it steps the focus ring until focus holds. It immediately distinguishes itself from siblings like ios_tap_by_label (coordinate/label tap) and tvos_select by describing the focus-ring mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not and routes to alternatives: remote keys go through ios_tv_button, typing goes through ios_tv_text, and the label value is read from ios_page_source. It also states the key precondition that it reaches elements not yet on screen, which a coordinate tap cannot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tvos_selecttvOS selectAInspect
Apple TV only. Select the element at a screen coordinate: move the focus ring to the smallest focusable element under (x,y) and press the remote Select. Take the coordinate from ios_page_source (its (cx,cy) centre) or the [focused] flag — NOT eyeballed from a screenshot. A point over non-focusable background is an error, not a near miss, so read page source first. Pass select:false to move focus there WITHOUT clicking (e.g. to line up a long-press via ios_tv_button). For selecting by name instead of coordinate, use tvos_focus.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X in screen points, from ios_page_source | |
| y | Yes | Y in screen points, from ios_page_source | |
| udid | Yes | Apple TV UDID or name | |
| select | No | Press Select once focused (default true); false just moves focus |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, but the description adds behavior the annotations do not: focus moves to the smallest focusable element under the point before Select is pressed, a point over non-focusable background is an error rather than a near miss, and select:false suppresses the click. Only missing detail is any return/confirmation behavior, which is minor here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the scope ('Apple TV only') and the core action, then sequences prerequisite, error behavior, and alternatives. No sentence is filler; each carries a distinct constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is needed for a fire-and-forget input tool, and the description covers prerequisites (read page source first), failure semantics (background = error), the non-clicking variant, and the name-based alternative. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; however the description adds real meaning beyond the schema by explaining why select:false exists (to line up a long-press via ios_tv_button) and by reinforcing that x/y must come from page source rather than visual estimation. It adds context the schema's terse field descriptions do not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (select) and resource (element at a screen coordinate) scoped to Apple TV, and explicitly distinguishes itself from the sibling tvos_focus ('For selecting by name instead of coordinate'). An agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and how: derive the coordinate from ios_page_source (cx,cy) or the [focused] flag, not from a screenshot; use select:false to move focus without clicking for a subsequent long-press; use tvos_focus for name-based selection. Conditions and alternatives are all named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
visual_compareVisual compareARead-onlyIdempotentInspect
Compare two screenshots — a baseline/expected capture and a live/current capture of (nominally) the same screen — using a perceptual pixel-diff. Returns the similarity score and changed-pixel count as text, AND returns the baseline, live, and diff images as images you can view directly, so YOU judge whether any flagged difference is a real regression (layout shift, missing/broken element, wrong color/theme, wrong or garbled text, unexpected new content) or just benign noise (dynamic content like timestamps/ads/carousels, anti-aliasing, rendering noise) — this tool does not make that call for you. Provide either two raw base64 images, or a review_id (from list_visual_reviews) to pull a stored baseline instead of re-fetching it.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Optional short label for this comparison (e.g. flow/step name), for log correlation only. | |
| review_id | No | Instead of baseline_image_base64, pull the stored baseline image from a pending review (from list_visual_reviews) and compare it against live_image_base64. | |
| live_image_base64 | Yes | The live/current screenshot to compare against the baseline, raw base64 (no "data:" prefix). | |
| baseline_image_base64 | No | The baseline/expected screenshot, raw base64 PNG or JPEG (no "data:" prefix). Omit if using review_id instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: it discloses both return channels (similarity score + changed-pixel count as text, plus baseline/live/diff images) and, crucially, states the tool does NOT make the regression call and that the agent must judge. It even enumerates real regressions vs benign noise, which is exactly the context an agent needs before deciding how to act.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the return shape, and every clause is substantively useful. It is dense — a long single paragraph with heavy parentheticals and em-dashes — so it sacrifices some scannability, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so fully: it names the score, the changed-pixel count, and the three images returned. Combined with the input-mode explanation and the explicit 'you judge' framing, an agent has everything needed to call it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter baseline is 3. The description earns above baseline by clarifying the either/or relationship between baseline_image_base64 and review_id and giving the rationale ('instead of re-fetching it'), which reinforces how the two optional paths interact with the required live_image_base64.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) and resource (two screenshots: baseline/expected vs live/current) plus the mechanism (perceptual pixel-diff). It distinguishes itself from siblings by naming list_visual_reviews as the source of a stored baseline, so an agent can place it in the visual-review workflow without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames the comparison context and spells out the two input modes (two raw base64 images vs a review_id from list_visual_reviews). It stops short of explicitly contrasting against adjacent siblings like get_visual_review or resolve_visual_review, so the when-vs-alternatives guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
visual_tolerance_resetVisual tolerance resetADestructiveInspect
Forget what earlier approve/reject verdicts taught the visual check for ONE step: the screen regions it learned to ignore and the relaxed similarity threshold. The step goes back to the global threshold with no ignored regions, and starts learning afresh from future verdicts. Pass any review_id belonging to that step (any status). Use when a review shows a learnedTolerance note and the ignored regions or relaxed threshold are hiding a real change. Owner-scoped to your account.
| Name | Required | Description | Default |
|---|---|---|---|
| review_id | Yes | Any review id for the step (from list_visual_reviews) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds what is actually destroyed (learned ignored regions and the relaxed threshold), that the step reverts to the global threshold, that it re-learns from future verdicts, and that it is owner-scoped. That is exactly the added context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first clause, and the when-to-use and scoping notes follow. There is mild redundancy between "forget what earlier verdicts taught" and "starts learning afresh from future verdicts," but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with no output schema, the description covers effect, trigger condition, and ownership scope, which is sufficient to call it correctly. It does not describe the response shape, but with no output schema that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents review_id. The description only adds that any status of review id works and that it must belong to the step, a marginal clarification over the schema's own text. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it forgets the learned ignored regions and relaxed similarity threshold for ONE step of the visual check. This is concrete enough that an agent knows exactly what state changes, though it never names a specific sibling (e.g. resolve_visual_review or get_visual_review) to anchor the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when a review shows a learnedTolerance note and the ignored regions or relaxed threshold are hiding a real change" gives a clear triggering condition. There is no explicit when-not guidance or named alternative (e.g. when to prefer resolve_visual_review instead), so it stops short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_backWeb backAInspect
Go back one history entry in the DESKTOP grid browser (by pageId). Not a device — for a phone or tablet use webpage_back.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the agent knows this mutates navigation state non-idempotently. The description adds the desktop-scope constraint, but says nothing about what happens at the start of history (no prior entry) or what the call returns. That is a modest addition on top of structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, with the operation and its scope front-loaded and the routing caveat immediately after. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter navigation tool with no output schema and no nested objects, the description covers what an agent needs to select and call it, including the sibling disambiguation. It stops short of describing failure behavior when there is no history entry to go back to.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter at 100% schema coverage, where the schema itself documents pageId as 'Page ID from web_navigate'. The description only echoes 'by pageId' and adds no format, origin, or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('go back one history entry in the DESKTOP grid browser') and immediately scopes it against the device sibling webpage_back. An agent can distinguish web_back from webpage_back without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance in both directions: use this for the desktop grid browser, and 'Not a device — for a phone or tablet use webpage_back.' The when-to-use and the alternative are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_clickWeb clickAInspect
Click an element by CSS selector in the DESKTOP grid browser (by pageId). NOT a device — to tap something on a real phone or tablet use webpage_click (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate | |
| selector | Yes | CSS selector of the element to click |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true and idempotentHint=false, so the agent knows this is a non-idempotent, non-destructive, open-world interaction. The description adds only surface/routing context — it says nothing about what happens when the selector matches nothing, whether the element is scrolled into view or waited for, or what a click returns. Useful but not rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero padding, and the positive scoping (desktop grid, by pageId) is front-loaded before the negative routing clause. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter click tool with full annotation coverage and no output schema, the description supplies the identity and disambiguation an agent needs. It is slightly short of complete because it omits failure behavior (missing selector, non-interactable element) and whether an implicit wait occurs, but nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: pageId is documented as 'Page ID from web_navigate' and selector as 'CSS selector of the element to click'. The description restates both without adding format, syntax, or edge-case guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (click), the target (element by CSS selector), and the exact surface it acts on (DESKTOP grid browser, addressed by pageId). It also explicitly names the sibling it is not (webpage_click) and why, so an agent can disambiguate without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not (NOT a device — real phone or tablet) and routes to the named alternative webpage_click with its addressing key (udid). This is a complete selection rule, not an implied one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_closeWeb closeAIdempotentInspect
Close the DESKTOP grid browser session (by pageId) and release the grid node. Always call this when done. Not a device — a phone or tablet browser needs no such call, since the webpage_* tools hold no grid node.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true and openWorldHint=true, so safety semantics are covered. The description adds real value beyond them by disclosing the grid-node lifecycle (the session holds a grid node that must be released) and the mobile-vs-desktop distinction, though it says nothing about what happens to page data or an already-closed pageId.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and resource, then adds the two constraints that matter, in three tight clauses with no filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter cleanup tool with full annotations and no output schema, the description covers purpose, mandatory timing, and the mobile exclusion. The only unaddressed corner is failure behavior (invalid or already-closed pageId), which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents pageId as coming from web_navigate. The description's 'by pageId' only echoes that linkage, adding no new format, sourcing, or validity detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource with scope: 'Close the DESKTOP grid browser session (by pageId) and release the grid node.' It explicitly separates this desktop-grid session from the device-based webpage_* tools, so an agent can place it without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both when-to-use ('Always call this when done') and when-not ('Not a device — a phone or tablet browser needs no such call'), and names the tool family that does not require it. Nothing about selection 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.
web_console_messagesWeb console messagesARead-onlyIdempotentInspect
Console output captured from the DESKTOP grid browser page (by pageId) since it opened, including page errors. Buffered from load — nothing is lost by asking late. NOT a device — for a real phone or tablet use android_devtools_console_logs or ios_safari_console_logs (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Case-insensitive substring filter, e.g. "error" | |
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: output is buffered from page load and nothing is lost by querying late, and page errors are included. It doesn't cover ordering or truncation, but it clearly exceeds the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool returns, then the buffering guarantee, then the disambiguation. No filler; each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with no output schema, the description covers what is returned (console output and page errors), the retention behavior (buffered since load), and the scope boundary versus device alternatives. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (pageId, filter) are already documented in the schema, establishing the baseline of 3. The description only reinforces pageId scoping and mentions errors indirectly; it adds no syntax or semantics for the filter parameter beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: console output from the DESKTOP grid browser page, keyed by pageId, including page errors. It explicitly contrasts itself with the android/ios console-log siblings, so an agent can distinguish it from nearby tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not clause ("NOT a device") and names the exact alternatives to use instead for phones/tablets (android_devtools_console_logs, ios_safari_console_logs, by udid). The condition selecting this tool versus those is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_dragWeb dragAInspect
Drag one element onto another in the DESKTOP grid browser (by pageId) — reorderable lists, kanban columns, file drop targets. NOT a device — there is no webpage_drag; on a real phone or tablet use device_swipe / device_drag_drop (Android) or ios_drag_drop (iOS), by udid.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | CSS selector of the drop target | |
| from | Yes | CSS selector of the element to drag | |
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the mutation/non-idempotent profile is covered structurally. The description adds the environment scoping (desktop grid browser vs. real device) and concrete use-case targets, but says nothing about failure modes, whether hidden/offscreen sources are scrolled into view, or timing/intermediate hover steps that drag operations often need.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the primary action front-loaded and the disambiguation trailing. Every clause earns its place; the em-dash-heavy phrasing is slightly compressed but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter drag tool with no output schema, the definition supplies the environment, the disambiguation from sibling drag tools, and representative targets. Only failure/edge behavior is absent, which is a minor gap given annotations carry the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — 'from' (CSS selector of element to drag), 'to' (CSS selector of drop target) and 'pageId' (from web_navigate) are all documented in the schema. The description only reinforces the pageId scoping, so it adds little beyond the schema and the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (drag) and resource (element onto another) plus the operating context (DESKTOP grid browser, by pageId). It names its typical targets (reorderable lists, kanban columns, file drop targets), so an agent can distinguish it from device_drag_drop, ios_drag_drop and device_swipe 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly excludes the device case ('NOT a device — there is no webpage_drag') and routes to named alternatives (device_swipe / device_drag_drop for Android, ios_drag_drop for iOS) with the discriminating key ('by udid'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_evaluateWeb evaluateADestructiveInspect
Run JavaScript in the DESKTOP grid browser page (by pageId) and return the result. Not a device — for a phone or tablet use android_devtools_evaluate or ios_safari_evaluate (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate | |
| script | Yes | JavaScript expression to evaluate (e.g. "document.title" or "() => window.location.href") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true and idempotentHint=false, so the agent knows this is an arbitrary-code, state-mutating, non-idempotent operation. The description adds the platform scope (desktop page vs device) but says nothing about execution side effects, timeouts, or what happens if the script mutates the page. It adds some value beyond the annotations, but not rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero filler, and the core purpose plus its platform scope are front-loaded before the alternative-tool routing. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two fully documented parameters and no output schema, the description plus schema is nearly sufficient: the return value is the script's result. Minor gaps remain around evaluation semantics (sync vs async expressions, serialization of non-primitive results, timeouts), but these are secondary for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema already explains pageId (from web_navigate) and the script format with examples. The description's 'by pageId' merely echoes the schema without adding format, constraint, or return-shape detail. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (run JavaScript in the desktop grid browser page, keyed by pageId) and explicitly contrasts it with the device-targeted evaluate tools. An agent can distinguish it from android_devtools_evaluate and ios_safari_evaluate 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: this is for the DESKTOP grid browser, and for a phone or tablet the agent should use android_devtools_evaluate or ios_safari_evaluate by udid. The when-to-use-vs-alternative condition is stated outright rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_fill_formWeb fill formAInspect
Fill several fields at once in the DESKTOP grid browser (by pageId). One call instead of a web_type per field — noticeably faster on a long form, and it reports which field failed. NOT a device — there is no webpage_fill_form; on a real phone or tablet fill fields one at a time with webpage_type (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Fields to fill, in order | |
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=true). The description adds behavior beyond them: batch execution with per-field failure reporting ('it reports which field failed'), which tells the agent how partial failures surface. It doesn't discuss authentication or the exact failure payload, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: action+scope first, then the speed/behavioral rationale, then the disambiguation warning. Front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param batch tool with full schema coverage and annotations covering safety, the description gives enough to select and invoke correctly. Minor caveat: it asserts 'there is no webpage_fill_form' while webpage_fill_form appears in the sibling list, which could momentarily confuse an agent about which batch tool exists for devices.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so pageId ('Page ID from web_navigate') and fields ('in order') are already documented. The description only paraphrases pageId and the batch nature of fields, adding no selector syntax or field-format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Fill several fields at once in the DESKTOP grid browser (by pageId).' It explicitly contrasts itself with web_type and webpage_type, so an agent can place it against siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a direct when-to-use ('One call instead of a web_type per field ... faster on a long form') and names the alternative plus its condition ('on a real phone or tablet fill fields one at a time with webpage_type (by udid)'). No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_forwardWeb forwardAInspect
Go forward one history entry in the DESKTOP grid browser (by pageId). Not a device — for a phone or tablet use webpage_forward.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, and the description's navigation semantics are consistent with them (no contradiction). The description adds the desktop-vs-device scope distinction but says nothing beyond annotations about behavior such as what happens when no forward history exists or whether the call blocks until load.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the primary purpose plus the disambiguation clause are both front-loaded in the first line. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool with annotations covering the safety profile, the description is nearly sufficient: scope and sibling routing are covered. It stops short of describing the edge case where no forward entry exists in the history stack.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single pageId parameter is already documented as 'Page ID from web_navigate'. The description only restates that the operation is keyed by pageId, adding no format, provenance, or constraint detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (go forward) and resource (one history entry) and scopes it to the DESKTOP grid browser via pageId. It also explicitly names the sibling it is not (webpage_forward for phone/tablet), so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: this tool is for the desktop grid browser, and for a phone or tablet the agent should use webpage_forward instead. That is a named alternative plus the condition that selects it, which is exactly the top-bar guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_get_attributeWeb get attributeARead-onlyIdempotentInspect
Read one attribute of an element in the DESKTOP grid browser (by pageId) — href, value, aria-label, data-*, anything. Not a device — for a phone or tablet use webpage_get_attribute.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate | |
| selector | Yes | CSS selector of the element | |
| attribute | Yes | Attribute name, e.g. href / value / aria-label |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety bar is covered. The description adds useful context — desktop browser scope, single-attribute read semantics, and example attributes including data-* — but does not cover failure modes when the element or attribute is absent. Credit for adding platform and scope context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the first front-loads purpose and scope, the second handles sibling routing. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with full annotation coverage and 100% schema description coverage, the definition is nearly complete; no output schema means return format need not be explained. The only minor gap is not stating behavior when the element or attribute is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents pageId, selector, and attribute. The description adds 'data-*, anything' beyond the schema's example list and reinforces the pageId scope, but provides no syntax, format, or edge-case detail. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read'), resource ('one attribute of an element'), and scope ('DESKTOP grid browser (by pageId)'), and explicitly distinguishes itself from the sibling webpage_get_attribute. An agent can identify the exact operation 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes platform choice: 'for a phone or tablet use webpage_get_attribute.' The condition that selects the alternative is stated, leaving nothing to inference for the main sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_get_sourceWeb get sourceARead-onlyIdempotentInspect
Full HTML source of the DESKTOP grid browser page (by pageId). Not a device — for a phone or tablet use webpage_get_dom (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the return payload is the *full* HTML source (as opposed to a DOM snapshot), which matters since there is no output schema. It omits size/pagination or auth caveats, so it falls 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero waste. The scope statement is front-loaded and the disambiguation/alternative follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description supplies the essentials: what is returned (full HTML source), how it is keyed, and which sibling to use on other platforms. Only minor gaps (source size/truncation, whether a page must be open) remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and pageId is already documented as coming from web_navigate; the description only restates '(by pageId)'. With one fully documented parameter, the schema does the heavy lifting and baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (full HTML source of the desktop grid browser page) and identifies the keying parameter (pageId). It explicitly contrasts itself with the sibling webpage_get_dom, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit when-not rule ('Not a device') plus the alternative to use instead ('for a phone or tablet use webpage_get_dom (by udid)'), including that alternative's own keying parameter. The desktop/mobile routing decision is fully spelled out rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_get_textWeb get textARead-onlyIdempotentInspect
Read visible text from the DESKTOP grid browser (by pageId) — one element, or the whole page when no selector is given. This is how you ASSERT on what is actually on screen. Not a device — for a phone or tablet use webpage_get_text (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate | |
| selector | No | CSS selector; omit for the whole page body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds useful context beyond that — that it reads only VISIBLE text and that it is the assertion primitive for on-screen content. It stops short of describing error behavior or how large/whole-page output is bounded, keeping it below 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences: scope first, then purpose, then the sibling exclusion. Every clause earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only text-extraction tool with full schema coverage, rich annotations, and no output schema, the description supplies the remaining essentials: target surface, scope, assertion purpose, and device-vs-desktop routing. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both pageId ("Page ID from web_navigate") and selector ("CSS selector; omit for the whole page body") are already documented. The description reinforces the selector-omission behavior but adds no new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (read visible text), the exact target surface (the DESKTOP grid browser, by pageId), and the scope (one element or the whole page). It also explicitly separates itself from webpage_get_text, so an agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ("This is how you ASSERT on what is actually on screen"), the selector-omitted case for whole-page reads, and a clear when-not/alternative ("Not a device — for a phone or tablet use webpage_get_text (by udid)"). Nothing 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.
web_hoverWeb hoverAInspect
Hover an element in the DESKTOP grid browser (by pageId) — the way to open a hover menu or reveal a tooltip before clicking. Not a device — for a phone or tablet use webpage_hover.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate | |
| selector | Yes | CSS selector of the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (not read-only, non-destructive, openWorld, non-idempotent), so the bar is lower. The description adds genuine behavioral context beyond that: hovering is the mechanism for surfacing hover menus/tooltips as a precursor to a click. It doesn't mention whether hovering triggers JS state changes or any wait/timeout behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler: the action and scope come first, then the purpose clause, then the disambiguation clause. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter interaction tool with no output schema and annotations covering safety, the description supplies everything needed: action, target, intent, and the sibling it is not for. Nothing required for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both params are already documented (pageId 'from web_navigate', selector as a CSS selector). The description only restates 'by pageId' and adds no syntax or format detail. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (hover) plus the resource and scope (an element in the DESKTOP grid browser, addressed by pageId). It explicitly contrasts itself with the sibling webpage_hover for phones/tablets, so an agent can pick the right tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('to open a hover menu or reveal a tooltip before clicking') and names the alternative (webpage_hover) with the condition that selects it ('for a phone or tablet'). Nothing 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.
web_network_requestsWeb network requestsARead-onlyIdempotentInspect
Network requests made by the DESKTOP grid browser page (by pageId) since it opened, with status codes. Buffered from load. Use filter to narrow to an API path. NOT a device — for a real phone or tablet use android_devtools_capture_network or ios_safari_capture_network (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Case-insensitive substring match on the URL | |
| pageId | Yes | Page ID from web_navigate | |
| failedOnly | No | Only show responses with status >= 400 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower; the description still adds useful behavior, namely that results are buffered from page load and include status codes. It doesn't state retention limits, pagination, or whether entries accumulate across navigations, which is the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences; the scope and pageId requirement come first, then the filter hint, then the negative case with alternatives. Zero filler and appropriately sized for a 3-param read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the key return semantics (requests with status codes, accumulated since page load) and the scoping prerequisite (pageId). It stops short of describing result shape or volume limits, a minor gap for a tool whose annotations already confirm a safe read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so filter, pageId, and failedOnly are already documented in the schema (substring match, page ID from web_navigate, status >= 400). The description only re-frames `filter` as narrowing to an API path, adding marginal value beyond the structured fields; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (network requests by pageId), the scope (since the DESKTOP grid browser page opened, buffered from load), and the payload detail (status codes). It explicitly distinguishes itself from device-level captures, so an agent can separate it from session_network_logs or the android/ios capture tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (page made by the desktop grid browser, scoped by pageId), a narrowing hint ('Use `filter` to narrow to an API path'), and a clear when-NOT-to-use with named alternatives (android_devtools_capture_network / ios_safari_capture_network by udid). Nothing 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.
webpage_backWebpage backAInspect
Navigate the device browser back one entry in its session history (history.back()) — works on BOTH iOS Safari and Android Chrome. VERIFIES the URL actually changed rather than trusting the call being accepted — on iOS, straight after ios_safari_navigate, history.back() can be accepted and move nothing. When that happens it falls back to navigating straight to the URL this server last drove the page FROM (tracked internally), and reports which path worked via via ("history" or "navigate"). Returns navigated:false with a reason — never a false navigated:true — when neither path moved the page, e.g. because there is nothing tracked to go back to.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, but leave the verification and fallback behavior undocumented. The description adds substantial context beyond annotations: it verifies the URL actually changed, falls back to the last FROM URL tracked internally, reports the path via 'via' ('history' or 'navigate'), and promises navigated:false with a 'reason' rather than a false positive. This is rich behavioral detail that structured fields do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and then unpacks the iOS-specific fallback behavior. The description is dense and uses all caps for emphasis, but each sentence carries behavioral weight and avoids repetition of schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description thoroughly explains return fields (navigated, reason, via) and both the primary and fallback navigation paths. For a tool with tricky platform-specific history behavior, an agent has enough information to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each of the four parameters documented in the schema itself. The description adds no parameter-level meaning, such as how pageId is auto-picked or when socket matters on Android, so the baseline of 3 is appropriate when the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Navigate the device browser back one entry in its session history (history.back())', with explicit platform scope for iOS Safari and Android Chrome. It is clear what the tool does, but it does not directly distinguish itself from sibling back tools such as web_back, session_back, or webpage_forward.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Mentions the iOS case where history.back() may be accepted but ineffective right after ios_safari_navigate, which gives useful context for when the fallback applies. However, it provides no explicit when-to-use versus alternatives routing for sibling tools like web_back, session_back, or webpage_forward. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_cdp_commandWebpage CDP commandADestructiveInspect
Send a raw DevTools-protocol command to the browser page on a device and return its reply — the escape hatch for capabilities no dedicated tool wraps yet (Emulation, Performance, CSS, Animation, DOM mutation, …). Works on BOTH iOS Safari and Android Chrome, auto-detected from the udid. method is "Domain.command" (e.g. "Emulation.setGeolocationOverride"); params is that command's parameter object. Scope is the BROWSER — this reaches web content only, never the device or native apps. Prefer a dedicated tool when one exists: they handle setup ordering, lifecycle and teardown that a bare command does not. IMPORTANT, iOS: the two engines do NOT implement the same protocol — Android is full CDP, iOS is WebKit's dialect. Chrome-only domains fail with -32601 "domain was not found" (Accessibility, Emulation, and Page.captureScreenshot are all absent on iOS), and a *.enable on iOS reports success without proving the domain exists, so never treat it as a capability probe — probe with a real method.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| method | Yes | Protocol method as "Domain.command", e.g. "Emulation.setDeviceMetricsOverride" | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| params | No | The command's parameter object; omit for commands that take none | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/openWorld/non-idempotent but say nothing about dialect or failure modes. The description adds high-value behavior: iOS uses WebKit's dialect, Chrome-only domains fail with -32601, and a `*.enable` on iOS reports success without proving the domain exists, so it must not be used as a capability probe. That is exactly the kind of operational context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing guidance, then the platform-specific pitfalls. The density is high and every sentence carries an actionable constraint (scope, precedence, error code, probe warning); nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, open-world, destructive escape hatch with no output schema, the description covers what the return is ('its reply'), which platforms it spans, the auto-detection behavior, and the failure modes. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description goes further by spelling out that `method` is 'Domain.command' with a concrete example and that `params` is that command's parameter object (omit when none), plus the caveat that method names differ across the two engines. It adds meaning about parameter validity beyond the schema, though it does not document pageId or socket.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Send a raw DevTools-protocol command to the browser page on a device and return its reply') and immediately positions itself as the escape hatch for capabilities no dedicated tool wraps. An agent can distinguish it from siblings like android_devtools_evaluate or ios_safari_evaluate without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use this only for capabilities no dedicated tool wraps, and 'Prefer a dedicated tool when one exists' because dedicated tools handle setup ordering, lifecycle and teardown. It also states the boundary of applicability (BROWSER scope only, never device or native apps) and the iOS-vs-Android protocol difference, which are the conditions that decide whether calling it will work at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_clear_browsing_dataWebpage clear browsing dataADestructiveIdempotentInspect
Clear cookies, localStorage, sessionStorage and/or the Cache Storage API for the page in the device browser (iOS Safari or Android Chrome, auto-detected). USE THIS to get a genuinely clean session between test cases: webpage_reload deliberately PRESERVES localStorage, so a reload keeps you logged in and carries app state into the next case. Every scope is VERIFIED by re-reading it afterwards and the result reports before/after counts, so a scope that could not be cleared says so instead of being assumed. On iOS cookies are removed one at a time through the Web Inspector (Page.deleteCookie), which reaches HttpOnly cookies that document.cookie cannot; on Android Network.clearBrowserCookies clears them in one call. HTTP cache: Android clears it via Network.clearBrowserCache (the browser reports no count, so it is returned as issued rather than verified); iOS has no Web Inspector equivalent, so only the Cache Storage API is cleared there and the HTTP cache is reported unsupported rather than silently skipped. DOES NOT LOG YOU OUT OF HTTP BASIC AUTH. Those credentials live in the browser credential store, which is none of these scopes — verified on qa.tms-hmpu.com, where an authenticated session shows 0 cookies, 0 localStorage and 0 sessionStorage. To force a Basic-auth challenge again, terminate the browser (ios_terminate_app com.apple.mobilesafari) and navigate afresh.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| scopes | No | What to clear (default: ["all"]). "all" = every scope this platform supports. | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (destructiveHint true, idempotent, openWorld), and the description adds substantial context beyond them: per-scope verification by re-reading with before/after counts, platform-specific mechanisms (Page.deleteCookie one-at-a-time on iOS reaching HttpOnly cookies vs Network.clearBrowserCookies on Android), HTTP cache cleared only on Android with iOS reported unsupported rather than silently skipped, and the Basic-auth credential-store caveat with real evidence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the reload contrast are front-loaded, and despite its length every sentence carries distinct operational value (verification semantics, platform differences, unsupported cases, auth caveat). It is dense rather than padded, though the volume of detail is close to the ceiling for a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive, cross-platform tool with no output schema, yet the description explains the return shape (before/after counts, unsupported scopes reported), platform behavior differences, and a non-obvious limitation about Basic auth. An agent has everything needed to invoke and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (udid, pageId, scopes, socket) is already documented in-schema, so the baseline is 3. The description reinforces scopes ('every scope is VERIFIED') and the default-all behavior but adds no enum or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Clear) plus the exact scopes it operates on (cookies, localStorage, sessionStorage, Cache Storage API) scoped to 'the page in the device browser'. It names platforms and auto-detection, and implicitly differentiates itself from the narrower sibling webpage_clear_cookies. An agent can identify the resource and action 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('get a genuinely clean session between test cases') and names the alternative it is contrasted with: webpage_reload, which deliberately PRESERVES localStorage and keeps you logged in. It also states a critical boundary — it does NOT log out of HTTP Basic auth — and tells the agent the workaround (terminate Safari and navigate afresh).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_clear_cookiesWebpage clear cookiesADestructiveIdempotentInspect
Expire all NON-HttpOnly cookies visible to the current page origin in the device browser (iOS Safari or Android Chrome, auto-detected), via document.cookie. PREFER webpage_clear_browsing_data: it reaches HttpOnly cookies (which this cannot — and a session cookie is usually exactly the HttpOnly one you wanted gone), verifies the result by re-reading the cookie jar, and can clear localStorage/sessionStorage/caches in the same call. This tool remains for callers that specifically want the document.cookie behaviour. Returns { cleared } — the count of cookies expired, NOT verified afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true but say nothing about coverage limits. The description adds the crucial behavioral facts: HttpOnly cookies are out of reach, the result is not verified afterward, and 'cleared' is a count rather than a confirmation. It even warns that the session cookie you likely want gone is usually the HttpOnly one.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Scope and the primary recommendation are front-loaded, and every sentence contributes routing or behavioral information. The parenthetical aside about session cookies is slightly editorial and the sentence runs long, but it adds real decision value rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, unverifiable, domain-scoped operation with no output schema, the description covers the return shape ({ cleared } with its count-not-verification caveat), the platform auto-detection, and the limitation set. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (udid, pageId, socket, platformVersion all documented), so the schema carries parameter semantics; the description adds no param-level detail beyond implying page-origin scoping via pageId. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb (expire), the exact resource subset (NON-HttpOnly cookies), the scope (current page origin), the platforms (iOS Safari / Android Chrome, auto-detected), and the mechanism (document.cookie). It explicitly positions itself against the sibling webpage_clear_browsing_data, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit directive ('PREFER webpage_clear_browsing_data') with three concrete reasons (reaches HttpOnly, verifies the jar, clears storage/caches) and then states the narrow condition under which this tool is still the right choice. When/when-not/alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_clickWebpage clickAInspect
Click an element in the device browser, by CSS selector or by a ref from a page-elements listing — works on BOTH iOS Safari and Android Chrome, auto-detected from the udid. Scrolls the element into view, waits for it to stop moving, and checks it is actually clickable — visible, non-zero-size, enabled, and not covered by anything — retrying until timeoutMs before it gives up. Then taps its center. On iOS the DEVICE taps its own screen at that position, so the page receives a real, fully trusted touch — pointerdown, touchstart, mousedown and click, exactly as from a finger — which also satisfies sites that gate on trusted input. On Android the tap is delivered as a TOUCH through the browser, so elements listening for pointer events respond as well as those listening for click. Falls back to mouse events, then a plain .click(), if a step is unsupported, and the response reports which was used via via. ERRORS rather than reporting success when the element never becomes clickable; pass force:true to skip the checks and dispatch at its coordinates anyway — which works for anything that still occupies a box, but NOT for a display:none or zero-size element, where there is no point to aim at and force fails too. When a selector matches several elements the first VISIBLE one wins, not the first in document order. This is COORDINATE-based. Android events are synthesized by the browser (isTrusted:false); iOS taps are real device input (isTrusted:true) whenever via comes back as "nativeTap".
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a page-elements listing, e.g. "e12". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page. | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| force | No | Skip the clickability checks and dispatch at the element center regardless (default: false). Use only when the checks are wrong about a target you know is clickable — it restores the old behaviour, where a click on a hidden or covered element reports success without doing anything. Needs a center to aim at, so it still fails on a display:none or zero-size element; it does apply to visibility:hidden, opacity:0, pointer-events:none, disabled, off-viewport, and covered targets. | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | CSS selector for the target element. Provide this or `ref`. | |
| snapshot | No | Append a webpage_snapshot of the resulting page (actionable elements only) so you can see what the click changed without a second call (default: false) | |
| timeoutMs | No | How long to keep retrying while the element is not yet clickable (default: 5000, max: 30000) | |
| pointerType | No | How the tap is delivered. You rarely need this — the default is the best path each platform has (a real device tap on iOS, a browser touch on Android). "touch" is what a finger produces and drives elements that listen for pointer events, which many component libraries bind. On Android a touch also produces mousedown/mouseup unless a handler cancels pointerdown or touchstart — and when one does, click is suppressed too, which is when "mouse" is the way through. "mouse" sends mouse events only, and on iOS it opts OUT of the device tap in favour of the browser-level path, which delivers only mouseup+click and is not trusted. The response reports which was used via `via`. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse (only readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the description carries the real burden and does so richly: scroll-into-view + stability wait + clickability retries until timeoutMs, error-on-failure rather than false success, the trusted-vs-synthesized input distinction (isTrusted true on iOS nativeTap, false on Android), and coordinate-based delivery. This is behavioral context far beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the opening clause, but the body is a dense wall of prose that overlaps heavily with the schema's pointerType, force, and ref descriptions (the iOS/Android and `via` explanation is effectively stated twice). Every sentence is informative, yet the duplication and length keep it from being tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, high-variance cross-platform interaction with no output schema, the description covers platform differences, failure semantics, fallback chain, and where the outcome is reported (`via`). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the per-parameter descriptions are already very detailed, so baseline is 3. The description still adds semantics not in the schema — notably the first-VISIBLE-element-wins rule when a selector matches several elements, and the retry/timeout interaction — justifying a step above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (click) and resource (element in the device browser) plus the two addressing modes (CSS selector or `ref`), and scopes it to both iOS Safari and Android Chrome. An agent can distinguish this from siblings like device_tap, session_click, webpage_hover, and webpage_scroll_into_view 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance for the tricky options: pass force:true only when checks are wrong about a known-clickable target, and use pointerType:"mouse" when a handler cancels pointerdown/touchstart. It does not explicitly route the agent away from sibling tools such as device_tap or web_click, so it stops short of naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_fill_formWebpage fill formAInspect
Fill SEVERAL fields of a form in one call on the device browser — the batch form of webpage_type, and the counterpart to Playwright MCP's browser_fill_form. Works on BOTH iOS Safari and Android Chrome. Fields are filled IN ORDER inside a single browser session, which is what makes this different from calling webpage_type N times: order-dependent forms (a country select that repopulates the state list, an autocomplete that rewrites the next field) behave the way they do for a real person, and you pay one round trip instead of N. Each field takes the same target shape as webpage_type — a CSS selector or a ref from webpage_snapshot — plus text, and an optional per-field clear. On iOS each field is typed on the DEVICE keyboard so the page receives real trusted keystrokes; where that is unavailable it falls back to setting .value via the native setter and dispatching bubbling input/change (isTrusted:false), reporting via and fallbackReason PER FIELD so a degraded field is never hidden by its neighbours succeeding. exact:false on a field means the keystrokes landed but the component rewrote the value as you typed (masks, autocompletes) — that is a success, not a failure. Stops at the first failure by default, because a form is usually order-dependent and filling past a field that did not take produces a state no one asked for; pass continueOnError:true to attempt every field anyway, which is what you want when diagnosing WHICH selectors are stale. This does NOT submit the form — follow it with webpage_press_key("Enter") or webpage_click on the submit control. ONE CROSS-PLATFORM TRAP, measured on device: change fires differently. Android dispatches change on every field. iOS fires it only on a real BLUR, and the LAST field still holds focus when this returns — so its change has NOT fired, and a form that validates on change will not have seen the final field. Follow with webpage_press_key("Tab") or a click elsewhere if that matters. Also on iOS, a field filled with clear:true emits one isTrusted:false input carrying the empty value (the wipe) before the trusted keystrokes.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| clear | No | Default for every field that does not set its own `clear` (default: false) | |
| fields | Yes | Fields to fill, in the order they should be filled | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| require | No | Set to "native" to fail a field loudly when the device keyboard is unavailable, instead of silently setting .value (isTrusted:false). iOS only. | |
| continueOnError | No | Attempt every field even after one fails, instead of stopping at the first failure. Use it to find out which selectors are stale in one round trip; leave it off for order-dependent forms. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false; the description adds substantial behavior beyond them — in-order filling, trusted device keystrokes with a isTrusted:false .value fallback reported per field via `via`/`fallbackReason`, stop-at-first-failure default, exact:false semantics, and the measured iOS change/blur trap where the last field's change has not fired.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and sibling differentiation in the first sentence, and the density is largely justified by the tool's cross-platform complexity. It is very long, and the mention of a non-existent `exact` field plus the Playwright comparison are minor wastes, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the full burden and does so: it covers ordering, platform divergence, fallback reporting fields, error handling, and the required submit follow-up. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), but the description adds real meaning: it explains the per-field target shape (selector or ref from webpage_snapshot, plus text, optional per-field clear), the clear default, continueOnError behavior, and the exact:false reinterpretation. One caveat: it references a per-field `exact` property that the schema does not expose (additionalProperties:false), so the added detail slightly exceeds the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (fill several form fields in one call on the device browser) and immediately differentiates itself from siblings: it is the batch form of webpage_type and the counterpart to web_fill_form. Scope (both iOS Safari and Android Chrome, in-order within a single session) is explicit, so an agent can distinguish it from webpage_type without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: use it instead of calling webpage_type N times for order-dependent forms, and use continueOnError:true specifically when diagnosing which selectors are stale. It also names the required follow-up (this does NOT submit — follow with webpage_press_key("Enter") or webpage_click), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_forwardWebpage forwardAInspect
Navigate the device browser forward one entry in its session history (history.forward()) — works on BOTH iOS Safari and Android Chrome. Same verify-then-fallback contract as webpage_back: confirms the URL actually changed, falls back to navigating straight to the tracked next URL when the in-page call did nothing, and reports via plus a reason on genuine failure rather than a false navigated:true.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic profile (readOnly=false, openWorld=true, idempotent=false, destructive=false); the description goes well beyond them by disclosing the verify-then-fallback contract, the URL-change verification step, the fallback to the tracked next URL, and that failures surface a `via` plus `reason` instead of a false navigated:true. That is exactly the non-obvious runtime behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Effectively one dense but well-formed sentence that front-loads the action, then the portability claim, then the behavioral contract. Nothing is redundant with the title or schema, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully characterizes the response shape (navigated, via, reason) and the failure semantics, plus cross-platform scope. It leaves the return payload's exact structure and the socket/pageId selection rules unspecified, which is a minor gap for a 4-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so udid, pageId, socket and the deprecated platformVersion are already documented in the schema. The description adds no parameter-level detail (e.g., how pageId is auto-picked, or when to set socket), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Navigate the device browser forward one entry in its session history (history.forward())') and explicitly names the sibling it mirrors, webpage_back. The cross-platform note ('works on BOTH iOS Safari and Android Chrome') separates it from the web_* and ios_safari_*/android_devtools_* browser families in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear usage context: this is the forward-direction counterpart to webpage_back, and the description implies you use it to move forward in history rather than navigate to an arbitrary URL (webpage_navigate/device_navigate_url). It does not spell out explicit exclusions or when the fallback-to-direct-URL path should be preferred, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_get_attributeWebpage get attributeARead-onlyIdempotentInspect
Get one attribute (e.g. href, value, aria-label, data-*) of an element in the device browser page, by CSS selector or by a ref from a page-elements listing (iOS Safari or Android Chrome, auto-detected). value is null when the element exists but the attribute is absent. Throws only when the target itself does not resolve.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a page-elements listing, e.g. "e12". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page. | |
| name | Yes | Attribute name to read, e.g. "href", "value", "aria-label" | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | CSS selector for the target element. Provide this or `ref`. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower, and the description still adds real behavioral context: `value` is null when the element exists but the attribute is absent, and it throws only when the target itself fails to resolve. That error/null semantics is exactly the kind of detail annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool does and how to target the element, followed by the two edge-case behaviors. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by spelling out the return semantics (null value) and the throw condition, which is what an agent most needs for a single-attribute read. The only minor gap is that it does not explicitly route to sibling tools for related reads.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters (including the ref-vs-selector tradeoff and the ignored platformVersion) are already documented in the schema. The description's attribute examples and selector/ref mention merely echo that, adding no meaning beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get one attribute of an element in the device browser page) and enumerates concrete attribute examples (href, value, aria-label, data-*), which cleanly separates it from siblings like webpage_get_text or webpage_get_dom. It also discloses the platform scope (iOS Safari / Android Chrome, auto-detected).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to target the element (CSS selector or a `ref` from a page-elements listing), which is implied usage guidance, but it never names an alternative tool or states when this should be preferred over webpage_get_text, webpage_snapshot, or webpage_evaluate. No when-not conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_get_domWebpage get DOMARead-onlyIdempotentInspect
Get the rendered outer HTML of the web page open in the device browser — works on BOTH iOS (Safari, via the Web Inspector) and Android (Chrome, via CDP); the platform is auto-detected from the udid. Returns document.documentElement.outerHTML, or the outerHTML of a CSS-selector-matched element when selector is given. On iOS, Safari is launched automatically if it is not already open. Output is capped at 100 000 characters with a truncation notice. This is web-page HTML — for a NATIVE app UI hierarchy use device_page_source (Android) or ios_page_source (iOS).
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted (iOS: appIdKey.pageIdKey; Android: CDP target id) | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | Optional CSS selector — returns outerHTML of the first matching element, or null | |
| platformVersion | No | iOS only: platform version for the remote debugger (default: 17.0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial behavior beyond that: platform auto-detection from udid, automatic Safari launch on iOS, and a 100 000-character output cap with truncation notice. It stops short of noting any auth/debugger-enablement prerequisites, which is why it is not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, but it is front-loaded with the core purpose and every clause carries distinct information (platforms, return value, auto-launch, cap, sibling routing). It could be broken into shorter sentences for scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of explaining the return value (documentElement.outerHTML or selector-matched element outerHTML, with truncation) and does so, plus covers cross-platform behavior and the correct sibling for native hierarchies. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented. The description restates the selector behavior (first matching element, or null) that the schema already specifies, so it adds no meaning beyond the structured field; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the rendered outer HTML of the web page open in the device browser') and immediately scopes it to both iOS Safari and Android Chrome. It explicitly distinguishes itself from sibling tools by naming device_page_source and ios_page_source for native UI hierarchies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use (web page HTML) and a when-not with the named alternative for native app hierarchies. It does not address other potentially overlapping web-DOM siblings such as webpage_snapshot, webpage_get_attribute or webpage_evaluate, so guidance is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_get_textWebpage get textARead-onlyIdempotentInspect
Get the visible text (innerText, trimmed) of an element in the device browser page, by CSS selector or by a ref from a page-elements listing (iOS Safari or Android Chrome, auto-detected). For reading a label/status/result after an action. Throws if the target does not resolve. For full HTML use webpage_get_dom; for many elements at once use webpage_snapshot, or ios_safari_elements / android_devtools_elements.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a page-elements listing, e.g. "e12". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page. | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | CSS selector for the target element. Provide this or `ref`. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description goes beyond them by specifying the returned form (innerText, trimmed), the failure mode ("Throws if the target does not resolve"), and automatic iOS Safari / Android Chrome detection. It stops short of return-shape or pagination detail, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, front-loaded with the core action, then usage context, then failure behavior, then sibling routing. Every clause carries distinct information with no repetition of schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description explains what is returned (visible, trimmed text) and what happens on failure (throws), and it maps the adjacent tools an agent might confuse it with. For a trivial read-only scrape this leaves nothing needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains ref vs selector in depth (positional resilience, reachability). The description only names the two addressing modes, adding no format or syntax detail beyond the schema, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (get the visible innerText of a browser element) and immediately scopes it by selector or ref, with platform auto-detection. It explicitly names what it is not (webpage_get_dom for HTML, webpage_snapshot for bulk), so the agent can pick it apart from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the triggering situation ("For reading a label/status/result after an action") and routes other cases to named alternatives: full HTML to webpage_get_dom, many elements to webpage_snapshot or ios_safari_elements / android_devtools_elements. When-to-use and alternatives are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_hoverWebpage hoverAInspect
Hover the pointer over an element in the device browser page, by CSS selector or by a ref from a page-elements listing (iOS Safari or Android Chrome, auto-detected). Scrolls it into view, waits for the scroll to settle, and dispatches a mouseMoved to its center — use it to reveal hover menus/tooltips before webpage_click. Returns x/y in VIEWPORT-relative CSS pixels, the same space webpage_click reports, never document-relative. On iOS the event is isTrusted:false. Throws if the target does not resolve.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a page-elements listing, e.g. "e12". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page. | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | CSS selector for the target element. Provide this or `ref`. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false) only sketch the profile, while the description discloses the real behavioral traits: it scrolls the target into view and waits for the scroll to settle (a side effect on page scroll position), dispatches a mouseMoved to the element center, returns viewport-relative x/y matching webpage_click's coordinate space, sets isTrusted:false on iOS, and throws when the target does not resolve.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with verb+resource, then mechanics, then the usage cue and return contract; every sentence carries information. It is dense and slightly long for a single-action tool, but there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by specifying the return values (x/y in viewport-relative CSS pixels, same space as webpage_click), plus failure behavior (throws if unresolved) and platform quirks. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents `selector`, `ref`, `udid`, `pageId`, and `socket`. The description reinforces the selector-vs-ref duality and the coordinate space but adds no syntax or format detail beyond the schema, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (hover) + resource (element in the device browser page) with the targeting modes named (CSS selector or page-elements `ref`) and platforms stated (iOS Safari / Android Chrome, auto-detected). It is clearly distinguishable from siblings like webpage_click and webpage_scroll_into_view, which it references by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'use it to reveal hover menus/tooltips before webpage_click', which gives a concrete sequencing rule rather than leaving intent implicit. It does not state exclusions (e.g. when a plain click is preferable or that hovering is meaningless on touch-only targets), so it falls short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_mock_addWebpage mock addAInspect
Add (or update in place, when id matches an existing route) a mock/abort rule for browser requests on this device. mode "mock" (default) serves the given status/headers/body without the request leaving the device; mode "abort" fails it so the page sees a network error. Routes apply immediately and survive navigation. WEB CONTENT ONLY: this intercepts requests made by browser/WebView pages. Requests made by native app code are NOT intercepted and never will be by this tool. Nothing device-wide is changed and no certificate is installed — the effect is scoped to the page. For requests made by native app code use android_traffic_mock_add / ios_traffic_mock_add instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Route id to update in place; omit to auto-generate a new one | |
| body | No | Response body for mode "mock" (text, or base64 when bodyEncoding is "base64") | |
| mode | No | "mock" serves a canned response (default); "abort" fails the request | |
| udid | Yes | Device id (Android serial or iOS UDID) | |
| method | No | Optional HTTP method filter (e.g. "GET"/"POST"); matches any method when omitted | |
| pageId | No | Pin routing to a specific page id (from the *_list_pages tool). Omit to follow the active page automatically across navigations and new tabs — recommended. | |
| socket | No | Abstract unix socket name (default: chrome_devtools_remote) | |
| status | No | HTTP status to serve for mode "mock" (default 200) | |
| delayMs | No | Latency injected before responding/failing, in ms (clamped to 60s) | |
| enabled | No | Whether the route is active (default true) — disabled routes are kept but ignored | |
| headers | No | Response headers for mode "mock", as {headerName: value} — e.g. {"content-type": "application/json"}. On iOS a `charset` in content-type is NOT applied to the response: an HTML body with non-ASCII characters must declare it in the document (e.g. <meta charset="utf-8">) or it will be decoded with the default encoding and render as mojibake. | |
| matchUrl | Yes | URL pattern to match against the request's full URL | |
| matchType | No | How matchUrl is interpreted against the request URL (default "contains") | |
| bodyEncoding | No | Encoding of `body` (default "text") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true. The description adds substantive traits the annotations cannot convey: routes apply immediately and survive navigation, the effect is page-scoped, no certificate is installed, nothing device-wide changes, and native traffic is never intercepted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and upsert semantics, then scope, then alternatives. It is a long description but nearly every sentence carries distinct information; the 'WEB CONTENT ONLY' emphasis is slightly redundant with the following sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, high-complexity mutation tool with no output schema, it covers scope, side effects, defaults, and sibling routing well. The only gap is that it never hints at what the call returns (e.g., a generated route id), which matters for the upsert flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema by framing the `id` parameter as an upsert key ('update in place, when `id` matches an existing route') and by stating the default mode. It does not otherwise add syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add ... a mock/abort rule for browser requests on this device') and immediately clarifies the upsert behavior when `id` matches. It explicitly distinguishes itself from android_traffic_mock_add / ios_traffic_mock_add, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (browser/WebView requests), when-not-to-use (native app code, 'never will be by this tool'), and names the exact alternative tools for the excluded case. The mode mock vs abort choice is also framed as a decision the caller makes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_mock_clearWebpage mock clearADestructiveIdempotentInspect
Remove ALL browser routes for this device and un-arm interception. Call this when finished — it restores completely normal networking for the browser on that device.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true. The description adds real behavioral value beyond that: it specifies the blast radius (ALL routes, not one) and the resulting state (interception un-armed, normal networking restored), which clarifies what destruction means here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and scope, followed by the trigger condition. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter cleanup tool with no output schema and annotations covering the safety profile, the description supplies what an agent needs: what is cleared and when to call it. Only the device-scoping nuance against sibling mock tools is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (udid) and schema coverage is 100%, so the schema fully documents it. The description adds no syntax or format detail beyond what the schema already provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: 'Remove ALL browser routes for this device and un-arm interception.' The emphasis on ALL implicitly contrasts with the sibling webpage_mock_remove (which presumably removes one route), so an agent can infer the distinction, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this when finished' gives clear lifecycle context, and the effect statement (restores normal networking) explains why. There is no explicit when-not guidance or named alternative (e.g. webpage_mock_remove for partial removal).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_mock_listWebpage mock listARead-onlyIdempotentInspect
List the browser mock/abort routes currently registered for this device, in match order (first match wins). WEB CONTENT ONLY: this intercepts requests made by browser/WebView pages. Requests made by native app code are NOT intercepted and never will be by this tool. Nothing device-wide is changed and no certificate is installed — the effect is scoped to the page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, but the description adds meaningful behavior: it operates per-page with no device-wide mutation and installs no certificate, and the native-code exclusion clarifies scope. The 'first match wins' ordering detail is useful context a caller would otherwise not know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then qualifies scope. Slightly wordy with the emphatic 'and never will be by this tool' and the certificate sentence, but every element is relevant and no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description conveys what is listed and the ordering rule, which is most of what a caller needs. It stops short of describing the shape/fields of the returned route list, so it is not quite fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter (udid) with 100% schema description coverage, so the schema already documents it fully and the description adds nothing about the parameter. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (browser mock/abort routes currently registered for this device), plus the ordering semantics 'in match order (first match wins)'. This lets an agent separate it from the mock_add/remove/clear/status siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for when this tool applies: browser/WebView pages only, and explicitly NOT native app code requests. This scoping steers the agent, though it never names an explicit alternative (e.g., traffic_mock_list for native) or states the reverse 'use this when' condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_mock_removeWebpage mock removeADestructiveIdempotentInspect
Remove one browser route by id. When the last route is removed the device is automatically un-armed, so no traffic is paused for nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Route id to remove (from *_mock_list) | |
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely new behavioral context beyond the annotations: the device is automatically un-armed when the last route is removed, which is a non-obvious side effect an agent could otherwise mis-handle.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and scope, then the side effect. Nothing is wasted, though the second clause is slightly conversational ('so no traffic is paused for nothing') rather than purely informational.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive mutation with full annotation coverage and no output schema, this is close to complete: action, key, and the auto un-arm consequence are all stated. The only gap is that it never says removal is a no-op if the id is absent (implied by idempotentHint but not spelled out).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'id' and 'udid' are already documented in the schema. The description only reiterates that removal is keyed by id, adding no format or sourcing detail beyond what the schema's 'from *_mock_list' note already gives. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove one browser route by id'), making it immediately distinguishable from sibling mutators like webpage_mock_clear. It does not, however, explicitly distinguish itself from the parallel mock_remove tools (android_devtools, ios_safari) or from webpage_mock_clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance and never names alternatives. An agent must infer that webpage_mock_clear is the 'remove all' counterpart and that ids come from webpage_mock_list (the schema hints at this, but the description does not).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_mock_statusWebpage mock statusARead-onlyIdempotentInspect
Report whether browser interception is currently armed on this device, which page target it is attached to, the active routes, and live hit counters (paused/mocked/aborted/passedThrough/errors). Check the counters to confirm a mock is actually firing — a route that never matches shows mocked: 0.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device id (Android serial or iOS UDID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral detail beyond that: it names the reported counters (paused/mocked/aborted/passedThrough/errors) and warns that a non-matching route yields mocked: 0, which is a real diagnostic gotcha.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The core purpose and the full list of reported fields are front-loaded, and the diagnostic caveat follows only after the essential content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return content, and it does: interception armed state, attached page target, active routes, and named counter buckets. An agent has enough to call it and to interpret the result without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter (udid) and schema description coverage is 100%, so the schema fully documents it. The description adds no extra meaning about the parameter, which is the expected baseline when the schema already does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Report whether browser interception is currently armed on this device') and then enumerates exactly what is reported: page target, active routes, and per-outcome hit counters. This clearly separates it from the sibling mock_list/mock_add/mock_remove tools, which manage rather than report state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied. 'Check the counters to confirm a mock is actually firing' tells the agent how to interpret output, but there is no explicit statement of when to call this versus webpage_mock_list or webpage_mock_add, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_press_keyWebpage press keyAInspect
Press a key in the device browser — works on BOTH iOS Safari and Android Chrome, and on both the key is real: Android dispatches a trusted browser-level keyDown/keyUp pair, and iOS presses it on the device hardware-keyboard surface, which DOES move focus (Tab moves through the form) and reaches key handlers. Where the hardware surface is unavailable, iOS falls back to a synthesized isTrusted:false KeyboardEvent on document.activeElement that does NOT move focus, and for Enter inside a also calls form.requestSubmit()/submit() so submission still fires. The response reports which was used via via.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key to press | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly discloses behavior beyond annotations: Android dispatches trusted keyDown/keyUp, iOS uses hardware surface or falls back to synthesized isTrusted:false events, focus behavior differs, and form submission is handled. It also notes the `via` response field. This is far more context than the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and every sentence adds relevant behavioral detail, but it is a dense single paragraph that could be slightly more scannable. It is appropriately sized for the complexity without being repetitive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the cross-platform complexity and fallback mechanics, the description covers what an agent needs to know: platform differences, focus movement, form submission, and the response indicator. No output schema exists, but the `via` response is mentioned, and the annotations cover the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no meaning for any parameter (key, udid, pageId, socket, platformVersion) beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (press) and resource (key) scoped to the device browser, explicitly covering iOS Safari and Android Chrome. It distinguishes itself from native app key tools by that browser scope, though it does not name a specific sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'in the device browser', but there is no explicit when-to-use guidance or comparison to alternatives like device_key or ios_key_hid. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_reloadWebpage reloadAInspect
Reload the page open in the device browser (CDP Page.reload) — works on BOTH iOS Safari and Android Chrome. Confirms the document was actually replaced rather than trusting the protocol ack: a sentinel is written to window before the reload and the call only reports reloaded:true once it is gone. Returns the post-reload url, and reloaded:false with a reason when the document survived, so a reload that quietly did nothing cannot read as success. Also waits for the NEW document to finish loading and reports ready, so the page is drivable when the call returns. This is the state-reset primitive between test cases on iOS, where tabs cannot be opened or closed — and unlike a same-hash navigate it forces a real load, which an SPA router would otherwise skip, leaving stale dialogs and form state behind. Pass hard:true to bypass the HTTP cache.
| Name | Required | Description | Default |
|---|---|---|---|
| hard | No | Bypass the HTTP cache (CDP ignoreCache) — a from-network reload (default: false) | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is a non-readonly, non-idempotent, open-world call; the description goes much further, disclosing the sentinel-based verification so a no-op reload cannot read as success, the reloaded:false + reason failure path, and that it blocks until the new document reports ready.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and verification mechanism, and every sentence is substantive. It runs long and the iOS state-reset rationale is stated twice (once as 'state-reset primitive' and again via stale dialogs/form state), which is mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description documents the return shape (url, reloaded, reason, ready) and the failure mode, plus cross-platform behavior and cache semantics. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including hard/udid/pageId/socket is already documented in the schema; the description only restates hard:true as an HTTP-cache bypass. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Reload) and resource (page in device browser) plus the implementation channel (CDP Page.reload) and platform scope (iOS Safari and Android Chrome). It explicitly distinguishes itself from a same-hash navigate, which an SPA router would skip.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the concrete scenario (state-reset between test cases on iOS, where tabs cannot be opened or closed) and names the near-miss alternative (same-hash navigate) plus the reason to prefer this one. An agent knows exactly when to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_screenshotWebpage screenshotARead-onlyIdempotentInspect
Screenshot the web page in the device browser (iOS Safari or Android Chrome, auto-detected). ANDROID: a clean capture of the web CONTENT — pass selector or ref to capture just that element (scrolled into view). iOS: element-clipped web capture is unavailable, so this returns the full DEVICE frame (includes the Safari chrome/status bar); selector/ref clipping is Android-only and is ignored on iOS (a note is returned). Returns a JPEG image.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Android only: capture just this element, named by a ref from a page-elements listing | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | Android only: capture just this element (CSS selector), scrolled into view | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely useful behavior beyond that: iOS returns the full device frame including Safari chrome/status bar, and selector/ref are ignored on iOS with a note returned, plus the JPEG return type. It does not address failure modes or capture latency, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded and the Android/iOS split is well organized with clear labels. It is slightly dense and capitalizes keywords heavily, but every clause conveys platform-specific behavior rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description correctly states the return type (JPEG) and explains the platform-dependent capture differences and ignored params. It is complete enough to invoke correctly; minor gaps remain around error cases and how `pageId`/`socket` interact, but those are documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds meaning the schema lacks: that `selector`/`ref` clipping is Android-only, scrolled-into-view, and actively ignored on iOS with a returned note. This clarifies the conditional semantics of those params beyond their per-field schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Screenshot the web page in the device browser') and clarifies the scope is web content inside iOS Safari/Android Chrome. It implicitly distinguishes itself from device_screenshot by contrasting web-content capture with the full device frame, though it never names sibling tools like web_screenshot or session_screenshot, leaving some routing to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional context: use `selector`/`ref` on Android for element-clipped capture, and know that on iOS you get the full device frame instead. However, it offers no explicit when-to-use-vs-alternatives routing (e.g., when to prefer this over web_screenshot or device_screenshot), so an agent must infer the boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_scroll_into_viewWebpage scroll into viewAInspect
Scroll an element into view (block/inline: center) in the device browser, by CSS selector or by a ref from a page-elements listing — works on BOTH iOS Safari and Android Chrome.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a page-elements listing, e.g. "e12". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page. | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | CSS selector for the target element. Provide this or `ref`. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false, openWorldHint=true, and readOnlyHint=false, so the safety profile is largely covered. The description adds genuine behavioral detail beyond the annotations: the scroll alignment is fixed to block/inline center, and the tool is cross-platform. It still omits error behavior (element not found) and whether anything 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the action, then the alignment behavior, then the targeting options, then platform scope. No filler sentences and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-shot browser action with full schema coverage and no output schema, the description supplies purpose, targeting, alignment, and platform applicability. The only real gap is failure/return behavior, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents selector, ref, udid, pageId, socket, and the ignored platformVersion. The description only restates the selector/ref duality and introduces the fixed 'block/inline: center' alignment, which is behavior rather than a parameter. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (scroll an element into view) and narrows the scope to 'the device browser', which separates it from native-app scroll siblings like device_scroll_to_element and ios_scroll_to_element. It does not name any sibling explicitly, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two targeting modes (CSS selector or a `ref` from a page-elements listing) and that it works on both iOS Safari and Android Chrome, which is useful context. But it never states when to reach for this tool versus alternatives (e.g. webpage_click, webpage_hover, device_scroll_to_element), nor any precondition such as needing an existing page/tab.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_select_optionWebpage select optionAInspect
Choose an option in a dropdown in the device browser page, by CSS selector or by a ref from a page-elements listing (iOS Safari or Android Chrome, auto-detected). Match the option by value, visible label, OR zero-based index — provide exactly one. Sets the select and dispatches input+change (React/controlled safe). Throws if the target is not a or no option matches the criterion.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a page-elements listing, e.g. "e12". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page. | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| index | No | Select the option at this zero-based index | |
| label | No | Select the option whose visible text equals this | |
| value | No | Select the option whose value attribute equals this | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | CSS selector for the target element. Provide this or `ref`. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=false), and the description adds real behavioral context beyond them: it dispatches input+change events so it is React/controlled-safe, and it throws when the target is not a <select> or no option matches. It does not disclose whether it scrolls the element into view or how the change is verified, but the added event-dispatch detail is genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and target, then addressing modes, then match criterion, then side effects and failure mode. Dense but every clause carries operational information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, open-world tool with no output schema, the description covers the operation, the three match modes and their exclusivity, the DOM event side effects, and the throw conditions. The main omission is differentiation from the parallel `web_select_option` family, which is a discoverability gap rather than a calling gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the cross-parameter constraint 'provide exactly one' of value/label/index and reiterates the selector-vs-ref exclusivity, which the schema does not express. That is meaningful semantics beyond the field definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Choose an option in a <select> dropdown in the device browser page', and clarifies addressing modes (CSS selector or ref) and platforms (iOS Safari / Android Chrome). However, it never distinguishes itself from the near-identical sibling `web_select_option`, leaving ambiguity for the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It specifies the matching constraint ('provide exactly one' of value/label/index) and the error condition, which implies usage. But it gives no explicit when-to-use or when-not-to-use guidance, and does not route the agent between this tool and the very similar `web_select_option` or `webpage_fill_form` siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_set_cookieWebpage set cookieAIdempotentInspect
Set a cookie on the CURRENT page origin in the device browser (iOS Safari or Android Chrome, auto-detected), via document.cookie. Use to seed auth/session state before a flow. LIMITATION: sets a NON-HttpOnly cookie on the current document origin only (cannot set HttpOnly/Secure-only or cross-domain cookies — that needs the browser CDP Network domain, which the iOS bridge does not expose). Defaults path=/ and a 365-day expiry. Returns { set, name, cookie }.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Expiry in days from now (default 365; 0 = session) | |
| name | Yes | Cookie name | |
| path | No | Cookie path (default: /) | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| value | Yes | Cookie value | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only signal a non-destructive, idempotent, open-world write), the description discloses the key non-obvious outcomes: it produces a NON-HttpOnly cookie on the current document origin only, cannot do cross-domain, requires CDP Network domain that the iOS bridge lacks, defaults path=/ and 365-day expiry, and returns { set, name, cookie }. That is rich behavioral context an agent cannot get from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, followed by intended use, then the limitation and defaults. Every sentence, including the long limitation clause, earns its place by preventing misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no output schema, the description covers purpose, usage, hard limitations, platform detection, defaults, and the return shape. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the path=/ and 365-day defaults. The description repeats those defaults and adds platform auto-detection, but contributes little parameter meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (set) and resource (cookie) plus the precise scope (CURRENT page origin, iOS Safari or Android Chrome, via document.cookie). An agent can distinguish this from webpage_clear_cookies or the devtools cookie inspectors without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use to seed auth/session state before a flow" gives clear when-to-use context, and the LIMITATION clause implies when NOT to use it (HttpOnly/Secure/cross-domain). It does not name an alternative sibling tool by name for those cases, so it falls just short of explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_snapshotWebpage snapshotARead-onlyIdempotentInspect
Read the page as a structured tree of what is on it — works on BOTH iOS Safari and Android Chrome. START HERE before acting: each line is role "name" [ref=eN], and that ref goes straight into webpage_click / webpage_type / webpage_hover, so you never have to guess a CSS selector or read markup. Refs address the live element, so they survive markup that shifted and reach elements no selector can. Shows only what is actually visible by default, and marks disabled / checked / expanded state and current field values. Pass interactiveOnly:true for just the things you can act on, or a selector to scope it to one region of a large page.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| limit | No | Maximum nodes to return (default: 400, max: 2000) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| selector | No | CSS selector to scope the snapshot to (default: the whole page) | |
| includeHidden | No | Include elements that are not visible (default: false) | |
| interactiveOnly | No | Only links, buttons, fields and other actionable roles (default: false) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and open-world safety. The description adds real behavior beyond them: visible-only filtering by default, refs that survive markup shifts and address live elements, and disclosure that disabled/checked/expanded state and current field values are marked. Cross-platform scope (iOS Safari and Android Chrome) is also stated. No rate-limit or size-ceiling behavior is mentioned, keeping it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The most important instruction ('START HERE before acting') is front-loaded and the ref format is shown inline as a concrete example. It is one dense paragraph with a couple of near-redundant clauses about refs, but nearly every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return value, and it does: the `role "name" [ref=eN]` line format, the visible-by-default rule, and the state/field-value markers. Combined with 100% schema coverage on the 8 parameters, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds usage-level meaning the schema lacks: it explains what interactiveOnly actually filters to ('just the things you can act on') and frames selector as a scoping mechanism for large pages. The remaining six parameters are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('read the page as a structured tree of what is on it') and immediately differentiates itself from siblings like webpage_get_dom by explaining the ref-based addressing model. An agent can tell what this produces and why it differs from raw DOM tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'START HERE before acting' is an explicit sequencing directive, and it names the downstream tools (webpage_click / webpage_type / webpage_hover) that consume its refs. It also gives the conditions for its two narrowing options (interactiveOnly for actionable-only, selector for large pages). It stops short of stating when NOT to use it versus web_snapshot or webpage_get_dom, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_tabsWebpage tabsAInspect
List, open, switch and close browser tabs on the device — one tool for what would otherwise be several. list works on BOTH iOS Safari and Android Chrome and returns a pageId per tab; pass that pageId to any other webpage_* tool to act on that specific tab, on either platform. new, select and close are ANDROID ONLY and error on iOS rather than pretending — Safari can list and drive tabs remotely but cannot open or close them, and needs no switching since pageId already targets one directly. Stale tabs accumulate across sessions and clutter the list: close what you are done with.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to open — for action "new" (default: about:blank) | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| action | No | What to do (default "list"). "new"/"select"/"close" are Android only. | |
| pageId | No | Tab to act on, from action "list" — required for "select" and "close" | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the generic annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), it discloses real behavioral facts: iOS actions error rather than silently no-op, Safari can list/drive but not open/close, and no switching is needed because pageId targets a tab directly. It stops short of describing what an Android-side error looks like or limits on concurrent tabs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The platform-capability constraint is front-loaded and each sentence carries information, but phrasing like 'one tool for what would otherwise be several' and 'rather than pretending' is rhetorical padding that could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, cross-platform tool with no output schema, it covers the platform matrix, the pageId flow, and the default action, which is what an agent needs to call it correctly. The Android-only 'socket' parameter is left entirely to the schema, a minor gap given how prominent it is in the signature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description still adds cross-tool meaning for pageId ('pass that pageId to any other webpage_* tool to act on that specific tab, on either platform'), which the schema field description does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names specific verbs and resource ('List, open, switch and close browser tabs on the device') and immediately frames scope against siblings ('one tool for what would otherwise be several'). An agent can distinguish it from ios_safari_list_pages, android_devtools_list_pages and webpage_close 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly which actions work on which platform ('list works on BOTH iOS Safari and Android Chrome', 'new, select and close are ANDROID ONLY'), explains the failure mode, and tells the agent how to route pageId into other webpage_* tools. It even advises on lifecycle hygiene ('close what you are done with').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_typeWebpage typeAInspect
Type text into an input/textarea in the device browser, by CSS selector or by a ref from a page-elements listing — works on BOTH iOS Safari and Android Chrome. On iOS it taps the field and types on the DEVICE keyboard, so the page gets real trusted keystrokes (keydown, keypress, beforeinput, input) exactly as from a person — use this for anything that reacts to typing rather than just reading .value. Otherwise it sets the value via the native HTMLInputElement/HTMLTextAreaElement value setter (so React/Vue-controlled inputs register the change) and dispatches bubbling input and change events, which are isTrusted:false. The response reports which happened via via ("nativeKeyboard" or "jsValue"), and when it fell back to jsValue it names the cause in fallbackReason — you never have to guess whether a degraded path was taken. Pass require:"native" to make an unavailable device keyboard a hard error instead of a silent downgrade, for fields that only behave correctly under real keystrokes. exact:false means the keystrokes landed but the component rewrote the value as you typed (masks, autocompletes) — that is a success, not a failure. By default appends to the existing value; pass clear:true to replace it.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from a page-elements listing, e.g. "e12". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page. | |
| text | Yes | Text to type | |
| udid | Yes | Device UDID / serial (iOS or Android) | |
| clear | No | Replace the existing value instead of appending (default: false) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| require | No | Set to "native" to fail loudly when the device keyboard is unavailable, instead of silently falling back to setting .value (isTrusted:false). Use for fields that gate on real keystrokes. iOS only — Android has no native-keyboard path here. | |
| selector | No | CSS selector for the target element. Provide this or `ref`. | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only flag it as a non-readonly, non-idempotent mutation), the description discloses the two execution paths, the actual DOM events dispatched (keydown/keypress/beforeinput/input vs. bubbling input/change), that jsValue events are isTrusted:false, that default behavior appends rather than replaces, and how degradation is reported. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and target are front-loaded in the first clause, and the paragraph is dense with no filler sentences. It is long for a single unstructured block, though, and would scan faster if the fallback/reporting details were broken out.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by explaining the response shape (via, fallbackReason) and error modes. Combined with annotations covering the safety profile and a fully described 9-parameter schema, an agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema baseline is 3, but the description adds real semantics: clear:true replaces vs. default append, require:"native" turns a soft downgrade into a hard error, and exact:false is reframed as success rather than failure. It also documents response fields (via, fallbackReason) that no schema declares.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('type text into an input/textarea in the device browser') and immediately scopes it by target ('by CSS selector or by a `ref`') and platform ('BOTH iOS Safari and Android Chrome'). It is clearly distinguishable from siblings like webpage_press_key, webpage_click, or webpage_fill_form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use condition: 'use this for anything that reacts to typing rather than just reading .value,' and explains when to escalate with require:"native" for fields that gate on real keystrokes. However, it never names or contrasts an alternative tool (e.g., webpage_fill_form or device_type), so the agent has no explicit routing guidance against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webpage_wait_forWebpage wait forARead-onlyIdempotentInspect
Poll for an element to appear (and optionally become visible) in the device browser by CSS selector — works on BOTH iOS Safari and Android Chrome. Polls every 250ms inside a single CDP session (no reconnect per tick) until found or timeoutMs elapses. Returns { found, waitedMs } rather than throwing on timeout, so callers can branch on the result. When the selector matches several elements, ANY of them satisfying the test counts as found — so a control duplicated across responsive breakpoints is reported visible when the on-screen copy is.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | Yes | Device UDID / serial (iOS or Android) | |
| pageId | No | Target page/tab id — auto-picked when omitted | |
| socket | No | Android only: abstract unix socket name (default: chrome_devtools_remote) | |
| visible | No | Also require the element to be visible (has client rects and a laid-out offsetParent, or position:fixed) rather than merely present in the DOM (default: false) | |
| selector | Yes | CSS selector to wait for | |
| timeoutMs | No | Max time to wait in milliseconds (default: 5000, max: 30000) | |
| platformVersion | No | Ignored (kept for compatibility) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only/idempotent profile, and the description adds behavior the annotations cannot convey: 250ms polling inside a single CDP session with no per-tick reconnect, non-throwing return of { found, waitedMs }, and the ANY-match rule when a selector hits multiple elements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and platform scope are front-loaded, and every sentence carries distinct information (polling cadence, return shape, multi-match rule). Sentences are dense and long, but none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return contract ({ found, waitedMs }) and the timeout semantics (no throw), plus cross-platform applicability and match behavior — everything an agent needs to call and branch on the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds semantics the schema does not: the selector's multi-match resolution rule and the distinction between mere DOM presence and becoming visible, which informs how `visible` and `selector` interact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (poll/wait for) and resource (element in the device browser by CSS selector), and explicitly scopes it to both iOS Safari and Android Chrome, which distinguishes it from the platform-specific device_wait_for_element, ios_wait_for_element, and web_wait_for siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The cross-platform browser framing implies when to pick this over native-element waits (device_wait_for_element) or per-platform browser waits, and the polling/timeout-behavior details clarify usage context. It never names an alternative outright or states an explicit when-not-to-use, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_press_keyWeb press keyAInspect
Press a key in the DESKTOP grid browser (by pageId) — Enter, Tab, Escape, ArrowDown, or a chord like Control+A. Targets an element when a selector is given, otherwise the focused one. Not a device — for a phone or tablet use webpage_press_key.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key name, e.g. Enter / Tab / Escape / ArrowDown / Control+A | |
| pageId | Yes | Page ID from web_navigate | |
| selector | No | CSS selector to focus first; omit to use focus as-is |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/idempotency profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=true). The description adds real targeting behavior beyond that: it acts on the element matching the selector when present, otherwise on the currently focused element. It doesn't elaborate on failure modes (e.g., no focused target), so it stops 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight clauses with no filler; the scope ('DESKTOP grid browser') is front-loaded, followed by key examples, targeting behavior, and the sibling exclusion. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param action with no output schema, the description covers scope, input form, targeting semantics, and the sibling alternative — enough to invoke correctly. Minor gap: no mention of what happens if no target is focused, but that is not essential to selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so pageId, key, and selector are already documented. The description restates the selector behavior ('targets an element when a selector is given, otherwise the focused one') and repeats key examples from the schema, adding marginal value over structured data. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Press a key in the DESKTOP grid browser (by pageId)' with concrete key examples and a chord syntax sample. It explicitly distinguishes itself from the sibling webpage_press_key, so the agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States both the when ('DESKTOP grid browser') and the when-not with a named alternative: 'Not a device — for a phone or tablet use webpage_press_key.' That is an explicit exclusion plus the routing condition, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_reloadWeb reloadAInspect
Reload the current page in the DESKTOP grid browser (by pageId). Not a device — for a phone or tablet use webpage_reload.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true. The description adds the useful environment distinction (desktop vs device), but does not elaborate on reload side effects, state handling, or waiting behavior beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no waste: the first gives the action, scope, and parameter; the second handles the sibling-tool distinction. It is front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 output schema and rich annotations, the description provides enough context to invoke correctly: what page, which browser environment, and which alternative to use for non-desktop targets.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage and documents pageId as 'Page ID from web_navigate'. The description's 'by pageId' adds no new meaning beyond that schema description, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Reload the current page') and scopes it to the DESKTOP grid browser by pageId. It also names the sibling alternative for phone/tablet (webpage_reload), so an agent can distinguish this tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent: use this for the desktop grid browser, and use webpage_reload for a phone or tablet. This gives a clear when-to-use and when-to-use-an-alternative rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_resizeWeb resizeAInspect
Resize the DESKTOP grid browser viewport (by pageId) — for checking responsive breakpoints without a real handset. A real phone is still the honest test; this only changes the window. NOT a device — a real handset has a fixed screen, so there is no webpage_resize; pick a different device by udid instead.
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Viewport width in CSS pixels | |
| height | Yes | Viewport height in CSS pixels | |
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true. The description adds valuable behavioral context beyond annotations: it only changes the window, does not emulate a device, and clarifies there is no webpage_resize. It does not contradict annotations and adds meaningful usage semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first clause. The remaining sentences are mostly justified by disambiguation, though the em-dash phrasing and repeated caveats make it slightly longer than strictly necessary. It is well-structured but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a viewport-mutation tool with no output schema and full annotation coverage, the description is largely complete: it explains the action, its scope, and its relationship to device emulation. It does not explain whether the resize persists across navigations or affects screenshots, which would be minor helpful additions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented with descriptions (width, height, pageId). The description only references 'pageId' and implies width/height via 'viewport', adding no syntax or format details beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Resize the DESKTOP grid browser viewport (by pageId)'. It explicitly distinguishes this from device resizing by saying it is NOT a device and that there is no webpage_resize, so an agent can differentiate it from sibling tools without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear purpose context ('for checking responsive breakpoints without a real handset'), an explicit exclusion ('NOT a device'), and a concrete alternative ('pick a different device by udid instead'). This covers when to use, when not to use, and what to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_screenshotWeb screenshotARead-onlyIdempotentInspect
Screenshot the DESKTOP grid browser page (by pageId), as base64 PNG. Not a device — for a phone or tablet screen use webpage_screenshot (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered structurally. The description adds genuinely new information: the return payload is base64-encoded PNG and the input is a pageId originating from web_navigate. It does not state viewport/full-page scope or payload size, which would matter for an image-returning tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the primary action and target front-loaded and the disambiguation clause second. Every clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully declares the return format (base64 PNG), which is the key thing an agent must know to consume the result, and it pins down the target page type. It is complete enough for a one-parameter capture tool, though viewport/capture-scope detail is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already documents itself ('Page ID from web_navigate'). The description restates the same identifier origin rather than adding format or constraint detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Screenshot) and a precisely scoped resource (the DESKTOP grid browser page, by pageId) and declares the output encoding (base64 PNG). It actively distinguishes itself from the many screenshot siblings by naming webpage_screenshot and device screenshots as different targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit exclusion ('Not a device') plus a named alternative for the phone/tablet case (webpage_screenshot by udid), which is exactly the routing an agent needs. It does not address the other screenshot siblings (device_screenshot, ios_screenshot, session_screenshot, flow_replay_step_screenshot), so it stops 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.
web_select_optionWeb select optionAInspect
Choose an option in a in the DESKTOP grid browser (by pageId), by value or visible label. Not a device — for a phone or tablet use webpage_select_option.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Visible option text; used when value is not given | |
| value | No | Option value attribute | |
| pageId | Yes | Page ID from web_navigate | |
| selector | Yes | CSS selector of the <select> |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered structurally. The description adds the browser-vs-device scope distinction but says nothing about what happens on failure, whether change events fire, or whether the option must exist. With annotations carrying the safety burden, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler. The scoping (desktop grid browser, by pageId) and the selection mode come first, and the routing exclusion follows, which is exactly the front-loaded order an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-step browser interaction with no output schema and annotations covering safety, the description supplies the context needed to route and invoke it. It stops short of covering failure modes or event/wait behavior, which is a minor gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so pageId, selector, value and label are already documented, including the 'used when value is not given' precedence on label. The description merely restates the value/label duality and the pageId scoping, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (choose/select) and resource (an option in a <select> element), and pins the execution context to the desktop grid browser scoped by pageId. It explicitly contrasts itself with the sibling webpage_select_option, so an agent can distinguish the two 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives both the positive condition (desktop grid browser, by pageId) and the negative routing rule with the exact alternative tool name: 'Not a device — for a phone or tablet use webpage_select_option.' That is an explicit when/when-not with a named alternative, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_snapshotWeb snapshotARead-onlyIdempotentInspect
Accessibility tree of the DESKTOP grid browser page (by pageId), as text — for finding elements and understanding layout. Not a device: the equivalent for a phone or tablet is webpage_snapshot (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID from web_navigate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: the return is a text accessibility tree (a structural representation, not a screenshot), and it is scoped to desktop pages. It stops short of mentioning output size/pagination limits, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first defines what is returned and why, the second routes to the alternative. Scope and the sibling contrast are front-loaded with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param, read-only snapshot tool with no output schema, the description covers purpose, output format, and the sibling boundary. Minor gap: no guidance on result size, truncation, or whether the tree covers the full page vs viewport, which would matter for a snapshot tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (pageId) and schema description coverage is 100%, with the schema itself linking to web_navigate ('Page ID from web_navigate'). The description repeats the 'by pageId' scope but adds no syntax or provenance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Accessibility tree of the DESKTOP grid browser page ... as text') and explicitly distinguishes itself from the mobile sibling by scope (desktop page vs device). An agent can differentiate it from webpage_snapshot and web_get_source 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the use case ('for finding elements and understanding layout') and an explicit exclusion with the correct alternative: phone/tablet work must go to webpage_snapshot (by udid). This is a clear when-to-use / when-not-to-use routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_typeWeb typeAInspect
Type into an element in the DESKTOP grid browser (by pageId). NOT a device — to type on a real phone or tablet use webpage_type (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type | |
| pageId | Yes | Page ID from web_navigate | |
| selector | Yes | CSS selector of the input element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, openWorldHint=true and destructiveHint=false, so the mutation profile is covered structurally. The description adds only the environment scoping (desktop grid browser vs real device); it says nothing about whether existing text is replaced or appended, focus/element-readiness requirements, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the environment constraint and the contrastive exclusion are front-loaded in the first read. Every clause carries routing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter, no-output-schema input tool with full schema coverage and a complete annotation set, the description covers what an agent most needs: the browser target and the correct sibling. Remaining gaps (append vs replace semantics, element readiness) are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all three required parameters (text, pageId, selector), so the schema fully documents them. The description only reiterates that pageId keys the desktop browser context; it adds no format, syntax, or edge-case meaning beyond the schema. Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (type) plus the exact target (an element in the DESKTOP grid browser) and immediately contrasts itself with the device-based tool. An agent can distinguish this from web_fill_form, webpage_type, or device_type 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use (desktop grid browser, by pageId) and an explicit when-not ('NOT a device'), naming a redirect target for phone/tablet input. The guidance is clear, though the named alternative ('webpage_type (by udid)') sits oddly beside the actual device_type/ios_send_keys siblings, so the routing hint may not be fully reliable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_upload_fileWeb upload fileAInspect
Set files on a file input in the DESKTOP grid browser (by pageId). Paths are read on the RDS host, not your machine. NOT a device — there is no webpage_upload_file; the device equivalent is ios_safari_set_input_files (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Absolute file paths on the RDS host | |
| pageId | Yes | Page ID from web_navigate | |
| selector | Yes | CSS selector of the <input type=file> |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the bar is lower. The description usefully discloses that paths are read on the RDS host rather than the caller's machine, which is non-obvious and important, but says nothing about failure modes, overwrite behavior, or awaiting file-picker state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the action and scope, then the host caveat, then the disambiguation. Zero filler; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, the critical host-vs-local path distinction, and the sibling/device disambiguation for a simple 3-param tool with no output schema. Nothing an agent needs before calling it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (paths, pageId, selector) are already documented in the schema, including the RDS-host constraint on paths. The description reinforces the RDS-host point but adds no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (set files on a file input) scoped to the DESKTOP grid browser by pageId. It explicitly distinguishes itself from the device path and the nonexistent 'webpage_upload_file', so an agent can identify 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the condition (desktop grid browser) and the alternative (ios_safari_set_input_files by udid) with an explicit 'NOT a device' exclusion. It also warns that no webpage_upload_file exists, closing off a plausible wrong guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_wait_forWeb wait forARead-onlyIdempotentInspect
Wait for a condition in the DESKTOP grid browser (by pageId) before continuing: an element to appear or disappear, text to show up, or a fixed delay. Prefer this over polling with web_evaluate. Not a device — for a phone or tablet use webpage_wait_for (by udid).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Wait until this text appears anywhere on the page | |
| state | No | visible | hidden | attached | detached (default: visible). Applies to selector. | |
| pageId | Yes | Page ID from web_navigate | |
| selector | No | CSS selector to wait for | |
| timeoutMs | No | Timeout in ms (default 10000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description adds the meaningful behavioral trait that this call blocks until the condition is met rather than returning immediately, but it does not say what happens on timeout (error vs. silent return), which is the main behavioral unknown for a wait primitive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and its condition set, then the routing constraint. Every clause earns its place and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema absent but all five params documented in the schema and annotations covering the safety profile, the description supplies what the structured fields cannot: the desktop-vs-device scoping and sibling routing. The only omission is timeout failure behavior, a minor gap for a wait tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter carries its own description (text, state enum, pageId provenance, selector, timeoutMs default), so the schema does the heavy lifting and baseline 3 applies. The description only reinforces the pageId scoping to the desktop grid browser; it adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (wait for) on a specific resource (the DESKTOP grid browser, addressed by pageId) and enumerates the three condition families it supports: element appear/disappear, text, or fixed delay. It also explicitly distinguishes itself from two siblings, web_evaluate (polling) and webpage_wait_for (device), so an agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative ('Prefer this over polling with web_evaluate') and an explicit exclusion ('Not a device — for a phone or tablet use webpage_wait_for (by udid)'), covering both when to use and 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
ios_tap_by_label2 fields changed- added
Input schema / properties / inputAdded value: +{ + "description": "Input path. 'auto' (default) tries the direct input path first — the one that needs no automation session — and falls back to the session only when the direct path is not usable right now (the response says which one ran). On a device set to direct-input-only, an unusable direct path is reported as an error instead of silently switching to the session. 'hid' forces the direct path with no fallback, reporting 'no HID available' on iOS 17.x or with no tunnel. 'session' forces the automation session even when the direct path would have worked.", + "enum": [ + "auto", + "hid", + "session" + ], + "type": "string" +} - added
Input schema / properties / nearAdded value: +{ + "description": "Direct-input path only: text of a neighbouring element, to pick between several look-alike labels.", + "type": "string" +}
2 tool updates
- Changed
ios_find_element1 field changed- added
Input schema / properties / inputAdded value: +{ + "description": "Lookup path. 'auto' (default) follows the device's mode: direct-input-only devices look up without a session (no coordinates returned). 'session' forces the automation-session lookup, which returns coordinates. 'hid' forces the session-free lookup.", + "enum": [ + "auto", + "hid", + "session" + ], + "type": "string" +}
- Changed
ios_scroll_to_element1 field changed- added
Input schema / properties / inputAdded value: +{ + "description": "Scroll path. 'auto' (default) follows the device's mode: direct-input-only devices scroll without a session (no coordinates returned). 'session' forces the automation-session scroll, which returns coordinates. 'hid' forces the session-free scroll.", + "enum": [ + "auto", + "hid", + "session" + ], + "type": "string" +}
1 tool update
- Changed
flow_recording_save3 fields changed- changed
Input schema / properties / tmsLink / properties / externalId / descriptionPrevious value: -"Case id as the TMS shows it: 'C1234', '4521', 'PROJ-12'"New value: +"Case id as the TMS shows it: 'C1234', '4521', 'PROJ-12', local 'LC-12'" - changed
Input schema / properties / tmsLink / properties / provider / descriptionPrevious value: -"Which TMS the case lives in"New value: +"Which TMS the case lives in. 'local' = a case saved in Test Manager (LC-12) for a user with no TestRail/ADO yet" - changed
Input schema / properties / tmsLink / properties / provider / enumPrevious value: -[ - "testrail", - "ado", - "jira", - "xray" -]New value: +[ + "testrail", + "ado", + "jira", + "xray", + "local" +]
2 tool updates
- Changed
flow_recording_save2 fields changed- changed
Input schema / properties / tmsLink / descriptionPrevious value: -"The TMS test case this flow automates. Required when the workspace enforces case links."New value: +"The TMS test case this flow automates. REQUIRED when the user has a TMS connected (tests only; fragments never need it)." - added
Input schema / properties / tmsLink / properties / refAdded value: +{ + "additionalProperties": false, + "description": "Where the case lives in the TMS. The server verifies and completes this.", + "properties": { + "containerId": { + "description": "Folder id as the TMS browse tools return it: TestRail '<suiteId>' or '<suiteId>:<sectionId>', ADO '<planId>:<suiteId>' (REQUIRED for ADO)", + "type": "string" + }, + "internalId": { + "description": "Jira/Xray numeric issue id, if known", + "type": "string" + }, + "projectId": { + "description": "TestRail project id, ADO project, or Jira project key", + "type": "string" + } + }, + "type": "object" +}
- Added
tms_gap_report
1 tool update
- Changed
flow_recording_save1 field changed- added
Input schema / properties / tmsLinkAdded value: +{ + "additionalProperties": false, + "description": "The TMS test case this flow automates. Required when the workspace enforces case links.", + "properties": { + "externalId": { + "description": "Case id as the TMS shows it: 'C1234', '4521', 'PROJ-12'", + "type": "string" + }, + "provider": { + "description": "Which TMS the case lives in", + "enum": [ + "testrail", + "ado", + "jira", + "xray" + ], + "type": "string" + }, + "title": { + "description": "Case title (cached for display)", + "type": "string" + }, + "url": { + "description": "Link to the case in the TMS", + "type": "string" + } + }, + "required": [ + "provider", + "externalId" + ], + "type": "object" +}
6 tool updates
- Added
insights_board_add_chart - Added
insights_board_apply_changes - Added
insights_board_create - Added
insights_board_get - Added
insights_board_save_template - Added
insights_board_undo
5 tool updates
- Added
insights_azdo_browse - Added
insights_azdo_sprint_summary - Added
insights_azdo_test_summary - Added
insights_testrail_browse - Added
insights_testrail_summary
5 tool updates
- Removed
insights_azdo_browse - Removed
insights_azdo_sprint_summary - Removed
insights_azdo_test_summary - Removed
insights_testrail_browse - Removed
insights_testrail_summary
5 tool updates
- Added
insights_azdo_browse - Added
insights_azdo_sprint_summary - Added
insights_azdo_test_summary - Added
insights_testrail_browse - Added
insights_testrail_summary
1 tool update
- Changed
ios_fps1 field changed- changed
Input schema / properties / durationMs / descriptionPrevious value: -"Sampling window in milliseconds (default 2000)"New value: +"Sampling window in milliseconds (default 3000)"
1 tool update
- Added
record_visual_verdict
1 tool update
- Removed
jira_designs_probe
1 tool update
- Added
jira_designs_probe
1 tool update
- Added
visual_tolerance_reset
Publisher details
- Operator
- Not applicable
- Operator website
- Not applicable
- Vendor relationship
- Not applicable
- Documentation
- https://robotactions.com/ · Publisher source
- Trust center
- Unknown
- Restrictions
- Unknown
Related MCP Connectors
Control real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
remote debug iOS/Android/Unity/Godot/Flutter/RN/Web on real-device.ui-tree/screenshots/taps,tests.
Build and run agents and automations across hundreds of apps using natural language.
Related MCP Servers
AlicenseAqualityAmaintenanceEnables AI assistants to automate mobile app testing and development for iOS and Android through natural language interactions. Supports intelligent element identification, session management, automated test generation, and comprehensive device interactions including clicks, swipes, screenshots, and app management.318,009 npm496Apache 2.0- AlicenseAqualityBmaintenanceEnables AI assistants to control mobile and desktop devices with natural language, including running automation tasks, taking screenshots, and managing devices.65 npmMIT
- AlicenseCqualityBmaintenanceEnables AI agents to control Android phones, emulators, redroid containers, iOS devices, and cloud-hosted devices through a perceive-act-verify loop of screen reading, taps, gestures, typing, and app launching. Exposes 138 tools for driving screens, elements, and files over adb, Portal APIs, and ios-portal without running ARM-only code on the device.9401MIT
- AlicenseNot gradedqualityCmaintenanceTurns a real cloud iPhone or Android device into an environment an agent drives through up to eighteen capability-gated tools for reading the screen, tapping, swiping, typing, pressing keys and launching apps. The device also records video and a timed trajectory of every action for later inspection.2Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.