Mobile MCP

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

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add mobile -- npx -y @mobilenext/mobile-mcp@latest
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "mobile": {
      "command": "npx",
      "args": [
        "-y",
        "@mobilenext/mobile-mcp@latest"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "mobile": {
      "command": "npx",
      "args": [
        "-y",
        "@mobilenext/mobile-mcp@latest"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "mobile": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@mobilenext/mobile-mcp@latest"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.mobile]
command = "npx"
args = ["-y", "@mobilenext/mobile-mcp@latest"]
Gemini CLITerminal
gemini mcp add --scope user mobile npx -- -y @mobilenext/mobile-mcp@latest

Settings 4

MOBILEMCP_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. For --listen.
MOBILEMCP_ALLOW_UNSAFE_URLS Optional: Set to 1 to let mobile_open_url open other URL schemes such as app deep links. Default unset (only http and https). For mobile_open_url.
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.

What it does

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.

What it needs

RuntimeNode.js 20+
Runs onmacOS, Windows, Linux
Mobile Next CloudOnly for the remote device tools. Local devices need no account.
Also
  • Xcode command line tools for iOS
  • Android Platform Tools (adb) for Android
  • A booted simulator, running emulator or connected and trusted device

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).

Limits

  • Limit Screenshots, recordings and saved logs are only written under the system temp folder or the start folder, and never when that folder is your home directory or above it.
  • Limit mobile_open_url refuses schemes other than http and https, so app deep links fail unless MOBILEMCP_ALLOW_UNSAFE_URLS=1 is set.
  • Not covered With MOBILEMCP_LEGACY_ROBOT=1, tapping by element ref, the raw element format and mobile_clear_app_data all stop working.
  • Not covered mobile_clear_app_data works on Android devices, Android emulators and iOS simulators, but not on real iPhones.
  • Not covered mobile_take_screenshot cannot run inside mobile_batch_commands. Use mobile_save_screenshot there.
  • Platform iOS simulators and devices need a Mac with Xcode. On Windows and Linux only Android targets are within reach.
  • Limit The --listen mode serves Streamable HTTP on /mcp only. The older HTTP+SSE transport was removed.

Who it suits

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.

Tools 35

12 only read, 21 change things, 2 can delete or overwrite. A ? marks an optional parameter.

get_more_tools
Sends a note about a missing capability to the developers. Only registered while telemetry is oncontext: string
mobile_list_available_devices
Lists the simulators, emulators and real devices it can see
mobile_get_screen_size
Returns the device screen size in pixelsdevice: string
mobile_get_orientation
Reports whether the screen is in portrait or landscapedevice: string
mobile_set_orientation changes
Switches the screen between portrait and landscapedevice: stringorientation: enum
mobile_fold_device changes
Folds or unfolds a foldable simulator or emulatordevice: stringposture?: enumangle?: number
mobile_set_location changes
Sets a fake GPS position on the device or clears itdevice: stringlatitude?: numberlongitude?: number
mobile_clipboard changes
Reads the device clipboard, or replaces it when text is givendevice: stringtext?: string
mobile_login_to_cloud_provider changes
Starts a device-code login to Mobile Next Cloud in the browser
mobile_list_remote_devices
Lists the device models that can be reserved in the cloud
mobile_allocate_remote_device changes
Reserves a physical cloud device, filtered by platform, model and OS versionplatform: enumname?: stringversion?: arraytype?: enumwait?: booleantimeoutSeconds?: number
mobile_release_remote_device changes
Hands a reserved cloud device backdevice: string
mobile_list_apps
Lists the apps installed on the devicedevice: string
mobile_get_foreground_app
Names the app that is in front right nowdevice: string
mobile_launch_app changes
Opens an app by package name or bundle ID, optionally in a given localedevice: stringpackageName: stringlocale?: string
mobile_terminate_app changes
Stops a running appdevice: stringpackageName: string
mobile_clear_app_data deletes
Wipes an app's stored data and stops it, leaving it installed as if new. Not on real iPhonesdevice: stringpackageName: string
mobile_install_app changes
Installs an .apk, .ipa, .app or .zip file on the devicedevice: stringpath: string
mobile_uninstall_app deletes
Removes an app, and its data with it, by package name or bundle IDdevice: stringpackageName: string
mobile_take_screenshot
Returns a screenshot as an image, scaled to 1024 px on the long side by defaultdevice: stringmaxSize?: numberscale?: number
mobile_save_screenshot changes
Writes a screenshot to a .png or .jpg filedevice: stringsaveTo: stringmaxSize?: numberscale?: number
mobile_list_elements_on_screen
Lists on-screen UI elements with refs and coordinates as text or JSON, or dumps the raw platform hierarchydevice: stringformat?: enum
mobile_click_on_screen_at_coordinates changes
Taps a point or an element ref from the element listdevice: stringx?: numbery?: numberref?: string
mobile_double_tap_on_screen changes
Double-taps a point or an element refdevice: stringx?: numbery?: numberref?: string
mobile_long_press_on_screen_at_coordinates changes
Holds a press on a point or an element ref, up to 10 secondsdevice: stringx?: numbery?: numberref?: stringduration?: number
mobile_swipe_on_screen changes
Swipes up, down, left or right from a point or the screen centredevice: stringdirection: enumx?: numbery?: numberdistance?: number
mobile_start_screen_recording changes
Begins recording the screen to a video filedevice: stringoutput?: stringtimeLimit?: number
mobile_stop_screen_recording changes
Ends the recording and saves the videodevice: string
mobile_type_keys changes
Types text into the focused field and can press enter afterdevice: stringtext: stringsubmit?: boolean
mobile_press_button changes
Presses a hardware or system key such as HOME, BACK or a volume keydevice: stringbutton: string
mobile_open_url changes
Opens an http or https address in the device browserdevice: stringurl: string
mobile_get_device_logs
Collects recent device logs (logcat or the iOS unified log), with a filter and an optional filedevice: stringlimit?: numberfilter?: arraysaveTo?: string
mobile_list_crashes
Lists the crash reports stored on the devicedevice: string
mobile_get_crash
Returns one crash report in full by its IDdevice: stringid: string
mobile_batch_commands changes
Runs several of the other tools in order in one call, screenshots excepteddevice: stringsteps: arraystopOnError?: booleanlistElementsAtEnd?: boolean

Similar servers