polyscreen-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ADB_PATH | No | Absolute path to the adb executable. If not set, adb is expected on PATH. |
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
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| mobile_server_infoA | Return package version, active profiles, and the exact registered tool list. Call after reconnect to verify Cursor sees the full core surface. |
| mobile_devices_listA | List ADB devices with reachability, hardware serial grouping, preferred TCP serial, and aliases when the same device appears under multiple serials. |
| mobile_device_inspectB | Probe the selected device's actual ADB, input, command, build, and backend capabilities. |
| mobile_displays_listB | List logical displays and correlated physical capture IDs with evidence and focus state. |
| mobile_screen_captureA | Capture one logical display after resolving its SurfaceFlinger physical display ID. Images whose long edge exceeds 1280px are downscaled before they are returned. coordinateSpace.scaleX and scaleY convert those screenshot pixels into the logical coordinates used by mobile_input_tap. |
| mobile_screen_recordA | Blocking record of one physical-backed display for a bounded duration. Prefer mobile_record_start/mark/stop when input must be interleaved. |
| mobile_sessions_statusA | Return active async recording, focus, and logcat sessions (optional serial filter). Use before stop/mark to recover IDs after a reconnect. |
| mobile_record_startA | Start a non-blocking screenrecord on one logical display so input tools can run during capture. One active session per (serial, displayId). |
| mobile_record_markB | Attach a labeled timestamp (offsetMs from record start) for later correlation with analyze/focus/logcat. |
| mobile_record_stopB | Stop screenrecord with SIGINT, pull the MP4 into artifacts, and return marks with offsets. |
| mobile_analyze_recordingA | Sample mean grayscale over an MP4 (ffmpeg), detect black/dim runs, and classify OEM-agnostic brightness buckets (true_black, near_black_content, system_launcher_idle, dark_app_ui, light_app_ui). Bucket ranges are heuristics—calibrate with exportSampleFrames on the device under test. Use mode='flash' for one-call regressions. Full per-frame timeline is omitted unless includeFullTimeline=true. |
| mobile_theme_flash_reportC | Correlate system night mode with a recording analysis (mode=flash) and marks whose offsets fall inside any reported black/dim run (± markWindowMs). |
| mobile_focus_traceA | Blocking sample of focused package/activity/taskId for a fixed duration. Prefer mobile_focus_trace_start/stop when interleaving input or recording. Large sample sets are written to an artifact; only a compact prefix is inlined. |
| mobile_focus_trace_startA | Start non-blocking focus sampling for logical displays. Optionally bind to a recordId so samples include recordOffsetMs aligned with record marks. Default interval 250ms; samples are ring-buffered (maxSamples). |
| mobile_focus_trace_stopA | Stop an async focus session and return focus change events plus samples (wallClockIso, tMs, optional recordOffsetMs). Prefer |
| mobile_artifacts_listA | List metadata stubs (uri, name, mime, size) for files under the artifact root. Does not embed binary contents. |
| mobile_artifacts_pruneA | Delete old or excess artifact files by maxAgeMs and/or maxCount. Use dryRun to preview. |
| mobile_screen_capture_pairB | Capture multiple logical displays as tightly paired same-moment screenshots (parallel screencap after one display resolve). |
| mobile_ui_snapshotA | Return parsed accessibility nodes, each with a ref (@nN) and the point that actually routes a tap to it. Pass ref to tap, double-tap, long-press, swipe, drag, or text. Refs are shared across HTTP requests until the next UI read on this serial and display. Portable ADB supports only display 0; other displays use the companion hierarchy when a companion session is active. |
| mobile_ui_findA | Find accessibility nodes by text, content description, or resource ID. Each match has a ref (@nN) and a tap point that accounts for clickable containers and overlays. Pass ref to mobile_input_tap. This replaces refs from the previous UI read. |
| mobile_ui_waitC | Poll until a matching accessibility node appears or the bounded timeout expires. |
| mobile_input_tapA | Inject a display-targeted touchscreen tap in logical display coordinates. Pass ref from the latest UI read, or x and y. ref wins when both are set. Prefer ref over a node's raw center. |
| mobile_input_double_tapB | Inject two display-targeted taps at the same point in one on-device script, so gapMs is the pause between the taps. Pass ref or x and y. |
| mobile_input_long_pressB | Hold a display-targeted touch at one point by swiping from that point to itself. Pass ref or x and y. |
| mobile_input_swipeB | Inject a display-targeted touchscreen swipe with explicit duration. startRef and endRef come from the latest UI read and win over start and end. |
| mobile_input_dragB | Inject a capability-gated long-press drag-and-drop on one logical display. startRef and endRef come from the latest UI read and win over start and end. |
| mobile_input_key_combinationB | Inject a device-supported key combination with explicit ordering and chord duration. |
| mobile_input_keyC | Send symbolic or numeric Android keys with gamepad source and capability-gated press options. |
| mobile_input_key_sequenceA | Send a timed sequence of Android keys and touchscreen taps in one call. Digits between actions are millisecond pauses, not a simultaneous chord. An x,y token is a tap; join points with + for a touch combo with no pause between them. Pass stepped.checks, one entry per action, to run each action on its own and poll for a UI node before continuing. |
| mobile_input_textA | Type text through ADB's virtual keyboard. Pass ref to tap that node first. Reports the Unicode limitation instead of hiding it. |
| mobile_app_inspectB | Read package state, permissions, components, users, and installation metadata. |
| mobile_app_launchB | Resolve and launch an activity on a logical display with ActivityManager wait diagnostics. |
| mobile_app_stopB | Force-stop a package, including its processes and pending implicit launches. |
| mobile_app_relaunch_on_displaysA | Force-stop a package, then launch its main (or given) activity on each logical display in order. Use for dual-display cold-start / flash reproduction. |
| mobile_app_installB | Install one local APK with a bounded timeout and structured ADB result. |
| mobile_app_uninstallB | Uninstall a package, optionally retaining its data. |
| mobile_app_foregroundA | Return the focused package and activity for one logical display. Window focus is preferred; activity tops are the fallback. |
| mobile_open_urlA | Start ACTION_VIEW for an http or https URL on one logical display. Other schemes are rejected. |
| mobile_orientationA | Read or set user rotation for one logical display. action lock uses rotation 0, 1, 2, or 3. action free lets the accelerometer decide. action get returns free or lock N, plus observedRotation from the live display when it is known. |
| mobile_device_foldB | List cmd device_state postures and, when state is set, switch to a name such as OPEN or CLOSED or a numeric identifier. Non-foldables return foldable false. |
| mobile_locationA | On an emulator, set uses adb emu geo fix (longitude then latitude). Clearing an emulator fix fails because the console has no clear. On a device, set requires Android 12 (API 31) and injects a gps test provider via cmd location. Fused location clients can ignore that provider. clear removes it. |
| mobile_clipboardA | Read dumpsys clipboard, then cmd clipboard get when the dump is redacted. set uses cmd clipboard set. When the shell cannot read or write, an active companion session uses ClipboardManager. Without a companion, the result says the read was denied and names the companion. An empty string is returned only when a read can see that the clipboard is empty. A clip the companion cannot see stays readable false. |
| mobile_batchA | Call other registered tools in one request. Each step is validated with that tool's schema. Nested mobile_batch, screenshots, and blocking screen records are rejected. stopOnError ends the sequence at the first failure. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 43 tools
Most tools have distinct resource/action targets, and descriptions explicitly distinguish blocking vs async recording/focus and input variants. Some overlap remains among UI node reads (snapshot/find/wait) and capture/record families, but guidance usually clarifies selection.
All tools use a mobile_ prefix and snake_case, so the convention is broadly readable. However the ordering is mixed: many use noun_verb (mobile_screen_capture, mobile_app_launch) while others use verb_noun (mobile_open_url, mobile_analyze_recording).
43 tools is heavy for one device-automation server; many variants (blocking vs async capture/record/focus, several input primitives) could be consolidated or grouped. The broad Android testing scope justifies some breadth, but the surface exceeds the 25-tool threshold in the rubric.
Coverage is broad across device/display discovery, capture, recording, UI inspection, input, app lifecycle, location, clipboard, and batching. Minor gaps include no direct logcat tool despite session status mentioning logcat, and no generic file/shell operations, but core device-control workflows are well supported.