Skip to main content
Glama
Fwmouomu
by Fwmouomu

maestro-plus

Multi-device pools, composite assertions, and automatic failure diagnosis for AI agents driving mobile UI tests.

Built on top of Maestro's official MCP server — an orchestration layer above it, never a replacement. When upstream grows, this project grows with it instead of dying.

CI Release Python License: MIT MCP Code style: ruff

Install · Tools · Why it exists · Known limitations · 中文说明


Maestro's MCP server gives an agent eyes and hands: it can read the screen, tap, and run a flow. It deliberately stops there — one device, atomic operations, and no opinion about whether the result was correct.

maestro-plus fills in what the official server leaves out.

Capability matrix

Capability

Official MCP

maestro-plus

List connected devices

Yes

Yes

Device pool with health and occupancy state

No

Yes — list_device_pool

Run a single flow

Yes

Yes

Run N flows across M devices in parallel

No

Yes — run_parallel

Read the current screen

Yes

Yes

Assert on the outcome (element / text / visual)

No

Yes — run_and_assert, assert_visual

Decide why a run failed

No

Yes — debug_failure

Turn an exploration into a replayable flow

No (Studio is closed-source)

Yes — explore_and_record

Self-check the local toolchain

No

Yes — health_check

Keep working when the official MCP is unavailable

No

Yes — adb fallback

The two tools that matter most are run_parallel and debug_failure. Parallel execution across devices is Maestro Cloud's revenue line, so it will never appear in the open-source CLI. Failure diagnosis is the work nobody wants to automate, which is exactly why it is worth automating.

Related MCP server: MCP Appium

Install

MCP host (Claude Code, Codex, Cursor, anything speaking MCP)

{
  "mcpServers": {
    "maestro-plus": {
      "command": "npx",
      "args": ["-y", "maestro-plus"]
    }
  }
}

The npm package is a launcher only. It locates a Python runtime, starts the real server, and hands over stdin/stdout. There is no logic in it beyond that.

Python-native

uvx maestro-plus

Or pin it into a project:

uv add maestro-plus

Requires Python 3.10+.

Prerequisites

maestro-plus shells out to tools you already use. It does not bundle them.

Tool

Required for

Install

Maestro CLI

every flow-running tool

curl -Ls "https://get.maestro.mobile.dev" | bash

adb

device discovery, fallback path, log collection

Android platform-tools

ffmpeg

only explore_and_record video capture

your package manager

Run health_check first. It reports which of these are missing and which tools degrade without them.

Tools

list_device_pool

Returns every connected emulator and physical device with its serial, model, Android version, and whether it is currently leased by another run. Agent-facing tools use this to decide where work can go.

run_parallel

Takes a set of flows and a set of devices, leases devices from the pool, runs the work, and returns one aggregated result. Results are per-flow and per-device, so a flake on one device does not mask a real failure on another.

run_and_assert

Runs a flow, then evaluates a list of assertions against the resulting screen state in the same call. This replaces the loop agents get stuck in today: run, screenshot, read the hierarchy, describe what is visible, decide, repeat.

assert_visual

Compares a screen region against a baseline image with a configurable tolerance, returning a diff percentage and the diff artifact path. Baselines can be regenerated on demand, which is what keeps this from becoming the flaky part of your suite.

debug_failure

The flagship tool. Given a failed run, it collects and correlates the failure step, the screenshots immediately before and after, the relevant slice of device logs, the view hierarchy at the failure point, and emits a structured diagnosis that separates application defect from test defect — the question every QA engineer actually asks first.

explore_and_record

Takes the steps an agent already performed, emits a Maestro flow, reads the resulting screen to generate the assertions — the part of a flow people get wrong — and then runs the finished file to prove it replays.

Not a drop-in replacement for Maestro Studio's recorder: this does not watch the screen and infer what you did. What it adds over Studio, which is closed source, is deriving the assertions. Recording taps is the easy half; assertions are where recorded flows rot.

health_check

Verifies Maestro CLI version, adb availability, device reachability, and whether the official MCP server is responsive. Returns a degradation map: which tools work now, which are impaired, and what to install.

Architecture

src/maestro_plus/
  server.py            # MCPServer instance and the complete tool registration
  pool.py              # device leasing: one owner per device at a time
  tools/
    devices.py         # health_check, list_device_pool
    parallel.py        # run_parallel
    assertions.py      # run_and_assert, assert_visual
    diagnostics.py     # debug_failure
    record.py          # explore_and_record
  backends/
    maestro_cli.py     # the primary path: wraps the Maestro CLI
    adb.py             # discovery, evidence collection, degradation path
  evidence.py          # screenshot de-duplication, log triage, hierarchy queries
  report.py            # diagnosis bundle and HTML rendering

Two rules keep the design honest:

  1. Never reimplement an official tool. If upstream exposes it, wrap it. There is a test that fails the build if anyone forgets.

  2. Always degrade, never fail. If the official MCP is down, fall back to adb + the Maestro CLI rather than returning an error.

Evaluation

This section exists because a portfolio repository should show its work, including the parts that do not look good. Every row is not yet measured, and that is accurate rather than an omission — inventing plausible numbers would defeat the point of having the table.

Claim

How it is measured

Status

Parallel execution reduces wall time

Total run time for N flows on M devices vs. sequential

Not yet measured

debug_failure correctly attributes the defect

Hand-labelled set of failures with a known root cause

Not yet measured

Screenshot de-duplication compresses evidence

Artifact count before and after de-duplication

Not yet measured

The first and third rows are mechanical. scripts/measure.py produces them against your own suite and prints finished markdown:

python scripts/measure.py --flows flows/ --devices emulator-5554,emulator-5556
python scripts/measure.py --flows flows/ --devices emulator-5554 --artifacts ~/.maestro-plus/artifacts

The second row is not automatable on purpose. Judging whether a diagnosis was right needs someone who knows the real root cause, so the script prints the labelling template rather than an accuracy figure.

Until the numbers exist, treat the claims above as design intent, not results.

Known limitations

  • Android only today. The device pool and fallback path are built on adb. iOS needs simctl and a second backend.

  • The fallback path is slower. uiautomator dump costs roughly a second per read, so it is a recovery mechanism, not a default.

  • No accessibility tree, no diagnosis. debug_failure can tell you an element was not found. It cannot tell you the app never rendered it if the app exposes nothing to the tree.

  • Not a test management system. No history storage, no dashboards, no scheduling. It is a tool layer for agents and CI.

  • Depends on Maestro CLI output stability. Where the CLI only offers human-readable output, parsing is fragile and version-sensitive.

Roadmap

  • iOS backend over simctl

  • Fill in the evaluation table with numbers from a real suite and a hand-labelled failure set

  • Progress reporting for long flows, so a four-minute run is not a black box

  • Optional HTTP transport, so a team can share one device pool instead of one pool per machine

License

MIT. See LICENSE.

Available Tools

7 tools
assert_visualB

Compare the current screen, or a region of it, against a baseline image.

Region comparison is the reason this is usable. A whole-screen baseline on a device with a clock in the status bar differs on every single run, which is how visual testing earns its reputation for flakiness. Cropping to the part that matters is what makes the result mean something.

update_baseline exists so refreshing a baseline is an explicit, visible act rather than an edit someone makes by hand and forgets to review.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoDevice serial. Omit to take any single free device.
regionNo[left, top, right, bottom] in pixels to compare. Omit to compare the whole screen.
baselineYesPath to the baseline PNG to compare against.
toleranceNoFraction of differing pixels still considered a match.
update_baselineNoOverwrite the baseline with the current screen and pass.

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It adds useful context about flakiness and the explicit baseline-refresh intent, but says nothing about what happens when the comparison fails (exception vs. returned diff), whether it blocks, or what permissions/environment it requires.

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

Conciseness3/5

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

Purpose is correctly front-loaded in sentence one and nothing is buried. The middle paragraph drifts into rhetorical justification ('how visual testing earns its reputation for flakiness') rather than information the agent needs to call the tool.

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

Completeness3/5

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

For a 5-parameter assertion tool with no annotations and no output schema, the definition covers purpose and region rationale but omits the failure contract — the single most important thing an agent needs when invoking an assertion. Adequate but with a clear gap.

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

Parameters3/5

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

Schema coverage is 100%, so device, region, baseline, tolerance and update_baseline are already documented in the schema. The description reinforces why region matters and clarifies the intent of update_baseline, but adds no format, range or interaction detail beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

The opening sentence gives a specific verb (compare) and resource (current screen or region) against a baseline image, so the operation is unambiguous. It does not, however, distinguish itself from the sibling run_and_assert, which an agent could plausibly reach for on the same task.

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

Usage Guidelines3/5

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

It explains why region cropping is preferable to whole-screen comparison, which is real usage guidance for the region parameter, and it frames update_baseline as the deliberate refresh path. It never says when to call this tool versus run_and_assert or the record/explore siblings, so routing is left to inference.

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

debug_failureA

Run a flow and, when it fails, gather the evidence needed to attribute the fault.

Collects the screen before the run, Maestro's own capture at the moment of failure, the screen after, the focused window, the relevant slice of logcat, and the elements present at failure — then applies an attribution heuristic and writes a JSON plus HTML bundle.

Returns diagnosed: false when the flow passes, because there is nothing to diagnose and inventing an analysis would be noise.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoMaestro -e variables for the flow.
flowYesMaestro flow file to run and diagnose.
deviceNoDevice serial. Omit to take any single free device.
packageNoApp package to narrow logcat to, for example com.example.app. Omit to read the whole buffer.
timeoutNoFlow timeout in seconds.

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: it enumerates the artifacts collected (before/after screens, Maestro capture, focused window, logcat slice, elements at failure), discloses that an attribution heuristic runs, that a JSON plus HTML bundle is written, and the notable behavior of returning diagnosed: false on pass. It does not mention auth/permission needs or rate limits, so not a 5.

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

Conciseness4/5

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

Front-loaded with the core action, then the evidence list and the pass-case return behavior. The final sentence about diagnosed: false is arguably long-winded but it conveys a genuinely non-obvious behavior, so it earns its place.

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

Completeness4/5

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

There is no output schema, so the description must explain returns — and it does highlight the diagnosed: false case, though it doesn't describe the success-path bundle structure or the shape of the attribution result. For a 5-parameter, side-effecting diagnostic tool with no annotations, that remaining gap keeps it at 4.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (env, flow, device, package, timeout) is already documented in the schema. The description adds no format or syntax detail beyond that, so the baseline of 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource: run a flow and, on failure, gather evidence to attribute fault. It clearly distinguishes itself from a simple assertion runner by emphasizing diagnosis and artifact production. It doesn't explicitly name the sibling tools it competes with (e.g. run_and_assert, run_parallel), so it stops short of a 5.

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

Usage Guidelines3/5

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

Usage is implied — reach for this when you want post-failure diagnosis — but there is no explicit 'use X instead when Y' guidance against run_and_assert, run_parallel, or explore_and_record. An agent can infer the context but is left to reason about alternatives on its own.

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

explore_and_recordA

Generate a replayable Maestro flow from a described exploration, then verify it runs.

With both capture_assertions and validate enabled the steps run twice: once to observe the resulting screen and derive assertions, once to prove the finished file replays. That is deliberate — a flow that has never been executed is a hypothesis, not a test.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFlow name, used as the file name.recorded-flow
stepsYesInteractions to replay, in the order they happened.
app_idYesMaestro appId, for example com.example.app.
deviceNoDevice serial. Omit to take any single free device.
timeoutNoFlow timeout in seconds.
validateNoRun the generated flow to prove it replays.
output_dirNoDirectory for the .yaml file. Defaults to the server working directory.
capture_assertionsNoGenerate assertVisible entries from the screen the steps leave behind. Requires one exploratory run of the steps.

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description bears the full burden. It does disclose a genuinely important behavioral trait — the deliberate double execution of steps when both capture_assertions and validate are on — but omits file-writing side effects (output_dir), device acquisition behavior, and what happens on validation failure.

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

Conciseness4/5

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

Front-loaded with the core purpose, followed by a short rationale paragraph. Only minor flourish ("a hypothesis, not a test") that still conveys the reason for the double run, so the text is nearly all earning its place.

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

Completeness3/5

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

For an 8-parameter, no-annotation tool, the description covers purpose and the notable double-run behavior but says nothing about return values, error handling, or where the generated file lands beyond the output_dir schema entry. Adequate, with clear gaps for an agent deciding how to call and interpret it.

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

Parameters4/5

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

Schema description coverage is 100%, so a 3 is the baseline. The description earns a point above baseline by explaining the interaction between two parameters — capture_assertions plus validate causes two runs — which the schema documents individually but never jointly.

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

Purpose4/5

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

States a specific verb and resource: generating a replayable Maestro flow from a described exploration, then verifying it runs. That is far more informative than the bare name, though it never names how it differs from siblings like run_and_assert or run_parallel.

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

Usage Guidelines3/5

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

Usage context is implied by the exploration-to-replayable-flow framing, and it explains the condition under which steps run twice (capture_assertions and validate both enabled). However, it gives no explicit when-to-use-this-instead guidance relative to run_and_assert or run_parallel, which are the obvious alternatives.

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

health_checkA

Verify the toolchain: which tools work, which are impaired, what to install.

Run this first when anything behaves unexpectedly. It distinguishes "the Maestro CLI is missing" from "the CLI is fine but the emulator is unauthorized", which are two very different afternoons.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It describes what is reported and distinguishes two failure modes, which is useful, but it does not state that the operation is read-only, what permissions are needed, or any side effects. Adequate but with gaps.

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

Conciseness5/5

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

Three sentences, with the core purpose front-loaded and each sentence adding value: the first states what it does, the second gives the usage trigger, and the third clarifies the diagnostic value. No fluff.

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

Completeness5/5

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

For a zero-parameter diagnostic tool with no output schema and no annotations, the description covers purpose, usage trigger, and the kind of result to expect. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters and the schema description coverage is 100%, so there is nothing to document. The baseline for a 0-parameter tool is 4.

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

Purpose4/5

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

States a specific verb+resource: 'Verify the toolchain' and enumerates the report contents ('which tools work, which are impaired, what to install'). Clear but does not explicitly differentiate from diagnostic siblings such as debug_failure, so it falls short of a 5.

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

Usage Guidelines4/5

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

Gives a clear trigger: 'Run this first when anything behaves unexpectedly.' It does not name alternatives or say when not to use it, so it lacks the explicit alternative routing that would earn a 5.

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

list_device_poolA

List every connected Android device and emulator with its health and lease state.

Call this before planning any parallel work: it is the only way to learn how many devices are actually usable right now, and which of them are already held by runs in flight. A device is usable when adb reports state device; unauthorized and offline devices appear in the list but cannot run flows.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it defines the `usable` state, and explains that `unauthorized` and `offline` devices still appear but cannot run flows. It does not cover permissions, pagination, or refresh cadence, so it is not fully exhaustive.

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

Conciseness5/5

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

Front-loaded with the core action, followed by a short usage instruction and a compact state glossary. Every sentence earns its place with no filler.

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

Completeness4/5

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

There is no output schema, so the description must convey returns; it does so by naming health and lease state and defining the state values. Return structure (fields per device) remains unspecified, which is a minor gap.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4 and there is nothing further for the description to document.

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

Purpose5/5

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

States a specific verb and resource ('List every connected Android device and emulator') plus the fields returned (health and lease state). An agent can immediately distinguish it from siblings like health_check or run_parallel.

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

Usage Guidelines4/5

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

Explicitly prescribes timing ('Call this before planning any parallel work') and explains why it is the sole source of truth for usable device count. It does not name an alternative or a when-not condition, so it falls short of the top bar.

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

run_and_assertB

Run a Maestro flow, then check assertions against the screen it left behind.

The flow's own result is always reported, even when assertions cannot run. Assertions are skipped entirely when the flow failed, because checking expectations after a known-broken run produces a second, noisier failure that buries the first one.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoMaestro -e variables for the flow.
flowYesMaestro flow file to run.
deviceNoDevice serial. Omit to take any single free device from the pool.
timeoutNoFlow timeout in seconds.
assertionsYesExpectations checked against the screen once the flow finishes.
screenshotNoCapture the resulting screen as evidence.

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose genuinely non-obvious behavior: the flow result is always reported and assertions are deliberately skipped after a failed flow. However, it says nothing about device allocation/side effects of running a flow on a pooled device, nor what the result payload looks like.

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

Conciseness4/5

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

Front-loaded with the core action, followed by two short sentences that justify the skipping behavior. Efficient overall, though the final causal clause is slightly more verbose than strictly needed.

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

Completeness3/5

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

For a flow-executor/asserter with no output schema and no annotations, the description covers failure semantics but omits return shape and device-pool side effects. The rich input schema compensates on the input side, leaving a moderate output/behavior gap.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter including the nested ElementAssertion fields is already documented. The description adds no parameter-level meaning (e.g., how 'flow' paths resolve or how 'device' interacts with the pool), so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: 'Run a Maestro flow, then check assertions against the screen it left behind.' This clearly distinguishes it from a plain runner, and the assertion-on-final-screen framing hints at separation from assert_visual. It stops short of explicitly naming which sibling to prefer, so it lands at 4 rather than 5.

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

Usage Guidelines3/5

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

The description explains the conditional behavior rule (assertions skipped when the flow failed) but never states when to choose this tool over run_parallel, assert_visual, or debug_failure. Usage must be inferred from the action itself.

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

run_parallelA

Run several Maestro flows in parallel across leased devices.

Flows are distributed round-robin over the leased devices, so N flows on M devices take roughly N/M rounds. Every device is leased for the duration and released on exit, including on failure, so a crashed run cannot strand a device.

Returns per-flow results plus wall-clock time, the sequential estimate, and the resulting speedup. A failure on one device never masks a pass on another: each result is reported separately.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNoMaestro environment variables, passed to every flow as -e KEY=VALUE.
flowsYesMaestro flow files to run. Paths resolve against the server working directory.
devicesNoPreferred device serials, tried first in order. Omit to use whatever the pool has free. A preferred device that is busy is skipped rather than fatal.
timeoutNoPer-flow timeout in seconds.

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: round-robin scheduling, ~N/M round count, devices leased for the whole duration, guaranteed release on exit including failure (so a crash cannot strand a device), and per-device failure isolation. These are exactly the operational traits an agent needs before invoking a resource-leasing tool.

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

Conciseness5/5

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

Front-loaded with the core action and scope, then two short paragraphs covering scheduling and return/failure behavior. Every sentence carries information an agent would otherwise have to guess; nothing is restated.

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

Completeness5/5

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

There is no output schema, but the description compensates by describing the return payload (per-flow results, wall-clock time, sequential estimate, speedup) and the failure-reporting model. Combined with the 100%-covered input schema, an agent has everything needed to call and interpret this tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents env, flows, devices, and timeout, including the busy-device-skipped rule. The description's mention of distribution and leasing adds context about how devices are used but not new per-parameter semantics. Baseline 3 is appropriate.

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

Purpose5/5

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

The first sentence gives a specific verb ('Run'), resource ('Maestro flows'), and the distinguishing scope ('in parallel across leased devices'). That scope cleanly separates it from the sibling run_and_assert, which implies single-flow execution. No ambiguity about what the tool does.

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

Usage Guidelines3/5

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

The parallel/multi-flow scenario is implied by 'Run several Maestro flows in parallel', and the device-pool behavior is explained, but there is no explicit when-to-use vs when-not guidance. It never states when to prefer run_and_assert or a single-flow path, nor does it note any prerequisites for leasing devices. Implied usage only.

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

Tool Schema Changelog

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

  1. 7 tool updatesv0.1.0
    • First observedassert_visual
    • First observeddebug_failure
    • First observedexplore_and_record
    • First observedhealth_check
    • First observedlist_device_pool
    • First observedrun_and_assert
    • First observedrun_parallel

TDQS

A3.8/5.0

Scored across 7 tools

Disambiguation4/5

Most tools have clearly distinct purposes (device listing, toolchain health, visual baselining, exploration recording), but run_parallel, run_and_assert, and debug_failure all execute Maestro flows, so their boundaries require careful reading to distinguish execution mode from assertion/diagnostics intent.

Naming Consistency4/5

All names use consistent snake_case with verb-first phrasing, though a few are verb_and_verb (run_and_assert, explore_and_record) rather than the cleaner verb_noun pattern of list_device_pool or assert_visual. Still predictable and readable overall.

Tool Count5/5

Seven tools is a well-scoped set for a mobile test orchestration server, with each tool covering a meaningful phase (discovery, health, execution, assertion, debugging, recording) and no filler.

Completeness4/5

The surface covers device discovery, health, parallel runs, assertions, visual baselining, failure debugging, and flow recording. A gap exists: assert_visual explicitly references an update_baseline tool that is not actually present in the set, though core lifecycle workflows are otherwise covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Maestro is the simplest and most effective UI testing framework for Mobile and Web. Maestro MCP allows you to control emulators, interact with apps, write and automatically debug UI tests on Claude Code, Cursor or Windsurf.
    15,680
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to automate Android mobile device testing through Appium, with automatic device detection, screen element inspection, and natural language test scenario execution.
    3
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to automate mobile app testing and development for iOS and Android through natural language interactions. Supports intelligent element identification, session management, automated test generation, and comprehensive device interactions including clicks, swipes, screenshots, and app management.
    31
    7,223 npm
    481
    Apache 2.0