podium-mcp 是一个 MCP(Model Context Protocol)服务器,旨在为 AI 智能体提供移动端和画布 UI 的自动化能力。它通过一个 stdio 端点暴露 51 个工具,替代通常需要配置多个 MCP 服务器的方案。
用途
podium-mcp 主要用于在 macOS 上对 iOS 和 Android 应用进行端到端测试、UI 自动化、调试和断言验证。它特别针对 React Native 应用和基于 WebView 的混合应用,以及使用 Canvas/WebGL 的游戏或图形界面。
主要能力
- 设备与应用管理:统一管理 iOS 模拟器(simctl)、真机 iPhone(devicectl)和 Android 设备(adb),通过平台标记的设备模型进行区分。
- 原生 UI 检查与手势:通过 idb / mobilecli 路由手势,并以 Maestro 作为回退,避免每次手势都启动 JVM。
- 端到端流程与批量自动化:支持声明式 Maestro 流程、有序动作批次,以及从工程师到 QA 的流程导出。
- 可信断言:采用“预言机阶梯”(WebView-DOM › 原生可访问性 › Maestro)返回可证伪、有证据的判定,并在无法验证时失败关闭(fail closed)。
- WebView DOM 与网络:解析 WKWebView DOM 以获取点击坐标、执行 JS、驱动导航,并以 JSON/HAR 格式捕获页面内 HTTP 流量。
- React Native 调试:通过 CDP 获取 Metro 控制台日志、网络请求和应用内状态,以及主机/模拟器崩溃报告。
- 真机支持:Android 模拟器/设备通过 adb(手势 + uiautomator 层级);真实 iOS 通过 devicectl 生命周期和可选的 WebDriverAgent 后端。
- Canvas 与游戏引擎自动化(无视觉):Canvas/WebGL 大脑将 Pixi/Konva/Fabric/Phaser/Three/Babylon UI 作为可寻址对象驱动(已在 WebKit 中实时验证)。实验性的引擎桥接可通过 AltTester 插桩构建驱动 Unity/GL(或 window.__podiumEngine WebGL 桥接),代码完成并通过模拟测试,但尚未在真实 Unity 构建上运行。
使用方式
环境要求
- macOS 且安装 Xcode 命令行工具(xcrun、simctl)
- Node.js ≥ 22(使用原生 fetch 和 WebSocket;.npmrc 设置 engine-strict=true)
- mobilecli(作为 npm 依赖自动捆绑,默认原生手势 + WebView 后端,无需单独安装)
- 可选:idb(idb + idb_companion)——当两者都存在时优先使用的原生手势后端,自动检测
- 可选:Maestro 在 PATH 中(或位于 ~/.maestro/bin)——run_flow 引擎和手势回退路径
- 可选:运行中的 Metro 打包器,用于 metro_* 调试工具
- 可选:Android SDK + adb——adb 路径仅检测,缺失时优雅降级
安装
- Claude Code 插件(推荐):一次性市场设置后安装,插件自动启动 MCP 服务器(全部 51 个工具)并附带五个技能。
- npx(零安装):可直接使用。
- 手动(从源码):构建服务器后,用任何 MCP 客户端注册。Claude Code 使用 .mcp.json 配置。
快速开始(使用顺序)
- podium_health——确认 xcrun / maestro / 原生后端可用性。
- device_list——选择一个已启动的模拟器 udid。
- 读取状态——app_list、app_state、screen_size、orientation_get。
- 驱动设备——app_launch,然后 tap_on / input_text / swipe / press_key,以及 set_location 和 orientation_set。用 run_steps 批量执行。
- 编写与验证——inspect_screen 发现元素,run_flow 进行声明式检查,然后 assert_visible / validate_flow 获得有证据的判定。
- 检查 WebView——webview_inspect → 点击坐标,webview_eval,webview_navigate,webview_network。
- 捕获与调试——screenshot / record_start → record_stop;metro_logs / metro_network / metro_state;crash_list / crash_get。
每个工具返回结构化 JSON,从不抛出异常——失败以 MCP 工具错误形式返回。
适用场景
- 在 macOS 上对 iOS 模拟器、真机 iPhone 和 Android 设备进行移动应用端到端测试。
- React Native 应用的调试,包括 Metro 日志、网络请求和状态检查。
- 混合应用(WebView 承载 UI)的 DOM 和网络检查。
- 使用 Pixi、Konva、Fabric、Phaser、Three、Babylon 等框架的 Canvas/WebGL 应用自动化。
- 需要可信断言和证据的 QA 流程。
限制
- Canvas/WebGL 需要配合的 JS 框架:Canvas 大脑通过选择器自动化 Pixi/Konva/Fabric/Phaser/Three/Babylon UI,前提是应用暴露场景图根(已验证)。原始/自定义 WebGL 画布、不透明/生产构建,或没有 AltTester / window.__podiumEngine 桥接的 Unity 无法通过选择器寻址——需回退到 tap_with_fallback 使用截图坐标,或对构建进行插桩。
- WebView 工具仅限开发/QA:生产 App Store 构建通常设置 isInspectable = false;工具返回可操作的错误并回退到坐标点击。
- WebView 内容进程内存无法从应用沙盒读取(平台限制)——使用间接信号(内存警告、进程终止)。
- Maestro 文本匹配器:是全字符串正则(IGNORE_CASE)——部分字符串不匹配;需逐字复制层级文本或用 .* 锚定。
- Android 需要 adb 在 PATH 中:一旦 adb 存在,手势/检查/截图即可工作;缺失时所有 Android 路径降级为结构化的“adb not found”结果。
- orientation_get 在没有原生后端时是截图宽高比启发式:iOS 模拟器不暴露直接的方向查询。
- record_start / record_stop 在进程内保持状态:需在同一连接上序列化 start → … → stop;每个 udid 一个活动录制(看门狗会最终确定从未停止的录制)。
- 游戏引擎工具为实验性:AltTester 路径尚未在真实 Unity 构建上验证;Unity-WebGL 需要应用暴露 window.__podiumEngine。引擎工具需要 AltTester 插桩构建(开发/暂存)或该 WebGL 桥接;在非插桩构建上它们失败关闭并给出可操作的错误——绝不回退到视觉。
平台范围(v0.3.0)
podium 自动化 iOS 模拟器、真机 iPhone(devicectl 生命周期 + 可选 WebDriverAgent)和 Android 模拟器/设备(adb 手势 + uiautomator 层级)。device_list 为每个目标标记平台,后端按目标选择。当工具链(如 adb)缺失时,这些路径降级为信息性结果而非失败。