DEBUG IOS APP WITH AI
Three families of agent tooling, one honest comparison, and the gap none of them closes alone.
An AI agent needs three things to debug an iOS app: a way to build and launch it, a way to drive its UI, and a way to see what the app did internally — the requests it sent, the logs it wrote, the rows it stored. Today's tooling covers the first two well and the third almost not at all. Build servers automate Xcode. UI-automation servers replay taps through the accessibility tree. Only an in-app SDK reports runtime state, and it costs one dependency in your debug build. Most teams end up combining two of the three.
XcodeBuildMCP, Apple's built-in Xcode MCP, ios-simulator-mcp. They compile, install, boot a simulator, tail the console, attach LLDB. They run on the Mac that holds your project, and they stop at the app's front door.
mobile-mcp, Appium, Argent. They read the accessibility tree and synthesize taps, swipes and text input. Excellent for walking a flow. They see what a screen reader sees — not why a screen rendered empty.
AppTelepath. Linked into a debug build, it exposes network traffic, logs, SQLite, UserDefaults, sandbox files, crashes and hangs as structured tool calls — over a hosted MCP endpoint, with no cable and no local server.
These three overlap less than their descriptions suggest. The matrix below is the part nobody publishes.
The agent finds the failure, reads the body that caused it, fixes the decoder, and confirms the fix — without asking anyone for a screenshot.
telepath_diagnose ✓ error · 3 log clusters · 1 failed requesttelepath_network_requests sinceSeconds=120 ✓ GET /v2/profile → 500 ×3 · 96 mstelepath_network_request_detail id=42 ✓ 1.2 KB body · key "avatar_url" missingtelepath_tap ref=s4n7 # after the decoder fix ✓ HomeViewController · incidents 0
Seven tools an AI agent can point at an iOS app, and the nine questions that decide which one you need. Two rows are ours to lose — they are in the table, not in a footnote.
| AppTelepath | XcodeBuildMCP | mobile-mcp | Argent | ios-simulator-mcp | Xcode MCP | Appium | |
|---|---|---|---|---|---|---|---|
| Physical device | Yes — the device dials out | Yes — USB or Wi-Fi | Yes — with WDA + tunnel | No on iOS; yes on Android | No | Build and run | Yes — with WDA + provisioning |
| Simulator | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| Xcode on the agent's machine | Not required | Required — Xcode 16+ | Required for iOS | Required | Required, plus idb | It is Xcode — 26.3+ | Required for iOS |
| WebDriverAgent, tunnel or cable | None | None; code signing still applies | WDA + go-ios + device tunnel | Bundled simulator server | idb | None | WDA built and installed per device |
| Hosted — works across the internet | Yes — hosted MCP endpoint | No — local server | No — local server | No — local server | No — local server | No — local bridge to Xcode | Self-hosted grid or a device cloud |
| App runtime internals — network, logs, DB, UserDefaults, files | Yes — all of them | Console logs and LLDB | No — accessibility tree only | Logs and profiling | No — accessibility tree only | Build diagnostics | No |
| Drives the UI | Yes — tap, type, swipe by stable ref | Simulator only | Yes | Yes — gestures and hardware keys too | Yes | No | Yes — the reference implementation |
| Requires a change to your app | Yes — one pod, debug builds only | No | No | No | No | No | No |
| Platforms | iOS only — Android on the roadmap | Apple platforms | iOS, Android | iOS, Android, TV, Electron | iOS Simulator | Apple platforms | iOS, Android, Windows and more |
Checked 20 August 2026 against each project's own documentation. All of them ship fast; verify before you commit to one.
The last two rows are the trade. Every tool that needs nothing from your app is also blind to everything inside it — an accessibility tree cannot tell you that the feed is empty because /v2/feed returned 500 with a malformed body. An SDK can, because it lives on the same side of the network stack as your code. That is the whole bargain. It also means the two categories are complements, not competitors — building with XcodeBuildMCP and observing with AppTelepath in the same session costs nothing but two MCP entries.
The live demo on the home page runs the same commands against a real session — screenshot, view hierarchy, tap, network, diagnose.
Open the demoCompiling is not verifying. The loop that actually closes is: build, install, launch, navigate to the screen you touched, then ask what broke. The first three steps belong to an Xcode-side server. The last one is where agents stall and ask you for a screenshot.
telepath_screen_digest answers it in text: the current view controller, the visible copy, and every interactive element with a stable ref. Cheaper than an image and directly actionable — the agent taps by ref, never by guessed coordinates. telepath_tap then returns what changed plus the error logs and failed requests recorded during that tap, so a step that worked needs no follow-up call at all.
# the agent already built and launched the app telepath_screen_digest // current screen as text, with refs telepath_tap { "ref": "s4n7" } // tap by ref; the response carries the consequences telepath_diagnose // anything wrong in the last 60 seconds?
telepath_diagnose returns one severity, one headline, deduplicated error-log clusters, failed and slow requests, crashes and hangs — the whole "what just went wrong" question in a single call, ranked. Fed a clean result, the agent moves on; fed an error cluster, it has the stack it needs.
A 500 that only the app sees is invisible to every accessibility-based tool. The screen just shows an empty list; the agent reports "the feed did not load" and starts guessing. The SDK captures traffic inside the app's own network stack, so the agent reads the exact bytes the app read.
Query the change, not the whole log: telepath_network_requests takes sinceSeconds. Large bodies page through bodyOffset, and the full body size is reported separately from the captured window — so a truncated capture never reads as a short response. When a server-side fix lands, telepath_replay_request re-sends the captured request through the app's stack, with the app's own headers, cookies and TLS. That is a different test from repeating it in curl.
telepath_network_requests { "sinceSeconds": 120, "urlContains": "/v2/" } telepath_network_request_detail { "id": 42, "maxBody": 65536 } telepath_replay_request { "id": 42 }
No MCP client? The same commands over HTTP.
curl -s https://apptelepath.com/api/invoke \
-H "Authorization: Bearer $TELEPATH_KEY" \
-H 'content-type: application/json' \
-d '{"command":"net.list","params":{"limit":20,"urlContains":"/v2/"}}'
Weak-network simulation is the other half of this: telepath_simulate can fail only the URLs you name, return a real 500 rather than a connection error, or hang a request without answering it — which is the only reliable way to find out whether your timeout handling exists.
Real cellular, real thermal throttling, a real keyboard, a build that came out of CI — plenty of bugs never appear in a simulator. This is exactly where local tooling gets expensive: WebDriverAgent installed on the device, a tunnel process, a cable, and a Mac in the same room as the phone.
AppTelepath inverts the direction. The SDK opens an outbound WebSocket from the device to the hosted service, so the device needs network and nothing else. The agent connects to the hosted MCP endpoint. Neither has to be near the other — a tester's phone in another country is one telepath_list_devices call away, and the same is true of a simulator on a colleague's Mac.
# one call each; no cable, no tunnel telepath_list_devices // every device attached to the workspace telepath_simulate // weak network, GPS route, push — including denied states telepath_repro // record, act, stop, summarized timeline — one call telepath_crash_reports // crashes with stacks
Stripped Staging builds do not resolve their own symbols, and a debugger that invents a nearby symbol name is worse than one that admits it cannot. Unresolved frames come back as image offsets together with the image UUIDs and load addresses, so the agent symbolicates locally, where the dSYM already is:
# the agent has a shell; let it use one atos -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp \ -arch arm64 -l 0x1044b8000 0x1044c9a1c
Every tool on this page can return a screenshot. What separates them is the state of your context window afterwards.
The default is a summary, not the full hierarchy: interactive elements and visible text, layout containers dropped, trimmed to a token budget. Whatever gets cut is counted and reported — a truncated tree that pretends to be complete is worse than no tree.
Every node carries a ref, and tap and input accept it directly. A ref from an older snapshot is an explicit error, never a silent tap on whatever now occupies those coordinates.
A tap returns the view controller transition, the elements that appeared and disappeared, and the error logs and failed requests recorded during it. The confirmation screenshot the agent would have taken next is already unnecessary.
sinceSeconds on network queries, telepath_ui_diff for what moved on screen. Re-sending the entire state every turn is how a context window dies halfway through a bug.
None of this is model inference. It is deterministic compression, done before the data reaches your agent — the platform never calls a model of its own.
A comparison page whose author wins every row is not a comparison page.
The SDK supports iOS 13 and later. Android, React Native and Flutter are on the roadmap and not shipped. If you need one tool across two platforms today, mobile-mcp or Appium is the honest answer.
One pod, compiled into debug, staging or CI builds behind a build flag. App Store builds are rejected at runtime and TestFlight requires an explicit opt-in — but it is still a dependency, and some teams will not take one.
No compiling, no installing, no simulator management, no LLDB. Pair it with XcodeBuildMCP or Xcode's built-in MCP; those tools are good at that and we do not duplicate them.
Everything above is free during the Beta. Billing isn't switched on yet, so prices aren't published. Seats count people; agents and devices never take a seat.
Yes, by three different routes. XcodeBuildMCP drives real devices over USB or Wi-Fi from the Mac that holds the project; mobile-mcp and Appium reach them through WebDriverAgent and a device tunnel. AppTelepath takes the third route: the SDK inside the app dials out to a hosted service, so the device only needs a network connection and the agent can run anywhere. Argent supports physical Android devices but iOS Simulator only.
For building, yes — every Xcode-side server requires a Mac with Xcode. For observing a running app, no. AppTelepath's MCP endpoint is hosted, so an agent in a container, in CI, or on a Linux box can read logs, network traffic and UI state from a device it has no physical access to.
Yes. You add one CocoaPods dependency and a single start call, guarded by a build flag so it compiles only into debug, staging and CI configurations. This is the real cost of the runtime access, and it is the reason accessibility-based tools cannot offer the same thing. The SDK detects App Store distribution and refuses to run; TestFlight requires an explicit opt-in.
Only under rules. Keep it out of App Store configurations, put its credentials in a gitignored local xcconfig or your existing secret store rather than in source control, and remember that screenshots, logs, files and network bodies can contain real user data. The device credential an agent issues can connect a device to the workspace and nothing else — it cannot call the MCP, HTTP or admin APIs.
If the agent's problem is "I cannot build and run this", start with XcodeBuildMCP or the Xcode MCP built into Xcode 26.3. If it is "I cannot walk this flow", add mobile-mcp, ios-simulator-mcp or Argent. If it is "I can see the screen but not why it is wrong", you need runtime access, which means an SDK. Combining a build server with AppTelepath covers all three.
Meta archived Flipper on 26 September 2025. It was the closest thing to an open in-app debugging surface for mobile, and it was designed around a human staring at a desktop client. Nothing in that generation of tools was built to answer questions from an agent with a token budget, which is why the current wave started from MCP rather than from a UI.
One pod, one hosted endpoint. Free during the Beta.
Start freeWhat the platform does, with a live command demo.
The hosted MCP endpoint and its tool catalog.
For teams migrating from a session-based debugger.
Plans, quotas, and what the free Beta includes.