Pepper gives AI agents eyes and hands inside iOS Simulator apps. It injects a shared library into any running simulator app — no source changes, no SDK, no build step. Your agent sees the screen as structured data, taps buttons, inspects live objects, intercepts network calls, reads the heap, and debugs layout issues. Dylib injection requires the simulator; device support uses a different mechanis
Add this skill
npx mdskills install skwallace36/pepperPowerful iOS Simulator automation with 60+ tools for comprehensive app inspection and interaction
1# Pepper23Pepper gives AI agents eyes and hands inside iOS Simulator apps.45It injects a shared library into any running simulator app — no source changes, no SDK, no build step. Your agent sees the screen as structured data, taps buttons, inspects live objects, intercepts network calls, reads the heap, and debugs layout issues. Dylib injection requires the simulator; device support uses a different mechanism.67https://github.com/user-attachments/assets/42ab3f1b-21f8-48e6-820f-7ca4012fb03b89*Claude navigating and inspecting [Ice Cubes](https://github.com/Dimillian/IceCubesApp) (Mastodon client) with zero source access.*1011Works with Claude Code · Cursor · Claude Desktop · any [MCP](https://modelcontextprotocol.io) client1213## Quickstart1415Requires macOS 14+, Python 3.10+, and an iOS Simulator runtime.1617```bash18pip install pepper-ios19pepper-ctl deploy # inject into the frontmost simulator app20pepper-ctl look # see what's on screen21```2223Then ask your agent:2425> "Tap through the onboarding flow and make sure every screen looks right"2627That's it. The agent uses Pepper's MCP tools to see, tap, and inspect — no extra config needed.2829<details>30<summary>Other MCP clients (Cursor, Claude Desktop, etc.)</summary>3132```json33{34 "mcpServers": {35 "pepper": {36 "command": "pepper-mcp"37 }38 }39}40```4142</details>4344<details>45<summary>Homebrew</summary>4647```bash48brew install --HEAD skwallace36/pepper/pepper49```5051Tap: [`skwallace36/homebrew-pepper`](https://github.com/skwallace36/homebrew-pepper)5253</details>5455## What It Does5657```58$ pepper-ctl look59Screen: navigation_stack (9 interactive, 4 text)6061 seg "Trending" → tap text:"Trending"62 btn "Sheryl Weikal, Right wing tech bros: we love St..."63 → tap text:"Sheryl Weikal, Right wing tech bros: we ..."64 seg "Settings" → tap text:"Settings"6566$ pepper-ctl tap --text "Settings"67Action: Tapped Settings68Screen: navigation_stack Title: "Settings" (15 interactive, 3 text)6970 btn "App Icon" → tap text:"App Icon"71 btn "Display Settings" → tap text:"Display Settings"72 ...73```7475Every element comes with its tap command. The agent sees the screen, acts, and gets the new state back in one round trip.7677### Things you can ask your agent7879These work against any app — no setup beyond `deploy`.8081> "Why is this list empty? Check the network request and see what the API returned"8283> "What objects are holding a reference to DeviceActuationService? I think it's leaking"8485> "Switch to dark mode and look for any text that's invisible against the background"8687> "The login button isn't responding — check the responder chain and see what's intercepting taps"8889> "Profile the scroll performance on the feed. Is anything hitching?"9091> "Read what's in the keychain after logout — nothing should be left"9293> "Turn off the feature flag for new-nav and make sure the old flow still works"9495View hierarchy, network interception, heap inspection, console capture, crash logs, performance profiling, accessibility audits, constraint debugging, keychain/UserDefaults/CoreData access, locale and orientation control, feature flags, push notifications — 60+ tools in total. Parameter docs are built into every tool; your MCP client surfaces them automatically.9697## How It Works9899Pepper uses macOS's dynamic linker (`DYLD_INSERT_LIBRARIES`) to load a dylib into the simulator process at launch. The dylib starts a WebSocket server on a local port. `pepper-mcp` connects to that WebSocket and translates MCP tool calls into commands executed inside the app.100101Because it runs in-process, Pepper has access to the full view hierarchy, the ObjC runtime, live object graphs, network delegates, and the HID event system. All touch input goes through native input events (IOHIDEvent) — the same path real fingers take. No private APIs, no entitlements — just `dyld`.102103## Development104105[`dylib/DYLIB.md`](dylib/DYLIB.md) — architecture and adding commands · [`tools/TOOLS.md`](tools/TOOLS.md) — MCP tool layer · [`docs/TROUBLESHOOTING.md`](docs/TROUBLESHOOTING.md) — common issues106
Full transparency — inspect the skill content before installing.