This release is a pre-release and may not be stable for production use.
Reproduce and validate iOS bugs in 60 seconds with Claude.
SimDrive is the MCP-native iOS automation toolkit your AI agent already knows how to drive. Hand it a Linear ticket, watch it walk the steps in the simulator (or a paired real device), and get back a deterministic recording that replays the same way every time.
60-second bug repro
You (in Cursor / Claude Code):
"Use simdrive to reproduce Linear ENG-1247 — sign-in fails on iPhone 17 /
iOS 26.3 with test@example.com."
Claude:
→ session_start({device: "iPhone 17", os_version: "26.3", bundle_id: "com.acme.app"})
→ observe() # screenshot + annotated marks
→ tap({text: "Email"})
→ type_text({text: "test@example.com"})
→ tap({text: "Password"})
→ type_text({text: "pw123"})
→ tap({text: "Sign In"})
→ observe() # captures error toast
→ record_stop({name: "ENG-1247-repro"}) # YAML+PNG attached to PR
After you ship the fix, replay the same recording with the replay tool to
confirm it still fails (or now passes) before deploy.
What you get
- Bug reproduction + validation (hero) — agent reads the ticket, drives the simulator, captures the failure, saves a deterministic recording.
- Record → replay — recordings are YAML + PNG bundles that re-run
identically each time via the
replaytool. - Autonomous test suites —
run_journeyreads a YAML journey with goals and success criteria; SimDrive drives the agent loop and reports pass/fail with evidence. - Real iOS device support — WebDriverAgent-backed; one-command
simdrive bootstrap-device <udid>bring-up. - Visual regression detection — SSIM-based pre/post comparison with configurable drift handling.
- Performance baselines + regression comparison — capture CPU / RSS / thread baselines and diff future runs.
Install
pip install simdrive
No license or account required.
Requires: macOS, Xcode 15+, Python 3.10+.
Wire SimDrive into your MCP client
Add to .claude/mcp.json (Claude Code), claude_desktop_config.json (Claude
Desktop), or your Cursor MCP config:
{
"mcpServers": {
"simdrive": { "command": "simdrive" }
}
}
Restart the client. Your agent now has 36 SimDrive tools available.
Note: SimDrive is no longer offered as a commercial product. It remains available as a free, open MCP tool for internal/personal use — see
LICENSE.
Minimum-viable session
session_start(bundle_id="com.example.app")
observe() # see initial screen
tap(label="Sign In") # tap a labelled control
observe() # verify state
record_stop(session_id="...", name="signin-smoke") # save replay
session_end(session_id="...") # clean up
Tool surface (36 MCP tools)
| Group | Tools |
|---|---|
| Lifecycle (3) | session_start, session_end, session_status |
| Observe (1) | observe |
| Act (6) | tap, swipe, type_text, press_key, clear_field, tap_and_wait_keyboard |
| Record/Replay (5) | record_start, record_stop, replay, list_replays, validate_replay |
| Logs (1) | logs |
| Performance (4) | perf, perf_baseline, perf_compare, memory |
| Diagnostics (5) | doctor, app_state, apps, crashes, list_devices |
| Robustness (4) | dismiss_first_launch_alerts, pre_grant_permissions, set_appearance, dismiss_sheet |
| Recordings (2) | lint_recordings, migrate_recording |
| Journeys (1) | load_journey |
| Version (1) | version |
| Accessibility (3) | perform_accessibility_action, get_announcements, set_text |
Canonical machine-readable list: simdrive/src/simdrive/server.py::_TOOLS.
Real-device support
Drive a paired iPhone or iPad in addition to the simulator:
export SIMDRIVE_ALLOW_PHYSICAL_DEVICE=1
simdrive bootstrap-device <device-udid>
session_start(bundle_id="com.example.app", udid="<device-udid>", target="device")
WDA bootstrap on iOS 26.x has some rough edges; the simulator
(target="simulator", default) is the fully supported path.
Environment variables
| Variable | Effect |
|---|---|
SIMDRIVE_ALLOW_PHYSICAL_DEVICE=1 |
Allow driving a paired physical iPhone/iPad (see above). |
SIMDRIVE_NO_AUTO_RESTART=1 |
Suppress the version-drift auto-restart. When the running server is older than the wheel on disk (after pip install -U simdrive), simdrive normally re-execs itself to pick up the new code. Set this for MCP-driver sessions (Claude Code, etc.): an auto-restart re-execs the process and desyncs the MCP stdio transport, after which every tool call fails MCP error -32602: Invalid request parameters until you reconnect (/mcp). When simdrive detects it is serving as an MCP stdio server it now suppresses the auto-restart automatically and tells you to reconnect; this env var makes that the default everywhere (incl. embedded/CLI contexts). Truthy values: 1, true, yes, on. |
Known limitations
See docs/LIMITATIONS.md for: type_text first-character drop workaround,
SSIM-vs-structural-check semantics, SwiftUI half-sheet dismissal,
appearance-respring caveats, real-device input scope.
Support
- Docs: https://docs.simdrive.dev
- Bugs / feature requests: open an issue
- Email (private support): support@simdrive.dev
- Security disclosures: security@simdrive.dev
License
Elastic License 2.0 — see LICENSE. Free for internal use; prohibits
offering SimDrive as a competing managed service.
Built by SyncTek.
Metadata
Release files for simdrive 1.0.0b14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| simdrive-1.0.0b14.tar.gz | 649.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| simdrive-1.0.0b14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 970.6 kB
Release files / simdrive-1.0.0b14.tar.gz
| Download URL | simdrive-1.0.0b14.tar.gz |
|---|---|
| Size | 649.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dc0ba977d2679eed42e8f31510ef2dd2781b5ba485fb6c1d76701228fbd76f9c
|
|
BLAKE2b-256 checksum How to use checksums |
b423dd83ea9c9f5e820e89c083ca8e5c5d94c426597f3bfaff0240f8b9dee0de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / simdrive-1.0.0b14-py3-none-any.whl
| Download URL | simdrive-1.0.0b14-py3-none-any.whl |
|---|---|
| Size | 321.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3a81b6acec0ef8bcd610e21182009445a8a3cd134f66c7613f56d41b18789cce
|
|
BLAKE2b-256 checksum How to use checksums |
218fd34651c207a5b8a17978ef861916f7b86f3b11819abc848ed6b6340e9b40
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency log