Expo Android MCP

io.github.frndchagas由 GitHub 帳號 frndchagas 發布v0.5.2更新於 Oct 24, 2026

MCP server for Android emulator automation via ADB.

已驗證STDIO僅桌面瀏覽器自動化開發者工具

概覽

AI 產生的概覽

本機 MCP 伺服器,讓助理透過 ADB 檢視並操作 Android 模擬器或裝置,包括點擊、滑動、輸入文字和啟動應用程式。

可以做什麼
列出並選擇已連線的裝置與模擬器,並檢查 ADB 是否可用、運作是否正常(doctor)。將目前畫面匯出為解析後的 UI 元素,可選擇附上截圖,並依文字、內容描述、資源 ID 或類別尋找、等待或斷言元素。點擊元素或原始座標、滑動、長按、在焦點輸入欄位輸入文字,並送出 Android 按鍵事件。依套件名稱啟動應用程式、列出已安裝的套件,並下載與安裝固定版本的 Expo Go APK。
適用情境
適合讓助理在模擬器或已連線裝置上測試或操作 Android 應用程式或 Expo 專案:檢視畫面、驅動 UI、確認預期元素是否出現。適用於本機開發與測試流程,而非日常手機使用。
執行需求
透過 npm(Node 18+)或一鍵桌面安裝包在本機執行。需要可用的 Android SDK platform-tools(adb),並連線模擬器或裝置。選用環境變數:ADB_PATH、ADB_SERIAL、ADB_TIMEOUT_MS、ADB_MAX_BUFFER_MB、ADB_DEBUG、MCP_TRANSPORT 和 PORT。未宣告驗證。
安裝前請注意
點擊、滑動、輸入、送出按鍵、啟動應用程式或安裝 APK 的工具會改變所連裝置的狀態;README 說明用戶端可利用宣告的標註限制這些操作。installExpoGo 會從網際網路下載 APK 並以 adb install -r 安裝。將 MCP_TRANSPORT 設為 http 或 both 會開放本機 HTTP 埠(預設 7332),且未宣告驗證。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Expo Android MCP,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

expo-android

[npm version] [npm downloads] [license] [node version] [typescript] [CI]

MCP server for Android emulator automation via ADB.

Requirements

  • Node 18+
  • Android SDK platform-tools (adb) available
  • Android emulator or device connected

Verify adb:

bash
adb devices

Install

Claude Desktop, one-click: download expo-android.mcpb from the latest release and drag it into Settings → Extensions. You can leave both fields empty — adb is auto-detected and the only connected device is used by default.

Via npm:

bash
npm install -g @fndchagas/expo-android# ornpx -y @fndchagas/expo-android

Quickstart

  1. Start an emulator or connect a device.
  2. Run doctor to validate adb + device selection.
  3. Use inspect, tapElement, inputText, etc.

Example:

ts
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

bash
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

bash
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:

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

VariableDefaultDescription
ADB_PATHadbPath to adb executable
ADB_SERIALoptionalDevice serial to target (auto to clear and auto-detect)
ADB_TIMEOUT_MS15000Timeout for adb commands
ADB_MAX_BUFFER_MB10Max output buffer size
ADB_DEBUG0Log adb diagnostics to stderr
MCP_TRANSPORTstdioTransport: stdio, http, or both
PORT7332HTTP port when using http/both

Troubleshooting

adb not found (spawn adb ENOENT)

The server starts even when adb is missing — tools return the ADB executable not found error until adb becomes reachable (run doctor to diagnose). To fix it, set ADB_PATH or export an SDK path:

bash
export ADB_PATH="$HOME/Library/Android/sdk/platform-tools/adb"# orexport 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:

ts
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

bash
npm run buildnpm test

Tools

Tool names are plain identifiers (e.g. tap); your MCP client prefixes them with the server name you registered.

  • 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.
  • installExpoGo — download the pinned Expo Go APK and install it via adb install -r (the url override only accepts official github.com/expo/expo-go-releases URLs).

Every tool declares MCP annotations (readOnlyHint/destructiveHint), so clients can auto-approve inspection tools and gate the ones that drive the device.

Search criteria

These tools accept flexible search inputs: findElement, tapElement, waitForElement, assertElement.

Common fields:

  • text, textContains
  • contentDesc, contentDescContains
  • resourceId, resourceIdContains
  • class
  • normalizeWhitespace, caseInsensitive

MCP usage examples

Inspect

ts
const result = await client.callTool({  name: 'expo-android.inspect',  arguments: { onlyInteractive: true, includeScreenshot: false, maxElements: 200 },});

Inspect options:

  • includeScreenshot (default: false)
  • screenshotMode: base64 or path
  • screenshotPath: optional file path when using path
  • maxElements: limit elements returned
  • includeElements: return elements or summary only

Doctor

ts
await client.callTool({  name: 'expo-android.doctor',  arguments: {},});

Override serial per call

ts
await client.callTool({  name: 'expo-android.tapElement',  arguments: { text: 'Search', serial: 'emulator-5554' },});

Tap element

ts
await client.callTool({  name: 'expo-android.tapElement',  arguments: { text: 'Private account' },});

Wait + assert

ts
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 },});

來源:README.md,提交 11bf4d0

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.5.2最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分