phonedriver
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PHONEDRIVER_ASK | No | Comma-separated list of extra tap categories to be asked about: any of "send" (Send, Reply, Post, Share), "delete" (Delete, Remove, Clear all) and "install" (Install, Uninstall). By default only payments and deleting an account are asked about, e.g. PHONEDRIVER_ASK=send,delete. | |
| PHONEDRIVER_GUARD | No | Set to "off" to turn off the approval check that holds taps on sensitive buttons (payments, deleting an account, and anything added via PHONEDRIVER_ASK) and asks you first. | |
| PHONEDRIVER_DEVICE | No | Device id to use when more than one device is connected, e.g. "android:emulator-5554". `phonedriver devices` lists the ids. | |
| PHONEDRIVER_DISPLAY | No | Set to "hidden" to have the agent work on a hidden second screen on Android 13 and later, so your own screen stays yours (equivalent to passing --display hidden to the CLI). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Operate an Android or iOS device. System settings: shell. App UI: launch takes an app name (no devices or apps first), then snapshot once and act on its @refs; each action returns what changed. Send calls one at a time on the shared screen. If an error needs the user to act on the device, say so and go on when they are done. Passwords, payments, sending and deleting need the user's word for this task.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| appsB | List apps ( |
| batchB | Run steps in order, one diff back; stops at the first failure. A step is {"tool":"tap","target":"@e3"}: tap, type, swipe, scroll, press, launch or wait. |
| clipboardC | Read the clipboard, or |
| devicesA | List devices (id, model, OS, holder). With several, pass an id as |
| launchA | Open an app (any part of its name, or its id) or a |
| pressC | Press home, back, recents, notifications, lock, volume-up, volume-down, enter or hide-keyboard. |
| screenshotA | Image of the screen, for what the snapshot lacks (canvas, map, photo). |
| scrollB | Scroll toward more content, or until the text or @ref in |
| shellA | Run a device shell command: exit code, output, screen change. Prefer it for settings: |
| snapshotB | The screen as lines like |
| swipeA | A finger gesture: flip pages, dismiss. |
| tapA | Tap by @ref, text or x,y point (from a screenshot). |
| typeA | Put text in a field (replaces its content) and report what it shows; empty text clears. |
| waitB | Wait for |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
Most tools have clearly distinct targets: observation (snapshot vs screenshot), gestures (tap, swipe, scroll, press) and input (type) are separated, and descriptions actively disambiguate hot spots like 'use scroll for lists' and 'screenshot for what the snapshot lacks'. Remaining overlap is real but modest: `batch` re-runs the same verbs as standalone tools, `shell` can launch apps the way `launch` does, and `tap` vs `press` require reading the descriptions to separate.
Every name is a single lowercase word with no casing or separator drift, which is a strong, predictable surface. The only inconsistency is grammatical: some names are nouns naming a resource (apps, devices, clipboard, snapshot, screenshot) while others are imperative verbs (launch, tap, type, wait), and `batch` is neither.
Fourteen tools sits squarely in the well-scoped range for mobile automation: device/app management, perception, gestures, text entry, waiting, and a batch combinator. Each tool maps to a distinct capability an agent needs and none feels like filler.
Coverage of the inspect-then-act loop is thorough: device discovery, app lifecycle (install/stop/clear/uninstall), launch with permissions, snapshot/screenshot perception, gestures, typing, waiting and batch composition, with `shell` as an escape hatch. Minor gaps remain — no permission revocation, no file push/pull, and `wait` only supports `gone:<text>` rather than `gone` for a ref — but agents can work around these via shell.