☰
mobile-mcp:基于MCP协议统一操控iOS与Android的移动端自动化方案
2026/11/3 6:31:27 网站建设 项目流程

1. 移动端自动化的痛点与 mobile-mcp 的切入点

做过移动端自动化的人都有一个共同感受:环境搭建比写用例还累。Appium 要装 Node、配 JDK、下 Android SDK、搞 WebDriverAgent 签名,一套流程走下来,半天没了。更别提 iOS 真机调试时那些证书、开发者模式、设备信任的连环坑。我身边不少测试工程师,光是让脚本在 iOS 上跑起来,就折腾了整整一周。

mobile-mcp这个项目,本质上是在解决一个很具体的问题:让 AI Agent 或者自动化脚本,用统一的方式去操控 iOS 和 Android 设备。它基于 MCP(Model Context Protocol)协议,把移动设备的操作能力封装成标准化的工具接口,上层无论是 Claude、Cursor 还是自己写的 Agent,都能通过这套接口去点击、滑动、输入、截图、获取页面结构。

MCP 是什么?简单说,它是让大模型能够调用外部工具的一套协议规范。你可以把它理解成"AI 世界的 USB 接口"——以前每个工具都要单独适配每个 AI 平台,现在大家都按 MCP 标准来,插上就能用。mobile-mcp就是把这个标准应用到了移动端设备控制上。

这个项目适合谁?三类人值得关注:一是做移动端自动化测试的工程师,想摆脱 Appium 那套重环境的束缚;二是搞 AI Agent 开发的,需要让 Agent 具备操控手机的能力;三是做跨端兼容性验证的,想用一套脚本同时覆盖 iOS 和 Android。哪怕你之前没接触过 MCP,只要会用命令行、能看懂基本的配置,这篇文章的内容都能直接上手。

2. 核心架构拆解:mobile-mcp 到底怎么工作的

2.1 MCP 协议层的角色定位

要理解mobile-mcp,先得搞清楚 MCP 的三层结构。最底层是设备控制层,负责跟 iOS 的 WebDriverAgent 或者 Android 的 ADB/UIAutomator 打交道;中间是MCP Server 层,把设备操作抽象成标准工具(tool),比如tap、swipe、screenshot、get_page_source;最上层是MCP Client 层,也就是 AI 应用或者你的脚本,通过 stdio 或 SSE 跟 Server 通信。

这种分层的好处很明显。设备控制层换了实现方式,上层完全不用改。比如你原来用 Appium 驱动 Android,现在想换成直接调 ADB,只要 MCP Server 的接口不变,Agent 那边的代码一行都不用动。这就是协议标准化的价值。

实际部署时,mobile-mcp通常以本地进程方式运行,通过 stdio 跟 Client 通信。配置大概长这样:

{ "mcpServers": { "mobile-mcp": { "command": "npx", "args": ["-y", "@mobile-mcp/server"], "env": { "ANDROID_HOME": "/Users/yourname/Library/Android/sdk", "IOS_DEVICE_ID": "auto" } } } }

这段配置放在 Claude Desktop 或者 Cursor 的 MCP 设置里,重启后就能在对话中直接调用移动设备操作了。

2.2 iOS 与 Android 双端适配的差异处理

iOS 和 Android 的自动化底层机制完全不同,这是mobile-mcp最需要花心思的地方。

Android 这边相对成熟。通过 ADB 可以完成大部分操作:adb shell input tap x y点击、adb shell input swipe滑动、adb shell uiautomator dump获取页面结构、adb exec-out screencap截图。这些命令稳定、延迟低,几乎不需要额外依赖。mobile-mcp在 Android 侧主要就是对这些 ADB 命令的封装和结果解析。

iOS 就麻烦得多。苹果不允许直接通过 USB 发送触摸事件,必须依赖 WebDriverAgent(WDA)这个中间层。WDA 是一个运行在设备上的 HTTP 服务,通过 XCUITest 框架来操控 UI。mobile-mcp需要先在你的 Mac 上编译并部署 WDA 到 iOS 设备,然后通过 HTTP 请求跟它通信。

这里有个关键细节:WDA 的签名问题。免费开发者账号签的 WDA 只有 7 天有效期,过期后需要重新签名部署。很多团队用个人账号调试,每周一早上第一件事就是重新签 WDA,非常影响效率。我的建议是,如果项目长期做 iOS 自动化,花 99 美元买个开发者账号,签名有效期延长到一年,省心太多。

对比维度Android 侧iOS 侧
底层驱动ADB + UIAutomatorWebDriverAgent + XCUITest
部署难度低,装好 SDK 即可高,需编译签名 WDA
签名有效期无限制免费账号 7 天,付费账号 1 年
截图方式adb exec-out screencapWDA HTTP 接口
页面结构获取uiautomator dumpWDA source 接口
输入法处理需切换 ADB Keyboard直接 sendKeys

2.3 工具接口设计的取舍逻辑

mobile-mcp暴露给上层的工具接口,设计上做了不少取舍。比如截图这个操作,它没有返回图片文件路径,而是直接返回 base64 编码的图片数据。为什么?因为 MCP Client 可能是运行在另一台机器上的 AI 服务,返回路径它读不到,返回 base64 才能让模型直接"看到"屏幕内容。

再比如页面结构获取,它返回的是精简后的元素树,而不是完整的 XML。完整的 UIAutomator dump 动辄几万行,直接塞给大模型会爆 token。mobile-mcp会过滤掉不可见元素、合并嵌套层级、只保留可交互节点,把数据量压缩到原来的十分之一左右。这个处理非常关键,直接决定了 Agent 能不能在合理的 token 预算内理解页面。

还有一个细节是操作等待策略。移动端 UI 有动画、有网络加载,点完一个按钮立刻获取页面结构,很可能拿到的是过渡态。mobile-mcp在每次操作后默认等待 500ms,并且提供了wait_for_element工具让上层显式等待某个元素出现。这个默认值是可以配的,实测下来 500ms 对大部分 App 够用,但如果是重动画的页面,建议调到 1000ms 以上。

3. 从零搭建 mobile-mcp 实操环境

3.1 Android 侧环境准备与验证

先说 Android,因为简单,先跑通它能建立信心。

第一步,装 Android SDK。如果你已经装了 Android Studio,SDK 一般在~/Library/Android/sdk(Mac)或者%LOCALAPPDATA%\Android\Sdk(Windows)。没装的话,单独下 command line tools 也行,不需要完整的 IDE。

第二步,配置环境变量。把platform-tools和emulator目录加到 PATH 里:

export ANDROID_HOME=$HOME/Library/Android/sdk export PATH=$PATH:$ANDROID_HOME/platform-tools export PATH=$PATH:$ANDROID_HOME/emulator

第三步,验证设备连接。手机开启开发者模式(连续点击"版本号"7 次),打开 USB 调试,插上电脑:

adb devices

正常应该输出类似emulator-5554 device或者ABCD1234 device的内容。如果显示unauthorized,在手机上确认那个"允许 USB 调试"的弹窗就行。

第四步,验证核心命令。手动跑一遍点击和截图,确认 ADB 本身没问题:

adb shell input tap 500 1000 adb exec-out screencap -p > /tmp/screen.png

截图能正常打开,说明 Android 侧基础环境 OK。

注意:部分国产手机(小米、OPPO、vivo)需要额外开启"USB 调试(安全设置)"才能模拟点击,只开普通 USB 调试的话,input tap会静默失败,不报错但也没效果。这个坑我踩过,排查了半天以为是坐标算错了。

3.2 iOS 侧 WebDriverAgent 部署要点

iOS 侧是重头戏。你需要一台 Mac(Windows 做不了 iOS 自动化)、一个 Apple ID、一台 iOS 设备。

第一步,装 Xcode,从 App Store 下就行,装完打开一次同意协议。

第二步,获取 WebDriverAgent 源码。Appium 项目里带了 WDA,路径在appium-webdriveragent目录下。或者直接用 Appium 的appium driver install xcuitest命令,它会自动把 WDA 拉下来。

第三步,用 Xcode 打开WebDriverAgent.xcodeproj,配置签名。在 Signing & Capabilities 里,Team 选你的 Apple ID,Bundle Identifier 改成一个唯一的字符串,比如com.yourname.wda。然后选中 WebDriverAgentRunner target,同样配置一遍。

第四步,部署到设备。选中 WebDriverAgentRunner scheme,目标设备选你的 iPhone,按 Cmd+U 运行测试。Xcode 会把 WDA 装到手机上并启动。

第五步,验证。手机上会看到一个无图标的 App 在运行,Mac 上执行:

curl http://localhost:8100/status

返回 JSON 里有"state": "success"就说明 WDA 跑起来了。如果连不上,先检查端口转发:

iproxy 8100 8100

这个命令把设备的 8100 端口映射到 Mac 本地,WDA 默认监听这个端口。

提示:iOS 16 以上版本,需要在设置-隐私与安全性-开发者模式里手动开启开发者模式,然后重启设备。这个开关藏得很深,很多人卡在这一步,WDA 装上了但连不上,就是因为它。

3.3 MCP Server 接入 AI 客户端

设备侧跑通后,把mobile-mcp接进 AI 客户端。

以 Claude Desktop 为例,编辑配置文件(Mac 在~/Library/Application Support/Claude/claude_desktop_config.json,Windows 在%APPDATA%\Claude\claude_desktop_config.json):

{ "mcpServers": { "mobile-mcp": { "command": "npx", "args": ["-y", "@mobile-mcp/server"], "env": { "ANDROID_HOME": "/Users/yourname/Library/Android/sdk", "IOS_WDA_URL": "http://localhost:8100" } } } }

重启 Claude Desktop,在对话框里输入"列出当前连接的移动设备",如果配置正确,它会调用mobile-mcp的list_devices工具并返回设备列表。

Cursor 的配置类似,在 Settings 里找到 MCP 配置入口,粘贴同样的 JSON 即可。不同客户端的配置路径不一样,但核心就是command、args、env这三项。

4. 典型自动化场景的落地实现

4.1 跨端 UI 回归测试脚本

假设你要验证一个登录流程在 iOS 和 Android 上都能正常走通。用mobile-mcp配合 Agent,可以写一套逻辑同时跑两端。

核心思路是:Agent 拿到页面结构后,根据元素的文本或 accessibility id 来定位,而不是写死坐标。这样同一套逻辑在两端都能用,因为两端元素的文本通常是一致的。

实际操作时,我会先让 Agent 做一次"探索":打开 App,获取页面结构,把可交互元素列出来。然后基于这份结构写操作序列。比如登录流程:

  1. 调用get_page_source获取当前页面
  2. 找到文本为"手机号"的输入框,调用tap聚焦
  3. 调用input_text输入手机号
  4. 同样方式输入密码
  5. 找到"登录"按钮,tap
  6. 等待 2 秒,get_page_source验证是否进入首页

这套流程在 Android 和 iOS 上唯一的差异是输入框的定位方式。Android 上 UIAutomator 的 resource-id 通常比较规范,iOS 上则更依赖 accessibility identifier。如果开发没加 accessibility id,就只能靠文本定位,稳定性会差一些。

实操心得:推动开发给关键元素加 accessibility identifier,这是移动端自动化稳定性提升最明显的一招。加一个 id 的成本对开发来说几乎为零,但对自动化脚本来说,定位从"猜"变成了"确定"。

4.2 结合 AI 的异常页面识别

传统自动化脚本最怕遇到预期外的弹窗——广告、更新提示、权限申请。脚本按固定流程走,遇到弹窗就卡死。mobile-mcp配合 AI 可以很好地解决这个问题。

思路是:每次操作前先截图,把截图交给多模态模型判断"当前页面是否有阻断性弹窗"。如果有,让模型决定点哪个按钮关闭它。这个判断逻辑用自然语言描述就行,不需要写复杂的规则。

实际配置时,可以在 Agent 的系统提示里加一段:

每次执行操作前,先调用 screenshot 工具获取当前屏幕。 如果屏幕上有弹窗、广告、权限申请等阻断性元素, 优先找到关闭按钮(通常是"跳过"、"关闭"、"以后再说"、"允许")并点击, 然后再继续原定操作流程。

这段提示词实测下来,对常见的开屏广告、版本更新弹窗识别率很高。模型能理解"跳过"和"立即更新"的区别,知道该点哪个。

4.3 批量设备并行操作

做兼容性测试时,经常需要同时在多台设备上跑同样的操作。mobile-mcp支持通过device_id参数指定目标设备,所以可以起多个 Agent 实例,每个绑定一台设备。

设备多了之后,ADB 的端口管理要注意。每台 Android 设备通过adb devices拿到的序列号是唯一的,直接用序列号指定即可。iOS 设备则要注意 WDA 端口冲突,每台设备需要独立的 iproxy 端口映射:

iproxy 8101 8100 -u <device1_udid> iproxy 8102 8100 -u <device2_udid>

然后配置里对应IOS_WDA_URL分别指向 8101 和 8102。

设备数量建议方案注意事项
1-2 台单机直连无需额外配置
3-5 台多端口映射注意 USB 供电,建议用带电源的 Hub
5 台以上分布式部署每台 Mac 挂 2-3 台设备,通过网络汇总结果

5. 踩坑记录与问题速查

5.1 高频问题排查表

现象可能原因排查方向
adb devices 显示 unauthorized手机未确认调试授权重新插拔,确认手机弹窗
input tap 无效果未开启安全调试/坐标错误检查开发者选项,用截图验证坐标
WDA 启动后 curl 无响应端口未转发/开发者模式未开检查 iproxy,确认设备开发者模式
截图返回黑屏视频版权保护/DRM 页面换普通页面测试,DRM 页面无法截图
元素定位失败accessibility id 缺失用文本定位兜底,推动开发加 id
操作后页面结构未更新动画未结束增加等待时间或显式等待元素
iOS 输入中文乱码WDA 输入法问题改用粘贴方式或切换输入法

5.2 那些文档里不会写的经验

坐标系的坑。Android 的input tap用的是屏幕绝对坐标,但不同分辨率设备坐标完全不同。iPhone 的 WDA 用的是点(point)而不是像素(pixel),Retina 屏上 1 点等于 2 或 3 像素。如果你从截图上量像素坐标直接传给 WDA,位置会偏。正确做法是用页面结构里元素的坐标,那是已经换算好的点坐标。

输入法的坑。Android 上用input text输入中文会失败,因为 ADB 的 input 命令不支持非 ASCII 字符。解决方案是装 ADB Keyboard,通过广播的方式输入:

adb shell am broadcast -a ADB_INPUT_TEXT --es msg '你好'

iOS 上 WDA 的 sendKeys 对中文支持还行,但遇到 emoji 偶尔会出问题。

后台进程的坑。WDA 跑久了会内存泄漏,连续跑几个小时可能就无响应了。我的做法是每跑 100 个用例重启一次 WDA,虽然麻烦但稳定。Android 的 UIAutomator 相对稳定,但 ADB 连接偶尔会断,加个心跳检测,断了自动重连。

权限弹窗的坑。iOS 首次安装 App 后的权限弹窗(通知、定位、相机),WDA 默认处理不了,因为那些弹窗属于系统层,不在 App 的 UI 树里。需要用autoAcceptAlerts能力,或者提前用xcrun simctl privacy预授权(模拟器才行,真机得手动点一次)。

6. 扩展玩法与个人体会

mobile-mcp的价值不止于测试。我最近在用它做一些有意思的事情:比如让 Agent 自动整理手机相册,根据截图内容分类;比如监控某个 App 的特定页面变化,有更新就通知我;比如批量处理手机上的重复操作,像每天签到这类事情完全交给 Agent。

还有一个方向是结合其他 MCP Server 做联动。比如mobile-mcp负责操控手机,playwright-mcp负责操控浏览器,两个配合可以做跨端的流程验证——手机上操作后,去网页端确认数据同步是否正确。这种跨端联动的场景,以前要写大量胶水代码,现在通过 MCP 协议组合几个 Server 就能实现。

我个人在实际操作中的体会是,移动端自动化的核心难点从来不是"怎么点",而是"怎么稳定地点"。mobile-mcp把底层差异屏蔽掉之后,稳定性问题就集中到了元素定位和等待策略上。把这两件事做好,脚本的可靠性会有质的提升。另外,别指望 AI 能完全替代人工判断,它更适合做那些重复、规则明确的操作,遇到复杂业务逻辑还是需要人来设计流程。把 AI 当成一个执行力很强但需要明确指令的助手,这个定位比较准确。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询