MCP tools reference
Every tool the akaphone-mcp server exposes to Claude Code, Cursor and Codex, with arguments, what each returns, the REST call behind it and example prompts.
akaphone-mcp 1.0.0 exposes 13 tools. Your agent picks them from your request. You rarely name them yourself, but knowing what they do helps you ask for the right thing. Setup is in Claude Code and Cursor and Codex.
Most tools return JSON text (the API response, pretty-printed); the exceptions are noted. If the API returns an error, the tool result is marked as an error and reads AkaPhone API <status> <code>: <message>. For 429 responses it also says how many seconds to wait.
Summary#
| Tool | What it does | REST calls |
|---|---|---|
device_create |
Boot a new Android 14 device | POST /v1/devices |
device_list |
List your devices | GET /v1/devices |
device_terminate |
Stop a device and its billing | DELETE /v1/devices/:id |
device_screenshot |
The current screen as an image | GET /v1/devices/:id/screenshot |
device_input |
Tap, swipe, type or press a key | POST /v1/devices/:id/input |
device_install_apk |
Upload a local APK and install it | POST /v1/uploads, PUT to storage, POST /v1/uploads/:id/complete, POST /v1/devices/:id/apps, GET /v1/devices/:id/apps/:install_id |
device_snapshot |
Save a device's disk as a snapshot | POST /v1/devices/:id/snapshot |
device_restore |
Boot a new device from a snapshot, or list snapshots | POST /v1/snapshots/:id/restore, GET /v1/snapshots |
device_run_task |
Run a plain-English task and wait for the result | POST /v1/devices/:id/tasks, then GET /v1/tasks/:id |
task_status |
Get a task | GET /v1/tasks/:id |
task_artifacts |
List or fetch a task's video, screenshots, trace and log | GET /v1/tasks/:id/artifacts |
usage |
Device-minutes this month | GET /v1/usage |
profiles_list |
Device profiles for device_create |
GET /v1/profiles |
device_create#
Boots a fresh Android 14 phone and, by default, waits until it is running.
| Argument | Type | Default | Description |
|---|---|---|---|
name |
string | none | Friendly name, up to 64 characters. |
profile |
string | pixel_8 |
pixel_8, pixel_tablet or small_phone (see profiles_list). |
wait |
boolean | true |
Wait until the device is running, for at most 90 seconds. |
Returns the device object. If the 90 seconds run out while capacity is busy, the API sends X-Wait-Timed-Out: 1 and the tool adds a note: the device is still queued or creating, and the agent should check it again with device_list.
Create a phone called "signup-test".
device_list#
| Argument | Type | Default | Description |
|---|---|---|---|
include_terminated |
boolean | false |
Also list finished devices (the 200 most recent). |
Returns an array of devices. Without include_terminated, only queued, creating, running and stopping devices.
Which phones do I have running?
device_terminate#
| Argument | Type | Description |
|---|---|---|
device_id |
string | The device to stop. |
Returns the device, now stopping (or terminated if it was queued). Billing stops.
Terminate all my running phones.
device_screenshot#
| Argument | Type | Description |
|---|---|---|
device_id |
string | A running device. |
Returns an image/jpeg image of the current screen, which the agent can look at directly.
Show me what's on the screen of signup-test.
device_input#
Sends one input event to a running device. Coordinates are device pixels: 720×1560 on pixel_8 (profiles_list has the others).
| Argument | Type | Used with | Description |
|---|---|---|---|
device_id |
string | all | A running device. |
type |
tap, swipe, text or key |
all | The kind of event. |
x, y |
integer, 0–10000 | tap |
Where to tap. |
x1, y1, x2, y2 |
integer, 0–10000 | swipe |
Start and end points. |
ms |
integer, 1–10000 | swipe |
Duration, default 300. |
text |
string, 1–500 characters | text |
Text to type into the focused field. |
key |
HOME, BACK, RECENTS, ENTER, DEL or TAB |
key |
Hardware or navigation key. |
Returns a short confirmation. A missing field for the chosen type (for example a tap without y) is an error before anything is sent. Input does not confirm that the tap had an effect; follow it with device_screenshot.
On signup-test, tap the email field at 360, 640, type test@example.com and press Enter.
device_install_apk#
Uploads a local APK and installs it on a running device, then waits for the result.
| Argument | Type | Description |
|---|---|---|
device_id |
string | A running device. |
file_path |
string | Path to a local .apk file, at most 300 MB. |
The tool creates an upload, PUTs the file straight to storage with the presigned URL, completes the upload, starts the install, and polls the install status for up to 5 minutes.
Returns the install: status installed with the package name, or an error result with status failed and the installer's error. If the install is still pending after 5 minutes, the tool says so; the install continues on the device. Runtime permissions are granted on install. .aab bundles are refused before any upload; build a universal APK first. See Install an APK.
Install ./app/build/outputs/apk/debug/app-debug.apk on signup-test and open it.
device_snapshot#
| Argument | Type | Description |
|---|---|---|
device_id |
string | A running device. |
name |
string | Optional label, up to 64 characters. |
Returns the snapshot in pending status. It becomes ready after a short while. Your plan's snapshot quota applies, and you can take at most 5 snapshots per hour. See Snapshots.
Snapshot signup-test as "logged-in".
device_restore#
| Argument | Type | Default | Description |
|---|---|---|---|
snapshot_id |
string | none | Snapshot to boot from. Omit it to list your snapshots instead. |
name |
string | none | Name for the new device. |
wait |
boolean | true |
Wait until the new device is running, for at most 90 seconds. |
Returns the new device (with the same timed-out note as device_create), or the snapshot list when snapshot_id is omitted. The original device is not touched.
Start a new phone from the "logged-in" snapshot.
device_run_task#
Has ARTEMIS carry out a plain-English instruction on a device. It then polls every 3 seconds until the task finishes or wait_seconds runs out.
| Argument | Type | Default | Description |
|---|---|---|---|
device_id |
string | required | A running device with no active task. |
instruction |
string | required | What to do, 1–8,000 characters. |
profile |
"flash" or "pro" |
"pro" |
flash for quick, simple actions; pro for multi-step work. The REST API's own default is flash. |
wait_seconds |
integer | 600 |
0–1800. 0 returns at once with the queued task. |
The tool sends MODEL_API_KEY and MODEL_PROVIDER from the server's environment as the X-Model-Key and X-Model-Provider headers. The host picks the model for the provider and profile (Model keys). To get structured output back, describe it in the instruction, for example “reply with JSON {version, build}”.
Returns the task with steps, status and result. If the task is still running when wait_seconds runs out, the text ends with (still running; poll with task_status).
On signup-test, open the app, sign up as test+42@example.com with password Test1234!, and tell me what the first screen after sign-up says.
task_status#
| Argument | Type | Description |
|---|---|---|
task_id |
string | The task. |
Returns the task with its steps. Statuses: queued, running, succeeded, failed, cancelled.
Is that task finished yet?
task_artifacts#
| Argument | Type | Description |
|---|---|---|
task_id |
string | A finished task. |
download |
string | Optional. The id (art_…) or file name of one artifact to fetch. |
Without download, the tool returns { "files": [...] }. Each file has its id, kind, name, size_bytes and a presigned download url. The URLs are valid for 15 minutes. The files are video.mp4, before.png, after.png, trace.tar.gz and stdout.log. The list is empty for a few seconds after a task ends, while the host uploads the files.
With download, the tool fetches that file through its presigned URL:
| File | Returned as |
|---|---|
before.png, after.png (screenshots) |
an image the agent can see |
stdout.log |
text (the last 200 KB if it is longer) |
video.mp4, trace.tar.gz |
a note with the download URL, since binary files cannot be shown inline |
Show me the after screenshot of the last task, and the end of its log.
usage#
No arguments. Returns the usage report for the current month: total_minutes, active_devices, minutes per day and per device.
How many device-minutes have I used this month?
profiles_list#
No arguments. Returns the device profiles with id, name, width, height, dpi and android:
[
{ "id": "pixel_8", "name": "Pixel 8", "width": 720, "height": 1560, "dpi": 320, "android": "14" },
{ "id": "pixel_tablet", "name": "Pixel Tablet", "width": 1280, "height": 800, "dpi": 240, "android": "14" },
{ "id": "small_phone", "name": "Small phone", "width": 540, "height": 960, "dpi": 240, "android": "14" }
]Which device sizes can I use? Start a tablet.
Environment variables#
| Variable | Required | Description |
|---|---|---|
AKAPHONE_API_KEY |
yes | Your ak_live_… key. The server exits at startup without it. |
AKAPHONE_API_URL |
no | Defaults to https://akaphone.abhgnx-417.workers.dev. |
MODEL_API_KEY |
for tasks | Your Gemini, Anthropic or OpenAI key. |
MODEL_PROVIDER |
no | gemini (default), anthropic or openai. Any other value stops the server at startup with MODEL_PROVIDER must be one of gemini, anthropic, openai. |
Tips for prompts#
- Name your devices and refer to them by name. The agent maps names to ids with
device_list. - Ask for a verdict. Ending with “…and tell me PASS or FAIL” makes results easy to scan.
- Ask it to clean up. End with “then terminate the phone” unless you want to keep it.
- Keep secrets out of instructions. Instructions are stored with the task, so use test accounts.