mcpField
A
adb-mcp: Android emulator and device control over adb

adb-mcp: Android emulator and device control over adb

本地服务
adb-mcp.com开发工具124 天前更新

关于 adb-mcp: Android emulator and device control over adb

adb-mcp 是通过 adb 控制 Android 模拟器和设备的 MCP 服务,面向 Android 开发者及 Agent,提供界面操作、诊断和 Gradle 构建工具,并将工作流指南作为资源提供。

主要功能

  1. 01控制模拟器和设备生命周期
  2. 02截取屏幕并检查 UI 层级
  3. 03点击、滑动、输入及执行带校验的步骤
  4. 04管理应用、锁屏和模拟器控制项
  5. 05读取 logcat 并诊断崩溃
  6. 06运行 Gradle 构建、测试和覆盖率分析

适用场景

  1. 01在模拟器上测试 Android 应用
  2. 02检查并操作应用界面
  3. 03收集日志以排查崩溃
  4. 04构建和测试 Android 项目

MCP 相关

通过 stdio 将 Android 设备、模拟器、UI、日志和 Gradle 操作作为 MCP 工具提供。它还将六份 Android 工作流指南作为 MCP 资源提供。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"iksnerd-adb": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/iksnerd/adb-mcp:0.24.3"
]
}
}
}
启动命令docker run -i --rm ghcr.io/iksnerd/adb-mcp:0.24.3

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/iksnerd/adb-mcp:0.24.3

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Android 机器人标志

adb-mcp

一个通过 adb 驱动 Android 模拟器和设备的 MCP 服务

Website Release CI Go MCP


启动 AVD、截屏、读取 UI 层级、点击/滑动/输入、设置设备锁、读取 logcat、运行 Gradle 构建和测试。可通过 stdio 从 Claude Code、Cursor、VS Code 或任何 MCP 客户端使用 80 个工具。

这是 Android 版的 XcodeBuildMCP,基于官方的 Go MCP SDK 构建。

Agent 使用 adb-mcp 驱动真实模拟器:describe_ui 找到 Chrome 图标,tap_on_text 点击它,截图确认 Chrome 已启动。模拟器屏幕与实际工具调用及结果并排显示。

describe_ui → tap_on_text → screenshot,在真实模拟器(emulator-5556)上实时运行,并展示实际工具调用及其实际输出。

Android 是 Google LLC 的商标。adb-mcp 是一款为 Android 构建的独立非官方 工具,与 Google 无关,也未获得 Google 赞助或认可。 上方的 Android 机器人图像复制/修改自 Google 创作并分享的作品,并依据 Creative Commons 3.0 Attribution License 中所述条款使用。

为什么使用

手动驱动 Android 意味着要执行一长串原始 adb 命令,而且很容易出错(点击坐标过期、截图被 CRLF 损坏、忘记使用 exec-out、根据缩小后的图像猜测坐标)。此服务将这些经验融入工具中,Agent 无需重新摸索:

  • 截图使用 exec-out screencap(不会被 CRLF 损坏),并会自动缩小,便于图像读取器处理。
  • describe_ui 会返回每个元素在设备真实像素中的中心点(这样点击就能准确落在目标位置,无需根据图像猜测),并会自动重试偶发的“无法获取空闲状态”故障。

工作流本身以易读的资源形式提供,Agent 可在任务中途随时查看(观察→操作循环、原生 PIN/锁处理、崩溃排查,见下文),无需每次会话都重新摸索。

开始使用

1. 前置条件
  • 安装包含 platform-tools(adb)和 emulator 的 Android SDK。服务会通过 $ANDROID_HOME/$ANDROID_SDK_ROOT 查找 SDK,否则使用平台默认路径(macOS 上为 ~/Library/Android/sdk)。如果 MCP 客户端启动服务时未设置这些变量,请在客户端配置的 args 中传入 --sdk /path/to/sdk(服务随后会导出该变量,因此 Gradle 也能找到 SDK)。doctor 会打印解析出的路径。
  • 至少有一个 AVD(在 Android Studio 的 Device Manager 中创建)。

不需要 Go:发行版已包含预构建的二进制文件,只有在从源代码构建时才需要 Go。

2. 安装

在 macOS/Linux 上:

curl -fsSL https://raw.githubusercontent.com/iksnerd/adb-mcp/main/install.sh | sh

此脚本(install.sh)会根据操作系统和架构选择合适的归档文件,将其 SHA-256 与发行版的 checksums.txt 进行校验,并安装到 ~/.local/bin(可通过 BIN_DIR=... 覆盖;通过 VERSION=v0.24.3 固定版本)。

想自行下载二进制文件?所有平台(macOS、Linux 和 Windows,amd64 和 arm64)的归档文件都在Releases 页面,每个归档都在 checksums.txt 中列有校验和。在 Windows 上,下载 windows_amd64 或 windows_arm64 zip 文件,并将 adb-mcp.exe 放到 PATH 中的某个位置。

安装后,可通过内置更新程序保持最新版本。它会获取最新发行版、校验其校验和,并就地替换二进制文件:

adb-mcp update

下面的注册配置会通过裸名称 adb-mcp 启动服务,因此它必须位于 $PATH 中(运行 which adb-mcp 应能找到它;如果 ~/.local/bin 不在其中,安装程序会发出警告)。否则,请将客户端指向二进制文件的绝对路径。

3. 注册 MCP 客户端

Claude Code:

claude mcp add adb -- adb-mcp

(在此仓库本身中工作时,会自动读取随附的 .mcp.json,无需注册。)

也可以安装为插件,它会注册服务,并为每份操作指南添加一个技能:

claude plugin marketplace add iksnerd/adb-mcp
claude plugin install adb-mcp@adb-mcp

对于 Codex,同一插件也提供 Codex 的清单格式:

codex plugin marketplace add iksnerd/adb-mcp
codex plugin add adb-mcp@adb-mcp-plugins

Claude 插件通过 node 启动服务,首次运行时会从 GitHub 发行版下载适用于你机器的构建版本,并使用固定的 SHA-256 进行校验,因此需要将 Node 放入 PATH,但无需执行第 2 步。Codex 插件仍要求 PATH 中有第 2 步安装的 adb-mcp。插件运行和发送的内容见 docs/PRIVACY.md。

Cursor / VS Code:一键安装(假设第 2 步安装的 adb-mcp 已在 PATH 中):

在 Cursor 中安装 在 VS Code 中安装

任何其他客户端(Windsurf、Codex,……):通过 stdio 运行 adb-mcp。 常见配置格式:

{
  "mcpServers": {
    "adb": { "command": "adb-mcp" }
  }
}

要确认连接正常,请让你的 Agent“启动一个模拟器并截取屏幕”。

从源代码构建(Go 1.26+)

模块固定使用 toolchain go1.26.10;首次构建时,Go 1.26 安装会自动下载该补丁版本。

make install                 # builds ./bin/adb-mcp and copies it to ~/.local/bin
# or:
go build -o bin/adb-mcp ./cmd/adb-mcp
# or straight from the module (note the /cmd/adb-mcp suffix):
go install github.com/iksnerd/adb-mcp/cmd/adb-mcp@latest

工具

80 个工具,涵盖十个领域。每个面向设备的工具都可选传入 serial(adb -s)。只连接了一台设备时可省略;连接多台设备时,从 list_devices 获取一个值传入。完整参考:docs/TOOLS.md。

  • 模拟器 / 设备:启动、列出、等待启动、关机、通过 Wi-Fi 连接、adb_reverse 端口转发(Metro!)
  • 观察:使用 screenshot 查看(支持多显示屏折叠设备,可通过 display 选择面板);使用 describe_ui 获取真实像素坐标的元素中心,并显示当前聚焦的顶层窗口(可通过可选的 package 发现遮挡目标的生物识别提示,或完全错误的应用);提供 filter/query/compact 模式,并显示隐藏节点数量,让节点确实不存在这一判断可信;render_stats 统计真实视图树和帧健康状况,而视口范围内的 describe_ui 无法做到这一点
  • 交互:点按、tap_on_text/tap_element(按 ID 定位)、滑动、拖动、长按、输入、组合按键、PIN 键盘、wait、run_sequence(在一次调用中批量执行步骤和检查条件,避免逐步往返干扰使用原生计时器的流程);选择启用 verify_change,即可获知点按/按键是否实际改变了 UI;在 tap_on_text/tap_element 上选择启用 via_accessibility(实验性),为坐标点按无法触及的原生视图分发真正的无障碍点击,参见 bridge/README.md
  • 锁屏 / Keystore / 生物识别:设置/清除安全锁屏、检查锁定状态、使用 has_biometric_enrolled + fingerprint_touch/finger_remove 满足模拟器上的 BiometricPrompt 要求
  • 扩展控件(模拟器):send_sms(OTP/2FA)、phone_call、set_battery(也可通过 dumpsys 在真实设备上使用)、cellular(漫游/弱信号/限速)、set_sensor(加速度计/光线/……)、rotate_screen、avd_snapshot,用于操作 describe_ui 无法看到的模拟器纯控制台面板
  • 应用生命周期:安装/卸载、启动/停止、get_app_details(已安装应用的版本和启动器 Activity,或通过 apk_path 在无设备时查询本地 APK)、app_state(运行中的 pid,以及 Metro 与嵌入式 bundle)、launch_dev_client(Expo 开发版构建 → Metro,跳过 Dev Launcher)、reload_app/open_dev_menu、清除数据、权限、深层链接、推送/拉取文件
  • 日志与捕获:一次性或流式 logcat(按子字符串/优先级/标签筛选、使用 since 时间范围、选择启用 redact 在输出前遮蔽令牌/密码/API 密钥)、clear_logcat、last_crash、屏幕录制
  • 环境与诊断:深色模式、模拟位置、清理状态栏、stay_awake(防止容易进入休眠状态的屏幕清空截图)、doctor
  • Gradle 构建与测试:assembleDebug、单元测试、插桩测试、通过 JaCoCo 执行 JVM 单元测试覆盖率分析(get_coverage_report/get_file_coverage)、任务 + 变体 + 模块发现(list_gradle_variants/list_gradle_projects)、scaffold_android_project、一次性 build_and_run。构建会返回精简摘要(状态、错误数、首批错误、APK),完整脱敏日志则保存在磁盘上;使用 gradle_build background=true 加 build_status,可避免耗时数分钟的构建一直占用调用
  • 会话默认值:通过 session_set_defaults 一次固定 project_dir/serial,这样多模块/多 flavor 项目或多设备会话就不必在每次调用时重复传入

驱动设备所需的知识本身以六个 MCP 资源(android://guide/*)的形式提供, 客户端可以列出并读取这些资源。URI 参见 docs/TOOLS.md, 也可以直接查看 android://guide/driving,了解下文的核心循环。

核心循环

观察 → 定位 → 操作 → 再次观察。 使用 screenshot 查看,使用 describe_ui 获取真实像素坐标的中心点,使用 tap/tap_on_text/swipe/input_text 执行操作,然后 再次使用 screenshot 确认。阅读 android://guide/driving,了解完整循环 以及那些会浪费操作轮次的注意事项。

开发

make check     # go vet + go test + doc-count check (unit tests need no emulator)
make run       # run over stdio for manual JSON-RPC poking

布局:

cmd/adb-mcp/main.go        entry: subcommands (update/version) or serve MCP over stdio
internal/tools/            thin MCP tool bindings
internal/adb/              the device layer: an adb.Client whose methods are the commands
internal/gradle/           host-side Gradle: builds (summary, log, background jobs), secret redaction, test and coverage reports
internal/uiauto/           pure uiautomator-hierarchy model + parsing (unit-tested)
internal/sdk/              resolves the Android SDK (adb/emulator paths, PATH env)
internal/concurrent/       RunAll/RunIndexed: fan out independent I/O calls, join, done
internal/guides/           the skill guides, embedded and served as MCP resources
internal/selfupdate/       the `adb-mcp update` release fetch/verify/swap
internal/bridgeupdate/     the `adb-mcp bridge install` release fetch/verify/install

依赖只能向内指向(tools → adb, gradle, uiauto → sdk),每个 internal/tools/<domain>.go 适配器都镜像一个同名的执行文件(设备命令是 adb.Client 方法)。完整映射、包依赖图以及添加工具的规则,请参阅:ARCHITECTURE.md。

文档

贡献

有关设置和约定,请参阅 CONTRIBUTING.md。发现安全问题?请参阅 SECURITY.md,不要公开提交问题。采用 MIT 许可。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。