Mobile Automator MCP Server
Provides tools for building, installing, uninstalling, and running unit tests on Android apps, enabling automated mobile app testing and deployment on Android emulators/devices.
Supports building Android apps via Gradle wrapper (gradlew) and running unit tests, integrating with the Android build system.
Provides tools for building, installing, uninstalling, and running unit tests on iOS apps, enabling automated mobile app testing and deployment on iOS simulators.
Enables compiling iOS apps using xcodebuild and managing simulators via simctl, integrating with the iOS development workflow.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Mobile Automator MCP ServerStart a new recording session for login flow on iOS"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Mobile Automator MCP Server
An MCP server that gives AI agents the power to record, replay, and mock mobile app interactions — combining Maestro UI automation with Proxyman network capture to generate complete, self-contained test scripts.
Architecture

The system orchestrates two async data streams — UI interactions (via Maestro) and HTTP traffic (via Proxyman) — then correlates them by timestamp to produce Maestro YAML + WireMock stubs for full experience replay.
Related MCP server: Hunt-Droid Mobile MCP
Capabilities
Capability | Description |
UI Recording | Dispatch taps, types, scrolls, swipes on iOS/Android simulators via Maestro |
Network Capture | Intercept HTTP/HTTPS traffic through Proxyman with scoped, session-aware exports |
Correlation | Automatically match UI actions to the network requests they trigger (sliding time window) |
YAML Synthesis | Generate Maestro test scripts with inline network context comments |
WireMock Stubs | Produce WireMock-compatible |
Selective Mocking | Mock all, some, or all-except-some APIs — unmocked routes proxy to the real server |
SDUI Validation | Deep-compare server-driven UI payloads against expected JSON shapes |
Named Flows | Invoke hand-authored Maestro flows by name ( |
Build & Deploy | Compile, install, uninstall, and boot simulators via |
Visual Verification | Capture PNG screenshots via |
Unit Tests | Run XCTest / Gradle unit tests via |
Tools
Tool | Purpose |
| Begin recording — snapshots Proxyman baseline, initializes session state |
| Dispatch a UI action and log it to the session |
| Capture the current accessibility tree from the simulator |
| Fetch intercepted HTTP traffic (with domain/path filtering) |
| Validate a network response against expected fields |
| Finalize session → export scoped HAR → correlate → generate YAML + WireMock stubs |
| Discover named Maestro flows under |
| Execute a named flow by name, merging manifest defaults with caller-supplied params |
| Compile an iOS app ( |
| Install a built |
| Remove an installed app from a device to guarantee clean-state launches |
| Boot an iOS simulator by UDID and wait for it to be ready (Android emulator: start manually) |
| Capture a PNG of the current simulator/emulator screen; returns an absolute path Claude can read back |
| Run the unit-test target and return structured results ( |
| Async entry point for |
| Read current status, duration, and recent streamed output for a task (read-only, never throws) |
| Read the final structured result for a completed task (idempotent, does not consume) |
| Abort a running task — SIGTERMs children, runs cleanups, marks cancelled |
| Inventory of in-process tasks filtered by |
Quick Start
Prerequisites
Node.js v20+
Maestro CLI 2.5.0+ —
curl -Ls "https://get.maestro.mobile.dev" | bash(older versions log a warning at startup; 2.3.x in particular exhibits XCTest driver flakiness on iOS port 22087)Proxyman macOS 5.20+ with CLI — see Proxyman Setup
A booted iOS Simulator or Android Emulator
Install
git clone <repository>
cd mobile-automator-mcp
npm install
npm run buildOption A — HTTP Bridge (use this if the MCP client is blocked at your org)
npm run dev:httpVerify it's running:
curl http://localhost:3000/health
# {"ok":true,"tools":34}Then call any tool via JSON-RPC:
curl -X POST http://localhost:3000/message \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_devices","arguments":{"platform":"ios"}}}'For a full tool reference, session lifecycle patterns, and common workflows see .github/skills/generate_mcp_curls/SKILL.md.
To regenerate boilerplate curl commands for all 34 tools: npx tsx .github/skills/generate_mcp_curls/generate.ts
Phase-1 admin tools
When something looks stuck, five admin tools provide visibility and recovery without restarting the server:
audit_state— single-shot snapshot of sessions, drivers, pollers, and Proxyman rules with an orphans reportlist_active_sessions— read-only inventory with driver/poller liveness and mock countslist_active_mocks— Proxyman rules taggedmca:plus drift between Proxyman and the local ledgerforce_cleanup_session— destructive: stop poller/driver, delete tagged Proxyman rules, mark session aborted (never throws)force_cleanup_mocks— destructive bulk delete ofmca:-tagged Proxyman rules by scope (all,session,standalone)
Option B — Register with an MCP Client (once org-approved)
Add to your MCP client config (e.g., Claude Desktop, Gemini Code Assist):
{
"mcpServers": {
"mobile-automator": {
"command": "node",
"args": ["/absolute/path/to/mobile-automator-mcp/dist/index.js"]
}
}
}Selective Mocking
The stop_and_compile_test tool accepts a mockingConfig to control which APIs are mocked vs. proxied to a real backend:
full → Mock all captured APIs (default, no real server needed)
include → Mock only listed routes, proxy everything else
exclude → Mock everything EXCEPT listed routesExample — mock only login, proxy everything else:
{
"mockingConfig": {
"mode": "include",
"routes": ["/api/login"],
"proxyBaseUrl": "http://localhost:3030"
}
}Output Structure
session-<id>/
├── wiremock/
│ ├── mappings/ ← WireMock stub JSON files
│ │ ├── post_api_login.json
│ │ ├── get_api_lore_doom.json
│ │ └── _proxy_fallback.json ← (include/exclude modes only)
│ └── __files/ ← Response body fixtures
│ ├── post_api_login_response.json
│ └── get_api_lore_doom_response.json
└── manifest.json ← Session metadata + route manifestProject Structure
src/
├── index.ts ← MCP server entry point
├── handlers.ts ← Tool handler implementations
├── schemas.ts ← Zod schemas (single source of truth for I/O)
├── types.ts ← Domain models
├── session/ ← Session lifecycle + SQLite persistence
├── maestro/ ← Maestro CLI wrapper + hierarchy parser
├── proxyman/ ← Proxyman CLI wrapper + payload validator
├── flows/ ← Named, hand-authored flow registry
├── build/ ← iOS (xcodebuild/simctl) + Android (gradlew/adb) build & deploy
├── screenshot/ ← PNG capture for visual self-verification
├── testing/ ← XCTest / JUnit unit-test runner + result parsers
└── synthesis/ ← Correlator + YAML generator + WireMock stub writerNamed Flows
Hand-authored Maestro flows let an agent navigate to a specific app screen before verifying an incremental change. Flows live as .yaml files in a flows directory (default: ./flows/) and are invoked by name.
flows/
├── _manifest.json ← optional: descriptions, tags, param specs
├── login.yaml ← flow name is "login"
└── navigate-to-checkout.yaml ← flow name is "navigate-to-checkout"An optional _manifest.json declares parameters and metadata:
{
"flows": {
"login": {
"description": "Launch the app and reach the logged-in home screen",
"tags": ["auth", "setup"],
"params": {
"USERNAME": { "default": "admin", "description": "Login username" },
"PASSWORD": { "default": "admin" }
}
}
}
}Params are forwarded to Maestro as -e KEY=VALUE and referenced inside the YAML as ${KEY}. Call list_flows to discover flows, then run_flow with { name, params? } to execute one.
Build & Deploy Loop
Closes the edit → rebuild → reinstall → navigate cycle so an agent can verify changes against a fresh build.
build_app → compile with xcodebuild / ./gradlew, return built .app or .apk path
uninstall_app → wipe the prior install + its data from the target device
install_app → push the new binary to the simulator / emulator
boot_simulator→ boot an iOS simulator (idempotent; alreadyBooted=true if already running)iOS — shells xcodebuild build -scheme <scheme> -destination 'generic/platform=iOS Simulator' -derivedDataPath <path> and locates the .app under <derivedDataPath>/Build/Products/<Configuration>-iphonesimulator/. Bundle id is extracted via plutil from the built Info.plist.
Android — shells ./gradlew :<module>:assemble<Variant> from the project root and locates the APK at <project>/<module>/build/outputs/apk/<variant>/. Booting the emulator is not yet automated — start it manually (e.g., emulator -avd <name>) before calling install/run tools.
Build output is truncated (head + tail) to keep MCP responses small while preserving both the lead-up and the final error context.
Visual Verification & Unit Tests
take_screenshot writes a PNG to disk and returns its path — Claude reads the image back directly, which catches visual regressions (wrong color, clipped text, broken image) that structural hierarchy checks miss. Pair it with get_ui_hierarchy for structural assertions.
run_unit_tests runs the normal unit-test target for the project:
iOS —
xcodebuild test -resultBundlePath <path>with optional-only-testing:<Target>/<Class>[/<Method>]filters. The stdout is parsed for per-test pass/fail so totals stay accurate across Xcode versions.Android —
./gradlew :<module>:test<Variant>UnitTestwith an optional--tests <filter>. JUnit XML under<module>/build/test-results/<task>/is parsed for failure details.
Both return structured results: { passed, totalTests, passedTests, failedTests, skippedTests, failures[] }. failures[] carries the failing test name and (where available) the first-line error message plus source file/line — enough for the agent to jump straight to the offending code without grepping the full log.
The full agent workflow (build → install → navigate → screenshot → unit test → iterate) is documented in .agents/skills/agent-loop.md.
Development
npm test # Run tests
npm run test:watch # Watch mode
npm run build # Compile TypeScript
npm start # Start server (stdio)
npm run lint # ESLintLicense
MIT
Available Tools
33 toolsboot_simulatorBoot SimulatorAIdempotent
Boot an iOS simulator by UDID and wait for it to be fully ready. Idempotent — returns alreadyBooted=true if already running. Opens Simulator.app by default. Android emulator booting is not yet supported (start it manually).
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Target mobile platform (Android booting is not yet supported) | |
| timeoutMs | No | Max wait in ms for the device to reach Booted state. Default: 120000. | |
| deviceUdid | Yes | Simulator UDID to boot (from list_devices) | |
| openSimulatorApp | No | iOS only: open Simulator.app to surface the UI. Default: true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | Device state after the boot attempt |
| output | Yes | |
| passed | Yes | Whether the device reached Booted state |
| platform | Yes | |
| deviceUdid | Yes | |
| durationMs | Yes | |
| alreadyBooted | Yes | True if the device was already Booted before the call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=true. The description adds that it opens Simulator.app and returns alreadyBooted=true on re-boot, but does not elaborate on other side effects or resource usage. With annotations covering core traits, the description adds moderate 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?
Two sentences pack all essential information: action, idempotency, Android limitation, and default behavior. Perfectly front-loaded with no 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 an output schema present (context signals), the description does not need to detail return values. It covers core functionality, idempotency, platform restriction, and defaults. Minor gaps exist (e.g., meaning of 'fully ready'), but overall adequate for a boot 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%, but the description adds meaningful context beyond the schema: it notes 'from list_devices' for deviceUdid, clarifies the Android limitation for platform, and states the default for openSimulatorApp. This extra guidance improves parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain 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 clearly states the tool boots an iOS simulator by UDID, waits for readiness, and is idempotent. It also explicitly mentions Android is unsupported, distinguishing it from any potential Android boot tool (none in siblings). This is specific verb+resource with clear 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?
The description explicitly states idempotency and the Android limitation ('Android emulator booting is not yet supported (start it manually)'), providing clear context for when to use (iOS) and when not (Android). It does not name alternative tools, but no sibling boot tools exist for Android.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_taskCancel TaskADestructiveIdempotent
Aborts a running task: sends SIGTERM to children, runs registered cleanups in reverse order, marks the task cancelled. Idempotent and never throws.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | ||
| taskId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| taskId | Yes | |
| notFound | No | |
| cancelled | Yes | |
| finalStatus | No | |
| cancelReason | No | |
| previousStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral details (SIGTERM, cleanup order, never throws) beyond annotations that already indicate destructiveness and idempotency. No contradiction 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?
The description is two sentences, front-loaded with the core action, and every word adds value. 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?
Given the presence of an output schema and annotations, the description covers purpose, behavior, and safety. However, it misses prerequisites like the task must be running.
Complex tools with many parameters or behaviors need more documentation. 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 0% schema description coverage, the description should explain parameters. It does not mention the 'reason' parameter and only implicitly references taskId. This forces the agent to infer parameter meaning from 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?
The description clearly states the tool aborts a running task with specific actions (SIGTERM, cleanups). It distinguishes itself from sibling tools like list_tasks or poll_task_status by focusing on cancellation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 (to cancel a running task) but does not explicitly mention when not to use or provide alternatives. It states idempotent and never-throws, which aids usage decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_mock_responsesClear Mock ResponsesADestructiveIdempotent
Remove mocks installed by set_mock_response. Pass mockId to remove one; omit to clear all mocks for the session. stop_and_compile_test runs this implicitly on session end.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| scope | Yes | Which scope was targeted |
| removed | Yes | Number of rules deleted from Proxyman |
| remaining | Yes | Number of rules still active in the targeted scope |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description aligns with annotations (destructiveHint=true, idempotentHint=true), confirming destructive removal behavior and adding context about implicit execution without 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?
Two sentences, zero waste, front-loaded with action and key usage details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 zero parameters and simple purpose, description fully covers usage, behavior, and relationship to sibling tools, with output schema present for 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?
No parameters in schema, but description adds semantics by naming mockId as optional parameter and clarifying its effect (remove specific vs all). Baseline 4 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?
Clearly states it removes mocks installed by set_mock_response, distinguishing it from sibling tools like set_mock_response and noting implicit execution by stop_and_compile_test.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 explains when to pass mockId (remove one) versus omit (clear all), and mentions that stop_and_compile_test runs it implicitly, guiding the agent on alternative invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_ui_actionExecute UI ActionA
Dispatch a UI action (tap, type, scroll, etc.) on a target element. Logs the interaction to session memory for later test synthesis. Selector priority: id > accessibilityLabel > text. Scroll/swipe are not supported during a live recording session — use start_flow for complex sequences.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The UI action to perform. "type" taps the element first then types — fails on iOS secure text fields where the tap can drop focus. Use "inputText" instead to type into the already-focused field with no preceding tap (matches Maestro's native `inputText` YAML command, the only reliable path for secure password fields). For inputText, the element field is optional and ignored. | |
| element | No | Target UI element to act on. Required for tap/type/scroll/swipe/etc. Ignored when action is "inputText" (typing happens against whatever field currently holds focus). | |
| sessionId | Yes | Active session ID | |
| textInput | No | Text to type (required when action is "type" or "inputText") |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | Human-readable result message |
| success | Yes | Whether the action was dispatched successfully |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses side effect of logging to session memory and limitations for scroll/swipe during recording. Annotations already indicate write operation, so description adds value without 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?
Two concise paragraphs with front-loaded purpose. Every sentence adds essential information with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, side effect, selector priority, and usage limitation. Does not explain all action types or output schema, but schema handles those 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 already covers all parameters with detailed descriptions (100% coverage). Description adds minor nuance about inputText element being ignored, but not significant beyond 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?
Clearly states the tool dispatches UI actions on target elements. Differentiates from siblings by mentioning 'use start_flow for complex sequences'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 not to use (scroll/swipe during live recording) and provides alternative (start_flow). Gives clear guidance for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_network_logsGet Network LogsARead-onlyIdempotent
Retrieve intercepted HTTP/HTTPS network transactions for the session from Proxyman. Filter by URL path to isolate SDUI or analytics endpoints. Used to correlate network state with UI state.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of log entries to return (default: 50) | |
| sessionId | Yes | Active or completed session ID | |
| filterPath | No | Optional URL substring to filter logs (e.g., "/api/sdui") | |
| filterDomains | No | Optional list of domains to capture (e.g., ["api.myapp.com"]). Reduces Proxyman noise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total number of matching events |
| events | Yes | Matching network transactions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the tool is safe for repeated use. The description adds value by specifying the source (Proxyman) and purpose (correlating with UI state), but does not elaborate on rate limits, data volume, or other behavioral aspects beyond what annotations 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?
The description is two sentences long, front-loaded with the action and resource, and every sentence provides essential information without redundancy. It efficiently communicates purpose, filtering options, and usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 tool has 4 parameters, a high annotation coverage, an output schema, and is a read-only retrieval tool, the description covers purpose, source, filtering capability, and usage correlation with UI state. No critical gaps are 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?
All 4 parameters are fully described in the input schema with clear descriptions, achieving 100% coverage. The description text mentions filtering by URL path, which aligns with the filterPath parameter, but does not add additional meaning beyond what the schema already provides. 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 clearly states the tool retrieves HTTP/HTTPS network transactions from Proxyman, with filtering capability. The verb 'retrieve' and resource 'network transactions' are specific, and the mention of 'SDUI or analytics endpoints' distinguishes it from sibling network verification tools that focus on conditions rather than raw 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?
The description indicates the tool is used to correlate network state with UI state and suggests filtering by URL path for specific endpoints. However, it does not explicitly state when not to use this tool or directly name alternatives like verify_network_* tools, though the context implies it for raw log retrieval vs. verification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_session_timelineGet Session TimelineARead-onlyIdempotent
Get a lightweight mid-session health check showing polling stats, interaction counts, and gap analysis. Use during an active recording to verify the poller is keeping up and interactions are being captured. Only available while session status is "recording".
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Active session ID to get timeline for |
Output Schema
| Name | Required | Description |
|---|---|---|
| gaps | Yes | Polling gaps where interactions may have been missed |
| status | Yes | Current session status |
| elapsedMs | No | Milliseconds since recording started |
| sessionId | Yes | The session this timeline belongs to |
| pollSummary | Yes | Aggregate polling statistics |
| recentPolls | Yes | Most recent 10 poll records for quick inspection |
| interactionSummary | Yes | Interaction capture statistics |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint true, idempotentHint true, and destructiveHint false. The description adds behavioral context beyond annotations, such as 'lightweight' and the specific contents of the health check, and the runtime availability condition.
Agents need to know what a tool does to the 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 two concise sentences with no wasted words. It front-loads the core functionality and provides necessary usage context efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 simple parameter set, presence of output schema, and comprehensive annotations, the description is complete. It covers purpose, usage condition, and expected content, making it sufficient for an AI agent.
Complex tools with many parameters or behaviors need more documentation. 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 parameter sessionId is fully described in the schema (100% coverage). The description does not add additional semantics beyond the schema, which is acceptable given complete schema 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?
The description clearly states the tool gets a lightweight mid-session health check with specific metrics (polling stats, interaction counts, gap analysis). It uses a specific verb and resource, and the focus on active recording distinguishes 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?
The description explicitly states when to use it (during an active recording) and the condition 'only available while session status is recording.' It lacks explicit alternatives for non-recording scenarios, 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.
get_task_resultGet Task ResultARead-onlyIdempotent
Returns the final structured result for a completed task. Returns error/notFound for not-yet-done or unknown tasks. Idempotent — does not consume the task.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| result | No | |
| status | Yes | |
| taskId | Yes | |
| notFound | No | |
| cancelReason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set idempotentHint and readOnlyHint. The description adds value by stating it returns error/notFound for incomplete/unknown tasks and explicitly says it is idempotent and does not consume the task.
Agents need to know what a tool does to the 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 essential purpose, and each sentence adds distinct information without redundancy or 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?
Given the presence of an output schema, the description adequately covers the core behavior and error cases. It could mention the output schema exists, but this is minor. Annotations provide safety 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?
With schema description coverage at 0%, the description does not explain the taskId parameter at all. The only parameter is not described in text, leaving the agent to infer its meaning 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?
The description clearly states the verb 'returns' and resource 'final structured result for a completed task'. It differentiates behavior from not-yet-done tasks by specifying error returns. This distinguishes it from sibling tools like poll_task_status or list_tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 usage for completed tasks but does not explicitly guide when to use this over alternatives like poll_task_status or list_tasks. No mention of prerequisites or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ui_hierarchyGet UI HierarchyARead-onlyIdempotent
Capture the current UI element tree from a booted simulator. Works standalone (auto-targets the sole booted device) or within a recording session via sessionId. Returns a normalized accessibility tree with pixel bounds for point-based taps when selectors don't match. Use interactiveOnly to filter to tappable elements.
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | If true, collapse single-child chains and strip anonymous containers to reduce tree depth. | |
| sessionId | No | Active session ID. If omitted, auto-targets the sole booted simulator. | |
| artifactPath | No | If set, write the full hierarchy JSON to this file path and return only a summary with node count. | |
| interactiveOnly | No | If true, return only elements with id, label, or text — stripping non-interactive nodes. | |
| includeRawOutput | No | If true, include the raw CLI/daemon output string in the response (default: omitted to save context). |
Output Schema
| Name | Required | Description |
|---|---|---|
| hierarchy | Yes | Normalized UI element tree |
| nodeCount | No | Total number of nodes in the hierarchy tree. |
| rawOutput | No | Raw output from the automation backend (CSV from daemon, JSON from CLI). Only included when includeRawOutput is true. |
| diagnostics | No | Diagnostic warnings when the result may be incomplete (e.g., empty parsed tree with non-empty raw output). |
| artifactPath | No | Path where the full hierarchy was written, if artifactPath was specified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false. The description adds useful context about point-based taps and matching, but the annotations already cover the safety profile 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?
Three sentences, front-loaded with the main action. Efficient and no unnecessary 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?
Given 5 parameters, good annotations, and an existing output schema, the description covers main use cases, mentions sessionId, interactiveOnly, and return type. It is complete for a read-only, idempotent 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 all parameters. The description does not add significant additional meaning beyond what the schema provides, e.g., it repeats the interactiveOnly purpose 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?
The description clearly states the tool captures the UI element tree from a booted simulator, specifying standalone or session-based usage. It mentions returning a normalized accessibility tree with pixel bounds, distinguishing it from siblings like take_screenshot or execute_ui_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?
The description explains when to use (capturing UI hierarchy) and how to use it (standalone or with sessionId, filtering with interactiveOnly). However, it does not explicitly mention when not to use or provide alternatives among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_appInstall AppAIdempotent
Install a built app onto a booted simulator/emulator. iOS uses xcrun simctl install; Android uses adb install -r. Returns the resolved bundle id (iOS) when available.
| Name | Required | Description | Default |
|---|---|---|---|
| appPath | Yes | Absolute path to the .app bundle (iOS) or .apk file (Android) to install | |
| platform | Yes | Target mobile platform | |
| deviceUdid | Yes | Target device UDID (from list_devices) |
Output Schema
| Name | Required | Description |
|---|---|---|
| output | Yes | |
| passed | Yes | Whether install succeeded |
| bundleId | No | iOS only: bundle identifier extracted from the .app (best-effort). |
| platform | Yes | |
| deviceUdid | Yes | |
| durationMs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint=true and destructiveHint=false. The description adds value by specifying the underlying commands (xcrun simctl install, adb install -r), the return value (resolved bundle id for iOS), and the prerequisite that the device be booted, which goes beyond annotation scope.
Agents need to know what a tool does to the 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 efficient sentences: first states purpose, second gives platform-specific implementation details, third mentions return value. No redundant or superfluous text; 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?
Given the tool's moderate complexity, the description covers purpose, parameters (with cross-reference), preconditions (booted device), and return value. It lacks details on error conditions or post-installation behavior, but the output schema likely covers return structure.
Complex tools with many parameters or behaviors need more documentation. 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 already covers all three parameters with full description (100% coverage). The description adds cross-referencing context for deviceUdid (from list_devices) and notes platform differences for appPath, providing useful semantics 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 clearly states the core action: installing a built app onto a booted simulator/emulator. It distinguishes from siblings like uninstall_app and boot_simulator, and mentions platform-specific commands, making the purpose specific and 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 does not explicitly state when to use this tool versus alternatives or when not to use it. It implies the device must be booted but provides no exclusion criteria or comparison to siblings like start_test or run_feature_test.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesList DevicesARead-onlyIdempotent
List available iOS simulators and Android emulators. Filter by platform, state (Booted/Shutdown), or OS version. Use this to discover device UDIDs before calling get_ui_hierarchy.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Filter by device state. If omitted, returns all states. | |
| platform | No | Filter by platform. If omitted, returns both iOS simulators and Android emulators. | |
| osVersionContains | No | Filter iOS runtimes containing this string (e.g., "18" for iOS 18.x). |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Number of devices returned |
| devices | Yes | List of discovered simulators/emulators |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds that it lists devices and is read-only, consistent with annotations. No contradictions. It provides additional context about the tool's role in a workflow.
Agents need to know what a tool does to the 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 main action, then lists filtering options and a use case. No unnecessary words, efficiently conveys all essential 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?
Complete for a read-only listing tool with well-documented schema and annotations. The description covers the purpose, filtering, and relationship to a crucial sibling tool, making it fully actionable.
Complex tools with many parameters or behaviors need more documentation. Simple 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 detailed parameter descriptions. The description merely reiterates the filtering options without adding deeper meaning or usage nuances, so it meets the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain 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 clearly states the tool lists iOS simulators and Android emulators, with explicit filtering options. It distinguishes itself from siblings by directly referencing a dependent tool (get_ui_hierarchy) and specifying the output as device UDIDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 a specific use case ('discover device UDIDs before calling get_ui_hierarchy'), which guides when to use it. It does not explicitly state when not to use it or list alternatives, but the context is clear enough given the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_flowsList FlowsARead-onlyIdempotent
Discover named Maestro flows in a flows directory (default: ./flows). Each flow is a .yaml file; an optional _manifest.json adds descriptions, tags, and parameter specs. Use start_flow to execute one by name.
| Name | Required | Description | Default |
|---|---|---|---|
| flowsDir | No | Directory containing flow .yaml files (default: ./flows relative to the MCP server's working directory). Optional _manifest.json in this directory adds descriptions, tags, and param specs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| flows | Yes | Discovered flows, sorted by name |
| total | Yes | Number of flows returned |
| flowsDir | Yes | Absolute path to the directory that was scanned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds value by explaining the file structure (.yaml files and optional manifest.json). No contradictions, and it provides additional 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 sentences with no wasted words. The first sentence states the purpose and directory, the second gives a pointer to the sibling tool. Very concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 tool with one parameter and an output schema, the description is complete. It explains the file types and optional manifest, covering all necessary context without needing to describe return values.
Complex tools with many parameters or behaviors need more documentation. Simple 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 extra meaning by mentioning the optional _manifest.json and default path, enhancing understanding beyond 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?
The description clearly states it discovers named Maestro flows in a flows directory, using the verb 'discover' and specifying the resource (flows). It distinguishes from the sibling start_flow by noting to use that tool for execution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 mentions using start_flow to execute flows by name, providing a clear context for when to use this tool. However, it does not explicitly state when not to use it or provide other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList TasksARead-onlyIdempotent
Lists tasks in the registry, optionally filtered by kind/status. Useful for orphan recovery alongside list_active_sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| since | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| tasks | Yes | |
| totalTasks | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the description need not repeat safety. It adds value by noting the tool's role in orphan recovery, providing behavioral context. No contradictions.
Agents need to know what a tool does to the 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, highly concise with no wasted words. Front-loaded with core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 present and strong annotations, the description is mostly adequate but falls short on parameter documentation (0% schema coverage, no parameter details in description). The tool has 3 parameters and could benefit from more 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 0%, yet the description only mentions optional filtering by kind/status without detailing the parameters (kind enum, since format, status enum). The description adds minimal meaning beyond the schema itself, leaving parameter semantics unclear.
Input schemas describe structure but not intent. Descriptions should explain 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 clearly states the tool lists tasks with optional filtering by kind and status, and distinguishes itself by mentioning orphan recovery alongside the sibling tool list_active_sessions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 context for use (orphan recovery) and references a sibling tool, but does not explicitly state when not to use this tool or alternative scenarios beyond the one mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poll_task_statusPoll Task StatusARead-onlyIdempotent
Returns current status, duration, and the recent tail of streamed output for a task. Cheap; safe to call frequently. Returns notFound:true for unknown or pruned task IDs (never throws).
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | ||
| tailLines | No | Cap the recentOutputLines tail. Default: full retained buffer. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | No | |
| error | No | |
| status | Yes | |
| taskId | Yes | |
| notFound | No | |
| lineCount | Yes | Lifetime line count (may exceed recentOutputLines.length when ring buffer evicted older lines). |
| startedAt | No | |
| durationMs | Yes | |
| finishedAt | No | |
| cancelReason | No | |
| recentOutputLines | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and destructiveHint. The description adds valuable context: cheap performance, safety for frequent calls, and that it never throws on unknown IDs. This 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?
The description is two concise sentences, front-loaded with the purpose. Every sentence provides essential information without 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?
Given the tool's simplicity and the presence of an output schema, the description covers the return values, safety, error handling (notFound), and performance. It is complete for a polling 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?
The schema describes tailLines (with description and constraints) but not taskId. The description does not add meaning for taskId (e.g., format uuid) and only loosely references 'recent tail' without detailing tailLines. With 50% schema coverage, the description fails to compensate for the undocumented taskId 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?
The description clearly states it returns current status, duration, and the recent tail of streamed output for a task. It uses specific verbs and resources, distinguishing itself from siblings like get_task_result by emphasizing its cheap and safe nature for frequent polling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 advises that the tool is cheap and safe to call frequently, guiding usage for polling. It also clarifies that notFound:true is returned for unknown/pruned IDs (never throws). However, it does not explicitly state when to use alternatives like get_task_result for final results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_segmentRegister SegmentAIdempotent
Register a recorded session as a named, reusable flow segment. Computes a fingerprint from the correlated steps and saves it to the segment registry for future deduplication.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable segment name (e.g., "login", "navigate-to-settings") | |
| sessionId | Yes | Session ID whose correlated steps define this segment | |
| registryPath | No | Path to registry.json (defaults to ./segments/registry.json) |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Registered segment name |
| message | Yes | Human-readable confirmation message |
| fingerprint | Yes | Segment fingerprint |
| registryPath | Yes | Path to the registry file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false. The description adds context about computing a fingerprint and saving to the registry, which exceeds annotation coverage. However, it doesn't mention potential merging or overwrite 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 description is two sentences, front-loaded with the core action, and every word adds value. No unnecessary 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 an output schema present, the description doesn't need to explain return values. It covers purpose and fingerprint computation. Missing details on error conditions or prerequisites, but overall 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 baseline is 3. The description does not add parameter-specific meaning beyond what the schema provides; it only reiterates that the session is recorded and the segment is reusable.
Input schemas describe structure but not intent. Descriptions should explain 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 clearly states the tool registers a recorded session as a named segment and computes a fingerprint for deduplication. It uses specific verbs and resources, distinguishing it from sibling tools like start_recording_session or verify_network_deduplication.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 usage for deduplication but does not explicitly state when to use this tool versus alternatives. No guidance on prerequisites or when not to use it is provided, which is moderate given the sibling list includes related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_feature_testRun Feature TestA
Execute a declarative feature test in ONE tool call: setup flows → start recording → UI actions → network assertions → stop & compile → teardown. Replaces 8–15 AI-orchestrated tool calls per run with a single deterministic lifecycle. Accepts an inline FeatureTestSpec or a path to a .yaml/.json spec file.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Env vars passed to every setup/teardown flow as Maestro -e KEY=VALUE | |
| spec | Yes | Inline FeatureTestSpec object or absolute path to a .yaml/.json spec file | |
| flowsDir | No | Directory for setup/teardown flow YAML files | |
| platform | No | Target platform (default: ios) | |
| settleMs | No | Wait after the last action before running assertions (default: 5000) | |
| stubsDir | No | Optional WireMock stubs root directory used by setup/teardown flows | |
| setupTimeoutMs | No | Max wall-clock time for all setup flows combined (default: 120000) | |
| actionTimeoutMs | No | Max wall-clock time for the entire actions phase (default: 30000) | |
| driverCooldownMs | No | Unified iOS driver cooldown (default: 5000). Applied in two places: (1) sleep between consecutive setup flows, (2) cooldown after the XCTest driver is uninstalled inside start_recording_session / run_flow (only hits that path when the driver health probe fails). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| error | No | Populated when the test aborted before completion |
| mocks | No | |
| setup | Yes | |
| passed | Yes | True only if setup, all actions, and every assertion passed |
| actions | Yes | |
| teardown | Yes | |
| assertions | Yes | |
| durationMs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description explains it orchestrates a lifecycle (setup, record, actions, assertions, teardown), implying side effects but not detailing what gets destroyed or authentication needs. With openWorldHint, more context on side effects would improve transparency, but the description does not contradict 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 description is two sentences, front-loading the key value proposition ('execute a declarative feature test in ONE tool call') and summarizing the lifecycle. Every sentence adds value without 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?
Given the tool's complexity (9 params, nested objects, output schema exists), the description provides a clear overview of the lifecycle and key capability. It does not explain return values (output schema exists, so not required). It could mention that it internally uses sibling tools, but the replacement claim implies that. Overall, it is sufficiently complete for an agent to understand when to use 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%, so baseline is 3. The description adds high-level meaning (accepts inline spec or file path) but does not provide additional semantics beyond what the schema already covers for each parameter. The schema itself is rich with 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?
The description clearly states the tool executes a declarative feature test in a single call, listing the lifecycle steps (setup, recording, actions, assertions, teardown). It distinguishes itself by claiming it replaces 8-15 individual tool calls, making its purpose specific and differentiated from siblings like start_recording_session, verify_network_*, 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?
The description implies when to use this tool: when you want to run a complete feature test in one call, avoiding manual orchestration. It mentions 'Replaces 8-15 AI-orchestrated tool calls', giving clear context. However, it does not explicitly state when not to use it (e.g., debugging or partial runs) or suggest alternatives beyond the implied single tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_unit_testsRun Unit TestsAIdempotent
Run the unit-test target for the project. Returns structured results: pass/fail counts, failing test names, first-line failure messages. Long-running — default timeout 30 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| module | No | Android only: Gradle module name. Default: "app". | |
| scheme | No | iOS only: Xcode scheme name. Required for iOS. | |
| variant | No | Android only: Build variant (e.g., "debug", "release"). Default: "debug". | |
| platform | Yes | Target mobile platform | |
| testPlan | No | iOS only: Optional xcodebuild -testPlan name to run a specific test plan. | |
| timeoutMs | No | Max test-run duration in ms. Default: 1800000 (30 minutes). | |
| gradleTask | No | Android only: Explicit Gradle task (e.g., "test", "connectedCheck"). Default: test<Variant>UnitTest (derived from variant). | |
| testFilter | No | Android only: Value forwarded to `--tests` (e.g., "com.example.MyTest" or "com.example.*"). Omit to run all tests. | |
| destination | No | iOS only: xcodebuild -destination value. Defaults to the iOS Simulator for the first matching runtime. | |
| onlyTesting | No | iOS only: Array of test identifiers to restrict the run. Each entry maps to xcodebuild -only-testing:<Target>/<Class>[/<Method>]. | |
| projectPath | No | Absolute path to the project. iOS: .xcodeproj (required if workspacePath omitted). Android: Gradle project root containing ./gradlew (required). | |
| configuration | No | iOS only: Build configuration (e.g., "Debug", "Release"). Default: "Debug". | |
| workspacePath | No | iOS only: Absolute path to a .xcworkspace. Takes precedence over projectPath. |
Output Schema
| Name | Required | Description |
|---|---|---|
| output | Yes | Truncated stdout/stderr from the test run |
| passed | Yes | True when the run finished cleanly with zero failing tests |
| failures | Yes | Failing tests with first-line messages (may be empty) |
| platform | Yes | |
| reportDir | No | Android only: directory containing the JUnit XML reports that were parsed |
| durationMs | Yes | Total test-run wall clock time in ms |
| totalTests | Yes | Total tests executed |
| failedTests | Yes | Tests that failed |
| passedTests | Yes | Tests that passed |
| skippedTests | No | Tests reported as skipped, if the tool emits that information |
| resultBundlePath | No | iOS only: path to the .xcresult bundle written by xcodebuild |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Disclosures beyond annotations: returns structured results with specific fields, and describes long-running nature with default timeout. Idempotent and non-destructive nature consistent; no contradictions.
Agents need to know what a tool does to the 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: first states purpose, second adds behavioral detail. No unnecessary words, properly 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?
Adequate for a complex tool with 13 parameters; output schema covers return structure. Could explicitly note platform-specific param requirements, but schema per-param descriptions fill the 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 covers all parameters (100% coverage), so baseline is 3. Description does not add additional parameter-level meaning; agent must rely entirely on schema for parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb ('Run') and resource ('unit-test target'), and distinguishes from sibling 'run_feature_test' by specifying it's for unit tests. Also mentions return 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?
No explicit when-to-use or when-not-to-use guidance nor alternatives. However, naming implies purpose and context signals show many sibling tools; a brief differentiation could improve clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_mock_responseSet Mock ResponseA
Install a live response-mocking rule via Proxyman. Two modes: staticResponse (return a verbatim payload — feature flags, fixtures) and responseTransform.jsonPatch (proxy to the real backend then mutate the response body in flight — e.g. the loginStatus override pattern). Session-scoped mocks auto-clean on stop_and_compile_test; standalone mocks persist until explicitly cleared. Requires Proxyman running with MCP enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| mock | Yes | ||
| sessionId | No | Active recording session ID. Mocks tagged with the session auto-clean on stop_and_compile_test. OMIT to install a STANDALONE mock that persists until explicitly cleared via clear_mock_responses ({ mockId } or { allStandalone: true }) — useful for agents mocking outside any recording session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| scope | Yes | Whether the mock is auto-cleaned on stop_and_compile (session) or persists (standalone) |
| mockId | Yes | Stable mock ID (echoed if provided, generated if not) |
| ruleName | Yes | Display name of the rule in Proxyman: mca:<sessionId>:<mockId> for session-scoped, or mca:standalone:<mockId> for standalone. |
| proxymanRuleId | Yes | Proxyman rule ID, useful for direct inspection in the Proxyman UI |
| totalSessionMocks | No | Total active mocks for this session after this call. Only set when scope === "session". |
| totalStandaloneMocks | No | Total active standalone mocks after this call. Only set when scope === "standalone". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate non-readOnly, non-idempotent, non-destructive. The description adds behavioral context about lifecycle (auto-clean vs. persistent) and mode differences, which 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?
The description is three sentences, well-structured, and front-loaded with purpose. Every sentence adds value without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 tool has an output schema, so return values are covered. The description addresses purpose, modes, lifecycle, and prerequisites. It lacks mention of error handling or failure scenarios, but overall it is sufficiently 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 schema already has detailed descriptions for many parameters (e.g., matcher fields, mock.id). The description adds conceptual understanding of the two modes but does not delve into parameter syntax or the sessionId distinction. Schema coverage is 50%, and the description provides moderate additional value.
Input schemas describe structure but not intent. Descriptions should explain 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 clearly states the tool installs a live response-mocking rule via Proxyman and distinguishes two modes (staticResponse and responseTransform.jsonPatch). It uses specific verbs and resources, and 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?
The description provides guidance on session-scoped vs. standalone mocks and the prerequisite of Proxyman running with MCP. However, it does not explicitly mention when not to use this tool or compare it to alternatives like clear_mock_responses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_buildStart Build (Async)A
Compile an iOS or Android app from source (xcodebuild or gradlew). Returns a taskId immediately; poll via poll_task_status, get final .app/.apk path + bundleId via get_task_result. Default timeout 15 min.
| Name | Required | Description | Default |
|---|---|---|---|
| module | No | Android only: Gradle module name. Default: "app". | |
| scheme | No | iOS only: Xcode scheme name. Required for iOS builds. | |
| variant | No | Android only: Build variant (e.g., "debug", "release"). Default: "debug". | |
| platform | Yes | Target mobile platform | |
| timeoutMs | No | Maximum build duration in ms. Default: 900000 (15 minutes). | |
| destination | No | iOS only: xcodebuild -destination value. Default: "generic/platform=iOS Simulator". | |
| projectPath | No | Absolute path to the project. iOS: .xcodeproj (required if workspacePath omitted). Android: Gradle project root containing ./gradlew (required). | |
| configuration | No | iOS only: Build configuration (e.g., "Debug", "Release"). Default: "Debug". | |
| workspacePath | No | iOS only: Absolute path to a .xcworkspace. Takes precedence over projectPath. | |
| derivedDataPath | No | iOS only: Path for Xcode build artifacts. Default: tmpdir/mobile-automator-build. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| status | Yes | |
| taskId | Yes | |
| startedAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (which mark it as non-readonly, open-world, non-idempotent, non-destructive), the description adds behavioral details: it is async, requires polling, has default timeout of 15 min, and provides output path via get_task_result. However, it doesn't mention side effects like overwriting existing builds.
Agents need to know what a tool does to the 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 two sentences with no wasted words. It front-loads the primary action (compiling apps) and efficiently conveys the async workflow and timeout. Every sentence adds necessary 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?
Given 10 parameters and async output, the description covers the main workflow (poll, get result) and default timeout. It doesn't specify error handling or platform-specific parameter dependencies, but the schema handles those. Mostly complete for a complex 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 baseline is 3. The description does not add new parameter semantics beyond what the schema already provides; it only summarizes the platform and build tools used. No extra guidance on parameter values or dependencies.
Input schemas describe structure but not intent. Descriptions should explain 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 clearly states the tool compiles iOS or Android apps from source using xcodebuild or gradlew. It distinguishes itself from sibling tools like run_unit_tests or run_feature_test by focusing on the build process and async pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 indirectly explains when to use the tool by describing the async workflow and that it returns a taskId for polling. It doesn't explicitly state when not to use it or list alternatives, but the context is sufficient given the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_flowStart Flow (Async)A
Execute a named Maestro flow (resolves /.yaml and merges manifest param defaults with caller params). Use to navigate to the area of an incremental change before verifying it. Returns a taskId; poll_task_status streams output, get_task_result returns final pass/fail. With MCA_FLOW_PAUSE_RESUME=on, pauses any active recording for the run and auto-resumes; otherwise errors if a session is active. cancel_task interrupts mid-flow.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Flow name (the filename without the .yaml suffix) | |
| params | No | Parameters forwarded to Maestro as environment variables (-e KEY=VALUE). Referenced inside the flow YAML as ${KEY}. Manifest-declared params with defaults are applied automatically when omitted. | |
| flowsDir | No | Directory containing flow .yaml files (default: ./flows) | |
| platform | No | Target platform (default: ios) | |
| stubsDir | No | Optional WireMock stubs root directory. If provided, a stub server is started for the flow run. | |
| debugOutput | No | Path where Maestro should dump debug output (screenshots, hierarchies, logs) | |
| stubServerPort | No | Port for the optional stub server (default: auto-select) | |
| driverCooldownMs | No | iOS-only: pause after uninstalling the XCTest driver to let port 7001 drain (default: 3000). Only applies on the uninstall path — a healthy driver is reused without cooldown. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| status | Yes | |
| taskId | Yes | |
| startedAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations, including returning a taskId, pause/resume behavior with MCA_FLOW_PAUSE_RESUME, error conditions for active sessions, and the ability to cancel mid-flow via cancel_task. No contradictions 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 description is concise and front-loaded with the main purpose. It efficiently covers key points without unnecessary fluff, though it could be slightly more streamlined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 tool's complexity with 8 parameters and nested objects, the description covers the return value (taskId), how to handle results (poll, get), and key behaviors. With an output schema present, it doesn't need to detail return fields, making it sufficiently complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema coverage is 100%, the description adds meaning by explaining how params are forwarded as environment variables, how manifest defaults merge with caller params, and specific details like driverCooldownMs being iOS-only. This goes beyond the basic 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?
The description clearly states 'Execute a named Maestro flow' with specifics about resolving YAML files and merging parameters. It distinguishes the tool from siblings like list_flows and cancel_task by focusing on execution and navigation to incremental changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 a clear use case: 'navigate to the area of an incremental change before verifying it.' It mentions related tools for polling and getting results, but lacks explicit comparisons to other execution tools like run_feature_test or start_test, which would improve guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_recording_sessionStart Recording SessionA
Begin recording a mobile interaction session. Initializes session memory, monitors the UI hierarchy, and starts capturing network events. Returns a session ID to use with subsequent tool calls. During the session, drive the app via execute_ui_action (single steps) or start_flow (stored Maestro yaml). Both update the recording timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | The target mobile platform | |
| timeouts | No | Optional timeout overrides. All values merge with defaults — only override what you need. | |
| appBundleId | Yes | The bundle identifier of the app to record (e.g., com.example.MyApp) | |
| captureMode | No | Hierarchy capture fidelity. "event-triggered" (default) captures pre/post-action snapshots with settle detection. "polling" captures at a fixed interval for high-fidelity transient state recording. | |
| sessionName | No | Optional human-readable name for this session | |
| filterDomains | No | Optional domain list for Proxyman traffic isolation (e.g., ["localhost.proxyman.io:3031"]). Enables concurrent sessions on different ports. | |
| settleTimeoutMs | No | How long to wait for the UI to stabilize after an action, in ms (default: 3000) | |
| trackEventPaths | No | URL path patterns for network-based interaction tracking (e.g., ["/__track"]). When the app POSTs to matching paths, the events are extracted as user interactions during compilation. | |
| pollingIntervalMs | No | Polling interval in ms when captureMode is "polling" (default: 500) |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | Human-readable status message |
| readiness | No | Readiness checkpoint — indicates whether the session is fully armed for recording. Wait for all fields to be true before interacting with the app for best results. |
| sessionId | Yes | Unique ID for the recording session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds context that it initializes session memory, monitors UI, and captures network events, which aligns with and supplements the annotations without 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?
The description is four sentences, each serving a clear purpose: stating the action, listing key behaviors, noting the return value, and providing usage guidance. 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?
Given the tool's complexity (9 parameters, 2 required, nested objects) and the presence of an output schema, the description sufficiently covers the main purpose and usage. It explains session lifecycle and integration with related tools, though it could mention prerequisites like having a simulator/device ready.
Complex tools with many parameters or behaviors need more documentation. Simple 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 detailed parameter descriptions. The description does not add extra meaning beyond the schema; it only mentions the return of a session ID. Baseline 3 is appropriate as the schema carries the full 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?
The description clearly states it begins recording a mobile interaction session, initializes session memory, monitors UI hierarchy, and captures network events. It also mentions returning a session ID and differentiates from sibling tools like execute_ui_action and start_flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 tells how to drive the app after starting a session (via execute_ui_action or start_flow) and notes they update the timeline. It provides clear context on when to use these alternatives, though it does not explicitly state when not to start a session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_testStart Test (Async)A
Run a Maestro YAML test file with optional WireMock stub replay. Replays a static script against a booted simulator — does NOT record new network traffic. Returns a taskId; poll_task_status streams live output, get_task_result returns final pass/fail. With MCA_FLOW_PAUSE_RESUME=on, pauses any active recording for the run and auto-resumes; otherwise errors if a session is active. cancel_task interrupts mid-flow.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Environment variables passed to Maestro via -e KEY=VALUE flags (e.g., { "APP_ID": "io.appcision.project-doombot" }) | |
| platform | No | Target platform (default: ios) | |
| stubsDir | No | Path to WireMock stubs root directory (session-xxx/wiremock/) containing mappings/ and __files/ subdirectories. If provided, a stub server is started automatically. | |
| yamlPath | Yes | Path to the Maestro YAML test file | |
| profiling | No | Optional performance profiling configuration. When provided, an xctrace (iOS) or dumpsys (Android) profiling session runs in parallel with the test. Results are returned as structured metrics. | |
| debugOutput | No | Path to a directory or filename where Maestro should dump debug output (screenshots, hierarchies, logs) | |
| stubServerPort | No | Port for the stub server (default: auto-select available port) | |
| driverCooldownMs | No | iOS-only: pause after uninstalling the XCTest driver to let port 7001 drain (default: 3000). Only applies on the uninstall path — a healthy driver is reused without cooldown. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| status | Yes | |
| taskId | Yes | |
| startedAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and idempotentHint=false, and the description adds useful behavioral details: it is async (returns taskId), does not record traffic, can be canceled via cancel_task, and handles active recording pauses. This goes beyond what 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 concise at five sentences, with no wasted words. It front-loads the primary purpose and logically structures additional details (non-recording, async polling, pause/resume condition, cancellation).
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 key aspects: purpose, non-recording, async return, result retrieval, cancellation, and the active recording edge case. It assumes a booted simulator is mentioned, which is sufficient given the sibling boot_simulator tool. It is complete for a tool of this complexity, though it could briefly mention prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple 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 each parameter is well-documented in the schema. The description does not add extra parameter-level meaning beyond the schema; it mainly provides high-level context about the tool's behavior and return 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?
The description clearly states the tool runs a Maestro YAML test file with optional WireMock stub replay, specifying the verb 'run' and the resource 'Maestro YAML test file'. It distinguishes itself from recording tools by explicitly stating it does NOT record new network traffic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 some implicit guidance (e.g., for static scripts, not recording) and mentions conditions like MCA_FLOW_PAUSE_RESUME for active recordings, but it does not explicitly compare with sibling tools such as start_flow or run_feature_test, which would clarify when to use this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_and_compile_testStop and Compile TestAIdempotent
Stop the active recording session and synthesize a Maestro YAML test script. Correlates captured UI interactions with network payloads and embeds JavaScript assertions for analytics events.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | The session ID returned by start_recording_session | |
| conditions | No | Optional natural-language assertions to include, e.g. "verify analytics event: page_view" | |
| outputPath | No | Absolute path where the generated .yaml file should be written | |
| mockingConfig | No | Network mocking configuration for WireMock stub generation |
Output Schema
| Name | Required | Description |
|---|---|---|
| yaml | Yes | The generated Maestro YAML test script content |
| stubsDir | No | WireMock stubs root directory containing mappings/ and __files/ subdirectories |
| yamlPath | Yes | File path where the YAML was written |
| sessionId | Yes | The session that was compiled |
| fixturesDir | No | Directory containing WireMock response fixtures |
| manifestPath | No | Path to the session manifest JSON |
| timelinePath | No | Path to the session timeline JSON file for post-hoc debugging |
| flowExecutions | No | Phase 5: per-flow summary for run_test / run_flow executions captured mid-session. The full step stream lives in the timeline.json file. |
| matchedSegments | No | Existing registered segments that match this recording |
| pollingDiagnostics | No | Health diagnostics from the passive capture polling loop |
| segmentFingerprint | No | SHA-256 fingerprint of the action+endpoint sequence for deduplication |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotent and non-destructive. The description adds that it correlates UI and network data and embeds assertions, but does not explain session termination side effects or 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?
The description is extremely concise, front-loading the core action in the first clause, and provides meaningful detail in a second sentence. 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?
The description covers the core functionality but lacks usage context, prerequisites, and side effects. Given the complexity (nested parameters, output schema exists), more guidance is beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple 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 well-documented in the schema. The description adds no additional parameter insight 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 clearly states the tool stops a recording session and synthesizes a test script, using specific verbs and resource types. It is not explicitly differentiated from siblings like run_feature_test, 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?
No explicit when-to-use or alternatives guidance is provided. The context implies it follows start_recording_session, but this is not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_screenshotTake ScreenshotARead-only
Capture a PNG of the current simulator/emulator screen; returns an absolute path the agent can read back. Auto-retries on transient failures; returns passed:false on terminal failure instead of throwing.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Target mobile platform | |
| timeoutMs | No | Max wait in ms for the capture to complete. Default: 30000. | |
| deviceUdid | Yes | UDID of the booted simulator or emulator (from list_devices) | |
| outputPath | No | Absolute path where the PNG should be written. If omitted, a timestamped file is created under tmpdir/mobile-automator-screenshots/. |
Output Schema
| Name | Required | Description |
|---|---|---|
| output | Yes | Truncated stdout/stderr from the capture tool |
| passed | Yes | Whether the screenshot was captured and saved |
| platform | Yes | |
| imagePath | Yes | Absolute path of the written PNG |
| sizeBytes | No | Size of the saved PNG in bytes |
| deviceUdid | Yes | |
| durationMs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, destructiveHint), the description discloses auto-retry behavior on transient failures and that terminal failures return passed:false instead of throwing. This adds actionable context for the agent.
Agents need to know what a tool does to the 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 purpose. Every sentence provides critical information without 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?
Given the tool's simplicity and full annotation/schema coverage, the description covers purpose, output format, failure modes, and return value. No missing critical 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 coverage is 100%, so the schema fully documents each parameter. The description does not add parameter-specific meaning beyond the schema, matching the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Capture' and resource 'current simulator/emulator screen', and specifies output format 'PNG' and return value 'absolute path'. It distinguishes from sibling tools like get_ui_hierarchy or verification 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?
No explicit when-to-use or when-not-to-use guidance. The purpose is implied for visual capture, but no comparison to alternative tools like get_ui_hierarchy or verify_network_* is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uninstall_appUninstall AppADestructiveIdempotent
Remove an installed app from a booted simulator/emulator, wiping its storage. Use before install_app to guarantee a clean-state launch. iOS: xcrun simctl uninstall; Android: adb uninstall.
| Name | Required | Description | Default |
|---|---|---|---|
| bundleId | Yes | iOS bundle identifier or Android package name of the app to remove | |
| platform | Yes | Target mobile platform | |
| deviceUdid | Yes | Target device UDID (from list_devices) |
Output Schema
| Name | Required | Description |
|---|---|---|
| output | Yes | |
| passed | Yes | Whether uninstall succeeded |
| bundleId | Yes | iOS bundle identifier or Android package name that was removed |
| platform | Yes | |
| deviceUdid | Yes | |
| durationMs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description aligns with annotations (destructiveHint=true, openWorldHint=true) by stating 'wiping its storage' and 'Remove an installed app'. No contradictions; adds behavioral 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 concise sentences, front-loaded with purpose and usage context. Every sentence adds value with no 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?
Given the output schema exists, the description sufficiently covers the tool's behavior (removal, platform-specific commands, usage hint). Annotations provide additional safety info. Complete for a destructive, idempotent 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 baseline 3. Description mentions bundleId as iOS bundle or Android package, but this repeats schema description. No additional semantic insight beyond 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 ('Remove') and resource ('installed app from a booted simulator/emulator'), and clearly distinguishes from sibling tools like install_app by mentioning wiping storage and clean-state launch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 ('before install_app to guarantee a clean-state launch') and provides implementation details for iOS and Android, giving clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_network_absentVerify Network AbsentARead-onlyIdempotent
Assert that a list of forbidden network calls do NOT fire within withinMs of a referenced UI action. Use to verify cache hits or absence of unnecessary prefetching.
| Name | Required | Description | Default |
|---|---|---|---|
| withinMs | No | ||
| sessionId | Yes | Active or completed session ID | |
| afterAction | Yes | Reference a prior UI action to anchor the time window | |
| filterDomains | No | Optional Proxyman domain filter | |
| forbiddenCalls | Yes | No matcher in this list may find any event in the window |
Output Schema
| Name | Required | Description |
|---|---|---|
| passed | Yes | |
| verdict | Yes | |
| violations | Yes | |
| anchorTimestamp | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, openWorld, idempotent, and non-destructive hints. Description adds the behavioural detail of the time window assertion and the 'not fire' condition, aligning well 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?
Two sentences, no wasted words. Front-loaded with the core assertion and use cases. Highly 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 verification tool with an output schema (not shown) and 5 parameters, the description covers the essential behavior and intent. Could elaborate on the afterAction anchoring, but the schema handles that 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 80%, so most parameters are documented in the schema. The description mentions 'withinMs' but adds no new meaning beyond the schema's default. 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?
Description clearly states the tool asserts that forbidden network calls do not fire within a time window, with specific use cases (cache hits, absence of unnecessary prefetching). This distinguishes it from siblings like verify_network_deduplication.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 ('verify cache hits or absence of unnecessary prefetching'), providing clear context for selection. Does not explicitly exclude alternatives, but the purpose is specific enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_network_deduplicationVerify Network DeduplicationBRead-onlyIdempotent
Assert that requests are not duplicated beyond a threshold. Groups by URL or extracted GraphQL operationName; flags groups exceeding maxDuplicates.
| Name | Required | Description | Default |
|---|---|---|---|
| groupBy | No | Group events by URL or by extracted GraphQL operationName | operationName |
| matcher | No | ||
| withinMs | No | ||
| sessionId | Yes | Active or completed session ID | |
| afterAction | No | Reference a prior UI action to anchor the time window | |
| filterDomains | No | Optional Proxyman domain filter | |
| maxDuplicates | No | Each unique key may appear at most this many times |
Output Schema
| Name | Required | Description |
|---|---|---|
| passed | Yes | |
| verdict | Yes | |
| duplicates | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, etc. The description adds that the tool groups events and flags duplicates, which is useful but does not detail the assertion outcome (e.g., whether it passes/fails or returns data). However, the output schema likely covers the return structure. Overall, description adds moderate value 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 sentences that efficiently convey the core functionality. No unnecessary words. The description is appropriately 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?
Despite the tool having 7 parameters, nested objects, and an output schema, the description is sparse. It does not describe the assertion mechanism, the effect of matcher, the time window (withinMs), or how afterAction anchors the window. With many sibling tools, a more complete description would help agents choose 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 71%, but the description only adds context for groupBy and maxDuplicates. It does not explain matcher, withinMs, afterAction, or filterDomains, which are not fully self-explanatory. The description does not compensate for the remaining 29% of parameters lacking schema 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?
Clearly states that the tool asserts network requests are not duplicated beyond a threshold, specifying grouping by URL or GraphQL operationName. This distinguishes it from other network verification tools like verify_network_absent or verify_network_sequence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 its many siblings (e.g., verify_network_parallelism, verify_network_payload). The description does not mention prerequisites, edge cases, or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_network_error_handlingVerify Network Error HandlingARead-onlyIdempotent
Assert that specific error responses appear in the session. Pair with WireMock stubs to verify the app behaves correctly under injected failures.
| Name | Required | Description | Default |
|---|---|---|---|
| withinMs | No | ||
| sessionId | Yes | Active or completed session ID | |
| afterAction | No | Reference a prior UI action to anchor the time window | |
| filterDomains | No | Optional Proxyman domain filter | |
| expectedErrors | Yes | Error responses that must appear in session traffic |
Output Schema
| Name | Required | Description |
|---|---|---|
| passed | Yes | |
| verdict | Yes | |
| errorsFound | Yes | |
| missingErrors | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds minimal behavioral context beyond these annotations, stating it asserts existence of errors. It does not contradict the annotations, but also does not add significant extra detail.
Agents need to know what a tool does to the 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 extremely concise: two sentences that front-load the purpose and immediately provide usage context. Every word is necessary, 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?
Given that the tool has an output schema (not shown) and annotations cover safety, the description is fairly complete. It explains the core function and usage context. It does not detail the output or parameter specifics, but the schema handles those.
Complex tools with many parameters or behaviors need more documentation. 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 80%, the baseline is 3. The description does not elaborate on parameters like 'sessionId' or 'expectedErrors'; the schema provides adequate descriptions. No additional meaning beyond the schema is added.
Input schemas describe structure but not intent. Descriptions should explain 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 clearly states the tool 'asserts that specific error responses appear in the session', providing a specific verb and resource. It distinguishes from sibling verification tools by focusing on error responses in the session, but does not explicitly differentiate from similar 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 provides explicit context for use: 'Pair with WireMock stubs to verify the app behaves correctly under injected failures.' This gives clear guidance on when to use the tool, though it does not mention alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_network_on_screenVerify Network On ScreenARead-onlyIdempotent
Assert that a list of expected network calls all fire within withinMs of a referenced UI action. Use to verify that navigating to a screen triggers the right API calls.
| Name | Required | Description | Default |
|---|---|---|---|
| withinMs | No | Look at network traffic within this many milliseconds of the anchor (default 3000, matches the Correlator window) | |
| sessionId | Yes | Active or completed session ID | |
| afterAction | Yes | Reference a prior UI action to anchor the time window | |
| expectedCalls | Yes | Every matcher in this list must find at least one event in the window | |
| filterDomains | No | Optional Proxyman domain filter |
Output Schema
| Name | Required | Description |
|---|---|---|
| extras | Yes | Events in the window that did not correspond to any expected matcher |
| passed | Yes | |
| matched | Yes | |
| missing | Yes | |
| verdict | Yes | |
| anchorTimestamp | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds that it checks network calls relative to a UI action, which is consistent and provides behavioral 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 sentences, no fluff. The first sentence states the function, the second provides a concrete use case. 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?
Given the annotations, full schema, and output schema, the description covers the essentials. It lacks prerequisites (e.g., session must be recording), but for a test utility this is minor. Adequate for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple 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 fully described. The description explains the overall logic (time window, anchor) but doesn't add significant detail beyond schema. A slight improvement over 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 clearly states the tool asserts that expected network calls fire within a time window of a UI action. It distinguishes itself from siblings like verify_network_absent by focusing on presence and timing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 use case: 'Use to verify that navigating to a screen triggers the right API calls.' While it doesn't list alternatives, the context is clear enough for an agent to infer when to use this vs other network verify tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_network_parallelismVerify Network ParallelismARead-onlyIdempotent
Assert that a set of matching network requests all start within a given time window (e.g., SDUI queries firing in parallel). Fails if fewer than minExpectedCount match or the total span exceeds maxWindowMs.
| Name | Required | Description | Default |
|---|---|---|---|
| matcher | Yes | Predicate selecting requests to test for parallelism | |
| sessionId | Yes | Active or completed session ID | |
| maxWindowMs | Yes | All matching requests must START within this window, in milliseconds | |
| filterDomains | No | Optional Proxyman domain filter | |
| minExpectedCount | Yes | Fail if fewer than this many requests fall inside the window |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Total matching events |
| events | Yes | |
| passed | Yes | |
| verdict | Yes | Human-readable summary |
| avgGapMs | Yes | Average time between consecutive matching events |
| actualSpanMs | Yes | Span (ms) from first to last matching event |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive. The description adds behavioral details: it 'fails' under specified conditions (count below minExpectedCount or span exceeding maxWindowMs), which is useful beyond the annotations. No contradictions detected.
Agents need to know what a tool does to the 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 two sentences, front-loading the core assertion and key conditions. Every word adds value; no unnecessary detail 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 (nested matcher object, multiple parameters) and the presence of an output schema (which explains return values), the description covers the essential logic: assertion condition and failure criteria. It could briefly explain matcher behavior, but the schema handles that.
Complex tools with many parameters or behaviors need more documentation. Simple 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 parameters. The description mentions minExpectedCount and maxWindowMs in context but adds no new semantic insight beyond what the schema provides. 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?
The description uses a specific verb (Assert) and resource (network requests starting in a time window). It includes an example (SDUI queries) and mentions key parameters (minExpectedCount, maxWindowMs), clearly distinguishing from sibling tools like verify_network_sequence or verify_network_performance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 use for checking parallel request timing. While it doesn't explicitly state when not to use, the sibling tool names (e.g., verify_network_absent, verify_network_deduplication) provide strong contextual cues, making the intended use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_network_payloadVerify Network PayloadARead-onlyIdempotent
Assert JSON response fields via dot/bracket paths: equals, contains, exists, type, minLength. More flexible than verify_sdui_payload, which only supports exact field matching.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Exact or partial URL; use this OR matcher | |
| matcher | No | Matcher to locate the event; use this OR url | |
| sessionId | Yes | Active or completed session ID | |
| filterDomains | No | Optional Proxyman domain filter | |
| responseAssertions | Yes | Path-based assertions to evaluate on the response body |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | No | |
| passed | Yes | |
| verdict | Yes | |
| mismatches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description's behavioral disclosure is less critical. The description adds path-based assertion context but no additional behavioral details like error handling or 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?
The description is a single, well-structured sentence that front-loads the purpose and efficiently adds a sibling comparison. 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?
Given the rich input schema and output schema, the description adequately conveys the core functionality. It doesn't explain all parameter interactions but is sufficient for an agent to understand the tool's basic use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 5 parameters have schema descriptions (100% coverage), so the description adds minimal extra meaning beyond the schema. The description lists assertion types but the schema already specifies 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 clearly states the verb 'Assert' and the resource 'JSON response fields via dot/bracket paths'. It lists supported assertions and distinguishes from the sibling tool verify_sdui_payload.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 compares with verify_sdui_payload, providing a clear when-to-use alternative. However, it does not elaborate on other usage conditions or prerequisites, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_network_performanceVerify Network PerformanceARead-onlyIdempotent
Assert latency budgets: max per-request durationMs and/or max total first-start→last-end across a matcher. Reports p50/p95 stats and excludes events with unknown durations from percentiles.
| Name | Required | Description | Default |
|---|---|---|---|
| matcher | Yes | Predicate selecting requests to measure | |
| withinMs | No | ||
| sessionId | Yes | Active or completed session ID | |
| maxTotalMs | No | First request start → last request end must be within this many milliseconds | |
| afterAction | No | Reference a prior UI action to anchor the time window | |
| filterDomains | No | Optional Proxyman domain filter | |
| maxIndividualMs | No | Each matching request must complete within this many milliseconds |
Output Schema
| Name | Required | Description |
|---|---|---|
| p50 | No | |
| p95 | No | |
| count | Yes | |
| passed | Yes | |
| totalMs | Yes | First start → last end (ms) |
| verdict | Yes | |
| fastestMs | No | |
| slowestMs | No | |
| violators | Yes | |
| unknownDurationCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only, idempotent, non-destructive. Description adds key behavioral details: 'Reports p50/p95 stats' and 'excludes events with unknown durations from percentiles,' which are beyond the annotations. No contradictions.
Agents need to know what a tool does to the 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: first defines core function, second adds reporting detail. No wasted words, front-loaded with the primary action. 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?
With output schema present and high schema coverage, the description provides sufficient high-level purpose and key behavioral traits (percentiles, exclusion). Could mention temporal anchoring with afterAction, but overall complete for a complex 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 86% (high), baseline 3. Description mentions 'max per-request durationMs' and 'max total first-start→last-end' mapping to maxIndividualMs and maxTotalMs, but does not describe filterDomains or afterAction. Adequate but not full compensation.
Input schemas describe structure but not intent. Descriptions should explain 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 starts with 'Assert latency budgets: max per-request durationMs and/or max total first-start→last-end across a matcher,' clearly stating the tool's specific purpose. It distinguishes itself from sibling tools like verify_network_absent or verify_network_deduplication by focusing on performance assertions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 usage when latency budgets need assertion (e.g., 'max per-request durationMs'), but does not explicitly state when to use this tool versus alternatives or provide exclusions. No direct guidance on when-not-to-use is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_network_sequenceVerify Network SequenceARead-onlyIdempotent
Assert that a set of network calls happened in a specific chronological order. Strict mode fails if any unmatched event appears between ordered matches.
| Name | Required | Description | Default |
|---|---|---|---|
| strict | No | If true, no un-matched events may appear between ordered matches | |
| matcher | No | Optional pre-filter applied before ordering | |
| withinMs | No | Optional window around afterAction; omit to scan all session traffic | |
| sessionId | Yes | Active or completed session ID | |
| afterAction | No | Reference a prior UI action to anchor the time window | |
| expectedOrder | Yes | Matchers that must fire in this chronological order | |
| filterDomains | No | Optional Proxyman domain filter |
Output Schema
| Name | Required | Description |
|---|---|---|
| passed | Yes | |
| missing | No | |
| verdict | Yes | |
| actualOrder | Yes | |
| firstDeviationIndex | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds behavioral detail about strict mode and unmatched events, complementing annotations (readOnlyHint, idempotentHint) without contradicting 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?
Two concise sentences: first defines purpose, second adds strict mode behavior. No unnecessary 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?
Output schema exists, so return values are covered. Description covers core function and key parameters, though could mention behavior on failure or prerequisites.
Complex tools with many parameters or behaviors need more documentation. 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 coverage, description still adds value by explaining 'matcher' as pre-filter, 'withinMs' as window, and 'afterAction' as anchor, going beyond schema names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool asserts chronological order of network calls, distinguishing it from siblings like verify_network_absent or verify_network_parallelism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies usage for ordering assertions but doesn't explicitly guide when to use this vs alternatives or mention 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.
verify_sdui_payloadVerify SDUI PayloadARead-onlyIdempotent
Validate that a specific SDUI network response matches expected fields. Returns matched status and a list of any mismatches. Used to assert correct server-driven content is rendered by the UI.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The full URL of the SDUI endpoint to verify | |
| sessionId | Yes | Active or completed session ID | |
| filterDomains | No | Optional list of domains to pre-filter the Proxyman HAR export (e.g., ["api.myapp.com"]) | |
| expectedFields | No | Key-value pairs that must be present in the response payload |
Output Schema
| Name | Required | Description |
|---|---|---|
| actual | No | The actual response payload |
| matched | Yes | Whether all expected fields matched the actual response |
| mismatches | No | List of field paths that did not match expectations |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive nature. Description adds return behavior (matched status, mismatches). No contradictions.
Agents need to know what a tool does to the 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, no fluff, front-loaded with purpose. Every sentence is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 annotations and schema, description is mostly complete. Briefly mentions return value. Could clarify that filterDomains relates to Proxyman, but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple 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 parameter descriptions. The tool description does not add additional semantic meaning 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 clearly states the tool validates an SDUI network response against expected fields and returns matched status and mismatches. It distinguishes from sibling network verification tools by specifying 'SDUI payload'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 it is used to assert correct server-driven content rendering, providing context. However, it does not explicitly contrast with other verification tools or give 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
33 tool updates
v0.1.0- First observed
boot_simulator - First observed
cancel_task - First observed
clear_mock_responses - First observed
execute_ui_action - First observed
get_network_logs - First observed
get_session_timeline - First observed
get_task_result - First observed
get_ui_hierarchy - First observed
install_app - First observed
list_devices - First observed
list_flows - First observed
list_tasks - First observed
poll_task_status - First observed
register_segment - First observed
run_feature_test - First observed
run_unit_tests - First observed
set_mock_response - First observed
start_build - First observed
start_flow - First observed
start_recording_session - First observed
start_test - First observed
stop_and_compile_test - First observed
take_screenshot - First observed
uninstall_app - First observed
verify_network_absent - First observed
verify_network_deduplication - First observed
verify_network_error_handling - First observed
verify_network_on_screen - First observed
verify_network_parallelism - First observed
verify_network_payload - First observed
verify_network_performance - First observed
verify_network_sequence - First observed
verify_sdui_payload
TDQS
Scored across 33 tools
Most tools have clearly distinct purposes, but the many verify_network_* variants (absent, deduplication, error_handling, on_screen, parallelism, payload, performance, sequence) could cause confusion for an agent if descriptions are not read carefully. Also, start_flow and start_test are similar but serve different functions. Overall, well-disambiguated with minor overlap.
Naming is inconsistent: some tools use snake_case (boot_simulator, cancel_task), while others use camelCase (execute_ui_action, get_ui_hierarchy, get_network_logs). Additionally, verbs are not uniformly placed (e.g., list_devices vs. get_ui_hierarchy). This lack of pattern makes the set harder to navigate.
With 33 tools, the set is too large for easy comprehension. The server covers a broad domain (device management, UI interaction, network mocking, verification), but the number exceeds the recommended range (3-15) and violates the 'too many' threshold (25+). Some tools like the many verify_network_* variants could be consolidated.
The tool set is comprehensive for mobile automation: device management (boot, list, install, uninstall), UI inspection and interaction (get_ui_hierarchy, execute_ui_action), recording and playback (start_recording_session, stop_and_compile_test, start_flow, start_test), network mocking and verification (set_mock_response, all verify_network_* tools), and task management. No obvious gaps for the stated purpose.
Maintenance
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for building and testing AI agents with multi-model experimentation and insights.
AI-native mock API server with MCP. Create REST/SOAP mocks from Claude, Cursor, or Windsurf.
MCP server for Mint — AI-powered QA that runs your app in a real browser on every PR.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAn MCP server that lets AI agents control iOS and Android devices (tap, scroll, type, take screenshots, read UI trees, and run code). Works with multiple devices at the same time.74 npm45MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that enables AI agents to drive real Android apps, capture API traffic, and test mobile-native attack surfaces, similar to Playwright for mobile.MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that enables AI agents to control Android and iOS devices via natural language, using platform tools like adb and simctl.2,060 npm47Apache 2.0
- AlicenseBqualityDmaintenanceAn MCP server that lets AI agents see, tap, type, scroll, and assert inside live Flutter apps — no pre-written tests required.285 npmMIT