Provides tools for interacting with Android devices over ADB, including device selection, UI automation (tap, text input, key events), activity management, screenshots, UI tree dumps, and element finding/tapping capabilities.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Android MCPtake a screenshot of my device"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Android MCP ๐คโจ
Friendly MCP stdio server that chats with Android devices over ADB using @devicefarmer/adbkit, speaking newline-delimited JSON-RPC via @modelcontextprotocol/sdk (no Content-Length headers needed). Plug it into Cursor/Claude MCP and start poking at devices.
โจ What is this?
MCP transport that forwards handy ADB actions (tap, text, screenshot, UI dump, etc).
Uses newline-delimited JSON on stdin/stdout; one request per line, one response per line.
Prototype-friendly: swap out the minimal JSON-RPC loop for a full MCP SDK later if you want.
๐ฆ Requirements
Node.js 18+ and npm.
ADB on PATH (e.g., Android SDK platform-tools). Keep
adb start-serverrunning.At least one device or emulator attached (
adb devices).Optional: Android SDK/Gradle only if you plan to build the demo app; not needed for the MCP server itself.
๐ Setup (local)
git clone <repo-url> android-mcp
cd android-mcp
npm ci # or npm install
npm test # stdio + tsconfig smoke tests
npm run dev # start MCP server with tsx
# or explicitly:
npx --yes tsx src/server.tsTo build output: npm run build (emits dist/). Keep adb devices happy before invoking tools.
๐งฐ MCP config (Cursor/Claude)
Example ~/.cursor/mcp.json entry:
{
"mcpServers": {
"android-mcp": {
"type": "stdio",
"command": "npx",
"args": ["--yes", "tsx", "/home/ivan/code/android-mcp/src/server.ts"],
"cwd": "/home/ivan/code/android-mcp"
}
}
}๐ฎ Tools exposed
selectDevice{ serial }โ set default device for subsequent calls.keyEvent{ keyCode, serial? }โ sendinput keyevent.tap{ x, y, serial? }text{ text, serial? }โ usesinput text(spaces become%s).startActivity{ component, serial? }โ e.g."org.example/.MainActivity".screenshot{ serial? }โ{ mimeType: "image/png", base64 }.uiDump{ serial? }โ parseduiautomator dumptree (text, contentDesc, resourceId, bounds).findAndTap{ text?, contentDesc?, serial? }โ finds the first matching node and taps its center.listDevicesDetailedโ lists attached devices with model/manufacturer/sdk info.
๐ธ Notes & limits
Screenshot and UI dump are periodic snapshots (no streaming yet).
UI dump depends on
uiautomatorbeing present on the device.Prototype transport; you can wire in a richer MCP SDK without changing the ADB helpers.
๐งช Tests
npm test๐ฑ Optional: Build/install the demo app
Only needed if you want to exercise the sample Android UI:
# from the parent monorepo that contains the Android app
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am start -n org.dronix.android.kindlegratis/.MainActivity๐ ๏ธ CI hints
Node workflow: checkout โ setup-node 18+ โ
npm ciโnpm test.If building the Android app in CI, add Java 17 + Android SDK setup and run
./gradlew assembleDebug.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.