The MCP server
mobium mcp is an MCP server on stdio with 72 tools. Add it to
a client's configuration — Claude Code, for one:
claude mcp add mobium -- mobium mcp
Or, in any client that reads a JSON configuration:
{
"mcpServers": {
"mobium": { "command": "mobium", "args": ["mcp"] }
}
}
Every tool takes device (a serial, when more than one is running) and
driver besides its own arguments, and every schema is
additionalProperties: false: an argument a tool does not declare is refused,
not ignored. A tool that fails answers with isError and a
structuredContent carrying its error's code, remedy, retryable and
details — never a JSON-RPC error. Read-only tools say so with
readOnlyHint. The MCP guide walks through a session.
Tools
| Tool | Read-only | What it does |
|---|---|---|
app_accessibility | Read the device's accessibility settings, or change one for the rest of the session: reduce_motion, bold_text, increase_contrast, reduce_transparency, button_shapes, differentiate_without_color, invert_colors, grayscale, and text size — text_size, a named category, on iOS, and text_scale, a number, on Android. | |
app_alert | Read a system dialog, or answer it with accept or dismiss. | |
app_appearance | Read the device's light/dark setting, or change it. | |
app_audit | yes | Run the platform's own accessibility audit on the screen in front. |
app_background | Send the app in front to the background for a number of seconds, then bring the same app back — resumed where it was, not relaunched — and confirm it is in front again. | |
app_batch | Run several tools in order, on one device, in one call — a known sequence such as tap, type, tap, without a round trip for each. | |
app_battery | yes | Read the battery: level in percent, whether it is charging, discharging, not charging or full, and on Android what it is plugged into. |
app_biometric | Biometrics on an emulator or simulator: read whether a face or finger is enrolled, enroll or unenroll one, and present a matching (match) or non-matching (nomatch) one to a prompt that is up. | |
app_boot | Start an Android emulator by its AVD's name, or an iOS simulator by its name or UDID, and wait until it has booted — adb sees it and Android says boot completed, or simctl's boot status returns — answering with its serial or UDID. | |
app_call | Simulate an incoming call: "ring", then "accept" or "hang". | |
app_check | Put a checkbox or switch into a state, rather than toggling whatever it is in. | |
app_clear_data | Delete an app's data and leave it installed — the state of a fresh install, without reinstalling. | |
app_clipboard | Read the device clipboard, or write it by passing text. | |
app_context | Switch between the native shell and a WebView, or report the current context when called with no argument. | |
app_contexts | yes | List the automatable contexts on the device: the native shell plus any debuggable WebViews. |
app_cookies | Read, set or clear the current WebView's cookies — the ones its page's URL is sent, HttpOnly ones included, which document.cookie cannot see. | |
app_crashes | yes | The crashes the device recorded — Java exceptions, native signals and apps that stopped responding — newest first, with the line worth reading first. |
app_current | yes | Report the app currently in the foreground, as a package name or bundle id. |
app_devices | yes | List running Android emulators and devices and iOS simulators, with their serial or UDID, state and model. |
app_dialogs | Declare how to answer a dialog, so an action that meets it carries on: when a dialog whose text contains when is in the way of a tap, a type or any action with a target, the button captioned press is pressed, the dialog is confirmed gone, and the action continues — and its result says which dialog was answered. | |
app_doctor | yes | Check that the environment mobium needs is present, and say what is wrong with it. |
app_download | yes | Bring back a file from where the device keeps downloads — Android's shared Download folder, or on iOS an app's own Documents — to check what an app saved. |
app_drag | Drag and drop: press something, hold until it is picked up, carry it, and release. | |
app_eval | Run a JavaScript expression in the current WebView and return its value as a string. | |
app_fill | Clear a specific element and type text into it, replacing what it held — Vibium's fill; app_type adds to it instead. | |
app_find | yes | Find elements matching a locator and return their refs, without tapping. |
app_grant | Grant an app's permissions up front, so a first-launch permission dialog never appears to block the flow. | |
app_hit_test | yes | Ask the platform's own hit test, below accessibility, whether a touch at the point app_tap would use reaches the target — and if not, what it would reach. |
app_hook | Call a hook the app registered with Mobium's gray-box library, by name, and return what it answered — sign in, seed data, raise a toast: state set up without walking the UI. | |
app_install | Install an app from a local .apk (Android) or .app bundle (iOS). | |
app_keyboard | The soft keyboard: whether it is up and which field has focus, typing at that field's cursor, pressing a named key, or hiding it. | |
app_launch | Bring an app to the foreground, starting it if it is not running. | |
app_list_apps | yes | List the apps installed on the device, with their id, version and whether they came with the platform. |
app_locale | Read or set the language one app runs in. | |
app_location | Read where the device believes it is, or place it somewhere. | |
app_lock | Read whether the screen is locked, or lock and unlock it. | |
app_logs | yes | Read a log: the current WebView's console, or the device's own log (logcat on Android, the unified log on an iOS simulator, and on a real iPhone what the session has captured since it started — a phone keeps no history). |
app_long_press | Press and hold an element or a point — the gesture that opens context menus and starts drag-and-drop. | |
app_map | yes | Map the actionable elements on the current screen and return them as refs (@e1, @e2, ...) with a label and role. |
app_network | Read or set the device's network conditions: offline, latency and bandwidth. | |
app_notifications | Read the notification shade, post a notification to it, or open it. | |
app_open_url | Open a URL or deep link on the device — the quickest way to reach a specific screen without tapping through to it. | |
app_orientation | Read which way the screen is turned, or turn it. | |
app_press | Press a hardware button. | |
app_press_drag | Press and drag: one finger holds an element while a second finger drags from one place to another, and the first lifts only after the second has. | |
app_press_tap | Press and tap: one finger holds an element while a second finger taps another, and the first lifts only after the second has. | |
app_record | Record the screen to a video: start, stop with a path to save it, or omit the action to ask whether a recording is running. | |
app_reset_permissions | Put permissions back to asking, so the app prompts again on next use. | |
app_revoke | Deny an app's permissions, to test how it behaves without them. | |
app_rotate | Turn two fingers about an element or the middle of the screen. | |
app_screen | Read the screen, or make an Android device pretend to be a different one, and optionally report what is wrong with the layout at that size. | |
app_screenshot | yes | Capture the device screen as a PNG. |
app_scroll_to | Scroll until an element is on screen — all of it, when it fits — then return it with a ref. | |
app_session | Start or end the session on a device. | |
app_shake | Shake the device — what shake-to-undo, shake-to-report and a debug menu listen for. | |
app_shutdown | Shut down an emulator or a simulator, after ending this daemon's session on it — the order that leaves nothing driving a device that is going away — and wait until it is gone. | |
app_sms | Deliver a simulated text message, to see what an app does when one arrives mid-flow. | |
app_source | yes | The raw hierarchy, as the device-side server sent it: UiAutomator2's or uiautomator's XML on Android, WebDriverAgent's on iOS, and in a WebView context the page's current markup: the page source. |
app_state | yes | What state one app is in: not_installed, not_running, background or foreground — for any app, where app_current names only the one in front. |
app_storage | Save, restore or clear the current WebView's storage state: its cookies and its origin's localStorage and sessionStorage, in the shape Vibium saves — {cookies, origins: [{origin, localStorage, sessionStorage}]} — so a state saved by one restores in the other. | |
app_swipe | Swipe the screen. | |
app_tap | Tap an element. | |
app_terminate | Stop a running app. | |
app_text | yes | Read text from the screen. |
app_time | yes | What time the device thinks it is, in its own zone — what a clock-dependent screen shows, and what a test of scheduling or a timezone change checks against. |
app_timezone | Read the device timezone, or change it. | |
app_trace | Record a session as a trace: start, then every call on this device is a step — before and after, the point an action touched, a failure's error — and after each the screen, with the map's elements drawn over it; stop with a path saves a zip in Vibium's record format, which player.vibium.dev opens. | |
app_type | Type text into a specific element, after what it already holds; app_fill replaces it instead. | |
app_uninstall | Remove an app from the device. | |
app_upload | Put a file from this machine where the device keeps downloads, so an app's file picker finds it: Android's shared Download folder, or on iOS an app's own Documents folder, which the Files app shows under On My iPhone. | |
app_wait_for | yes | Wait until an element appears, disappears, shows particular text, or reaches a state — enabled, checked, focused, holding a value — then return. |
app_zoom | Pinch two fingers apart or together, about an element or the middle of the screen. |