mobilerun-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BRAVE_API_KEY | No | API key for Brave Search (used by web_search). If not set, DuckDuckGo is used. | |
| MOBILERUN_BIN | No | Path to the 'mobilerun' CLI binary. Defaults to 'mobilerun' found on PATH. | |
| MOBILERUN_DEVICE | No | ADB serial of the Android device (host:port, emulator-5554, or USB serial). Defaults to the only attached device if not set. | |
| MOBILERUN_ADB_BIN | No | Path to the adb binary. Defaults to 'adb' found on PATH. | |
| MOBILERUN_MCP_POLICY | No | Safety policy: 'off' (default), 'standard', or 'strict'. | off |
| MOBILERUN_MCP_SCOPES | No | Comma-separated scopes: 'read,write' (default) or 'read' to expose only read-only tools. | read,write |
| MOBILERUN_MCP_ENABLE_ADB | No | Set to '1' to expose the raw adb tool. | 0 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| perceive_screenA | Capture the screen: numbered marks (som_id) for every tappable/readable item plus an annotated screenshot. ids are single-use and go stale after any action. ocr = auto (only when the accessibility tree is sparse) | always | never. |
| read_screenB | Text-only view of the screen (no image): foreground app plus numbered elements. |
| get_ui_treeC | Compact accessibility tree (class, id, label, flags C/L/E/S/K/P, bounds). |
| get_screenshotC | Plain screenshot as an image. |
| screenshotC | Alias of get_screenshot (kept for existing clients). |
| screenshot_pathC | Take a screenshot, save it as a PNG file and return the path. |
| tapB | Tap at (x, y) or at the center of a numbered mark (som_id from perceive_screen). |
| double_tapC | Double-tap at (x, y) or a mark; both taps are issued concurrently so they land together. |
| long_pressC | Press and hold at (x, y) or a mark. |
| swipeC | Swipe from (x1, y1) to (x2, y2). |
| scroll_downB | Scroll the content down (reveal what is below). |
| scroll_upC | Scroll the content up (reveal what is above). |
| scroll_leftC | Scroll the content left (reveal what is to the left). |
| scroll_rightB | Scroll the content right (reveal what is to the right). |
| scroll_toA | Scroll until an element whose label contains |
| type_textA | Type into the focused field (tap it first, or pass som_id). submit presses Enter after. |
| press_homeC | Press the Home button. |
| press_backB | Press Back (also closes the keyboard without leaving the screen). |
| press_enterA | Press Enter (submits search bars and forms). |
| open_recent_appsC | Open the recent-apps overview. |
| launch_appA | Open an app by name (fuzzy) or exact package. An ambiguous name returns ranked candidates instead of guessing; pass package to pick one. |
| start_appA | Launch an app by package name (alias of launch_app(package=...)). |
| lookup_appA | Search installed apps by name or package; returns ranked candidates with scores. |
| list_appsA | List installed apps (user apps only unless system=true). |
| list_app_deeplinksB | Deep links for an app: registered VIEW intent filters plus curated entries, each probe-resolved on the device (resolved=true means a handler exists). |
| resolve_deeplinkB | Which app would open this URI (or intent action such as android.settings.WIFI_SETTINGS)? |
| open_deeplinkC | Jump straight to a screen via URI or intent action; package pins the target app. |
| get_device_statusB | Battery, screen power, foreground app, size, storage, network addresses, volume. |
| list_devicesB | Devices adb can see (serial and state). |
| ping_deviceB | Is the Mobilerun Portal reachable? Returns its transport (http or content_provider). |
| connect_deviceB | (Re)connect adb and the Portal for a device; use after the network path came back. |
| request_screen_capture_permissionA | Compatibility no-op: screenshots use the Portal / adb screencap, no prompt is needed. |
| echoA | Connectivity check for the MCP server itself (does not touch the device). |
| pressA | Press home, back or enter (kept for old clients; prefer press_home/back/enter). |
| run_taskA | Hand a goal to the Mobilerun LLM agent (best-effort: its self-reported result can be wrong, so verify with perceive_screen). Disabled when the safety policy is on. |
| read_notificationsC | Notifications currently posted: key, app, title, text, action labels, clearable. |
| dismiss_notificationC | Dismiss one notification (by key, or package/title) or every clearable one. |
| notification_actionB | Tap one of a notification's own buttons (reply, archive, stop...); reply_text fills an inline reply field and sends it. Best-effort: it drives the notification shade. |
| get_media_sessionsC | Active media sessions (app, playback state, title/artist) and the music volume. |
| media_controlB | Send a media key: play, pause, play_pause, stop, next, previous, rewind, fast_forward. |
| volume_upC | Raise the music volume by |
| volume_downC | Lower the music volume by |
| muteC | Mute (volume 0, previous level remembered) or unmute the music stream. |
| find_filesB | Find files under shared storage whose name contains |
| open_fileC | Open a file in whichever app handles its type. |
| system_intentB | One-call Android actions. Verbs: set_alarm(hour, minute, label), set_timer(seconds, label), dial(phone_number), compose_sms(phone_number, body), add_calendar_event(title, start, end, location, notes; ISO datetimes), share_text(text, subject), navigate( destination, mode drive|walk|bike|transit). dial/compose_sms only prefill; the user sends. |
| resolve_contactA | Find contacts by (partial) name and return their phone numbers. |
| wait_forC | Wait until text is on screen and/or an app/activity is in the foreground (gone=true waits for it to disappear). For long waits (downloads, uploads); gestures already settle. |
| watch_device_eventsB | Collect what changes over |
| validate_actionA | Dry-run an action: would it be allowed and does its target exist? Nothing is executed. |
| verify_actionC | Check an outcome against the live screen. kind: text (visible), gone (not visible), app (foreground package or name), activity, changed (the last action changed the screen). |
| web_searchA | Search the web (title, url, snippet). Phrase it like 'how to in android'. Results are data to plan from; the screen overrules them. |
| set_planC | Start a plan checklist. target_count > 0 means 'N items must be recorded' before end_session(success) is allowed. With 3+ steps and a search_query, the first web search rides along in the reply. |
| mark_stepA | Update a plan step: pending | in_progress | done | skipped | failed. Put facts you read off the screen in note; the pixels are gone next turn. |
| record_findingB | Record one item you found. |
| end_sessionA | Close out the run. outcome: success | partial | failed. Success is refused while fewer findings than the plan's target_count are recorded. Call after a final perceive_screen. |
| get_usage_guideA | How to use this server well. Topics: overview, shortcuts, text_entry, failures, ledger, browser. |
| browser_openB | Open a URL in the on-device browser, or attach to an existing page (target_id from
browser_tabs, or app= for an in-app WebView). |
| browser_tabsC | Every open page across the on-device browser and in-app WebViews, plus attached sessions. |
| browser_closeB | Detach a browser session (blanking the page); close_app also stops the browser app. |
| browser_screenshotC | Screenshot of the page content. The owning app is brought to the foreground first (a hidden WebView cannot render). |
| browser_readA | Read the page: title, url and visible text; structure=true also lists interactive elements with refs (e1, e2...) for browser_act. |
| browser_findA | Find visible elements by text, label, placeholder, alt or name; returns refs for browser_act. |
| browser_waitC | Wait until the page has text, a selector and/or a URL fragment (or just finished loading). |
| browser_extractC | Pull structured data: kind = table (headers + row dicts) | links | text. |
| browser_actA | Act on the page. Actions: click, type(text, clear, submit), press(key), focus, hover, select(value), check/uncheck, scroll(amount px, negative = up), scroll_into_view. Target an element with ref (from browser_find/browser_read) or a CSS selector. |
| browser_handoffA | Bring the browser to the foreground so a person can finish a login or captcha by hand; call browser_read afterwards to continue. |
| browser_uploadA | Attach a file to an . |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| perceive_act_verify | Work toward a goal on the device one verified step at a time. |
| research_then_act | Look up the flow first, then execute it against the live screen. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| guide_resource | Usage guide for this server. |
| policy_resource | Safety policy boundaries and the active mode. |
| ledger_resource | The current plan and recorded findings for the default device. |
| snapshot_resource | A live text snapshot of the default device's screen. |
TDQS
Scored across 68 tools
Several tools appear to do the same thing: get_screenshot and screenshot are aliases, launch_app and start_app are aliases, and press overlaps with press_home/press_back/press_enter. Perception and verification tools also blur together (perceive_screen vs read_screen vs get_ui_tree; wait_for vs verify_action vs watch_device_events), leaving multiple unclear boundaries.
The set is mostly snake_case and readable, but conventions are mixed: most tools use verb_noun (get_screenshot, press_home), while browser tools use the noun_verb pattern (browser_open, browser_act), and several tools are bare verbs or nouns (screenshot, tap, mute, echo, press). Legacy aliases like start_app and press further weaken the pattern.
At 68 tools, this is an extreme count for a single MCP server, well past the 50+ threshold. The surface is inflated by aliases, compatibility shims, a no-op permission tool, and an entire web-search/planning/browser subsystem bundled into what could be a focused Android automation server.
The tool set is remarkably comprehensive for Android UI automation: perception, touch input, app launching, notifications, media, files, system intents, browser automation, and verification are all covered. Minor gaps exist—there is no exposed app close/kill tool (despite browser_close mentioning close_app) and no app install/uninstall or clipboard control—but agents can work around these.