mcp-android-emulator
Enables AI assistants to interact with Android devices and emulators via ADB, providing tools for screenshots, UI inspection, touch and text input, app management, and device control.
README
MCP Android Emulator
A Model Context Protocol (MCP) server that enables AI assistants like Claude to interact with Android devices and emulators via ADB (Android Debug Bridge).
Features
- Screenshots: Capture device screen as base64 images
- UI Inspection: Get UI hierarchy (like DOM but for Android)
- Touch Input: Tap, swipe, scroll, pinch zoom, multi-tap gestures
- Text Input: Type, clear, select all, set text in input fields
- System Keys: Press BACK, HOME, ENTER, VOLUME, etc.
- App Management: Launch, install, force stop, clear data
- Clipboard: Get and set clipboard content
- Device Control: Rotate screen, get device info
- Logs: Access logcat with filters and log levels
- Wait & Assert: Wait for elements, UI stability, assertions for testing
- Safe Interactions: Tap avoiding system bars, element bounds detection
Requirements
- Node.js 18+
- ADB (Android Debug Bridge) installed
- One of the following:
- Android Studio Emulator (AVD)
- Redroid (Docker-based Android)
- Genymotion
- Physical Android device via USB/WiFi
Installation
From npm (Recommended)
npm install -g mcp-android-emulator
From source
git clone https://github.com/Anjos2/mcp-android-emulator.git
cd mcp-android-emulator
npm install
npm run build
Quick Start
1. Ensure ADB is working
adb devices
# Should show your device/emulator
2. Add to Claude Code
claude mcp add android-emulator -- npx mcp-android-emulator
3. Start using
Ask Claude: "Take a screenshot of the Android device"
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
ADB_PATH |
adb |
Path to ADB executable |
SCREENSHOT_DIR |
/tmp/android-screenshots |
Directory for temporary screenshots |
Claude Code Integration
Option 1: CLI command
claude mcp add android-emulator -- npx mcp-android-emulator
Option 2: Manual configuration
Edit ~/.claude.json:
{
"mcpServers": {
"android-emulator": {
"command": "npx",
"args": ["mcp-android-emulator"],
"env": {
"ADB_PATH": "/path/to/adb"
}
}
}
}
Claude Desktop Integration
Add to claude_desktop_config.json:
{
"mcpServers": {
"android-emulator": {
"command": "npx",
"args": ["mcp-android-emulator"],
"env": {
"ADB_PATH": "/path/to/adb"
}
}
}
}
Available Tools (40 tools)
Screen Capture & UI
| Tool | Description |
|---|---|
screenshot |
Capture screen as base64 PNG image |
get_ui_tree |
Get UI element hierarchy with coordinates |
get_all_text |
Get all visible text elements on screen (for debugging) |
get_clickable_elements |
NEW Get all clickable elements with text/id/coordinates (useful when tap_text fails) |
get_screen_size |
Get screen dimensions and density |
get_focused_element |
Get info about currently focused element |
is_element_visible |
Check if element is visible on screen |
get_element_bounds |
Get exact coordinates of an element |
assert_screen_contains |
Assert text is visible (for testing) |
Touch Interactions
| Tool | Description |
|---|---|
tap |
Tap at specific coordinates |
tap_text |
Find element by text and tap it |
tap_element |
Tap element by text or resource-id (more reliable) |
tap_safe |
Tap avoiding system navigation bars |
double_tap |
Double tap at coordinates |
long_press |
Long press for context menus |
multi_tap |
Multiple rapid taps at same position |
swipe |
Swipe between two points |
scroll |
Scroll in a direction (up/down/left/right) |
scroll_to_text |
Scroll until text is visible |
drag |
Drag gesture for drag & drop |
pinch_zoom |
Pinch zoom gesture (zoom in/out) |
Text Input
| Tool | Description |
|---|---|
type_text |
Type text into focused input |
clear_input |
Clear focused text field |
select_all |
Select all text in focused field |
set_text |
Clear and type new text (combines both) |
get_focused_input_value |
NEW Get current text value of focused input |
is_keyboard_visible |
NEW Check if soft keyboard is currently visible |
System & Keys
| Tool | Description |
|---|---|
press_key |
Press system key (BACK, HOME, ENTER, etc.) |
rotate_device |
Rotate to portrait or landscape |
set_clipboard |
Set text to device clipboard |
get_clipboard |
Get clipboard content |
App Management
| Tool | Description |
|---|---|
launch_app |
Launch app by package name |
install_apk |
Install APK file |
list_packages |
List installed packages |
clear_app_data |
Clear app data |
force_stop |
Force stop an app |
get_current_activity |
Get currently focused activity |
Device Info & Logs
| Tool | Description |
|---|---|
device_info |
Get device model, Android version, screen size |
get_logs |
Get logcat logs with filters and log levels |
Wait & Sync
| Tool | Description |
|---|---|
wait_for_element |
Wait for element with text to appear |
wait_for_element_gone |
Wait for element to disappear |
wait_for_ui_stable |
Wait for UI to stop changing (after animations) |
Emulator Setup Guides
Option 1: Android Studio Emulator (AVD)
Best for: Local development on machines with display
# List available AVDs
emulator -list-avds
# Start emulator
emulator -avd YOUR_AVD_NAME
# Verify connection
adb devices
Option 2: Redroid (Docker) - Recommended for Servers
Best for: Headless servers, CI/CD, cloud VPS
Redroid runs Android in a Docker container without requiring KVM on x86.
# Run Redroid container
docker run -d --name redroid \
--privileged \
-p 5555:5555 \
redroid/redroid:13.0.0-latest \
androidboot.redroid_width=720 \
androidboot.redroid_height=1280 \
androidboot.redroid_dpi=320
# Connect ADB
adb connect localhost:5555
# Verify
adb devices
For apps using network (React Native, Expo, etc.):
# Forward ports from device to host
adb reverse tcp:8081 tcp:8081 # Metro bundler
adb reverse tcp:3000 tcp:3000 # API server
Option 3: Genymotion
Best for: Local development, faster than AVD
- Download from genymotion.com
- Create and start a virtual device
- Enable ADB bridge in settings
- Connect:
adb connect localhost:5555
Option 4: Physical Device
Best for: Real-world testing
USB Connection:
- Enable Developer Options on device
- Enable USB Debugging
- Connect via USB
- Run
adb devices
WiFi Connection:
# First connect via USB, then:
adb tcpip 5555
adb connect DEVICE_IP:5555
# Disconnect USB
Running on Cloud/VPS Servers
Prerequisites
- Linux server (Ubuntu 20.04+ recommended)
- Docker installed
- At least 4GB RAM, 2 CPU cores
Step-by-Step Setup
1. Install ADB
# Ubuntu/Debian
sudo apt update
sudo apt install android-tools-adb
# Verify
adb version
2. Run Redroid
docker run -d --name redroid \
--privileged \
-p 5555:5555 \
redroid/redroid:13.0.0-latest \
androidboot.redroid_width=720 \
androidboot.redroid_height=1280 \
androidboot.redroid_dpi=320
3. Connect ADB
adb connect localhost:5555
adb devices # Should show "localhost:5555 device"
4. Install Node.js and MCP
# Install Node.js 18+
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# Install MCP
npm install -g mcp-android-emulator
5. Configure Claude Code
claude mcp add android-emulator -- npx mcp-android-emulator
Running AVD Headless (Alternative)
If you have KVM support:
# Install Android SDK
sudo apt install openjdk-11-jdk
wget https://dl.google.com/android/repository/commandlinetools-linux-latest.zip
# ... setup SDK ...
# Run emulator headless
emulator -avd YOUR_AVD \
-no-window \
-no-audio \
-no-boot-anim \
-gpu swiftshader_indirect \
-memory 2048 \
-cores 2
Usage Examples
Once configured, ask Claude to:
"Take a screenshot of the Android device"
"Tap on the Login button"
"Type 'hello@example.com' in the email field and press Enter"
"Scroll down until you see 'Submit' and tap it"
"Launch the Chrome app and navigate to google.com"
"Get error logs from the last 100 lines"
"Wait for the loading spinner to disappear, then take a screenshot"
"Check if 'Welcome' text is visible on screen"
"Rotate the device to landscape mode"
Automated Testing Example
"Test the login flow:
1. Take a screenshot of the initial state
2. Type 'testuser' in the username field
3. Type 'password123' in the password field
4. Tap the Login button
5. Wait for the UI to stabilize
6. Assert that 'Dashboard' is visible
7. Take a final screenshot"
Troubleshooting
ADB not found
# Check if ADB is installed
which adb
# If not found, install it
sudo apt install android-tools-adb # Ubuntu/Debian
brew install android-platform-tools # macOS
# Or set custom path
export ADB_PATH=/path/to/android-sdk/platform-tools/adb
No devices connected
# List devices
adb devices
# If using Redroid, connect explicitly
adb connect localhost:5555
# Check if emulator is fully booted
adb shell getprop sys.boot_completed # Should return "1"
Permission denied on screenshots
mkdir -p /tmp/android-screenshots
chmod 755 /tmp/android-screenshots
Redroid container won't start
# Check logs
docker logs redroid
# Ensure privileged mode
docker run --privileged ...
# Try different Android version
docker run ... redroid/redroid:11.0.0-latest
Apps can't reach localhost services
# Forward ports from device to host
adb reverse tcp:8081 tcp:8081
adb reverse tcp:3000 tcp:3000
# Verify
adb reverse --list
Changelog
See CHANGELOG.md for the full history.
v2.0.0 (Latest) — Security release
- Eliminated command injection across the MCP tool surface (issue #1).
The ADB execution layer was rebuilt on
child_process.execFile, and every LLM-controlled input now passes through strict zod allowlists before reaching the device shell. - Dependencies pinned to exact versions (
npm auditclean). - New
SECURITY.mdwith responsible disclosure policy. - Breaking: stricter allowlists reject some inputs previously accepted. See CHANGELOG.md for migration notes.
v1.4.0
- New tools:
get_clickable_elements- Get all clickable elements with text, resource-id, class, and coordinates. Useful whentap_textfails to find an element.
v1.3.0
- New tools:
get_all_text- Get all visible text elements on screen (useful for debugging)is_keyboard_visible- Check if soft keyboard is currently visibleget_focused_input_value- Get current text value of focused input field
- Improvements:
wait_for_ui_stable- Now uses UI fingerprint instead of raw XML comparison (more reliable)get_current_activity- Multi-method approach for compatibility with different emulators (AVD, Redroid, Genymotion, etc.)is_keyboard_visible- Multiple detection methods with fallbacks
v1.2.3
- Updated documentation with comprehensive setup guides
- Added emulator comparison (AVD, Redroid, Genymotion, Physical)
- Added cloud/VPS deployment instructions
- Added troubleshooting section
v1.2.2
- Fixed
set_clipboardandget_clipboardfor Redroid/Docker compatibility - Uses
/data/local/tmpas fallback path
v1.2.0
- Added 14 new tools:
get_screen_size,is_element_visible,get_element_boundsscroll_to_text,wait_for_ui_stable,wait_for_element_gonemulti_tap,pinch_zoom,tap_safe,tap_elementset_clipboard,get_clipboard,rotate_deviceget_focused_element,assert_screen_contains
v1.1.0
- Added
double_tap,drag,set_text,select_all,clear_input
v1.0.0
- Initial release with core functionality
Development
# Clone repo
git clone https://github.com/Anjos2/mcp-android-emulator.git
cd mcp-android-emulator
# Install dependencies
npm install
# Build
npm run build
# Watch mode for development
npm run dev
License
MIT License - see LICENSE for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Ideas for contributions:
- Support for multiple connected devices
- Screen recording
- File transfer (push/pull)
- Network simulation
- Battery/GPS simulation
Related Projects
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。