# AndroidMCP Framework (npm · androidmcp-framework)

MCP server and CLI for Android development and change-aware Android and Flutter testing workflows.

- Trust score: 71/100 (medium)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `androidmcp-framework`: 71/100 (this document), [markdown](https://verifymcp.io/servers/kshivam1177-androidmcp-framework/androidmcp-framework.md), [page](https://verifymcp.io/servers/kshivam1177-androidmcp-framework/androidmcp-framework)

## Channel facts

- Registry: `npm`
- Package: `androidmcp-framework`
- Version: `0.1.12`
- 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-11-05.

- **Supply Chain Security**: 81/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects zod 3.25.76, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - 34 of 112 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to kshivam1177/android-mcp-framwork).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 1 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 65/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2653 tokens (~88/item across 30 items; 30 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**: 75/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 26% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 30 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **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

### How do I install the AndroidMCP Framework MCP server?

AndroidMCP Framework runs locally as an npm package, launched with npx -y androidmcp-framework. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add kshivam1177-androidmcp-framework -- npx -y androidmcp-framework
```

### Cursor

```json
{
  "mcpServers": {
    "kshivam1177-androidmcp-framework": {
      "command": "npx",
      "args": [
        "-y",
        "androidmcp-framework"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "kshivam1177-androidmcp-framework": {
      "command": "npx",
      "args": [
        "-y",
        "androidmcp-framework"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add kshivam1177-androidmcp-framework -- npx -y androidmcp-framework
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add kshivam1177-androidmcp-framework --command npx --arg -y --arg androidmcp-framework
```

### Hermes

```yaml
mcp_servers:
  kshivam1177-androidmcp-framework:
    command: "npx"
    args: ["-y", "androidmcp-framework"]
```

### Netclaw

```json
{
  "McpServers": {
    "kshivam1177-androidmcp-framework": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "androidmcp-framework"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add kshivam1177-androidmcp-framework -t stdio -c npx -a -y androidmcp-framework
```

### Other

```json
{
  "mcpServers": {
    "kshivam1177-androidmcp-framework": {
      "command": "npx",
      "args": [
        "-y",
        "androidmcp-framework"
      ]
    }
  }
}
```

## 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-10-27 (score 71, +20)

- [security regression] CVE-2026-41650 affects this package: high
- [security regression] CVE-2023-54404 affects this package: high
- [security regression] Known CVEs: unverified → fail
- [security improvement] Malware scan: unverified → pass
- [functional improvement] Dependency health: unverified → 0.86

### 2026-10-26 (score 51)

First indexed and scored.

## MCP tools (30)

### `list_devices` (~61 tokens)

List Devices

List every connected Android target - booted emulators and physical devices together, the same way `adb devices -l` does. Each entry reports id (adb serial), type ('emulator'|'physical'), state, and avdName when resolvable.

### `build_device` (~152 tokens)

Build (Device)

Compile-only build for a Gradle module + variant (assemble<Variant>). Does not install or launch. Works identically whether you plan to target an emulator or a physical device - both use the same adb, unlike Xcode's simulator/device split.

Input parameters:

- `extraArgs` (array): Extra raw Gradle CLI args, e.g. ["--stacktrace"].
- `module` (string): Gradle module path, e.g. ":app". Falls back to sessionDefaults.module.
- `projectPath` (string): Gradle project root. Falls back to sessionDefaults.projectPath.
- `variant` (string): Build variant, e.g. "debug" or "devDebug". Falls back to sessionDefaults.variant.

### `build_run_device` (~161 tokens)

Build, Install, and Launch

One-shot: build a module + variant, install it, and launch it. Resolves the target automatically - an explicit targetId wins, then the active session default, then whichever single emulator/device is connected; if more than one is connected without a pin, this fails with the candidate list instead of guessing. Launches via the default launcher activity unless `activity` is given.

Input parameters:

- `activity` (string): Fully-qualified activity to launch, e.g. "com.example.app.MainActivity". Defaults to the app's launcher activity.
- `extraArgs` (array)
- `module` (string)
- `projectPath` (string)
- `targetId` (string): adb serial. Auto-resolved if omitted.
- `variant` (string)

### `install_app_device` (~118 tokens)

Install App

Install an already-built APK for a module + variant onto the resolved target. Does not rebuild - run build_device first if sources changed. Pass apkPath directly to skip variant lookup entirely.

Input parameters:

- `apkPath` (string): Explicit path to a .apk, bypassing module/variant lookup.
- `module` (string)
- `projectPath` (string)
- `reinstall` (boolean): Pass -r to adb install to keep existing app data. Default true.
- `targetId` (string)
- `variant` (string)

### `launch_app_device` (~117 tokens)

Launch App

Launch an already-installed app on the resolved target. Provide packageId directly, or module/variant to look it up from the last build's APK. Uses the app's default launcher activity unless `activity` is given.

Input parameters:

- `activity` (string)
- `module` (string)
- `packageId` (string): Application id, e.g. "com.example.app". Resolved from the built APK if omitted.
- `projectPath` (string)
- `targetId` (string)
- `variant` (string)

### `stop_app_device` (~51 tokens)

Stop App

Force-stop a running app on the resolved target (adb shell am force-stop).

Input parameters:

- `packageId` (string, required): Application id, e.g. "com.example.app".
- `targetId` (string)

### `uninstall_app_device` (~61 tokens)

Uninstall App

Uninstall an app (and its data) from the resolved target.

Input parameters:

- `keepData` (boolean): Pass -k to adb uninstall to keep app data/cache. Default false.
- `packageId` (string, required)
- `targetId` (string)

### `clear_app_data_device` (~56 tokens)

Clear App Data

Reset an app to first-install state on the resolved target (adb shell pm clear) - wipes the app's data and cache without uninstalling it.

Input parameters:

- `packageId` (string, required)
- `targetId` (string)

### `test_device` (~117 tokens)

Test (Device)

Run tests for a module + variant. `instrumented` (default) runs connected<Variant>AndroidTest against the resolved target via ANDROID_SERIAL - needs an emulator or device attached. `unit` runs test<Variant>UnitTest on the JVM instead and needs no target at all.

Input parameters:

- `extraArgs` (array)
- `kind` (string): Defaults to "instrumented".
- `module` (string)
- `projectPath` (string)
- `targetId` (string)
- `variant` (string)

### `push_file_device` (~47 tokens)

Push File

Copy a local file or directory onto the resolved target (adb push).

Input parameters:

- `localPath` (string, required)
- `remotePath` (string, required)
- `targetId` (string)

### `pull_file_device` (~50 tokens)

Pull File

Copy a file or directory off the resolved target onto the local filesystem (adb pull).

Input parameters:

- `localPath` (string, required)
- `remotePath` (string, required)
- `targetId` (string)

### `snapshot_ui` (~132 tokens)

Snapshot UI

Capture a semantic UI hierarchy for the current screen - every element gets a short-lived elementRef (e1, e2, ...) that tap/long_press/type_text can target directly. Saves the captured hierarchy as JSON under .androidmcp-framework/artifacts/ui-snapshots/ by default.

Input parameters:

- `interactiveOnly` (boolean): Default true: only clickable/focusable/scrollable/checkable elements or ones with text/content-desc. false returns the full raw tree.
- `projectPath` (string): Project root for the saved JSON snapshot; defaults to the current working directory.
- `targetId` (string)

### `tap` (~75 tokens)

Tap

Tap either a raw (x, y) point or an elementRef from the latest snapshot_ui output. Prefer elementRef - it survives minor layout shifts that would break a hard-coded coordinate.

Input parameters:

- `elementRef` (string)
- `targetId` (string)
- `x` (number)
- `y` (number)

### `long_press` (~72 tokens)

Long Press

Long-press either a raw (x, y) point or an elementRef from the latest snapshot_ui output.

Input parameters:

- `durationMs` (number): Default 600.
- `elementRef` (string)
- `targetId` (string)
- `x` (number)
- `y` (number)

### `swipe` (~121 tokens)

Swipe

Swipe either by explicit start/end coordinates, or a screen-relative direction ("up"|"down"|"left"|"right") computed from the current screen size.

Input parameters:

- `direction` (string)
- `distance` (number): Screen-relative distance for direction mode, 0-1. Default 0.6.
- `durationMs` (number): Default 300.
- `endX` (number)
- `endY` (number)
- `startX` (number)
- `startY` (number)
- `targetId` (string)

### `drag` (~137 tokens)

Drag

Press-and-drag from one point to another (adb shell input draganddrop) - for reordering list items or drag targets, where a quick swipe would be interpreted as a flick instead of a hold-and-move. Endpoints can be elementRefs from the latest snapshot_ui, or raw coordinates.

Input parameters:

- `durationMs` (number): Default 800.
- `endElementRef` (string)
- `endX` (number)
- `endY` (number)
- `startElementRef` (string)
- `startX` (number)
- `startY` (number)
- `targetId` (string)

### `type_text` (~97 tokens)

Type Text

Type text into whatever field currently has focus. If elementRef is given, taps it first to focus it, then types. Only ASCII-range and common Latin text renders reliably through adb input text - non-Latin scripts and emoji generally need an IME-level workaround this tool does not attempt.

Input parameters:

- `elementRef` (string): Tapped first to focus, if given.
- `targetId` (string)
- `text` (string, required)

### `key_press` (~104 tokens)

Key Press

Send one hardware/software key event (adb shell input keyevent). Accepts either a symbolic Android keycode name (KEYCODE_BACK, KEYCODE_ENTER, KEYCODE_DEL, KEYCODE_TAB) or its numeric code. Prefer button for common hardware buttons (home/back/recents/power/volume) - it maps friendly names for you.

Input parameters:

- `keyCode` (string, required): e.g. "KEYCODE_ENTER" or "66".
- `targetId` (string)

### `button` (~50 tokens)

Hardware Button

Press a named hardware/system button: home, back, recents, power, volume_up, volume_down, menu, enter, camera.

Input parameters:

- `button` (string, required)
- `targetId` (string)

### `gesture` (~83 tokens)

Gesture Preset

Named system gesture presets: expand_notifications, expand_quick_settings, collapse_statusbar (all via `cmd statusbar`, no coordinates needed), swipe_up_from_bottom (home/app-switcher gesture-nav swipe), swipe_down_from_top (notification-shade swipe as an alternative to expand_notifications on older API levels).

Input parameters:

- `preset` (string, required)
- `targetId` (string)

### `screenshot` (~85 tokens)

Screenshot

Capture the current screen, return it as an image, and save a copy under .androidmcp-framework/artifacts/screenshots/ by default.

Input parameters:

- `outputPath` (string): Optional explicit screenshot file path. Defaults to the project artifacts folder.
- `projectPath` (string): Project root for the saved screenshot; defaults to the current working directory.
- `targetId` (string)

### `wait_for_ui` (~138 tokens)

Wait For UI

Poll the UI until a condition holds, then record the latest snapshot (same caching as snapshot_ui - refs from the result are usable directly). With textContains/resourceId: waits for a matching element to appear (or disappear, if gone:true). With neither: waits for the hierarchy to stop changing between polls ("settled").

Input parameters:

- `gone` (boolean): Wait for absence instead of presence. Default false.
- `pollIntervalMs` (number): Default 500.
- `resourceId` (string)
- `targetId` (string)
- `textContains` (string)
- `timeoutMs` (number): Default 10000.

### `batch` (~78 tokens)

Batch

Run several same-screen UI actions in one call, resolving the target once and reusing it for every step. Use for multiple taps/toggles with no intermediate assertion needed - if you need to check state between steps, call the individual tools instead so you can inspect each result.

Input parameters:

- `steps` (array, required)
- `targetId` (string)

### `touch` (~91 tokens)

Touch (raw down/up/move)

Send a raw touch event (adb shell input motionevent) rather than a full tap/swipe gesture. Use for composing custom multi-point sequences - e.g. DOWN, several MOVEs, then UP - that the higher-level tap/swipe/drag tools don't expose.

Input parameters:

- `action` (string, required)
- `targetId` (string)
- `x` (number, required)
- `y` (number, required)

### `session_show_defaults` (~56 tokens)

Show Session Defaults

Show the active session-default profile and its resolved values (config.yaml sessionDefaults, overlaid with any runtime overrides from session_set_defaults). Call this before your first build/run/test call in a session - do not assume defaults are configured.

### `session_set_defaults` (~112 tokens)

Set Session Defaults

Set one or more session defaults for the active profile at runtime (in-memory + persisted under the state dir for this profile - not written back to config.yaml). Only the fields you pass are changed; everything else stays as-is.

Input parameters:

- `applicationId` (string)
- `avdName` (string)
- `gradleTaskPrefix` (string)
- `module` (string)
- `projectPath` (string)
- `targetId` (string)
- `variant` (string)

### `session_clear_defaults` (~48 tokens)

Clear Session Defaults

Clear runtime overrides for the active profile (or a named one) - falls back to config.yaml's static sessionDefaults on the next read, not to nothing.

Input parameters:

- `profile` (string)

### `session_use_defaults_profile` (~58 tokens)

Switch Session Defaults Profile

Switch the active session-defaults profile - useful in a monorepo with several Gradle projects, so each can keep its own remembered projectPath/module/variant/targetId without overwriting the others.

Input parameters:

- `profile` (string, required)

### `doctor` (~41 tokens)

Doctor

Check Android development prerequisites: adb, Java, Gradle, Android SDK, emulator, build-tools and the optional Google Android CLI integration. This framework does not require Python.

### `manage_workflows` (~84 tokens)

Manage Workflows

List every workflow and which of its tools are currently enabled, or enable/disable a workflow for this running server session. Session-only - it does not edit .android-build-mcp/config.yaml, so restart-persistent changes still belong in enabledWorkflows there.

Input parameters:

- `action` (string): Default "list".
- `workflowName` (string): Required for enable/disable.

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/kshivam1177-androidmcp-framework/androidmcp-framework#diagnostics

## Score history

- 2026-11-05: 71
- 2026-11-04: 71
- 2026-11-03: 71
- 2026-11-02: 71
- 2026-11-01: 71
- 2026-10-31: 71
- 2026-10-30: 71
- 2026-10-29: 71
- 2026-10-28: 71
- 2026-10-27: 71
- 2026-10-26: 51

## Common questions

### What is the AndroidMCP Framework MCP server?

AndroidMCP Framework is an MCP server listed in the public MCP registry as io.github.kshivam1177/androidmcp-framework. MCP server and CLI for Android development and change-aware Android and Flutter testing workflows. This page covers its npm package (androidmcp-framework).

### Is the AndroidMCP Framework MCP server safe to use?

AndroidMCP Framework scores 71 out of 100 on VerifyMCP. We recorded 2 known advisories against it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. 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 AndroidMCP Framework MCP server expose?

AndroidMCP Framework exposes 30 tools: list_devices, build_device, build_run_device, install_app_device, launch_app_device, and 25 more. Their descriptions and schemas cost roughly 2,653 tokens of context every time the server is loaded.

### Is the AndroidMCP Framework MCP server still maintained?

AndroidMCP Framework is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the AndroidMCP Framework MCP server under?

AndroidMCP Framework declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

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