Documentation
Mobdev
Mobdev reads the iPhone screen over USB and taps and types as a Bluetooth keyboard and pointer. Agents use it through MCP or HTTP.
Install
You need a Mac with Bluetooth LE and macOS 26 or later, an iPhone and a USB data cable. Download the app, open the disk image and drag Mobdev into Applications. It is signed and notarized by Apple and updates itself.
Allow Bluetooth and Camera when macOS asks. macOS treats the iPhone screen like a camera, which is why it asks for camera access. To build it yourself with Xcode 26 or later:
git clone https://github.com/niklas-schmidt-dev/mobdev
cd mobdev/macos
scripts/build-app.sh
open build/Mobdev.appSet up the iPhone
- Plug it in, unlock it and tap Trust. If the Mac asks to allow the accessory, click Allow.
- On the iPhone open Settings › Bluetooth and tap your Mac under Other Devices. iOS lists it by the Mac’s name. If it is missing, wait a moment or click Show on iPhone Again in Mobdev: an iPhone on the same Apple Account can miss the Mac until Mobdev offers it again.
- Turn on Settings › Accessibility › Touch › AssistiveTouch. It turns the pointer into taps. On the same page turn off Snap to Item and keep Perform Touch Gestures on, otherwise every swipe becomes a tap.
- In Mobdev, pick the keyboard layout that matches Settings › General › Keyboard › Hardware Keyboard on the iPhone.
- Set Auto-Lock to Never while agents work. The phone must stay unlocked.
Connect an agent
The app shows these with the right paths under Connect. They contain no secret.
Claude Code
claude mcp add --scope user mobdev -- /Applications/Mobdev.app/Contents/MacOS/Mobdev mcpCodex (~/.codex/config.toml)
[mcp_servers.mobdev]
command = "/Applications/Mobdev.app/Contents/MacOS/Mobdev"
args = ["mcp"]Claude Desktop, Cursor and others
{
"mcpServers": {
"mobdev": {
"command": "/Applications/Mobdev.app/Contents/MacOS/Mobdev",
"args": ["mcp"]
}
}
}HTTP clients can use http://127.0.0.1:4686/mcp with the token from Settings › API. The server speaks MCP 2026-07-28 and the earlier versions back to 2024-11-05.
Tools
Coordinates are pixels of the image screenshot returns (long edge 1280 px). Actions return a fresh screenshot unless you pass "screenshot": false. With more than one iPhone on the Mac, pass device (an id or name from list_devices) to pick one.
| Tool | Arguments | What it does |
|---|---|---|
| list_devices | The iPhones on this Mac: id, name, model, iOS version, ready | |
| status | Screen and Bluetooth readiness, screenshot size | |
| screenshot | JPEG of the screen | |
| tap | x, y | Tap a point of the screenshot |
| long_press | x, y, seconds | Touch and hold |
| swipe | from_x, from_y, to_x, to_y, duration | Drag, e.g. to scroll |
| scroll | direction, amount, x, y | Mouse wheel |
| type_text | text, submit | Type into the focused field (up to 1000 characters per call) |
| press_key | key, modifiers | e.g. space + cmd for Spotlight |
| home | Go to the home screen | |
| open_app | name | Open an app through Spotlight |
| read_screen | All visible text with positions (on-device OCR) | |
| find_text | text | Where a label is |
| tap_text | text, index | Tap a visible label |
| wait_for_text | text, timeout, gone | Wait for text to appear or disappear |
Build, run and debug
For apps you build, Mobdev also installs builds, launches them and reads their output and crash reports. The agent builds with xcodebuild, installs, drives the app with the tools above and reads the logs. These tools use Xcode’s devicectl, so they need Xcode on the Mac and Developer Mode on the iPhone (Settings › Privacy & Security › Developer Mode). Everything else works without them.
| Tool | Arguments | What it does |
|---|---|---|
| list_apps | all | Apps installed for development, or every app |
| install_app | path | Install an .app or .ipa built for iPhone from the Mac |
| uninstall_app | bundle_id | Remove an app installed for development |
| launch_app | bundle_id, arguments, environment, restart | Launch an app and capture what it prints |
| stop_app | bundle_id | Stop a running app |
| open_url | url | Open a deep link, universal link or web page |
| logs | bundle_id, after, lines, contains | print, NSLog and os_log output, and how the app ended |
| crash_reports | app, name, limit | List crash reports, or read one: exception, reason, crashed thread |
xcodebuild -scheme MyApp -destination 'generic/platform=iOS' \
-derivedDataPath build -allowProvisioningUpdates build
# install_app {"path": "…/build/Build/Products/Debug-iphoneos/MyApp.app"}
# launch_app {"bundle_id": "com.example.MyApp"}
# logs {"bundle_id": "com.example.MyApp"}logs returns a cursor; pass it as after to get only new lines. When the app crashes, logs says so and crash_reports shows the report. Paths for install_app are on the Mac that runs Mobdev, also through a relay. Mobdev never removes App Store or system apps.
Skills
Skills give your agent whole workflows on top of the tools: the build and debug loop, smoke tests, onboarding audits and competitor research. They work with Claude Code, Codex, Cursor and other agents that read SKILL.md files.
npx skills add niklas-schmidt-dev/mobdevOr copy a folder from skills/ into your agent’s skills directory.
Remote access
To reach the phone from another computer, the Mac keeps an outgoing WebSocket to a relay. No port is opened on the Mac, and the relay stores nothing.
- Sign in to the dashboard and create an access token.
- Click “Open in Mobdev”, or paste the token under Remote Access in the app.
- Copy the remote command from the app and run it on the other computer:
claude mcp add --transport http mobdev-remote \
https://relay.mobdev.sh/h/<mac-name>/mcp \
--header "Authorization: Bearer mdc_…"The client key (mdc_…) is derived from a secret that never leaves your Mac. Anyone with it can control the phone; “New Client Key” in the app revokes it. Revoking the access token in the dashboard disconnects the Mac.
Limits of the hosted relay
Free connects 1 Mac and includes 20,000 requests and 10 active hours a month. Pro ($9 USD a month, plus applicable tax) connects 3 Macs and includes 1,000,000 requests and 300 active hours a month. Active time counts while a Mac works on a request; a connected Mac that waits costs nothing. The dashboard shows what you used. Mobdev on the Mac and a relay you run yourself have no limits.
When a limit is reached, the relay answers with HTTP 429 and a Retry-After header:
- More than 50 requests in 10 seconds with one client key.
- More than 4 requests waiting for the same Mac.
- The month’s requests or active time used up. Retry-After points to when they renew.
Run your own relay
The relay in the repository speaks the same protocol. It is one Go binary or a small Docker image:
cd relay
RELAY_HOST_ACCESS_TOKEN=choose-one go run .
# or
docker build -t mobdev-relay . && docker run -p 8080:8080 mobdev-relayPut it behind HTTPS and enter its URL in the app. With RELAY_HOST_ACCESS_TOKEN set, only Macs that know the token may connect.
Security and privacy
- The local API binds to 127.0.0.1, needs a bearer token and rejects browser requests.
- Text recognition runs on the Mac. No screen content leaves it unless your agent sends it to its model.
- The hosted relay stores your email, hashed access tokens, which Macs are connected and the iPhones they report. Requests and screenshots only pass through memory. See privacy.
- Agents act on your real phone with your accounts. Keep a person in the loop for anything that sends messages, pays or deletes.