AkaPhoneDocs
MCP server

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.1.1 exposes 15 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. AI is included: device_run_task needs no model key.

Recommended: the hosted remote connector, https://app.akaphone.ai/mcp (also reachable as https://app.akaphone.ai/mcp, and set up from Connect to Claude in the dashboard). It signs in with OAuth, needs no install and no API key, and has the same tools; its waits are capped at 25 seconds. The stdio package is optional: npx -y https://akaphone.ai/mcp/akaphone-mcp-1.1.1.tgz (it is not on the npm registry).

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 phones, including stopped (saved) ones GET /v1/devices
device_terminate Stop a phone and save its data; billing stops POST /v1/devices/:id/stop
device_start Resume a stopped phone from its last save, on any server POST /v1/devices/:id/start
device_delete Delete a phone and erase its saved data DELETE /v1/devices/:id?wipe=true
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 portable 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 deleted devices (the 200 most recent).

Returns an array of devices: running and starting phones (queued, creating, running), phones being saved (stopping, saving) and stopped phones with saved data (stopped, with data.bytes and data.saved_at). Deleted phones appear only with include_terminated.

Which phones do I have, and which ones are stopped?

device_terminate#

Argument Type Description
Stop the phone and save its data (apps, logins, files); billing stops; resume with device_start. The name is kept from earlier versions: it no longer destroys the phone. To erase a phone use device_delete.
Argument Type Description
device_id string The device to stop.

Returns the device, now stopping; it moves on to saving and then stopped on its own, and data.generation goes up by one. Billing stops at once. A phone that was still queued or booting comes back stopped (or terminated, if it was new and had never been saved).

Stop all my running phones.

device_start#

Resumes a stopped phone from its latest save. It can start on any host; the host restores the saved data and boots it.

Argument Type Default Description
device_id string required A phone in status stopped.
wait boolean true Wait until it is running, for at most 90 seconds.

Returns the device, normally running, with the same timed-out note as device_create if the wait ran out. A phone that is not stopped (for example still saving) gives a 409 conflict error; so does being over your plan's saved-phone limit. Credit and concurrency checks are the same as for device_create.

Start checkout-test again and check I'm still signed in.

device_delete#

Deletes a phone permanently: stops it without saving if it is running, and erases all of its saved data. Cannot be undone.

Argument Type Description
device_id string The phone to delete.
confirm true Required, and must be exactly true. Calls without it are rejected before anything is sent.

Returns the device in status terminated. Use it to clean up throwaway phones and to make room when you hit your plan's saved-phone limit (Free 3, any pack 20, Scale 50, Enterprise 500).

Delete the phones I used for yesterday's test runs.

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 [email protected] 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. Snapshots are portable: device_restore can boot any number of new phones from one, on any host. Your plan's snapshot quota applies, and you can take at most 5 snapshots per hour. See Snapshots. You do not need a snapshot just to keep a phone's data: device_terminate already saves it.

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 task runs on the included AI (no key needed; it counts toward your plan's daily AI tasks). Optional: with the stdio package, MODEL_API_KEY and MODEL_PROVIDER in the server's environment are sent as the X-Model-Key and X-Model-Provider headers to use your own key instead. 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 [email protected] 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:

JSON
[
  { "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://app.akaphone.ai.
MODEL_API_KEY no Optional: your own Gemini, Anthropic or OpenAI key. Leave it out to use the included AI.
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 stop the phone” to keep it for later (stopped phones cost nothing), or “then delete the phone” for a throwaway one.
  • Keep secrets out of instructions. Instructions are stored with the task, so use test accounts.