Phone Harness MCP
OfficialProvides tools for starting and controlling Android emulators/devices, including screenshots, screen element listing, tapping, swiping, typing, button presses, app listing/launching, and session management.
Provides tools for starting and controlling iPhones, including screenshots, screen element listing via text recognition, tapping, swiping, typing, button presses, app launching, and session management.
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., "@Phone Harness MCPopen the Settings app and take a screenshot"
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.
Phone Harness MCP
Connect AI agents to real iPhones and Androids.
The official Model Context Protocol server for Phone Harness. The agent sees the screen, taps, types, swipes, and opens apps on a real phone in Phone Harness Cloud, all over HTTPS. Nothing to pair, no adb, no Mac required, any OS.
Tool names follow mobile-mcp
(phone_take_screenshot, phone_click_on_screen_at_coordinates, …), so an
agent that has driven a phone before already knows how.
Use it two ways:
Run it yourself with
uvx phone-harness-mcpover stdio. It signs in as you: an API key, or the sign-inphone-harness cloud loginleft on the machine.Hosted at
https://mcp.phone-harness.com/mcp. Nothing to install; your client sends your API key as a bearer token.
Requirements
A Phone Harness Cloud account, and an API key from the dashboard (or the phone-harness CLI signed in with
phone-harness cloud login).Python 3.10+ with uv for the local server. The hosted server needs nothing.
Related MCP server: Karagöz
Getting started
Most clients take this standard config:
{
"mcpServers": {
"phone-harness": {
"command": "uvx",
"args": ["phone-harness-mcp"],
"env": { "PHONE_HARNESS_API_KEY": "pck_…" }
}
}
}Leave out env if the machine is already signed in with phone-harness cloud login.
Local:
claude mcp add phone-harness -e PHONE_HARNESS_API_KEY=pck_… -- uvx phone-harness-mcpHosted, signing in with OAuth (run /mcp afterwards to authenticate):
claude mcp add --transport http phone-harness https://mcp.phone-harness.com/mcpHosted, with an API key instead:
claude mcp add --transport http phone-harness https://mcp.phone-harness.com/mcp \
--header "Authorization: Bearer pck_…"Settings → Connectors → Add custom connector, URL https://mcp.phone-harness.com/mcp.
Claude signs in through Phone Harness's own OAuth consent screen; no key to paste.
Or add the standard config to claude_desktop_config.json to run it locally.
Add the connector with URL https://mcp.phone-harness.com/mcp and sign in when
prompted; the consent screen asks for the phone:drive scope.
codex mcp add phone-harness --env PHONE_HARNESS_API_KEY=pck_… -- uvx phone-harness-mcpOr in ~/.codex/config.toml, hosted:
[mcp_servers.phone-harness]
url = "https://mcp.phone-harness.com/mcp"
bearer_token_env_var = "PHONE_HARNESS_API_KEY"Click the Cursor badge above, or Settings → MCP → Add new MCP Server and paste
the standard config into ~/.cursor/mcp.json. For the hosted server:
{
"mcpServers": {
"phone-harness": {
"url": "https://mcp.phone-harness.com/mcp",
"headers": { "Authorization": "Bearer pck_…" }
}
}
}Click a VS Code badge above, or:
code --add-mcp '{"name":"phone-harness","command":"uvx","args":["phone-harness-mcp"],"env":{"PHONE_HARNESS_API_KEY":"pck_…"}}'Add the standard config under mcpServers in ~/.gemini/settings.json.
Run /mcp add, or put this in ~/.copilot/mcp-config.json:
{
"mcpServers": {
"phone-harness": {
"type": "local",
"command": "uvx",
"args": ["phone-harness-mcp"],
"env": { "PHONE_HARNESS_API_KEY": "pck_…" },
"tools": ["*"]
}
}
}Add the standard config to ~/.codeium/windsurf/mcp_config.json.
Advanced settings → Extensions → Add custom extension, type STDIO, command
uvx phone-harness-mcp, environment variable PHONE_HARNESS_API_KEY.
Add the standard config to .kiro/settings/mcp.json.
Program → Install → Edit mcp.json, paste the standard config.
{
"mcp": {
"phone-harness": {
"type": "local",
"command": ["uvx", "phone-harness-mcp"],
"environment": { "PHONE_HARNESS_API_KEY": "pck_…" },
"enabled": true
}
}
}Settings → AI → Manage MCP Servers → + Add, paste the standard config.
Local: command uvx, arguments phone-harness-mcp, environment PHONE_HARNESS_API_KEY.
Hosted: streamable HTTP at https://mcp.phone-harness.com/mcp with header
Authorization: Bearer <API key>.
What the agent does with it
● phone_list_available_devices → no phone running; an iPhone and an Android are available
● phone_start_device → s_7f3a: Android emulator, 390x844, 30 min
● phone_launch_app name="Weather"
● phone_list_elements_on_screen → "San Francisco" at (195, 212) …
● phone_take_screenshot → forecast is up
● phone_stop_deviceTools
Every tool but the first two takes device, an id from phone_list_available_devices.
Tool | Does |
| Running phones and their ids, plus the phones the account can start. |
| Start a phone and wait until it is ready. |
| End the session; billing stops. |
| The coordinate space taps use. |
| JPEG, long side ≤ |
| Write a PNG or JPEG to a path. Local server only. |
| Visible text with tap-ready centers ( |
| Tap |
| Hold for |
|
|
| Type into the focused field; |
|
|
| Installed apps (Android). |
| Open an app by name or package id. |
| Which app is in front. |
Not yet: opening a URL (url.open is not served by the session route today),
installing apps, clipboard, screen recording.
Configuration
phone-harness-mcp [OPTIONS]
--api-key KEY API key. Default $PHONE_HARNESS_API_KEY, else the CLI's sign-in. stdio only.
--api-url URL Default $PHONE_HARNESS_CLOUD_API or https://api.phone-harness.com
--port PORT Serve streamable HTTP instead of stdio (see below)
--host HOST Interface for --port [default: 127.0.0.1]
--path PATH MCP endpoint path [default: /mcp]
--allowed-hosts HOSTS Host header values to accept; '*' disables the check
--allowed-origins ORIGINS Origin header values to accept
--public-url URL The URL clients reach the server at (with --oauth-issuer)
--oauth-issuer URL Publish OAuth protected-resource metadata for this issuer
--oauth-scope SCOPE The scope advertised to OAuth clients [default: phone:drive]
--stateful HTTP mode: one MCP session per clientStandalone and hosted server
--port serves streamable HTTP at /mcp:
uvx phone-harness-mcp --port 8931In this mode the server holds no credential. Every request must carry
Authorization: Bearer …, an API key or an OAuth access token, which is
forwarded unchanged to Phone Harness Cloud, so one process can serve many
accounts and leaks none. A request without a bearer gets a 401 with a
WWW-Authenticate challenge.
With --oauth-issuer the server also publishes OAuth protected-resource
metadata, so clients that support OAuth (Claude.ai, ChatGPT, Claude Code,
Cursor) discover the authorization server, register themselves, and sign the
user in through a consent screen that asks for the phone:drive scope.
mcp.phone-harness.com runs this way with Clerk as the authorization server.
{
"mcpServers": {
"phone-harness": {
"url": "http://localhost:8931/mcp",
"headers": { "Authorization": "Bearer pck_…" }
}
}
}Behind a reverse proxy pass the public hostname so the Host header is
checked (DNS-rebinding protection): --host 0.0.0.0 --allowed-hosts mcp.example.com.
mcp.phone-harness.com runs exactly this binary.
Vercel
The repo is also a Vercel project: app.py exposes the same server as one
Python function, stateless, answering JSON. Import the repo in Vercel, add the
domain, done. mcp.phone-harness.com runs this way.
Environment variable | Default | Means |
|
| The API to forward to. |
|
| Host header check; off on Vercel, whose edge owns routing. |
| unset | Set to the OAuth authorization server to publish protected-resource metadata. Unset means API keys only. |
| unset | The URL clients use, required with the issuer. |
|
| The scope advertised to OAuth clients. |
vercel.json sets maxDuration to 300 s so phone_start_device can wait
for a phone to boot.
Docker
docker build -t phone-harness-mcp .
docker run --rm -p 8000:8000 phone-harness-mcp --port 8000 --host 0.0.0.0 --allowed-hosts '*'Security
The server is a thin HTTPS client. It never holds a phone, and over HTTP it never holds a credential: each request's bearer is the only identity.
Over stdio it uses this machine's sign-in, like any local MCP server; it is not a security boundary between you and your own account.
Screenshots and text read from the phone pass through unlogged. API keys are never written to logs.
Phones are rented by the minute. The
phone_start_devicedescription says so; turn on your client's tool-approval setting if you want to confirm it.
Report vulnerabilities per SECURITY.md.
Development
uv sync
uv run pytest # a fake Phone Harness Cloud API; no account needed
uv run phone-harness-mcp --helpLayout: src/phone_harness_mcp/{cli,server,phone,cloud,screenshots,auth}.py.
cloud.py is the HTTP client, phone.py turns API answers into sentences for
the model, server.py is the tool set, auth.py is hosted-mode bearer handling.
License
MIT
Available Tools
15 toolsphone_click_on_screen_at_coordinatesTapA
Tap the screen at (x, y) in screen coordinates, such as a center from phone_list_elements_on_screen.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is partly covered. The description adds the coordinate-space constraint but never warns that a tap can navigate away, trigger irreversible app actions, or produce no effect if coordinates are stale. For a state-changing interaction with a lower annotation bar, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and the core semantics. Nothing is wasted and nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the coordinate-space clarification covers the main ambiguity for this simple three-parameter tool. The only real gap is the undocumented required 'device' parameter.
Complex tools with many parameters or behaviors need more documentation. Simple 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%, so the description must carry the parameter burden. It does explain x/y meaningfully (screen coordinates, with a recommended source), but the required 'device' parameter is completely unaddressed and no format or bounds are given for x/y.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (tap) plus the exact coordinate semantics ('screen coordinates') and disambiguates the unit of input. The contrast with phone_long_press_on_screen_at_coordinates and phone_swipe_on_screen is implicit in the verb choice, so an agent can select it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides real guidance on where coordinates come from by naming phone_list_elements_on_screen as a source. However, it never says when to prefer tap over long-press, press_button, or type_keys — usage relative to alternatives is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_get_foreground_appForeground appARead-only
Which app is in front right now. Not every phone reports it; then take a screenshot instead.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares this is a safe read, and the description adds a genuinely non-obvious behavioral caveat: support is device-dependent, so calls may return nothing usable. The fallback instruction operationalizes that failure mode, which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose and immediately followed by the failure/fallback note. No filler, nothing that could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape need not be explained, and the device-support caveat is covered. The remaining gap is the undocumented device parameter and whether a non-reporting phone errors or returns empty, which matters for how an agent bounds the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter (device) with 0% schema description coverage, and the description says nothing about its expected identifier format or where to obtain it (presumably phone_list_available_devices). With low coverage the description is expected to compensate, and it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Which app is in front right now" names a specific resource and query intent, so an agent can tell this apart from phone_list_apps or phone_list_elements_on_screen. It lacks an explicit verb (e.g. "get"/"return") but the intent 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?
Explicitly names the fallback path and the condition that triggers it: when a phone does not report the foreground app, use phone_take_screenshot. That is real routing guidance rather than implied usage, though it does not cover the positive case (why to prefer this over list_apps).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_get_screen_sizeScreen sizeBRead-only
The phone's screen size in the coordinate space the tap and swipe tools use.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint already declares this is a safe read, and an output schema exists, so the description's main added value is the coordinate-space guarantee. It does not disclose whether the value changes with device rotation, whether it is cached, or how it relates to a specific running device.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no filler. It is efficient, though the coordinate-space clause could be sharpened into an explicit call-order hint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, return values need not be explained, and the coordinate-space note covers the main conceptual gap. However, the undocumented 'device' parameter and the missing unit/prerequisite details leave the definition only partially complete for a device-scoped 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 0% and the single required parameter 'device' is never mentioned in the description. An agent must guess whether this is a device id from phone_list_available_devices or a human-readable name, and whether the device must be started first.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and return value (screen size) and adds the key qualifier that it is in the coordinate space used by the tap and swipe tools. That distinguishes it from siblings like phone_take_screenshot or phone_list_elements_on_screen without naming them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied via the reference to 'the tap and swipe tools' – an agent can infer it should be called before phone_click_on_screen_at_coordinates or phone_swipe_on_screen, but the description never states when to call it or that it is a prerequisite for coordinate math.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_launch_appLaunch an appA
Open an app by the name on its icon ("Settings", "Notes", "Chrome") or, on Android, its package id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a non-destructive action. The description adds the naming convention but omits what happens on failure (app not installed), whether the app is brought to the foreground if already running, and any device-state 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?
A single sentence with no waste; the primary identifier convention is front-loaded and the Android package-id exception is appended compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the annotations cover the safety profile. However, with 0% schema description coverage and a completely undocumented "device" parameter, plus no mention of device-state prerequisites, the description leaves meaningful gaps for a two-required-param device 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 0% for two required parameters, so the description carries the full burden. It explains the "name" parameter well (icon label or Android package id, with examples) but says nothing at all about the required "device" parameter, leaving half the surface undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ("Open") plus resource ("app") with concrete examples of the accepted identifier formats ("Settings", "Notes", "Chrome") and the Android package-id variant. It doesn't explicitly contrast with siblings like phone_list_apps or phone_get_foreground_app, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the identifier format guidance, but there is no statement of when to prefer this over sibling tools (e.g., use phone_list_apps to discover valid names) and no preconditions such as the device needing to be started via phone_start_device. The agent must infer the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_list_appsList appsBRead-only
List the apps installed on the phone: package ids on Android, bundle ids on an iPhone. Any of them can be passed to phone_launch_app.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already communicates the safety profile, so the description's burden is lower. It usefully adds that returned identifiers are actionable in phone_launch_app and differ by platform, but says nothing about result size, ordering, or whether all installed apps (including system apps) are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core purpose and identifier semantics are front-loaded before the follow-up hint about phone_launch_app.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the read-only nature is covered by annotations. The remaining gap is the undocumented required 'device' parameter, which an agent must infer from a sibling 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 0% for the single required 'device' parameter, and the description never mentions it. Given the total lack of schema documentation, the description should explain what 'device' expects (e.g., a device id from phone_list_available_devices), but it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('apps installed on the phone') and clarifies the identifier format per platform (package ids vs bundle ids), which distinguishes it from device-scoped siblings like phone_list_available_devices. It does not explicitly contrast with any named alternative, keeping it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Any of them can be passed to phone_launch_app' implies a downstream workflow, giving some implied usage context. However, there is no explicit when-to-use/when-not guidance or comparison against alternatives such as phone_get_foreground_app.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_list_available_devicesList phonesARead-only
List the phones running on this account, whose ids the other tools take as device, and the phones the account can start.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, and the description adds genuinely non-obvious content: the list spans two populations, already-running phones and phones that could be started. That distinction affects downstream logic (a returned id may need phone_start_device first). It does not cover ordering, empty-account behavior, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence carrying purpose, scope, and the cross-tool id contract, with the primary purpose front-loaded before the qualifier about startable phones. Nothing is redundant with the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument, read-only list tool with an output schema, the description supplies everything needed to decide to call it and how to use the result. Minor gaps such as result ordering or the empty-account case are not material.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so baseline is 4; the schema adds nothing to explain. The description doesn't need to compensate, though it does usefully clarify the meaning of the `device` id values produced by this tool and consumed elsewhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource ('List the phones running on this account') with a clearly delineated scope: it returns both running devices and devices the account can start. It also explains that the returned ids are the `device` identifiers consumed by the other phone_* tools, which makes its role unambiguous within the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'whose ids the other tools take as `device`' effectively tells the agent to call this first for discovery, and the running-vs-startable split hints that phone_start_device handles the not-yet-running entries. It stops short of explicitly naming phone_start_device or stating when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_list_elements_on_screenList what is on screenARead-only
List the text visible on screen with the center of each piece, ready to tap with phone_click_on_screen_at_coordinates. On Android the positions come from the accessibility tree; on an iPhone from reading the pixels. Call it again after the screen changes.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | ||
| format | No | text |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses an important implementation asymmetry: accessibility-tree positions on Android versus pixel-derived detection on iPhone, which tells the agent results may differ in reliability and completeness across platforms. The staleness warning ('call it again after the screen changes') is likewise useful behavioral context not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the what and the return shape, followed by platform behavior and the refresh caveat. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, so the description correctly does not restate them, and it explains the coordinate payload's purpose. The remaining gap is the silent 'device' argument, which matters in a toolset where many devices can be listed and started.
Complex tools with many parameters or behaviors need more documentation. Simple 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%, so the description carries the burden, yet neither parameter is mentioned. The 'device' parameter — required, and non-obvious given a multi-device toolset with phone_list_available_devices as a sibling — and the text/json 'format' enum are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('list the text visible on screen') plus the exact payload returned (each piece's center point), which distinguishes it from the screenshot siblings. It also names the natural follow-up tool, so the agent knows immediately what class of operation this is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to phone_click_on_screen_at_coordinates as the consumer of the returned coordinates and tells the caller to refresh after the screen changes. It lacks a stated when-not (e.g. use phone_take_screenshot for images/non-text), which keeps it below 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_long_press_on_screen_at_coordinatesLong pressB
Press and hold at (x, y) in screen coordinates for duration milliseconds (default 800).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| device | Yes | ||
| duration | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds only the duration default (which the schema already declares as default 800), and says nothing about gesture side effects, whether the hold triggers context menus, blocking behavior, or timing tolerance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the coordinate anchor and duration semantics are both stated compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations cover safety. However, given 0% schema coverage the description should at least identify the device parameter and clarify interaction semantics relative to click/swipe; those omissions leave it only adequate.
Complex tools with many parameters or behaviors need more documentation. Simple 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%, so the description must compensate: it explains what x/y mean (screen coordinates) and what duration is in milliseconds with its default. It leaves the required 'device' parameter completely unexplained, which is a meaningful gap for a 4-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('press and hold') plus resource ('at (x, y) in screen coordinates'), which implicitly distinguishes it from click and swipe siblings. It does not explicitly name those siblings as alternatives, keeping it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when a long press is preferred over phone_click_on_screen_at_coordinates or phone_swipe_on_screen, and no prerequisites (e.g., an active device session) are stated. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_press_buttonPress a buttonB
Press a system button: HOME, BACK (Android; an iPhone has none), APP_SWITCHER, or ENTER.
| Name | Required | Description | Default |
|---|---|---|---|
| button | Yes | ||
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is not read-only and not destructive. The description adds a useful platform caveat that BACK does not exist on iPhone, but it does not disclose effects such as HOME backgrounding the app, whether ENTER targets a focused field, or device-state 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 a single front-loaded sentence with no filler. Every clause, including the iPhone caveat, contributes useful 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?
An output schema and annotations exist, so return format and safety need not be restated. Still, the definition is incomplete because the required device parameter is never explained and there is no guidance on alternatives 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?
Schema description coverage is 0%. The description repeats the button enum values and adds platform meaning for BACK, but the required 'device' parameter is entirely undocumented in both the schema and the description. With low schema coverage, more parameter semantics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Press a system button') and enumerates the exact supported button values. The phrase 'system button' helps distinguish it from coordinate-based siblings, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the system-navigation button set, and the iPhone/Android note gives some context. However, it does not say when to use this instead of phone_click_on_screen_at_coordinates, phone_long_press_on_screen_at_coordinates, or phone_type_keys for ENTER.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_save_screenshotSave a screenshotA
Save a screenshot to a file on this machine: PNG when the name ends in .png, else JPEG. Full size unless max_size or scale says otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | ||
| device | Yes | ||
| save_to | Yes | ||
| max_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description adds genuine behavioral detail beyond that: file format is chosen by the extension (.png → PNG, otherwise JPEG) and the default is full resolution unless max_size or scale is given. It still omits overwrite behavior when the target file exists and whether permissions/paths are validated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the core action front-loaded and two concrete behavioral clauses appended. No filler, no redundancy with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The existence of an output schema relieves the description of explaining return values, and the format/size rules are covered. But for a 4-parameter file-writing tool with 0% schema coverage, leaving `device` undocumented and the capture-vs-save semantics unstated against a directly competing sibling leaves real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning; it does explain save_to's extension-driven format and that max_size/scale override full size. But the required `device` parameter gets no mention at all, and units for max_size (pixels? bytes?) and scale (factor vs percentage) remain undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Save a screenshot to a file on this machine") and adds the format rule, so the action is unambiguous. However, it never distinguishes itself from the sibling phone_take_screenshot — an agent cannot tell whether this captures a fresh screenshot or persists an existing one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "to a file on this machine" implicitly signals the use case (persisting to disk rather than returning inline), and "Full size unless max_size or scale says otherwise" implies when the sizing options apply. But there is no explicit when-to-use, when-not-to-use, or named alternative such as phone_take_screenshot, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_start_deviceStart a phoneA
Start a phone and wait until it is ready; returns its device id. With nothing named, the account's default phone (a temporary Android emulator) starts. platform and kind go together (android/emulator, or ios/device for the account's own iPhone). device_id is an id from phone_list_available_devices: a particular iPhone, or the account's saved Android phone (apps and logins kept between sessions). A rented phone bills the account by the minute for up to minutes (default 30), so stop it with phone_stop_device when done.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| minutes | No | ||
| platform | No | ||
| device_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly/destructive/idempotent flags; the description adds genuinely new context: billing by the minute, the 30-minute default window, that state (apps and logins) persists on saved devices, and the required teardown step. It stops short of disclosing what happens if the device is already running or whether concurrent starts are limited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with action, return value, and default behavior, then parameters, then cost and teardown. No filler and no sentence that fails to add 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 need not explain return values, and it still covers lifecycle, cost, device selection, and cleanup. For a 4-param creation tool with no annotation detail, everything an agent needs to invoke it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and largely does: it explains the kind/platform coupling, the provenance of device_id, and the billing meaning and default of minutes. Remaining gaps are the absence of any bound or expiry behavior for minutes beyond the default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Start a phone'), its blocking semantics ('wait until it is ready'), and its return ('returns its device id'). It also distinguishes variants (default temporary Android emulator vs. saved Android phone vs. account iPhone), so an agent can tell exactly what it will get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the sibling that supplies input ('device_id is an id from phone_list_available_devices') and the sibling that must follow ('stop it with phone_stop_device when done'). It also states the zero-argument default path, removing any ambiguity about how to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_stop_deviceStop a phoneADestructiveIdempotent
End a running phone session so it stops billing. Anything not saved on the phone is lost.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description earns credit for adding the concrete consequence: unsaved data on the device is lost. That is exactly the pre-call warning an agent needs beyond the hint flags. It does not discuss auth or session state, but the output schema covers results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, with the action and its consequence front-loaded before the loss warning. Nothing could be cut without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema removes the need to describe return values, and the data-loss warning covers the destructive risk. The missing piece is how to supply a valid 'device' identifier, which is the sole required input for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter ('device') with 0% schema description coverage, and the description says nothing about what form it takes — device ID, name, or index from phone_list_available_devices. This is the one place the description should compensate for the empty schema and it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('End a running phone session') plus the practical reason ('so it stops billing'), which clearly positions it as the counterpart to phone_start_device. It does not name the sibling explicitly, so it stops just short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the billing rationale — an agent can infer you call this when a session is no longer needed — but there is no explicit when-not guidance, no mention of checking unsaved state first, and no reference to phone_start_device or phone_list_available_devices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_swipe_on_screenSwipeA
Swipe in a direction: the way the finger moves, so "up" reveals what is below. Starts at (x, y), or the screen center, and travels distance pixels (default 40% of the screen).
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| device | Yes | ||
| distance | No | ||
| direction | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety frame is set. The description adds real behavioral context — the start point falls back to screen center and distance defaults to 40% of the screen — but says nothing about gesture speed/duration, whether the call blocks until the gesture settles, or side effects like triggering navigation or dismissing content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the direction semantics front-loaded and no filler. Every clause — direction meaning, start point default, distance default — carries information the schema does not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, return values need no explanation, and the geometrically tricky parameters are covered. The gaps are the undocumented `device` parameter and the absence of guidance on when this gesture is the right choice versus the many sibling interaction tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does: x/y are explained as the start point with a screen-center default, distance as pixels with a 40%-of-screen default, and direction is given concrete finger-movement semantics. Only the required `device` parameter is left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (swipe) plus the key semantic subtlety that trips agents up: direction is the direction the finger moves, so "up" reveals content below. That is a concrete, distinguishing clarification that separates it from the click and long_press siblings without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the gesture semantics — there is no statement of when to prefer a swipe over phone_click_on_screen_at_coordinates, phone_list_elements_on_screen, or phone_press_button. An agent can infer that swiping is for scroll/reveal gestures, but nothing explicitly routes it away from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_take_screenshotTake a screenshotARead-only
Take a screenshot of the phone. Use it to understand what is on screen when the text list is not enough. The image is usually smaller than the screen; the text before it says how to convert a point you see into screen coordinates. Do not reuse an old screenshot: the screen changes.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | ||
| device | Yes | ||
| max_size | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint, so the description carries most of the burden and does well: it discloses that the returned image is scaled down from the real screen and that a coordinate conversion note precedes it. Those are behaviors an agent cannot get from the schema. It still omits how the scaling relates to the scale/max_size inputs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the usage condition, then the freshness warning. Little waste, though 'the text before it' is a vague reference that costs a moment of parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by explaining the returned image format and coordinate mapping. However, for a 3-parameter tool with zero schema documentation, the total absence of parameter guidance (especially the required device) leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are 3 parameters, including a required 'device', yet the description never explains what any of them mean. The remark that 'the image is usually smaller than the screen' hints at scale/max_size but gives no guidance on values or defaults, so the coverage gap is unmitigated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Take a screenshot of the phone'. The distinction from the sibling phone_save_screenshot (capture vs persist) is not made explicit, so an agent must infer which one it wants when saving is the goal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to understand what is on screen when the text list is not enough' gives a clear trigger and implicitly routes away from phone_list_elements_on_screen. 'Do not reuse an old screenshot: the screen changes' gives a valuable when-not rule, but it never names phone_save_screenshot or any alternative explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_type_keysType textA
Type text into the focused field. Tap the field first so the keyboard is up; text sent with nothing focused goes nowhere. submit presses Enter afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| device | Yes | ||
| submit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare that this is a non-destructive write; the description adds genuinely new behavior: input requires an existing focus, unfocused input is silently discarded, and `submit` triggers Enter afterwards. It does not say what happens on failure or what is returned, but the key interaction risks are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the precondition, then the optional flag. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output is covered by an output schema, so return values need not be explained. Combined with the focus precondition and Enter behavior, an agent has what it needs to call it correctly; only error handling and the `device` parameter are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning. It explains `submit` explicitly ('presses Enter afterwards') and `text` implicitly through the verb; only `device` is left unaddressed, though its meaning is self-evident from the sibling set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and target ('Type text into the focused field'), which no sibling covers – siblings handle taps, swipes, buttons, and screenshots. An agent can select this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition ('Tap the field first so the keyboard is up') and warns about the failure mode when nothing is focused. It does not name the sibling to use for focusing (e.g., phone_click_on_screen_at_coordinates), so the alternative routing is left implicit.
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.
15 tool updates
v0.1.0- First observed
phone_click_on_screen_at_coordinates - First observed
phone_get_foreground_app - First observed
phone_get_screen_size - First observed
phone_launch_app - First observed
phone_list_apps - First observed
phone_list_available_devices - First observed
phone_list_elements_on_screen - First observed
phone_long_press_on_screen_at_coordinates - First observed
phone_press_button - First observed
phone_save_screenshot - First observed
phone_start_device - First observed
phone_stop_device - First observed
phone_swipe_on_screen - First observed
phone_take_screenshot - First observed
phone_type_keys
TDQS
Scored across 15 tools
Each tool targets a clearly distinct action or resource: capture vs save screenshot, list elements vs get screen size, device lifecycle vs app lifecycle vs input actions. The descriptions reinforce the boundaries, especially around coordinates, screenshots, and device sessions.
All tools use a consistent `phone_` prefix and snake_case with verb-led names such as `phone_list_available_devices`, `phone_click_on_screen_at_coordinates`, and `phone_start_device`. The convention is predictable throughout the set.
Fifteen tools is well-scoped for a phone automation harness, covering device management, screenshots, screen inspection, input, and app control without redundant tools. Each tool has a clear role in the workflow.
The surface covers the core mobile automation lifecycle: start/stop/list devices, inspect screen, interact via tap/long-press/swipe/type/system buttons, and list/launch apps. Minor gaps exist, such as app installation/uninstallation or richer system key events, but the main workflows are covered.
Maintenance
Related MCP Connectors
Give your AI agent a real cloud Android phone: push APKs, drive it, get screenshots and logs.
Control real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Cloud Android phones for AI agents: create a phone, read the screen, tap, type, install APKs, park.
Related MCP Servers
- AlicenseBqualityBmaintenanceGive any LLM agent a real Android or iPhone. 62 MCP tools: tap, swipe, type, screenshot, screen-tree reading, app launch, camera, TTS, crash reports, batched execution. Android via ADB, iPhone via WebDriverAgent, on-device inference, Docker+KVM emulators. Works with Claude Code, Cursor, LangChain, LlamaIndex, and any MCP client. MIT.66537 PyPI390MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to automate Android and iOS devices, including emulators and physical devices, by capturing screenshots, reading UI accessibility trees, performing touch and text input, and managing app lifecycle and logs.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to control real cloud phones by reading screens as text, tapping, typing, installing APKs, handing off to humans, and parking devices to stop billing, without ADB or emulators.MIT
- AlicenseNot gradedqualityAmaintenanceLets AI agents see and use a real Android phone over Wi-Fi: read the screen, find elements by text or ID, tap, type, swipe, take screenshots and read notifications, without ADB or root.312MIT