
Podium Mcp
io.github.hoainho由 GitHub 账号 hoainho 发布v0.4.0更新于 Nov 3, 2026
Mobile E2E MCP (51 tools): iOS + Android, native UI + canvas/WebGL, no-vision, RN debug
概览
本地 stdio MCP 服务器,提供 51 个工具,用于驱动 iOS 模拟器、真机 iPhone 和 Android 设备:UI 自动化、端到端流程、断言、WebView 与 React Native 调试。
- 可以做什么
- 列出、启动并查看设备与应用,设置定位、打开深链、读取屏幕尺寸与方向
- 点击、输入、滑动、按键、旋转屏幕,并可批量执行手势;屏幕检查返回结构化元素而非截图
- 运行并导出声明式 Maestro 流程,用带证据的断言验证流程是否通过
- 检查 WebView:把 DOM 选择器解析为点击坐标、执行 JS、控制导航,并以 JSON 或 HAR 捕获页面内 HTTP 流量
- 通过 Metro CDP 调试 React Native:控制台日志、网络请求、应用内状态,以及主机与模拟器崩溃报告
- 按对象名称自动化 canvas/WebGL 界面(Pixi、Konva、Fabric、Phaser、Three、Babylon),并可截图或录屏
- 适用场景
- 适合需要在 Mac 上端到端测试或操作移动应用的场景:复现缺陷、编写并验证 Maestro 流程、检查 React Native 行为,或在不使用视觉模型的情况下自动化 canvas/WebGL 界面。
- 运行要求
- 以 stdio 在本地运行,可通过 npx 或源码安装。需要 macOS 与 Xcode 命令行工具、Node.js 22 或更高版本,以及已启动的模拟器或已连接设备。可选:idb、PATH 中的 Maestro、运行中的 Metro 打包服务、含 adb 的 Android SDK。真机 iOS 使用 WebDriverAgent 需设置 PODIUM_WDA_URL 变量。
安装
在 SourceWeft 中
- 打开 控制台中的 Podium Mcp,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
podium-mcp
One baton. Every instrument.
A single MCP stdio endpoint with 51 tools for iOS (simulator + real) and Android device control, native UI automation, end-to-end flows, trustworthy assertions, React Native debugging, WebView DOM + network inspection, and a no-vision canvas/WebGL brain for Pixi/Konva/Fabric/Phaser/Three/Babylon (validated live in WebKit) — plus an experimental engine bridge for instrumented Unity/GL builds (AltTester) — one connection instead of half a dozen servers.
[npm] [Glama] [mcp.so] [CI] [License: MIT]
[tools 51] [tests 378] [tokens ~5x cheaper] [canvas 6 live engines] [Node ≥22] [TypeScript strict] [MCP stdio] [PRs welcome]
[podium-mcp agent session — one prompt opens Safari on a live iOS simulator, types github.com/hoainho, explores the profile and opens a repository]
One prompt → podium drives Safari live → types the URL → explores the profile → opens a repo. Footage captured on a live iPhone 16 Pro simulator.
A podium is where a maestro stands — one place to conduct the whole orchestra. This MCP server unifies eight capability sets behind a single stdio endpoint:
- Device & app management — iOS simulators (
simctl), real iPhones (devicectl), and Android (adb) behind one platform-tagged device model. - Native UI inspection & gestures — route through
idb/mobilecliwith a Maestro fallback (no per-gesture JVM spin-up). - End-to-end flows & batch automation — declarative Maestro flows, ordered action batches, and an engineer→QA flow exporter.
- Trustworthy assertions — an oracle ladder (WebView-DOM › native a11y › Maestro) that returns falsifiable, evidenced verdicts and fails closed.
- WebView DOM + network — resolve
WKWebViewDOM to tap coordinates, evaluate JS, drive navigation, and capture in-page HTTP traffic as JSON/HAR. - React Native debugging — Metro console logs, network requests, and in-app state over CDP, plus host/simulator crash reports.
- Real devices — Android emulator/device via
adb(gestures +uiautomatorhierarchy); real iOS viadevicectllifecycle + an opt-in WebDriverAgent backend. - Canvas & game-engine automation, no vision — a canvas/WebGL brain drives Pixi/Konva/Fabric/Phaser/Three/Babylon UIs as addressable objects (validated live in WebKit). An experimental engine bridge drives Unity/GL via an AltTester-instrumented build (or a
window.__podiumEngineWebGL bridge) — code-complete + mock-tested, not yet run against a live Unity build.
Rather than wiring several MCP servers into every client config, podium-mcp exposes everything behind one connection, with a shared execFile layer (no shell), consistent structured errors, automatic retry around Maestro's iOS-driver flakiness, and a single health-check tool to confirm what's available on the host.
Table of contents
- Why
- Benchmarks
- Requirements
- Install
- Usage
- Quick start
- The 51 tools
- The oracle ladder — trustworthy assertions
- Native-first gesture backend
- WebView & RN network introspection
- Documented limits
- Architecture
- Development & testing
- Roadmap & contributing
- Releasing
- Prompt playbook & references
- Design ideas
- Contributing · Security · License
Why
Driving a React Native app end-to-end usually means juggling several MCP servers — one for device/app control, one for UI flows, one for Metro/debugger logs, another for WebView inspection — each with its own config entry, quirks, and failure modes. podium-mcp collapses that into one server with:
- a single
execFile-based command runner (no shell — arguments are passed verbatim), - consistent structured errors (a tool never crashes the server),
- automatic retry around Maestro's known iOS-driver flakiness,
- graceful degradation when a toolchain (e.g.
adb) is absent, - evidenced verdicts so an agent knows when a flow actually worked.
Benchmarks
Podium is built on two choices that make it fast and cheap: it drives UIs as structured data — never screenshots — and routes gestures through a native backend with no per-action JVM spin-up.
Token economics — no-vision is ~5× cheaper
A screenshot-driven agent sends an image to a vision model on every step. Podium returns a compact structured element list instead. On an equivalent 8-step mobile flow (1179×2556 screenshots vs ~20-element lists):
The gap compounds with every step — a 30-step session runs roughly 62k vs 12k input tokens. On top of per-step cost, the full 51-tool schema travels with every request (~3,612 tokens, ~71/tool); Podium keeps tool descriptions lean so the tool block never dominates the context window.
For canvas / WebGL UIs the advantage is structural, not just cheaper: the Canvas Brain addresses objects by name and text, where a screenshot-only agent must re-analyze pixels on every frame.
Speed — native-first gesture backend
Gestures route through idb / mobilecli instead of spinning up Maestro's JVM
per action (measured on a live iPhone 16 Pro simulator):
One connection, not six
All 51 tools — device & app control, UI automation, declarative Maestro flows, evidenced assertions, WebView DOM + network capture, React Native / Metro debugging, and no-vision canvas/WebGL automation (plus an experimental engine bridge for instrumented Unity/GL) — sit behind a single stdio endpoint, replacing the usual stack of half a dozen separate MCP servers.
Token figures are heuristic estimates (~4 chars/token; Anthropic's ~750 px/token image formula) — reproduce with
npm run token-bench, or swap in the Anthropiccount_tokensAPI for exact counts. Speed figures were measured on a live iPhone 16 Pro simulator (npm run benchmark).
Requirements
- macOS with Xcode command-line tools (
xcrun,simctl) - Node.js ≥ 22 (uses native
fetchandWebSocket;.npmrcsetsengine-strict=true) mobilecli— bundled automatically as an npm dependency; the default native gesture + WebView backend (no separate install)- (optional)
idb(idb+idb_companion) — preferred native gesture backend when both are present; auto-detected - (optional) Maestro on
PATH(or at~/.maestro/bin) — therun_flowengine and the gesture fallback path - (optional) a running Metro bundler for the
metro_*debugging tools - (optional) Android SDK +
adb— adb paths are detection-only and degrade gracefully when absent
Platform scope (v0.3.0): podium automates iOS simulators, real iPhones (
devicectllifecycle + opt-in WebDriverAgent), and Android emulators/devices (adbgestures +uiautomatorhierarchy).device_listtags each target with its platform and the backend is selected per target. When a toolchain (e.g.adb) is absent, those paths degrade to an informative result instead of failing.
Install
Claude Code plugin (recommended)
No manual config — one-time marketplace setup, then install:
The plugin auto-starts the MCP server (all 51 tools) and ships five skills:
npx (zero install)
Manual (from source)
Usage
Register the built server with any MCP client. Claude Code (.mcp.json):
Quick manual smoke test over raw stdio (lists the 51 registered tools):
Always call podium_health first to confirm which toolchain is available on the host.
Quick start (order of use)
podium_health— confirmxcrun/maestro/ native backend availability.device_list— pick a booted simulatorudid.- Read state —
app_list,app_state,screen_size,orientation_get. - Drive the device —
app_launch, thentap_on/input_text/swipe/press_key, plusset_locationandorientation_set. Batch several withrun_steps. - Author & verify —
inspect_screento discover elements,run_flowfor declarative checks, thenassert_visible/validate_flowfor an evidenced verdict. - Inspect WebViews —
webview_inspect→ tap coordinates,webview_eval,webview_navigate,webview_network. - Capture & debug —
screenshot/record_start→record_stop;metro_logs/metro_network/metro_state;crash_list/crash_get.
The 51 tools
Every tool returns structured JSON and never throws — failures come back as MCP tool errors. See
docs/tool-catalog.mdfor the authoritative per-parameter reference.Platform support (v0.3.0): the gesture / inspect / lifecycle tools below run on iOS simulators, real iPhones (
devicectl+ opt-in WebDriverAgent viaPODIUM_WDA_URL), and Android (emulator/device viaadb; hierarchy fromuiautomator).device_listtags each device with its platform and the backend is selected per target.
Game engine — Unity / GL via AltTester, no vision · experimental (4)
Status: experimental. The wire shapes are unit-tested against mocks; the AltTester path has not yet been validated against a live Unity build (
engine-smokeskips until an instrumented build is provided), and Unity-WebGL needs the app to exposewindow.__podiumEngine. Engine tools require an AltTester-instrumented build (dev/staging) or that WebGL bridge; on a non-instrumented build they fail closed with an actionable error — never a vision fallback. For canvas/WebGL apps using a JS framework, the canvas brain below is the validated path.
Canvas brain — Pixi/Konva/Fabric/Phaser/Three/Babylon, no vision (3)
Validated live: all six frameworks pass a Playwright-WebKit (≈ WKWebView) suite at DPR 1 + 3 (
npm run test:canvas, 19 tests). Canvas tools require an inspectable WKWebView hosting a supported framework with its root reachable (commonly onwindow, or Pixi's__PIXI_APP__). No framework / no inspectable WebView → fails closed with an actionable error — never a vision fallback.
Diagnostics (1)
Health & toolchain (1)
Device & simulator (6)
Apps (6)
Capture (3)
UI inspection & gestures (8)
Flows & batch automation (4)
Assertions & verdicts — the oracle ladder (5)
WebView DOM & network (4)
React Native debugging — Metro CDP (4)
Crash diagnostics (2)
The oracle ladder — trustworthy assertions
"It works" is operationalized as a falsifiable, evidenced verdict — never "looks ok". Assertions and validate_flow resolve visibility through a three-rung ladder, using the strongest available signal:
- WebView DOM — when an inspectable
WKWebViewis present, query the real DOM. - Native accessibility — the native AX element set (via
idb/mobilecli). - Maestro —
assertVisible/assertNotVisibleas the fallback.
assert_not_visible fails closed: if absence can't be positively verified (e.g. a WebView is unreadable), it reports failure rather than a false pass. Every verdict names the oracle that produced it, so an agent can weight its confidence.
Native-first gesture backend
Imperative gestures (tap_on, input_text, swipe, press_key, orientation_set, run_steps) and inspect_screen route through the fastest available backend, probed once and cached (with a short negative-cache TTL so a backend that starts after launch is picked up):
idb— when bothidbandidb_companionare installed (native, fastest).mobilecli— the bundled npm dependency (prebuilt Go binary). Default; no install.- Maestro fallback — when no native backend resolves, or for actions it can't express (double/long-press,
UPSIDE_DOWN). The gesture generates a minimal flow withlaunchApp: { stopApp: false }, foregrounding the app without restarting so state is preserved.
Each result reports the backend it used. Set PODIUM_DISABLE_NATIVE=1 to force Maestro. Eliminating the per-gesture JVM spin-up cut tap_on ~14.7 s → ~0.6 s and inspect_screen ~8.9 s → ~0.9 s on an iPhone 16 Pro simulator. Run npm run benchmark for a full pass/fail sweep.
Maestro flakiness retry: when the fallback runs, its iOS driver intermittently fails with Failed to connect to 127.0.0.1:<port>. Flows retry up to 2× with 2 s / 5 s backoff and report the retries count; a persistent failure returns the raw output with remediation hints.
WebView & RN network introspection
Two distinct network layers, two tools:
metro_networkcaptures requests on the RN/Hermes target via the CDP Network domain — the right tool for a native RN app's ownfetch.webview_networkcaptures traffic inside aWKWebView: it injects afetch/XHRrecorder (rich — method/status/headers/body for calls after capture starts) and reads the browser's Performance Resource Timing buffer (includeResources, default on) — every request since navigation, including pre-capture ones (URL/timing/size). The merge yields a near-complete request list, exported as redacted JSON or HAR 1.2.
For an RN shell that hosts its UI in a WebView, the app's API calls run in the web layer — so metro_network sees nothing and webview_network is the tool to reach for. WebView tools require WKWebView.isInspectable = true (default in debug/staging builds; off in production); when none is found they return an actionable error.
Documented limits (by design, not bugs)
- Canvas/WebGL needs a cooperating JS framework — the canvas brain automates Pixi/Konva/Fabric/Phaser/Three/Babylon UIs by selector when the app exposes its scene-graph root (validated live). A raw/custom WebGL canvas, an opaque/production build, or Unity without an AltTester /
window.__podiumEnginebridge is not selector-addressable — fall back totap_with_fallbackwith screenshot-derived coordinates, or instrument the build. - WebView tools are dev/QA only — production App Store builds typically set
isInspectable = false; tools return an actionable error and fall back to coordinate taps. - WebView content-process memory is unreadable from the app sandbox (platform limit) — use indirect signals (memory warnings, process terminations).
- Maestro
text:matcher is full-string regex (IGNORE_CASE) — partial strings don't match; copy hierarchytextverbatim or anchor with.*. - Android requires
adbonPATH— gestures / inspect / screenshot work onceadbis present; when it's absent every Android path degrades to a structured "adb not found" result. orientation_getis a screenshot-aspect heuristic when no native backend is present — iOS simulators expose no direct orientation query.record_start/record_stopkeep state in-process — serializestart→ … →stopon one connection; one active recording per udid (a watchdog finalizes one that's never stopped).
Architecture
Development & testing
359 unit/integration tests across 31 files, plus 19 live canvas-bridge tests (378 total), all passing — including the v0.3.0 device-target registry, the Android adb driver + uiautomator parser, the AltTester engine client + WebGL bridge, the devicectl/WDA real-iOS parsers, plus the v0.2.0 oracle ladder, recording watchdog, gesture-parity, HAR export, WebView, and Metro paths.
Standards: TypeScript strict, no as any / @ts-ignore, no shell execution (all commands via lib/exec.ts), tools return structured errors instead of throwing. See CONTRIBUTING.md for the "add a new tool" checklist.
E2E on CI: the E2E (simulator) workflow boots a real iOS simulator on a macOS runner and runs the smoke suites nightly + on demand (not a PR gate — simulator runs are slow). full-smoke.e2e.mjs asserts the happy path where a target exists and the real structured-error path where a dependency is absent (a debug isInspectable app for WebView; a connected RN app for metro_*).
Roadmap & contributing
podium-mcp is production-ready for iOS/Android UI automation and no-vision canvas/WebGL (Pixi/Konva/Fabric/Phaser/Three/Babylon — validated live). The frontier, where a contributor can make a real dent, lives in open issues:
High-impact — help wanted
- #1 — validate the AltTester/Unity engine path against a live instrumented Unity build (the biggest gap to real Unity automation).
- #2 — real-device WKWebView e2e for the canvas brain (today validated in Playwright WebKit).
- #3 — Unity-WebGL adapter: auto-detect + a drop-in
window.__podiumEnginebridge.
Good first issues — good first issue
- #4 — more canvas adapters (PlayCanvas, Cocos Creator, p5.js).
- #5 — expose
canvas_hittest/canvas_object_recttools. - #7 — exact token counts via the Anthropic
count_tokensAPI. - #6 — address Konva Group/Container targets.
Adding a tool follows one checklist in CONTRIBUTING.md: TypeScript strict, no shell, structured-errors-never-throw, a vitest test, and a row in the tool catalog. PRs welcome.
Releasing
server.json is the official MCP Registry manifest. Pushing a v* tag runs
Publish to npm then
Publish to MCP Registry (GitHub OIDC for the
io.github.hoainho/* namespace — no long-lived token). Both workflows run typecheck → build → test
as a gate first; the registry publish only succeeds once the matching npm version is live, and
versions are immutable.
Prompt playbook & references
prompts/— copy-paste prompts for e2e flows, test cases, feature verification, bug fixing, and device control. Each names the podium tools it drives and was validated on a real simulator. Start withprompts/README.md.docs/tool-catalog.md— authoritative tool-by-tool reference.docs/e2e-demo.md— a real transcript against a booted iPhone 16 Pro simulator running a production RN app.
Design ideas
- One podium, one connection. A single server fronts every mobile capability so an agent configures one endpoint and discovers all 51 tools at once.
- Safe by construction. Every external command runs through an
execFilelayer with an explicit argument array — never a shell string. - Never crash the conductor. Tools return structured results and errors instead of throwing; one bad call can't take the server down.
- Degrade, don't fail. A missing toolchain (e.g. Android's
adb) yields an informative result rather than a hard error. - Prove it, don't guess. Assertions return evidenced verdicts via the oracle ladder and fail closed when they can't verify.
Contributing
Contributions welcome — see CONTRIBUTING.md and the Code of Conduct. Use the issue templates for bugs and feature requests.
Security
Please report vulnerabilities privately per SECURITY.md — do not open a public issue.
SECURITY.md also documents the webview_eval / run_flow trust boundary and the PII-in-transcript caveat.
License
MIT © 2026 hoainho
来源:README.md,提交 7bcafbb
工具
0版本历史
1- v0.4.0最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分