# io.github.martingeidobler/android (npm · android-mcp-server)

Control Android devices and emulators via ADB — screenshots, UI automation, and logcat.

- Trust score: 60/100 (medium)
- Change this week: +35
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `android-mcp-server`: 60/100 (this document), [markdown](https://verifymcp.io/servers/martingeidobler-android/android-mcp-server.md), [page](https://verifymcp.io/servers/martingeidobler-android/android-mcp-server)

## Channel facts

- Registry: `npm`
- Package: `android-mcp-server`
- Version: `1.2.1`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 70/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects sharp 0.33.5, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (124 of 128), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 137 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 77/100
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 1256 tokens (~59/item across 21 items; 21 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: 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

### Claude

```bash
claude mcp add martingeidobler-android -- npx -y android-mcp-server
```

### Codex

```bash
codex mcp add martingeidobler-android -- npx -y android-mcp-server
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "martingeidobler-android": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "android-mcp-server"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add martingeidobler-android --command npx --arg -y --arg android-mcp-server
```

### Hermes

```yaml
mcp_servers:
  martingeidobler-android:
    command: "npx"
    args: ["-y", "android-mcp-server"]
```

### Other

```json
{
  "mcpServers": {
    "martingeidobler-android": {
      "command": "npx",
      "args": [
        "-y",
        "android-mcp-server"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 60, +34)

- [security regression] GHSA-f88m-g3jw-g9cj affects this package: high
- [security regression] Provenance: unverified → fail
- [security regression] Known CVEs: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Capabilities: pass → unverified
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] License: unverified → pass
- [functional improvement] Schema quality: unverified → excellent
- [functional] Licence: MIT

### 2026-08-01 (score 26, +5)

- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] MCP protocol: unverified → pass

### 2026-07-31 (score 21, −25)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 46, +21)

- [functional regression] Dependency health: partial → unverified
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: unverified
- [functional] First check of Schema quality: pass
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100

### 2026-07-27 (score 25)

First indexed and scored.

## MCP tools (21)

### `list_devices` (~16 tokens)

List connected Android devices and emulators

### `list_avds` (~15 tokens)

List available Android Virtual Devices

### `start_emulator` (~48 tokens)

Start an Android emulator. Waits up to 60s for it to come online.

Input parameters:

- `avd_name` (string, required): Name of the AVD to start (from list_avds)

### `screenshot` (~64 tokens)

Take a screenshot of the Android device. Returns the image for visual analysis. Optionally saves to a file path.

Input parameters:

- `device_id` (string): Device ID (optional if only one device)
- `save_path` (string): Local file path to save the screenshot PNG (optional)

### `get_ui_tree` (~58 tokens)

Get the UI element hierarchy of the current screen. Returns interactive elements with their bounds, text, resource IDs, and state. Use this to find elements before tapping.

Input parameters:

- `device_id` (string): Device ID (optional if only one device)

### `tap` (~47 tokens)

Tap at specific screen coordinates

Input parameters:

- `device_id` (string): Device ID (optional if only one device)
- `x` (number, required): X coordinate
- `y` (number, required): Y coordinate

### `tap_element` (~73 tokens)

Tap a UI element by its resource-id, text, or content-desc. Finds the element in the UI tree and taps its center.

Input parameters:

- `by` (string, required): How to find the element
- `device_id` (string): Device ID (optional if only one device)
- `value` (string, required): Value to match

### `tap_and_wait` (~102 tokens)

Tap element then wait for UI to settle and return the new UI tree. Combines tap + wait + get_ui_tree into a single fast operation.

Input parameters:

- `by` (string, required): How to find the element to tap
- `device_id` (string): Device ID (optional if only one device)
- `value` (string, required): Value to match
- `wait_ms` (number): Time to wait for UI to settle after tap (default 1000ms)

### `type_text` (~43 tokens)

Type text into the currently focused input field

Input parameters:

- `device_id` (string): Device ID (optional if only one device)
- `text` (string, required): Text to type

### `press_key` (~40 tokens)

Press a hardware/software key

Input parameters:

- `device_id` (string): Device ID (optional if only one device)
- `key` (string, required): Key to press

### `swipe` (~91 tokens)

Perform a swipe gesture on the screen

Input parameters:

- `device_id` (string): Device ID (optional if only one device)
- `duration_ms` (number): Swipe duration in ms (default 300)
- `end_x` (number, required): End X coordinate
- `end_y` (number, required): End Y coordinate
- `start_x` (number, required): Start X coordinate
- `start_y` (number, required): Start Y coordinate

### `scroll_to_element` (~76 tokens)

Scroll down repeatedly until an element matching the given criteria is visible

Input parameters:

- `by` (string, required): How to find the element
- `device_id` (string): Device ID (optional if only one device)
- `max_scrolls` (number): Maximum scroll attempts (default 10)
- `value` (string, required): Value to match

### `wait_for_element` (~80 tokens)

Wait for a UI element to appear on screen. Polls every 500ms.

Input parameters:

- `by` (string, required): How to find the element
- `device_id` (string): Device ID (optional if only one device)
- `timeout_ms` (number): Timeout in ms (default 10000)
- `value` (string, required): Value to match

### `launch_app` (~67 tokens)

Launch an Android app by package name

Input parameters:

- `activity` (string): Activity to launch (optional - launches default if omitted)
- `device_id` (string): Device ID (optional if only one device)
- `package_name` (string, required): App package name (e.g., com.android.settings)

### `install_apk` (~47 tokens)

Install an APK file on the device

Input parameters:

- `apk_path` (string, required): Local path to the APK file
- `device_id` (string): Device ID (optional if only one device)

### `get_current_activity` (~33 tokens)

Get the currently displayed app and activity

Input parameters:

- `device_id` (string): Device ID (optional if only one device)

### `adb_shell` (~46 tokens)

Run an arbitrary ADB shell command

Input parameters:

- `command` (string, required): Shell command to execute on the device
- `device_id` (string): Device ID (optional if only one device)

### `get_logs` (~149 tokens)

Get device logcat output. Use to find crashes, exceptions, and errors after reproducing a bug.

Input parameters:

- `device_id` (string): Device ID (optional if only one device)
- `level` (string): Minimum log level: V(erbose), D(ebug), I(nfo), W(arn), E(rror), F(atal)
- `lines` (number): Number of recent log lines to return (default 200)
- `package_name` (string): Filter logs by app package name (e.g., com.example.app)
- `since` (string): Show logs since timestamp (e.g., '2024-01-15 10:30:00.000')

### `clear_logs` (~42 tokens)

Clear the logcat buffer. Call this before reproducing a bug to get clean logs.

Input parameters:

- `device_id` (string): Device ID (optional if only one device)

### `get_device_info` (~45 tokens)

Get device details: model, manufacturer, Android version, API level, screen size, and DPI.

Input parameters:

- `device_id` (string): Device ID (optional if only one device)

### `pull_file` (~74 tokens)

Pull a file from the Android device to the local filesystem.

Input parameters:

- `device_id` (string): Device ID (optional if only one device)
- `local_path` (string, required): Local path to save the file to
- `remote_path` (string, required): Path on the device (e.g., /sdcard/somefile.txt)

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/martingeidobler-android/android-mcp-server#diagnostics

## Score history

- 2026-08-03: 60
- 2026-08-02: 60
- 2026-08-01: 26
- 2026-07-31: 21
- 2026-07-30: 46
- 2026-07-28: 46
- 2026-07-27: 25

## Links

- npm package: https://www.npmjs.com/package/android-mcp-server
- Socket report: https://socket.dev/npm/package/android-mcp-server
- Repository: https://github.com/martingeidobler/android-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/martingeidobler-android/android-mcp-server/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/martingeidobler-android/android-mcp-server/changelog.json
- HTML version of this page: https://verifymcp.io/servers/martingeidobler-android/android-mcp-server
