ghosthand
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GHOSTHAND_TEAM | No | Apple developer team to force when signing the runner on a real iPhone. | |
| GHOSTHAND_MODEL | No | Model used by the autonomous agent (default `claude-opus-5-5`). | |
| GHOSTHAND_DEVICE | No | Target device name (e.g. "iPhone 17"), used instead of the default target (the only booted simulator, else the only reachable iPhone). | |
| GHOSTHAND_EFFORT | No | Effort level used by the autonomous agent (default `low`). | |
| ANTHROPIC_API_KEY | No | Anthropic API key, needed for the MCP server to run the autonomous agent (ios_run_task), e.g. `claude mcp add … -e ANTHROPIC_API_KEY=…`. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ios_devicesA | List simulators and real iPhones, and which ones are ready (booted / reachable). |
| ios_bootA | Get a target ready: boot a simulator (name like "iPhone 17", or UDID) or pick an iPhone, then start the automation runner on it. The first start compiles the runner (a minute or two). On an iPhone it must be unlocked, and the very first time the user must trust the developer certificate in Settings > General > VPN & Device Management. |
| ios_observeA | See the screen: numbered list of visible elements, plus a screenshot. Args: screenshot: Include a screenshot (scaled to points, so pixel = tap coordinate). annotate: Draw element indexes on the screenshot. device: Simulator name or UDID; defaults to the only booted one. |
| ios_tapA | Tap an element by [index] from the latest observation, or a point (x, y) in points. Args: index: Element index from the latest ios_observe or action result. x: Horizontal position in points (with y, instead of index). y: Vertical position in points. hold_seconds: Press duration for a long press (e.g. 1.0); 0 for a normal tap. device: Simulator name or UDID. |
| ios_swipeA | Swipe: either a direction from the screen center, or explicit points. The direction is the finger's: "up" scrolls content down (reveals what is below). To go back in most apps, swipe from x=2 to x=250 at mid-height. Args: direction: up, down, left or right. from_x: Start x in points (with from_y, to_x, to_y instead of direction). from_y: Start y in points. to_x: End x in points. to_y: End y in points. duration: Gesture duration in seconds; shorter is a faster fling. device: Simulator name or UDID. |
| ios_typeA | Type text into the field that has keyboard focus (tap the field first). Use "\n" for Return. |
| ios_pressC | Press a hardware button. "home" goes to the home screen. |
| ios_launchA | Open an app by bundle ID (see ios_apps). relaunch=True restarts it from scratch. |
| ios_terminateC | Quit an app. |
| ios_appsB | List installed apps: bundle ID and display name. |
| ios_open_urlC | Open a URL or deep link (https://…, maps://…, app schemes). |
| ios_run_taskA | Hand a whole task to the built-in agent (Claude via the Anthropic API) instead of driving step by step. It runs in the background; poll with ios_task_status. Needs ANTHROPIC_API_KEY (or Args: task: What to do, in plain language, e.g. "Turn on dark mode in Settings". max_steps: Step budget before giving up. wait_seconds: Block up to this long for the result (0 returns immediately). mode: "fast" acts directly; "reliable" plans checkpoints and has each one verified (slower, surer). device: Simulator name or UDID. |
| ios_task_statusA | Status and latest steps of an agent task; without task_id, a list of all tasks. |
| ios_task_cancelB | Stop an agent task after its current step. |
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
Each tool maps to a distinct action in the observation→interaction loop (observe, tap, swipe, type, press), and the agent-mode tools (ios_run_task / ios_task_status / ios_task_cancel) are clearly separated from manual driving. The only soft overlaps are ios_launch vs ios_open_url (an app scheme URL could effectively launch an app) and ios_press vs dedicated navigation, which an agent could occasionally misselect.
All 14 tools use a uniform ios_ prefix with snake_case, giving a highly predictable namespace. Most are verb or verb_noun (ios_boot, ios_tap, ios_open_url, ios_run_task), with a few noun-only list/query names (ios_devices, ios_apps, ios_task_status) that follow a conventional read-only pattern but are a minor deviation.
14 tools sits squarely in the well-scoped range and every tool maps to a needed primitive: discovery, boot, observation, four input gestures, app lifecycle, URL handling, plus an optional agent layer with status/cancel. Nothing looks redundant or padded for the scope of iOS device automation.
The core loop is fully covered end-to-end: list devices, boot, observe screen (elements + screenshot), interact (tap/swipe/type/press), and app lifecycle (apps, launch, terminate, open_url), plus an agent mode with status and cancellation. Minor gaps remain—no install/uninstall of apps, no orientation/rotation, no explicit wait/sleep or clipboard/keyboard-dismiss primitive—but agents can work around these with existing gestures.