device connected · deso 1+

An agent that can
hold your phone.

MobileMCP turns your real Android phone into a tool for AI agents. It reads the screen as a compact tree with stable refs, taps and types like a person, opens apps and replies to notifications. No USB. No ADB. Works wherever the phone has signal.

Open source (MIT) · Self-hosted hub · Claude Code, Cursor, Codex and any MCP client

▶ tap text="Send"

ok · node click · 82 ms observation v12 · com.whatsapp @7 input hint:"Message" (520,2234) @12 text "wss://mobilemcp.example.com" (700,2088) @13 image (Delivered) (790,2110)

Targets are visible text or refs. Every action returns the screen after it settles.

Three parts, one contract.

The phone dials out, the hub routes, the agent asks. Nothing opens a port on the phone and nothing stores what's on screen.

app · Kotlin

Accessibility service

Reads the window tree, performs node actions and real gestures, takes screenshots, launches apps, reads notifications. Keeps the hub connection alive.

hub · Node

Hub + dashboard

Routes requests per account, serves MCP over HTTP and local sessions over IPC, shows devices and live activity, serves the app for self-updates.

server · 35 tools

Your agent

Claude Code, Cursor, Codex or anything that speaks MCP. Targets by text or ref, batches known flows, reads the compact observation each action returns.

The whole phone, as tools.

Built so most flows need no screenshot and no snapshot: name the text, get the result.

Observe

get_screen_snapshotread_textwait_for_texttake_screenshot marks

Act

tap text=type_text field=scroll_untilswipedraggesturepinchpress_key

Apps

open_appopen_urlopen_settingsstart_intentlist_appsuninstall_app

Notifications

get_notificationsnotification_actionopen_notificationdismiss_notification

System

set_volumeset_brightnessset_dndmedia_controlset_rotationset_flashlightwake_screen

Flow

run_mobile_actionslist_devicesselect_deviceget_device_info
35MCP tools across observe, act, apps, notifications and system
−60%observation size on the same screens vs. the raw tree (Settings, Pixel 7 emulator)
1 callfor a whole flow: open app → tap by text → type → scroll-and-tap, as one batch
0USB cables, ADB pairings or open ports on the phone

Get started.

A laptop is enough. A small server behind your own domain makes it work from anywhere.

  1. Run the hub

    npm run hub locally, or the Docker image behind a TLS reverse proxy with a token.

  2. Install the app on the phone

    Sideload the release APK, allow the accessibility service, enter the hub URL and token, tap Connect.

  3. Point your agent at it

    Add the server to your MCP client, then ask it to do something on your phone.

{
  "mcpServers": {
    "mobilemcp": {
      "command": "node",
      "args": ["/path/to/mobilemcp/server/dist/index.js"]
    }
  }
}

The accessibility service can read and act on everything on the phone — keep the token private. Android hides banking and DRM screens from it. In some countries Play Protect blocks accessibility apps installed from chat or browser downloads; the docs cover the workaround.