Getting Started

Install iphone-use

One command on the Mac the iPhone is plugged into. The installer sets the phone up, shows an agent driving it, registers the MCP server with your agents and opens the control page in your browser. If anything is missing, it says what and how to fix it.

What you need

⚠️ iOS 15 and 16
These phones need no update, but from Xcode 26 on Xcode cannot see them, so setup takes its own legacy path. That path needs a paid developer account's App Store Connect API key; without one, setup stops with ios_too_old and says so. iOS 14 or older is below the runner's floor.

Install

bash
$ curl -fsSL https://raw.githubusercontent.com/leeguooooo/iphone-use/main/install.sh | sh

What the installer does

  1. Fetches the latest GitHub Release, registers a per-user LaunchAgent, installs the matching agent skill, lays the device runner sources down at ~/.iphone-use/runner and links the iphone-use command into ~/.local/bin.
  2. With an iPhone plugged in, runs iphone-use setup (build, sign, install and launch the runner, start the relays) and iphone-use try (open Settings, read the screen, go Home), so you see an agent drive the phone before the installer exits.
  3. Registers the MCP server with Claude Code and Codex, and with Cursor and Claude Desktop when they are installed (IPHONE_USE_NO_CLIENT_SETUP=1 skips those two). The server reads the daemon URL and token from the LaunchAgent, so no secret lands in the client's config.
  4. Opens the control page in your browser with a one-time sign-in link and prints a QR code the iPhone camera can scan, so nobody copies the password.

--no-setup (or IPHONE_USE_NO_SETUP=1) skips the phone step; upgrades never run it.

Everyday commands

bash
$ iphone-use status    # is the phone ready for agents?
$ iphone-use doctor    # what is missing, and how to fix it
$ iphone-use setup     # set the phone up again (after a new iPhone or Xcode)
$ iphone-use try       # a harmless check: open Settings, read the screen, go Home
$ iphone-use login     # sign a browser in again, with a QR code for the iPhone
$ iphone-use upgrade   # update everything
$ ~/.iphone-use/uninstall.sh --dry-run   # what uninstalling would remove (drop --dry-run to do it)
✅ Setup says "No Accounts"?
Open the runner project printed in the error (normally ~/.iphone-use/runner/IPhoneUseRunner/IPhoneUseRunner.xcodeproj), select the IPhoneUseRunner scheme and your iPhone, then choose Product → Build For → Testing once. Allow keychain access if asked so Xcode can create the signing certificate and profile, then rerun setup.

Or ask your agent to install it

Paste this into Codex or Claude Code on the Mac the iPhone is plugged into:

prompt
Install iphone-use (https://github.com/leeguooooo/iphone-use) on this Mac so you can drive my iPhone.
1. Run: curl -fsSL https://raw.githubusercontent.com/leeguooooo/iphone-use/main/install.sh | sh
2. Run `iphone-use doctor`. Fix what it reports that can be fixed from the terminal, and run
   `iphone-use setup` when it tells you to.
3. Some steps only I can do: signing in to an Apple ID in Xcode, tapping Trust on the iPhone,
   turning on Developer Mode, unlocking the phone. For those, stop, tell me exactly what to do,
   and wait until I say it is done. Never ask me for a password or a code.
4. Run `iphone-use doctor` again until nothing is missing, then `iphone-use try`.
5. If the phone_* tools are not loaded in this chat yet, tell me to start a new chat.

Codex and Claude Code plugins

Each plugin adds the skill and the MCP server; they still need the install above.

Codex
$ codex plugin marketplace add leeguooooo/iphone-use && codex plugin add iphone-use@iphone-use
Claude Code
> /plugin marketplace add leeguooooo/iphone-use
> /plugin install iphone-use@iphone-use

Other MCP clients (Cursor, VS Code, Claude Desktop, Gemini CLI, opencode, Windsurf) and the HTTP API: MCP, HTTP API & skill.


Upgrades

bash
$ iphone-use upgrade            # install the latest release (daemon + skill)
$ iphone-use upgrade --check    # change nothing, just report

Automatic upgrades are on by default and wait for the phone to be idle. A daily job (04:30) upgrades every daemon on the Mac when a newer release exists and nobody is using that phone: no owner lease, no hold, no live viewer and no agent request in the last 15 minutes. A busy phone is skipped until the next day. The upgrade is the release's own install.sh, with its SHA-256 checks and rollback, and every setting is carried over.

bash
$ ~/.iphone-use/auto-update.sh disable    # off, and it stays off across installs
$ ~/.iphone-use/auto-update.sh status     # on or off, what it would do now, the last result

A second phone

One daemon drives one phone. To drive another iPhone at the same time, install a named instance for it; the default install is left as it is. The instance gets its own copy of the app, state directory, token and ports.

bash
$ curl -fsSL https://raw.githubusercontent.com/leeguooooo/iphone-use/main/install.sh | sh -s -- --instance lab --udid <UDID>
$ iphone-use setup --instance lab

No phone at hand: simulators (preview)

The runner also runs on an iOS Simulator, which needs no phone, no Apple ID and no signing, only Xcode with a simulator runtime.

bash
$ iphone-use simulator start "iPhone 16 Pro"
$ claude mcp add iphone-sim -e IPHONE_USE_INSTANCE=sim -- iphone-use-mcp

Simulators have no camera, App Store apps, real push notifications or Face ID, so tasks that need those only work on a phone.

The iOS app

The iOS app is not in the App Store. Build and install it with your own signing team, the one setup already uses for the runner:

bash
$ iphone-use setup-app   # add --instance <name> for a second phone

Next: what to ask your agent, or how it works.