Drives a real Android device over ADB and attaches the resulting screen to every action.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
An MCP server that drives a real Android device over ADB β and hands the agent back the screen its action produced.
One native binary. The server has no Python, Appium, scrcpy, or ffmpeg
dependency and runs no Node at all β npx below is only a convenient
installer β so the runtime is the binary plus adb. A background H.264
screenrecord stream is decoded in process, so the screen that follows an
action is attached to the tool result automatically instead of costing a second
round trip to ask what happened.
Every image carries the coordinate space it was produced in, so a model can tap what it just looked at without guessing a scale factor. When the accessibility tree comes back empty β Flutter, React Native, canvas, games β OCR and template matching still find the target.
This is a powerful local controller, not a sandbox. Run it only against a device and an MCP client you trust.
That downloads a prebuilt binary for your platform and needs no build tools. The
server is also listed in the official MCP Registry as
io.github.edgecasehuman/droidsight.
To compile it instead, from crates.io:
Or from source:
Both compiling routes need NASM on the PATH. The H.264 decoder is built from
C++ by openh264-sys2, which assembles its hot paths with NASM, and no platform
ships it by default -- without it the build fails inside a transitive dependency
rather than in this crate. Install it with apt install nasm,
brew install nasm, or winget install NASM.NASM. The npx route above needs
none of this.
The server is target/release/droidsight. It speaks newline-delimited
JSON-RPC 2.0 over stdin and stdout.
ADB must be reachable through PATH, ANDROID_SDK_ROOT, ANDROID_HOME, or an
explicit DROIDSIGHT_ADB_PATH. If more than one authorized device is visible
the server refuses to guess; set DROIDSIGHT_DEVICE_SERIAL.
Thirty-one tools are published by default. Two more appear only when
DROIDSIGHT_ALLOW_SHELL=1 is set, and are listed last.
| Tool | Purpose |
|---|---|
mcp_android_vision_query | Screenshot, hierarchy, OCR, and element or template search. Its elements and tap_element actions avoid coordinate arithmetic entirely. |
mcp_android_vision_stream | Start, stop, or read the background H.264 stream. |
mcp_android_get_view_hierarchy | The accessibility tree as structured JSON. |
mcp_android_smart_wait | Block until an element appears, or time out. |
| Tool | Purpose |
|---|---|
mcp_android_input_act | Tap, type, key events, swipe, smart tap, and IME control. |
mcp_android_tap_text | Scan for text and tap it the instant it appears, retrying until timeout. Avoids the miss between a screenshot and a tap. |
mcp_android_run_flow | Run a bounded, fully prevalidated sequence of safe actions. |
mcp_android_record_gesture | Record raw touch input for a fixed duration. |
mcp_android_play_gesture | Replay a recorded gesture timeline. |
| Tool | Purpose |
|---|---|
mcp_android_app_manage | Launch, stop, list, install, and read crash logs. Uninstall, clear data, permission, enable, and disable additionally require confirm_destructive. |
mcp_android_app_instrumentation | Deep state inspection: activity, window, process list, stack traces. |
mcp_android_open_url | Open a URL. |
mcp_android_start_intent | Start an arbitrary intent. |
| Tool | Purpose |
|---|---|
mcp_android_device_control | Clipboard, battery, device info, lock state, unlock, rotation. |
mcp_android_system_control | Accessibility services and the draw-over-other-apps permission. Grants screen-read and input-injection authority across every app. |
mcp_android_network_control | Wi-Fi, mobile data, HTTP proxy, phone calls, SMS, wireless ADB pairing. |
mcp_android_sensor_control | Mock battery level and charging status; GPS mocking is emulator-only. |
mcp_android_check_health | Connectivity and responsiveness of the selected device. |
mcp_android_check_debug_exposure | Report which developer settings are enabled and therefore visible to apps. |
| Tool | Purpose |
|---|---|
mcp_android_diagnostic_stream | Read logcat, clear it, or read buffered raw and semantic events. |
mcp_android_read_recent_events | Buffered device events from the optional monitor. |
mcp_android_log_filter | Filter logs by regex, tag, or priority. |
mcp_android_get_notifications | Dump posted notifications, including unredacted message content. |
mcp_android_file_system | List, read, push, and pull files, confined to DROIDSIGHT_LOCAL_ROOT. |
mcp_android_forensics_control | Query an on-device SQLite database, hash a file, or irreversibly delete an application's data. |
| Tool | Purpose |
|---|---|
mcp_android_start_recording | Begin a screen recording, up to 180 seconds, written to the device. |
mcp_android_stop_recording | Stop it. The file stays on the device. |
mcp_android_companion | Post a notification, show a transient message, or open a URL for whoever is holding the phone. |
mcp_android_sentinel_control | Register a watched package. See Background enforcement before using it. |
mcp_android_start_session, mcp_android_stop_session | Session markers. They acknowledge the call and hold no server state. |
DROIDSIGHT_ALLOW_SHELL=1| Tool | Purpose |
|---|---|
mcp_android_run_shell | Run an arbitrary device shell command. No filtering of any kind. |
mcp_android_run_macro | Run up to 100 shell commands in sequence, stopping at the first failure. |
Screenshots are downscaled to 720 pixels wide by default, so a coordinate read
off the returned pixels is usually not a device coordinate. Every tool that
returns an image also returns a metadata.image object describing how to
convert one:
When coordinate_space is device, the image is already 1:1 and coordinates
can be used directly. Request max_width: 1440 to reduce or remove downscaling.
Crops additionally report a non-zero origin_x/origin_y that must be added
after scaling.
Taps, uiautomator hierarchy bounds, OCR boxes, and template matches are all in
device coordinates. The background stream runs screenrecord without --size,
so decoded frames are native resolution and share that one space.
You can avoid the arithmetic entirely. The mcp_android_vision_query tool's
elements action returns an indexed snapshot with a precomputed center per
element, and its tap_element action takes that snapshot_id and an index.
| Variable | Effect |
|---|---|
DROIDSIGHT_DEVICE_SERIAL | The only Android target the process may use. Mandatory when ADB reports multiple authorized devices. |
DROIDSIGHT_ADB_PATH | Explicit path to the ADB executable. |
DROIDSIGHT_LOCAL_ROOT | Confines host paths used by APK installation and file push/pull. Defaults to the process working directory. |
DROIDSIGHT_DEVICE_PIN | Numeric PIN for UI actions that need automatic unlock. Supply at runtime only; never in source or a checked-in MCP configuration. |
DROIDSIGHT_ALLOW_SHELL=1 | Publishes the arbitrary shell and macro tools. This grants authority equivalent to broad ADB shell access. Off by default. |
DROIDSIGHT_DEBUG_LOG | Path to a persistent debug log. Logging to a file is strictly opt-in; without this, warnings go to stderr and no file is written. |
DROIDSIGHT_LOG | Tracing filter. Defaults to warn, or debug when a debug log path is set. |
DROIDSIGHT_EVENTS=1 | Starts the long-running device event monitor. Requires DROIDSIGHT_DEVICE_SERIAL. |
DROIDSIGHT_SENTINEL=1 | Starts the background enforcement loop described under Background enforcement. Off by default: it re-applies device state on a timer, including unlocking the screen. |
One background H.264 screenrecord stream starts at process startup and the
latest decoded RGB frame is kept in memory. Screenshot tools and input
observations read that cache, so a snapshot is available immediately once the
first frame decodes. A static screen's last frame stays valid while the stream
runs; it does not expire merely because the encoder stopped emitting unchanged
pixels.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/droidsight)<a href="https://allmcps.com/mcp/droidsight"><img src="https://allmcps.com/api/badge/droidsight?style=directory" alt="Droidsight on AllMCPs" /></a>