Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

adb-mcp — Android emulator and device control over adb

OCI · GHCR.IO/IKSNERD/ADB-MCP:0.22.2 · SCANNED AUG 22

Drive an Android emulator or device over adb: screenshot, inspect UI, tap, type, build and test.

38 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score →

Supply Chain Security0
  • Malware scan not yet available for this package.Unverified
  • Known CVEs could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.Unverified
Provenance & Transparency35
Schema Quality & AI Usability82
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 13576 tokens (~163/item across 83 items; 78 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 2 categories

Categories scored 0 because we could not verify them: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Install

How do I install the adb-mcp — Android emulator and device control over adb server?

adb-mcp — Android emulator and device control over adb runs locally as a container image, launched with docker run --rm -i ghcr.io/iksnerd/adb-mcp:0.22.2. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

oci · ghcr.io/iksnerd/adb-mcp:0.22.2

# add to Claude Code
claude mcp add iksnerd-adb-mcp -- docker run --rm -i ghcr.io/iksnerd/adb-mcp:0.22.2
// .cursor/mcp.json
{
  "mcpServers": {
    "iksnerd-adb-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/iksnerd/adb-mcp:0.22.2"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "iksnerd-adb-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/iksnerd/adb-mcp:0.22.2"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add iksnerd-adb-mcp -- docker run --rm -i ghcr.io/iksnerd/adb-mcp:0.22.2
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "iksnerd-adb-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "ghcr.io/iksnerd/adb-mcp:0.22.2"
      ],
      "enabled": true
    }
  }
}
# ~/.hermes/config.yaml
mcp_servers:
  iksnerd-adb-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "ghcr.io/iksnerd/adb-mcp:0.22.2"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "iksnerd-adb-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/iksnerd/adb-mcp:0.22.2"
      ]
    }
  }
}
// mcp.json
{
  "mcpServers": {
    "iksnerd-adb-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/iksnerd/adb-mcp:0.22.2"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 16 Aug 26 38

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 22 Aug 2026 · Analysed oci/ghcr.io/iksnerd/adb-mcp:0.22.2

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem oci
Reason No attestation published
MCP tools · 78 exposed · ~13,364 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
run_unit_tests ~246

Run Gradle JVM unit tests (default task 'test') in project_dir and return the result summary, including per-suite timing and failing-test stack traces. Note that on an Android project 'test' runs EVERY variant's unit tests (debug and release both); pass task="testDebugUnitTest" (or ":app:testDebugUnitTest" in a multi-module build) to run just one and roughly halve the time. Pass json=true for a structured JSON summary instead of the text form.

NameTypeReqDescription
argsnull|arrayExtra arguments passed to Gradle (e.g. --stacktrace, -Pflavor=free).
jsonbooleanFor run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary. Ignored by gradle_build…
project_dirstringPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.
taskstringGradle task to run. Defaults to the tool's standard task.

No output schema declared.

No examples provided.

scaffold_android_project ~168

Create a minimal Kotlin Android application in a new empty directory, including Gradle Kotlin DSL files, an AndroidManifest, a launcher Activity, resources, README, and gitignore. The tool never overwrites a non-empty directory. It also generates the Gradle wrapper when a system `gradle` is on PATH, so the result is immediately buildable with gradle_build; if no gradle is installed the result says so, and `gradle wrapper` has to be run in that directory before any Gradle tool here will work (they all drive ./gradlew).

NameTypeReqDescription
destinationstringyesEmpty or new directory to create the project in.
namestringyesHuman-readable app name.
packagestringyesApplication id/package, e.g. com.example.app.

No output schema declared.

No examples provided.

screenshot ~314

Capture the current screen as a PNG so you can SEE the UI state. Call it after every action to confirm the screen changed before acting again — driving blind chains taps onto the wrong screen. The image is auto-downscaled (default max 760px) so it is accepted by the image reader; this is for seeing only — derive tap coordinates from describe_ui, not from this image. Auto-retries an all-black frame (an intermittent capture glitch) and, if it stays black, says why (FLAG_SECURE content like a native PIN pad, or a sleeping display) — when black, use describe_ui instead. Works on multi-display foldables (the default display captures correctly); pass display="cover"/"inner"/an index to grab a specific panel.

NameTypeReqDescription
displaystringWhich physical display to capture on a multi-display device (a foldable). Omit for the default/built-in screen. Accepts a name alias ('inner'/'primary' or 'cover'/'outer'), an HWC index ('0','1'), or…
max_dimnull|integerMax width/height of the returned image in pixels. Omit for the default 760; pass 0 (or a negative) to disable downscaling and get the full-resolution image.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

send_sms ~131

Deliver an incoming SMS to the emulator (adb emu sms send) — the standard way to drive OTP / 2FA flows without a second phone. Pass a sender number (from) and the message text (e.g. the code). Emulator-only.

NameTypeReqDescription
fromstringyesSender phone number the SMS appears to come from, e.g. "+15551234567".
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
textstringyesMessage body (e.g. an OTP code) delivered to the device's SMS inbox.

No output schema declared.

No examples provided.

session_clear_defaults ~41

Clear any project_dir/serial defaults pinned for this session, reverting to requiring them on every call (serial still falls back to the single-attached-device default).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

session_set_defaults ~162

Pin a default project_dir and/or serial for the rest of this session so later calls can omit them — the fix for a multi-module or multi-flavor project (or multiple attached devices) forcing you to repeat the same project_dir/serial on every Gradle or device call. Only the fields you pass are changed; omit a field to leave its current default alone. An explicit project_dir/serial on any individual call always overrides the session default for that one call.

NameTypeReqDescription
project_dirstringDefault Android project root to use whenever a tool call omits project_dir. Leave empty to leave the current default unchanged.
serialstringDefault device serial to use whenever a tool call omits serial. Leave empty to leave the current default unchanged.

No output schema declared.

No examples provided.

session_show_defaults ~28

Show the project_dir/serial defaults currently pinned for this session (set via session_set_defaults).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

set_battery ~235

Set the battery level (0-100) and/or charging state — test low-battery UI and charging-only logic deterministically. On an emulator it uses the console (adb emu power); on a PHYSICAL device it forces the values via dumpsys battery, which persist until you call this again with reset=true (or the device reboots). Provide level, charging, or both — or reset=true to restore automatic reporting. (For a fake battery in a clean SCREENSHOT status bar only, use set_status_bar instead.)

NameTypeReqDescription
chargingnull|booleantrue = plugged into AC, false = on battery. Omit to leave the charging state unchanged.
levelnull|integerBattery charge level 0-100. Omit to leave the level unchanged.
resetbooleanRestore automatic battery reporting (dumpsys battery reset) and ignore level/charging. On a physical device the forced values persist until this (or a reboot); use it to clean up after testing.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

set_dark_mode ~69

Turn the system dark theme on or off (cmd uimode night) — to test light/dark appearances.

NameTypeReqDescription
enabledbooleanyestrue = dark theme on, false = off.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

set_device_lock ~156

Set a secure lock screen (type: pin [default], pattern, or password). REQUIRED before AndroidKeyStore / Keystore-backed crypto flows, which fail with 'A secure lock screen is required' on a fresh emulator that has no lock. Follow with is_device_secure to confirm.

NameTypeReqDescription
old_valuestringThe CURRENT credential, required only when a lock is already set and you want to change it (locksettings refuses to overwrite otherwise).
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
typestringLock type: pin (default), pattern, or password.
valuestringyesCredential to set, e.g. "1234".

No output schema declared.

No examples provided.

set_location ~75

Set the emulator's mock GPS location (longitude, latitude) — for location-gated features.

NameTypeReqDescription
latitudenumberyesLatitude of the mock GPS fix.
longitudenumberyesLongitude of the mock GPS fix.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

set_sensor ~205

Set an emulated hardware sensor value (adb emu sensor set) — drive accelerometer/gyroscope/orientation (pass x, y, z) or a single-value sensor like light/proximity/temperature/pressure/humidity (pass x only). Use to exercise shake/tilt/rotation handlers or ambient-light/proximity logic. Emulator-only.

NameTypeReqDescription
sensorstringyesSensor name, e.g. acceleration, gyroscope, magnetic-field, orientation (3 values) or light, proximity, temperature, pressure, humidity (1 value).
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
xnumberyesFirst value (the only value for single-axis sensors like light/proximity).
ynull|numberSecond value for multi-axis sensors. Omit for single-value sensors.
znull|numberThird value for multi-axis sensors. Omit for single-value sensors.

No output schema declared.

No examples provided.

set_status_bar ~429

Pin a clean status bar via SystemUI demo mode (enabled=true) — fixed clock, chosen signal/battery, no notification icons by default — so screenshots for docs don't leak the wall clock or a random signal state. Optionally set clock (HHMM), battery (0-100), network_type (wifi/mobile/none) with mobile_level/data_type/carrier for mobile, and notifications_visible/notification_icon. Call with enabled=false to restore the live bar.

NameTypeReqDescription
batterynull|integerFixed battery level 0-100 (shown unplugged). Only when enabled=true; omit to leave unchanged.
carrierstringCarrier/operator name shown in the status bar. Only used when network_type=mobile.
clockstringFixed clock as 4 digits HHMM, e.g. "1200". Only when enabled=true; omit to leave unchanged.
data_typestringMobile data-type icon shown next to the signal, e.g. lte, 4g, 5g, 3g, edge, 1x, h, h+, roam. Only used when network_type=mobile.
enabledbooleanyestrue = enter demo mode (clean, fixed status bar); false = exit and restore the live status bar.
mobile_levelnull|integerMobile signal bars 0-4. Only used when network_type=mobile. Default 4.
network_typestringNetwork icon: "wifi" (default, full signal), "mobile", or "none" (hide network icons). Only when enabled=true.
notification_iconstringBest-effort: an AOSP SystemUI icon resource name to show in the first notification slot. Support varies by SystemUI/Android version. Only when enabled=true.
notifications_visiblenull|booleanShow notification icons in the status bar. Default false (hidden, for clean screenshots). Only when enabled=true.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

shutdown_emulator ~54

Power off a running emulator (adb emu kill). Use when you are done with a device you booted.

NameTypeReqDescription
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

start_logcat_capture ~101

Begin streaming logcat into a buffer for this device (optionally clearing first). Pair with stop_logcat_capture to get everything logged DURING a flow — use this instead of the one-shot 'logcat' when you need logs across an interaction.

NameTypeReqDescription
clearnull|booleanClear the logcat buffer before capturing. Default true.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

start_screen_record ~59

Start recording the screen to an mp4 on the device (Android caps a single recording at ~180s). Pair with stop_screen_record.

NameTypeReqDescription
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

stay_awake ~143

Keep the display from dozing during a driving session (svc power stayon true) — the fix when screenshots keep coming back black with screen_off:true because the device sleeps between steps (common on emulators with a short timeout). enabled=true holds the screen on while charging (emulators always are); enabled=false restores the normal timeout. describe_ui works regardless, but any screenshot/coordinate flow needs the screen on.

NameTypeReqDescription
enabledbooleanyestrue = keep the screen on while charging (svc power stayon true); false = restore the normal display timeout.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

stop_app ~73

Force-stop an app by package name. Pair with launch_app to reset an app to a clean start when reproducing a bug.

NameTypeReqDescription
packagestringyesApplication package name (e.g. com.example.app).
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

stop_logcat_capture ~240

Stop the running logcat capture and return what was collected since start, optionally filtered by a case-insensitive substring, a minimum priority (V/D/I/W/E/F), and/or tags (OR'd). Output is capped to the last 500 lines by default (override with tail) so a long capture doesn't blow the token budget — narrow with the filters first.

NameTypeReqDescription
filterstringCase-insensitive substring to keep.
prioritystringMinimum priority to keep: V, D, I, W, E, or F.
redactbooleanMask common secrets (token, password, authorization, api key, secret) before returning captured lines.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
tagsnull|arrayKeep only lines whose log tag contains one of these (case-insensitive, OR'd).
tailintegerKeep only the last N lines after filtering (the most recent, where a crash usually is). Default 500; pass a larger number for more, or a huge one to effectively disable the cap.

No output schema declared.

No examples provided.

stop_screen_record ~75

Stop the screen recording, finalize the mp4, and pull it to a local path.

NameTypeReqDescription
local_pathstringyesLocal path to save the pulled mp4, e.g. /tmp/rec.mp4.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

swipe ~236

Swipe/drag from a start point to an end point. Params: x1,y1 (start) and x2,y2 (end) in true device pixels — x and y are accepted aliases for x1 and y1. To SCROLL DOWN a list, swipe from a HIGH y to a LOW y (drag the content up); reverse to scroll up. A longer duration_ms gives a slower, controlled drag; a short one flings.

NameTypeReqDescription
duration_msintegerSwipe duration in ms. Default 300.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
xnull|integerAlias for x1 (start X).
x1null|integerStart X in true device pixels (alias: x).
x2integeryesEnd X in true device pixels.
ynull|integerAlias for y1 (start Y).
y1null|integerStart Y in true device pixels (alias: y).
y2integeryesEnd Y in true device pixels.

No output schema declared.

No examples provided.

tap ~346

Tap a single coordinate in true device pixels. Use a center value from describe_ui. If a tap seems to do nothing, the coordinate is almost always stale/misscaled — re-run describe_ui and use a fresh center. Prefer tap_on_text when you know the element's label. When a tap lands but nothing happens, pass identify=true (reports which element the coordinate hit — or that it hit a non-clickable wrapper / no reported element) and/or verify_change=true (reports whether the UI actually changed) to tell the failure modes apart. Note: some native views (e.g. Compose/RN NativeTabs bars) don't respond to coordinate taps at all — use tap_on_text/tap_element with via_accessibility=true there (EXPERIMENTAL, requires `adb-mcp bridge install` once per device).

NameTypeReqDescription
identifynull|booleanAlso report which UI element the coordinate lands in (a hit test against the hierarchy read just before tapping). Use when a tap seems to do nothing: it tells you whether the coordinate hit the eleme…
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
verify_changenull|booleanAlso report whether the UI hierarchy changed after the tap (ui_changed: true/false). Costs two extra hierarchy reads (~2-3s); use when a tap silently doing nothing would send you down the wrong path.
xintegeryesX coordinate in true device pixels.
yintegeryesY coordinate in true device pixels.

No output schema declared.

No examples provided.

tap_element ~398

Find an element by resource_id and tap its center — the id-addressed sibling of tap_on_text, for elements with no visible label. Runs describe_ui internally (filter=all, so even unlabeled wrapper nodes are findable) and re-resolves the element right before tapping, narrowing the window where a stale coordinate lands on an overlay (e.g. an Expo dev-menu bubble) the a11y tree never reported. Use exact match (partial=false) to avoid hitting the wrong item when ids overlap; verify_change reports whether the tap had any visible effect. If a coordinate tap lands but nothing happens (e.g. a Compose/RN NativeTabs bar), pass via_accessibility=true to dispatch a real accessibility click instead (EXPERIMENTAL — see that param's description).

NameTypeReqDescription
partialnull|booleanSubstring match instead of exact. Default true.
resource_idstringyesResource id to find and tap, e.g. "com.example.app:id/submit_button" or just "submit_button" (matches by substring by default).
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
verify_changenull|booleanAlso report whether the UI hierarchy changed after the tap (ui_changed: true/false). Costs two extra hierarchy reads (~2-3s); use when a tap silently doing nothing would send you down the wrong path.
via_accessibilitynull|booleanEXPERIMENTAL. Dispatch a real accessibility click (AccessibilityNodeInfo.performAction(ACTION_CLICK)) through the adb-mcp accessibility bridge instead of a coordinate tap — reaches native views (Comp…

No output schema declared.

No examples provided.

tap_on_text ~317

Find an element by its visible text or content-description and tap its center — the one-shot way to press a labelled button/row without computing coordinates yourself. Runs describe_ui internally and prefers a clickable match. Use exact match (partial=false) to avoid hitting the wrong item when labels overlap. If a coordinate tap lands but nothing happens (e.g. a Compose/RN NativeTabs bar), pass via_accessibility=true to dispatch a real accessibility click instead (EXPERIMENTAL — see that param's description).

NameTypeReqDescription
partialnull|booleanSubstring match instead of exact. Default true.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
textstringyesText or content-description to find.
verify_changenull|booleanAlso report whether the UI hierarchy changed after the tap (ui_changed: true/false). Costs two extra hierarchy reads (~2-3s); use when a tap silently doing nothing would send you down the wrong path.
via_accessibilitynull|booleanEXPERIMENTAL. Dispatch a real accessibility click (AccessibilityNodeInfo.performAction(ACTION_CLICK)) through the adb-mcp accessibility bridge instead of a coordinate tap — reaches native views (Comp…

No output schema declared.

No examples provided.

uninstall_app ~91

Uninstall an app by package name (adb uninstall). Use to remove a build before a clean install, or to verify first-run behavior after reinstalling. To keep the app but reset it, prefer clear_app_data.

NameTypeReqDescription
packagestringyesApplication package name (e.g. com.example.app).
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.

No output schema declared.

No examples provided.

wait ~89

Sleep for a number of seconds (fractions ok, capped at 300), then return. For TIME-based conditions where wait_for_text's polling doesn't apply: backgrounding an app long enough to trip a native auth timer, waiting out a cooldown or rate limit, letting a long animation finish.

NameTypeReqDescription
secondsnumberyesHow long to wait, in seconds. Fractions allowed; capped at 300.

No output schema declared.

No examples provided.

wait_for_boot ~77

Block until a device finishes booting (sys.boot_completed=1). Only needed if you started an emulator elsewhere; boot_emulator already waits by default.

NameTypeReqDescription
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
timeout_sintegerTimeout in seconds. Default 120.

No output schema declared.

No examples provided.

wait_for_text ~208

Poll the UI until an element with the given text/content-description appears (or times out), then return it. Use this after an async action (network load, navigation, animation) instead of a blind wait-then-screenshot — it returns as soon as the element is present, with its tappable center. Note: canvas-drawn (RN/Skia) text never enters the hierarchy, so it will time out on those — screenshot instead.

NameTypeReqDescription
partialnull|booleanSubstring match instead of exact. Default true.
scrollnull|booleanWhen true, swipe upward through the current scroll container while polling. Useful when Android omits off-screen ScrollView content from the accessibility tree.
serialstringTarget device serial (adb -s). Optional when exactly one device is attached.
textstringyesText or content-description to wait for.
timeout_sintegerHow long to wait, in seconds. Default 15.

No output schema declared.

No examples provided.

Common questions

What is the adb-mcp — Android emulator and device control over adb server?

adb-mcp — Android emulator and device control over adb is listed in the public MCP registry as io.github.iksnerd/adb-mcp. Drive an Android emulator or device over adb: screenshot, inspect UI, tap, type, build and test. This page covers its container image (ghcr.io/iksnerd/adb-mcp:0.22.2).

Is the adb-mcp — Android emulator and device control over adb server safe to use?

adb-mcp — Android emulator and device control over adb scores 38 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the adb-mcp — Android emulator and device control over adb server expose?

adb-mcp — Android emulator and device control over adb exposes 78 tools: adb_reverse, app_state, avd_snapshot, boot_emulator, build_and_run, and 73 more. Their descriptions and schemas cost roughly 13,364 tokens of context every time the server is loaded.

Is the adb-mcp — Android emulator and device control over adb server still maintained?

adb-mcp — Android emulator and device control over adb is still listed as active in the MCP registry. We last reached this channel on 22 August 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.