claude-in-mobile
Local MCP server that controls Android, iOS Simulator, desktop, web and other device targets for testing
Drives iOS and Android simulators, emulators and real devices from an assistant
By Mobile Next TypeScript Local · stdio TestingDeveloper tools
96 popularity score ★ 10k ↓ 55k/wk
Opens the app, which asks before it adds the server.
claude mcp add mobile -- npx -y @mobilenext/mobile-mcp@latest{
"mcpServers": {
"mobile": {
"command": "npx",
"args": [
"-y",
"@mobilenext/mobile-mcp@latest"
]
}
}
}{
"mcpServers": {
"mobile": {
"command": "npx",
"args": [
"-y",
"@mobilenext/mobile-mcp@latest"
]
}
}
}{
"servers": {
"mobile": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@mobilenext/mobile-mcp@latest"
]
}
}
}[mcp_servers.mobile]
command = "npx"
args = ["-y", "@mobilenext/mobile-mcp@latest"]gemini mcp add --scope user mobile npx -- -y @mobilenext/mobile-mcp@latestMOBILEMCP_DISABLE_TELEMETRY |
Optional: Any value turns off the PostHog and Scarf usage pings and hides the get_more_tools tool. |
|---|---|
MOBILEMCP_AUTH secret |
Optional: Bearer token that every request to the HTTP server must carry. Unset, it accepts any caller and logs a warning. |
MOBILEMCP_ALLOW_UNSAFE_URLS |
Optional: Set to 1 to let mobile_open_url open other URL schemes such as app deep links. |
MOBILEMCP_LEGACY_ROBOT |
Optional: Set to 1 to use the older per-platform drivers for Android and real iPhones. iOS simulators keep using mobilecli. Tapping by ref stops working. |
Mobile MCP gives an assistant hands on a phone or tablet. It works with simulators and emulators as well as real devices plugged in over USB, and one set of tools covers both platforms. To see the screen it reads the native accessibility tree, which hands back each element with a ref and its coordinates. A screenshot is the fallback for things missing from that tree. From there the assistant can tap and type, press hardware keys, rotate the device or fake its GPS position. It also manages apps, records the screen and pulls device logs and crash reports.
The makers pitch it at native app testing and data entry, along with longer user journeys that an assistant walks through step by step. A batch tool runs a known sequence of taps and typing in one call, which saves round trips to the device. Physical devices rented from Mobile Next Cloud work through the same tools once you log in from the browser.
Two things the README does not spell out, from the source at the published version. With telemetry left on, the server registers an extra tool, get_more_tools, and whatever context the assistant writes into it goes to the developers' PostHog project (src/server.ts). Files it writes must land in the system temp folder or the folder it was started from, and that folder is refused when it is your home directory or above it (src/utils.ts).
It talks over stdio by default. The --listen flag turns it into a Streamable HTTP server instead, and there is also an install subcommand that finds the MCP clients on your machine and writes the config for you.
| Runtime | Node.js 20+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Mobile Next Cloud | Only for the remote device tools. Local devices need no account. |
| Also |
|
Install Xcode for iOS targets or the Android SDK platform tools for Android, then boot a simulator or emulator, or plug in a device. A real Android phone needs USB debugging turned on and authorised. A real iPhone must trust the computer. To add the server to every client it finds, run npx @mobilenext/mobile-mcp@latest install (add -y to skip the picker).
A good fit for a developer or tester who wants an assistant to click through a real app on a simulator, emulator or attached phone, check a flow, and collect logs or crash reports when it breaks. It runs on your own machine and needs no account for local devices. It changes device state freely, so point it at test devices rather than a personal phone. iOS work needs a Mac. If you only want to drive a website, a browser automation server is the closer fit.
12 only read, 21 change things, 2 can delete or overwrite. A ? marks an optional parameter.
get_more_toolscontext: stringmobile_list_available_devicesmobile_get_screen_sizedevice: stringmobile_get_orientationdevice: stringmobile_set_orientation changesdevice: stringorientation: enummobile_fold_device changesdevice: stringposture?: enumangle?: numbermobile_set_location changesdevice: stringlatitude?: numberlongitude?: numbermobile_clipboard changesdevice: stringtext?: stringmobile_login_to_cloud_provider changesmobile_list_remote_devicesmobile_allocate_remote_device changesplatform: enumname?: stringversion?: arraytype?: enumwait?: booleantimeoutSeconds?: numbermobile_release_remote_device changesdevice: stringmobile_list_appsdevice: stringmobile_get_foreground_appdevice: stringmobile_launch_app changesdevice: stringpackageName: stringlocale?: stringmobile_terminate_app changesdevice: stringpackageName: stringmobile_clear_app_data deletesdevice: stringpackageName: stringmobile_install_app changesdevice: stringpath: stringmobile_uninstall_app deletesdevice: stringpackageName: stringmobile_take_screenshotdevice: stringmaxSize?: numberscale?: numbermobile_save_screenshot changesdevice: stringsaveTo: stringmaxSize?: numberscale?: numbermobile_list_elements_on_screendevice: stringformat?: enummobile_click_on_screen_at_coordinates changesdevice: stringx?: numbery?: numberref?: stringmobile_double_tap_on_screen changesdevice: stringx?: numbery?: numberref?: stringmobile_long_press_on_screen_at_coordinates changesdevice: stringx?: numbery?: numberref?: stringduration?: numbermobile_swipe_on_screen changesdevice: stringdirection: enumx?: numbery?: numberdistance?: numbermobile_start_screen_recording changesdevice: stringoutput?: stringtimeLimit?: numbermobile_stop_screen_recording changesdevice: stringmobile_type_keys changesdevice: stringtext: stringsubmit?: booleanmobile_press_button changesdevice: stringbutton: stringmobile_open_url changesdevice: stringurl: stringmobile_get_device_logsdevice: stringlimit?: numberfilter?: arraysaveTo?: stringmobile_list_crashesdevice: stringmobile_get_crashdevice: stringid: stringmobile_batch_commands changesdevice: stringsteps: arraystopOnError?: booleanlistElementsAtEnd?: boolean