expo-android
MCP server for Android emulator automation via ADB.
MCP 服务配置
复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用
{
"mcpServers": {
"@fndchagas/expo-android": {
"args": [
"@fndchagas/expo-android@0.2.1"
],
"command": "npx"
}
}
}
可用工具 (5 个)
该服务在 MCP 协议中暴露的工具,AI 可按需调用
tavily_search 14 个参数 需填 1 项
Search the web for current information on any topic. Use for news, facts, or data beyond your knowledge cutoff. Returns snippets and source URLs.
必填参数:query
tavily_extract 6 个参数 需填 1 项
Extract content from URLs. Returns raw page content in markdown or text format.
必填参数:urls
tavily_crawl 11 个参数 需填 1 项
Crawl a website starting from a URL. Extracts content from pages with configurable depth and breadth.
必填参数:url
tavily_map 8 个参数 需填 1 项
Map a website's structure. Returns a list of URLs found starting from the base URL.
必填参数:url
tavily_research 2 个参数 需填 1 项
Perform comprehensive research on a given topic or question. Use this tool when you need to gather information from multiple sources to answer a question or complete a task. Returns a detailed response based on the research findings.
必填参数:input
服务介绍
expo-android
MCP server for Android emulator automation via ADB.
# Requirements
- Node 18+
- Android SDK platform-tools (adb) available
- Android emulator or device connected
Verify adb:
adb devices
# Install
npm install -g @fndchagas/expo-android
# or
npx -y @fndchagas/expo-android
# Quickstart
- Start an emulator or connect a device.
- Run
doctorto validate adb + device selection. - Use
inspect,tapElement,inputText, etc.
Example:
await client.callTool({ name: 'expo-android.doctor', arguments: {} });
await client.callTool({
name: 'expo-android.inspect',
arguments: { onlyInteractive: true, maxElements: 200 },
});
# Use with Claude Code CLI
claude mcp add expo-android \
- -env ADB_PATH="$HOME/Library/Android/sdk/platform-tools/adb" \
- -env ADB_SERIAL="auto" \
- - npx -y @fndchagas/expo-android
# Use with OpenAI Codex CLI
codex mcp add expo-android \
- -env ADB_PATH="$HOME/Library/Android/sdk/platform-tools/adb" \
- -env ADB_SERIAL="auto" \
- - npx -y @fndchagas/expo-android
Or edit ~/.codex/config.toml:
[mcp_servers.expo-android]
command = "npx"
args = ["-y", "@fndchagas/expo-android"]
env = { ADB_PATH = "/Users/you/Library/Android/sdk/platform-tools/adb", ADB_SERIAL = "emulator-5554" }
Serial selection priority:
serial param (per tool call) → setDevice override → ADB_SERIAL env → auto (if only one device).
# Environment variables
| Variable | Default | Description |
| - -- | - -- | - -- |
| ADB_PATH | adb | Path to adb executable |
| ADB_SERIAL | optional | Device serial to target (auto to clear and auto-detect) |
| ADB_TIMEOUT_MS | 15000 | Timeout for adb commands |
| ADB_MAX_BUFFER_MB | 10 | Max output buffer size |
| ADB_DEBUG | 0 | Log adb diagnostics to stderr |
| MCP_TRANSPORT | stdio | Transport: stdio, http, or both |
| PORT | 7332 | HTTP port when using http/both |
# Troubleshooting
# # adb not found (spawn adb ENOENT)
If you see an error like ADB executable not found or spawn adb ENOENT, set ADB_PATH
or export an SDK path:
export ADB_PATH="$HOME/Library/Android/sdk/platform-tools/adb"
# or
export ANDROID_HOME="$HOME/Library/Android/sdk"
If multiple devices are connected, set ADB_SERIAL to the target device.
You can also run setDevice at runtime:
await client.callTool({
name: 'expo-android.setDevice',
arguments: { serial: 'emulator-5554' },
});
If you update PATH or SDK variables, restart the MCP process so it can pick up
the new environment.
# Tests
npm run build
npm test
# Tools
Tools are exposed under your MCP server name. Example: expo-android.tap.
devices— list connected devices and emulators.doctor— validate adb availability and show connected devices.setDevice— override the active device serial for this MCP process.inspect— UI dump parsed into elements with a summary (screenshot optional).screenshot— capture a screenshot only (base64 or file path).findElement— return elements that match search criteria.tapElement— find an element and tap its center.waitForElement— wait until an element appears (optionally with state checks).assertElement— verify element existence and state.tap— tap at x/y coordinates.swipe— swipe between coordinates.longPress— press and hold at coordinates.inputText— type text in the focused field.keyEvent— send Android key events (e.g., BACK, HOME).openApp— launch an app by package name.listPackages— list installed package names.
# Search criteria
These tools accept flexible search inputs: findElement, tapElement,
waitForElement, assertElement.
Common fields:
text,textContainscontentDesc,contentDescContainsresourceId,resourceIdContainsclassnormalizeWhitespace,caseInsensitive
# MCP usage examples
# # Inspect
const result = await client.callTool({
name: 'expo-android.inspect',
arguments: { onlyInteractive: true, includeScreenshot: false, maxElements: 200 },
});
Inspect options:
includeScreenshot(default:false)screenshotMode:base64orpathscreenshotPath: optional file path when usingpathmaxElements: limit elements returnedincludeElements: return elements or summary only
# # Doctor
await client.callTool({
name: 'expo-android.doctor',
arguments: {},
});
# # Override serial per call
await client.callTool({
name: 'expo-android.tapElement',
arguments: { text: 'Search', serial: 'emulator-5554' },
});
# # Tap element
await client.callTool({
name: 'expo-android.tapElement',
arguments: { text: 'Private account' },
});
# # Wait + assert
await client.callTool({
name: 'expo-android.waitForElement',
arguments: { text: 'Save', timeout: 10000, shouldBeClickable: true },
});
await client.callTool({
name: 'expo-android.assertElement',
arguments: { text: 'Private account', shouldBeChecked: true },
});