Skip to main content

English · 中文

phonectl-mcp

Let AI agents see and drive a real iPhone from your Mac, over USB or Wi-Fi.

PyPI macOS only iOS 27+ MCP server Tests License: MIT

Install · Tools · Troubleshooting · Security

An MCP server for screenshots, on-screen text, taps, swipes, typing, buttons, apps and the clipboard on an iPhone connected to your Mac. Nothing to install on the phone, no jailbreak.

An AI agent makes a rednote post through phonectl-mcp: text card, template, stickers, filter, title and caption A script applies to one job in the BOSS Zhipin app through phonectl-mcp, reading the screen with read_text and tapping
An AI agent makes a rednote post: text card, template, stickers, filter, caption. It stops before Post. Sped up. A script applies to a job in a recruiting app: read_text finds the buttons, tap presses them. 2× speed.

Requirements

  • A Mac with uv
  • An iPhone on iOS 27 or later, with Developer Mode on
  • A USB data cable (not a charge-only one) for the first setup. After that, Wi-Fi works too

Tested on an iPhone 17 Pro with iOS 27.2 and macOS 27.

Install

Let your agent install it

Paste this to your coding agent (Claude Code, Codex, Cursor…):

Install phonectl-mcp by following https://github.com/jiefeng-ai/phonectl-mcp#install-by-hand, then add it to your MCP config and take a screenshot of my phone to check it works. When I need to do something on the phone, tell me step by step and wait for me.

Install by hand

uv tool install phonectl-mcp
phonectl install-service   # runs the server at login on http://127.0.0.1:47321/mcp
phonectl doctor            # checks cable, trust, Developer Mode, disk image and server

install-service also creates an access token in ~/.config/phonectl/token. Then connect your client:

Claude Code

claude mcp add --scope user --transport http phone http://127.0.0.1:47321/mcp \
  --header "Authorization: Bearer $(cat ~/.config/phonectl/token)"

Cursor (~/.cursor/mcp.json) and other clients with streamable HTTP

{
  "mcpServers": {
    "phone": {
      "url": "http://127.0.0.1:47321/mcp",
      "headers": { "Authorization": "Bearer <contents of ~/.config/phonectl/token>" }
    }
  }
}

To check, ask your agent to take a screenshot of the phone.

After one setup over the cable, it also works over Wi-Fi while the phone and the Mac share a network.

All agents and scripts share this one server, since the phone takes a single control connection; let one agent drive at a time.

Tools

Coordinates are iOS points, the same as the pixels of the returned screenshot.

Tool What it does
screenshot Captures the screen
read_text Text on screen with positions, as JSON. Much cheaper than an image
tap, long_press, swipe Touch. To scroll down, swipe upward
type_text Types into the focused field. Non-ASCII text goes through the clipboard
press_key A key or chord, such as enter or cmd+a
press_button home, lock, volume-up, volume-down, mute, siri
launch_app, list_apps Opens apps, finds bundle ids
get_clipboard, set_clipboard The phone's clipboard
status The server and the phone link

Tools that act on the phone return a screenshot taken afterwards (screenshot=False skips it). Taps are not confirmed, so check that screenshot.

Troubleshooting

Run phonectl doctor first. It tells you which link is broken.

Symptom Fix
No iPhone found Use a data cable, unlock the phone, replug
"Mac is not trusted" Unlock the phone, replug, tap Trust
No Developer Mode switch Open Xcode once with the phone connected; the switch appears under Settings › Privacy & Security
Screenshots fail (e.g. after the phone restarts) Plug in the cable; phonectl doctor --fix mounts the developer disk image
Taps do nothing Needs iOS 27+; keep the screen on and unlocked
Clients cannot connect phonectl restart, then check ~/Library/Logs/phonectl.error.log. A 401 means the client's token differs from ~/.config/phonectl/token

Security

  • The server listens only on 127.0.0.1 and rejects requests without the token.
  • An agent can do anything your finger can: send messages, pay, delete. Keep its instructions narrow and watch the screen. Use at your own risk; automating third-party apps may break their terms.

Settings

Environment variables (set them, then run phonectl install-service again; restart keeps the old values)
Variable Default Meaning
PHONECTL_UDID first connected iPhone Which phone to use when several are connected
PHONECTL_PORT 47321 HTTP port (127.0.0.1 only)
PHONECTL_TOKEN_FILE ~/.config/phonectl/token Where the token is kept
PHONECTL_SCALE 3 Pixels per point; 2 on iPhone SE, XR, 11. Only affects screenshot size
PHONECTL_OCR_LANGS zh-Hans,en-US read_text languages, in priority order
PHONECTL_SETTLE 0.6 Seconds to wait before the screenshot after an action
PHONECTL_TOUCH_IDLE 30 Idle seconds before the input stream closes (reopening takes ~0.6 s)
PHONECTL_CALL_TIMEOUT 15 Seconds to wait for the phone, on top of the gesture time
PHONECTL_LOG WARNING Log level (INFO for the service); logs in ~/Library/Logs/phonectl*.log

Other commands: phonectl restart (e.g. after uv tool upgrade phonectl-mcp). To remove: phonectl uninstall-service, uv tool uninstall phonectl-mcp, and delete ~/.config/phonectl.

Development

git clone https://github.com/jiefeng-ai/phonectl-mcp
cd phonectl-mcp
uv sync
uv run pytest

uv run phonectl install-service from the clone runs your working copy as the service.

License

MIT

Metadata

Release files for phonectl-mcp 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for phonectl-mcp 0.1.1
File Size Uploaded Provenance Actions
phonectl_mcp-0.1.1.tar.gz 127.4 kB With provenance Details for phonectl_mcp-0.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for phonectl-mcp 0.1.1
File Interpreter ABI Platform Actions
phonectl_mcp-0.1.1-py3-none-any.whl Python 3 none any Details for phonectl_mcp-0.1.1-py3-none-any.whl

Total release size: 151.6 kB

Release files / phonectl_mcp-0.1.1.tar.gz

Download URL phonectl_mcp-0.1.1.tar.gz
Size 127.4 kB
Tags Source
SHA-256 checksum
How to use checksums
421de9b7b7d094d240bbc25545ad081077648fc2423b0481fc9cde4b250a6ee6
BLAKE2b-256 checksum
How to use checksums
bd8016a3af8e950c671f70a2e59749b0d9e8d673920e4a99051c39d8a517dc9b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.

Transparency log

Release files / phonectl_mcp-0.1.1-py3-none-any.whl

Download URL phonectl_mcp-0.1.1-py3-none-any.whl
Size 24.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
be30495de3ddf3f6ed5266a0b4b038b7a32c97859f43a36f725c664203e48512
BLAKE2b-256 checksum
How to use checksums
d776c9f8ef1b61619f6b3f36aed458419eebada9be1d787ea8a71abe27590b2c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.

Transparency log

Security for phonectl-mcp 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for phonectl_mcp-0.1.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page