@mmerterden/dev-toolkit-mcp 2.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +708 -0
  2. package/LICENSE +21 -0
  3. package/README.md +387 -0
  4. package/index.js +1277 -0
  5. package/package.json +80 -0
  6. package/tools/design-check/content-cardinality.js +204 -0
  7. package/tools/design-check/geometry.js +140 -0
  8. package/tools/design-check/index.js +213 -0
  9. package/tools/design-check/mock-detect.js +213 -0
  10. package/tools/design-check/report.js +590 -0
  11. package/tools/design-check/scan.js +91 -0
  12. package/tools/design-check/scenario-inventory.js +598 -0
  13. package/tools/design-check/visual-compare.js +961 -0
  14. package/tools/ios-app-store-audit/context.js +180 -0
  15. package/tools/ios-app-store-audit/data/apple-required-sdks.json +32 -0
  16. package/tools/ios-app-store-audit/data/debug-tools-blocklist.json +133 -0
  17. package/tools/ios-app-store-audit/index.js +164 -0
  18. package/tools/ios-app-store-audit/models.js +47 -0
  19. package/tools/ios-app-store-audit/rules/asset-validation.js +72 -0
  20. package/tools/ios-app-store-audit/rules/binary-size.js +70 -0
  21. package/tools/ios-app-store-audit/rules/code-signing.js +95 -0
  22. package/tools/ios-app-store-audit/rules/dead-reference.js +131 -0
  23. package/tools/ios-app-store-audit/rules/debug-tool-leak.js +185 -0
  24. package/tools/ios-app-store-audit/rules/duplicate-resource.js +130 -0
  25. package/tools/ios-app-store-audit/rules/embedded-sdk.js +126 -0
  26. package/tools/ios-app-store-audit/rules/entitlement.js +105 -0
  27. package/tools/ios-app-store-audit/rules/extension-signing.js +105 -0
  28. package/tools/ios-app-store-audit/rules/info-plist.js +158 -0
  29. package/tools/ios-app-store-audit/rules/ipv6-compliance.js +101 -0
  30. package/tools/ios-app-store-audit/rules/privacy-manifest.js +121 -0
  31. package/tools/ios-app-store-audit/rules/production-hygiene.js +237 -0
  32. package/tools/ios-app-store-audit/rules/provisioning-profile.js +127 -0
  33. package/tools/ios-app-store-audit/rules/required-reason-api.js +123 -0
  34. package/tools/ios-app-store-audit/rules/sdk-floor.js +104 -0
  35. package/tools/ios-app-store-audit/rules/swift-abi.js +64 -0
  36. package/tools/ios-app-store-audit/rules/team-id.js +62 -0
  37. package/tools/ios-testflight/index.js +479 -0
  38. package/ui-tree-dumper.swift +122 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mert Erden
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,387 @@
1
+ # @mmerterden/dev-toolkit-mcp
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@mmerterden/dev-toolkit-mcp)](https://www.npmjs.com/package/@mmerterden/dev-toolkit-mcp)
4
+ [![npm downloads](https://img.shields.io/npm/dw/@mmerterden/dev-toolkit-mcp)](https://www.npmjs.com/package/@mmerterden/dev-toolkit-mcp)
5
+ [![GitHub stars](https://img.shields.io/github/stars/mmerterden/dev-toolkit-mcp)](https://github.com/mmerterden/dev-toolkit-mcp)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ **80 tools** for iOS Simulator, Android Emulator, and headless web control. MCP server that lets your AI coding assistant see, interact with, and audit your mobile apps - plus drive browsers, run an 18-rule App Store compliance audit, and orchestrate multi-step batch flows.
9
+
10
+ Distributed via **GitHub Packages** (private).
11
+
12
+ **Verified on Claude Code, Copilot CLI and Codex CLI** - the three hosts the release gates actually exercise. Being a standard stdio MCP server it also runs in Cursor, Antigravity, VS Code Copilot Chat, Claude Desktop and any other MCP client; config snippets for those are below, but nothing here checks them.
13
+
14
+ That distinction is worth keeping straight. This line once called five hosts "the multi-agent-pipeline's full-orchestration targets", which stopped being true in pipeline v10.7.0 when the Cursor / Antigravity / Codex / Copilot Chat adapters were deleted. Codex CLI returned as a first-class target in pipeline v13.0.0 on capability - it now has skills, parallel sub-agents, hooks and MCP - and it is on the verified list only because a gate exercises it, not because it is supported elsewhere. Claiming hosts nobody exercises is not free either: 2.20.0 and 2.21.0 shipped an illegal `outputSchema` on the first tool, so Claude Code rejected the whole `tools/list` and served zero of the 78 - in the primary host, for two releases, with every gate in this repo green.
15
+
16
+ **6 categories:**
17
+ - **Device Control** (58 tools) - screenshot, tap, swipe, type, navigate, dark mode, locale, location, permissions, push notifications
18
+ - **Accessibility Audit** (2 tools) - auto-detect missing labels, small tap targets, missing identifiers (scope filtering supported)
19
+ - **Store Compliance** (5 tools) - App Store / Play Store readiness; **18-rule deep `ios_app_store_audit`** cross-references Apple ITMS error codes + App Store Review Guidelines (privacy manifest, required-reason API, Info.plist, code signing, entitlements, embedded SDK, IPv6, debug-tool leak, ...)
20
+ - **Web Automation** (8 tools) - Playwright-powered: goto, click (CSS selectors), type, eval JS, wait for selector, extract text, screenshot. Chromium / WebKit / Firefox engines. **Requires `playwright` peer dependency.**
21
+ - **Design Audit** (6 tools) - mock-mode vs Figma conformance: scenario inventory, mock detection, mock launch, live UI geometry, pixel/geometry/typography compare, and the HTML/PDF report with its coverage gate
22
+ - **Autonomous Agent DSL** (1 tool) - `agent_run_steps` executes a batch array of {tool, args, continue_on_error?, wait_ms?} steps in one MCP round trip. Ideal for scripted login flows, form fills, multi-step QA paths.
23
+
24
+ ## Prerequisites
25
+
26
+ This is a **private package** hosted on GitHub Packages. You need:
27
+
28
+ 1. **Collaborator access** to `mmerterden/dev-toolkit-mcp` (granted by the repo owner).
29
+ 2. A **Classic** Personal Access Token (fine-grained PATs are not fully supported for GitHub Packages on private repos).
30
+
31
+ ### 1. Create a Classic PAT
32
+
33
+ Go to https://github.com/settings/tokens/new?scopes=read:packages,repo and create a token with:
34
+
35
+ - ✅ `read:packages`
36
+ - ✅ `repo` (required for private package access)
37
+
38
+ If your GitHub account belongs to an SSO-enforced organization, after creating the token click **"Configure SSO" → Authorize** on the token row.
39
+
40
+ ### 2. Configure `~/.npmrc`
41
+
42
+ ```bash
43
+ # Replace ghp_xxx with the token from step 1
44
+ echo "@mmerterden:registry=https://npm.pkg.github.com" >> ~/.npmrc
45
+ echo "//npm.pkg.github.com/:_authToken=ghp_xxx" >> ~/.npmrc
46
+ ```
47
+
48
+ ### 3. Verify access
49
+
50
+ ```bash
51
+ npm view @mmerterden/dev-toolkit-mcp version
52
+ # → prints the latest published version when everything is wired up
53
+ ```
54
+
55
+ If this fails, see [Troubleshooting](#troubleshooting) below.
56
+
57
+ ## Quick Start
58
+
59
+ ### Option A - Install from source (recommended, no registry auth)
60
+
61
+ The simplest path. Works even if you haven't configured `~/.npmrc` yet.
62
+
63
+ ```bash
64
+ git clone git@github.com:mmerterden/dev-toolkit-mcp.git
65
+ cd dev-toolkit-mcp
66
+ npm install
67
+
68
+ # Optional: web tools require Playwright
69
+ npm i -g playwright && npx playwright install chromium
70
+
71
+ # Make it globally available as 'dev-toolkit-mcp'
72
+ npm link
73
+ ```
74
+
75
+ Update later with `git pull && npm install` inside the clone. Pin to a specific version by checking out the corresponding tag (`git tag -l` to list).
76
+
77
+ ### Option B - npx (requires Prerequisites above)
78
+
79
+ ```bash
80
+ npx @mmerterden/dev-toolkit-mcp
81
+ ```
82
+
83
+ ### Setup (after either Option A or B)
84
+
85
+ #### Claude Code / Claude Desktop
86
+
87
+ ```json
88
+ {
89
+ "mcpServers": {
90
+ "dev-toolkit": {
91
+ "command": "npx",
92
+ "args": ["-y", "@mmerterden/dev-toolkit-mcp"]
93
+ }
94
+ }
95
+ }
96
+ ```
97
+
98
+ #### Cursor
99
+
100
+ Add to `.cursor/mcp.json`:
101
+ ```json
102
+ {
103
+ "mcpServers": {
104
+ "dev-toolkit": {
105
+ "command": "npx",
106
+ "args": ["-y", "@mmerterden/dev-toolkit-mcp"]
107
+ }
108
+ }
109
+ }
110
+ ```
111
+
112
+ #### Antigravity
113
+
114
+ Add to `.agent/mcp_config.json` (or the global `~/.gemini/antigravity/mcp_config.json`):
115
+ ```json
116
+ {
117
+ "mcpServers": {
118
+ "dev-toolkit": {
119
+ "command": "npx",
120
+ "args": ["-y", "@mmerterden/dev-toolkit-mcp"]
121
+ }
122
+ }
123
+ }
124
+ ```
125
+
126
+ #### Copilot CLI
127
+
128
+ Add to `~/.copilot/settings.json`:
129
+ ```json
130
+ {
131
+ "mcpServers": {
132
+ "dev-toolkit": {
133
+ "command": "npx",
134
+ "args": ["-y", "@mmerterden/dev-toolkit-mcp"]
135
+ }
136
+ }
137
+ }
138
+ ```
139
+
140
+ #### Codex CLI
141
+
142
+ Let Codex write its own config - it owns `~/.codex/config.toml` (marketplace and
143
+ plugin state live there too), and the command is idempotent:
144
+
145
+ ```bash
146
+ codex mcp add dev-toolkit -- npx -y @mmerterden/dev-toolkit-mcp
147
+ codex mcp list # confirm
148
+ codex doctor --json # checks["mcp.config"] should read ok
149
+ ```
150
+
151
+ For reference, that produces:
152
+ ```toml
153
+ [mcp_servers.dev-toolkit]
154
+ command = "npx"
155
+ args = ["-y", "@mmerterden/dev-toolkit-mcp"]
156
+ ```
157
+
158
+ The multi-agent pipeline's `install --codex` runs the `codex mcp add` step for you.
159
+
160
+ ## Troubleshooting
161
+
162
+ ### `npm error code E401` - "User cannot be authenticated with the token provided"
163
+
164
+ Your token is being rejected by GitHub Packages. Usually one of:
165
+
166
+ - PAT is fine-grained instead of **Classic**. Recreate as Classic.
167
+ - PAT is missing `repo` scope. Private packages require both `read:packages` **and** `repo`.
168
+ - SSO not authorized. On the token row, click **"Configure SSO" → Authorize** for the relevant org.
169
+ - Token expired or revoked.
170
+
171
+ ### `npm error code E404` on `registry.npmjs.org`
172
+
173
+ Your `~/.npmrc` does not have the `@mmerterden:registry=...` line. npm defaulted to public npm, which doesn't host this package. Redo the Prerequisites section.
174
+
175
+ #### VS Code Copilot Chat
176
+
177
+ Add to `.vscode/mcp.json`:
178
+ ```json
179
+ {
180
+ "servers": {
181
+ "dev-toolkit": {
182
+ "command": "npx",
183
+ "args": ["-y", "@mmerterden/dev-toolkit-mcp"]
184
+ }
185
+ }
186
+ }
187
+ ```
188
+
189
+ ### Requirements
190
+
191
+ - **Node.js 18+**
192
+ - **iOS tools**: macOS + Xcode (provides `xcrun simctl`)
193
+ - **Android tools**: Android SDK Platform-Tools (provides `adb`)
194
+ - **Web tools** (optional): `playwright` - install once:
195
+ ```bash
196
+ npm i -g playwright && npx playwright install chromium
197
+ ```
198
+ (or `webkit` / `firefox` - choose engine per `web_goto` call.)
199
+
200
+ > If Xcode is not installed, iOS tools return a friendly message instead of crashing. Same for Android and Web tools - use what you have.
201
+
202
+ ### Agent DSL Example
203
+
204
+ Run a scripted login flow in one MCP call:
205
+
206
+ ```json
207
+ {
208
+ "tool": "agent_run_steps",
209
+ "args": {
210
+ "steps": [
211
+ { "tool": "web_goto", "args": { "url": "https://example.com/login" } },
212
+ { "tool": "web_type", "args": { "selector": "#email", "text": "user@example.com" } },
213
+ { "tool": "web_type", "args": { "selector": "#password", "text": "s3cret" } },
214
+ { "tool": "web_click", "args": { "selector": "button[type=submit]" }, "wait_ms": 1000 },
215
+ { "tool": "web_wait_for", "args": { "selector": ".dashboard" } },
216
+ { "tool": "web_screenshot", "args": { "full_page": true } }
217
+ ]
218
+ }
219
+ }
220
+ ```
221
+
222
+ Returns per-step status so the agent can self-correct on failure.
223
+
224
+ ### iOS Tools (37)
225
+
226
+ | Tool | Description |
227
+ |------|-------------|
228
+ | `ios_list_devices` | List all available simulators |
229
+ | `ios_boot_device` | Boot a simulator |
230
+ | `ios_screenshot` | Capture screenshot (base64 PNG) |
231
+ | `ios_tap` | Tap at coordinates |
232
+ | `ios_swipe` | Swipe gesture |
233
+ | `ios_type_text` | Type text into focused field |
234
+ | `ios_launch_app` | Launch app by bundle ID |
235
+ | `ios_terminate_app` | Terminate app |
236
+ | `ios_list_apps` | List installed apps |
237
+ | `ios_go_home` | Press home button |
238
+ | `ios_set_appearance` | Set light/dark mode |
239
+ | `ios_set_content_size` | Set Dynamic Type size |
240
+ | `ios_set_locale` | Change app language |
241
+ | `ios_open_url` | Open URL or deep link |
242
+ | `ios_status_bar` | Override status bar - supports presets (`clean` 9:41/100% for App Store screenshots, `testing`, `low-battery`, `airplane`) plus manual time/battery |
243
+ | `ios_push_notification` | Send simulated push |
244
+ | `ios_grant_permission` | Grant privacy permission |
245
+ | `ios_revoke_permission` | Revoke permission |
246
+ | `ios_reset_permissions` | Reset all permissions |
247
+ | `ios_set_location` | Set simulated GPS |
248
+ | `ios_clear_location` | Clear location |
249
+ | `ios_set_increase_contrast` | Toggle Increase Contrast |
250
+ | `ios_record_video` | Screen recording |
251
+ | `ios_add_media` | Add to photo library |
252
+ | `ios_keychain_reset` | Reset keychain |
253
+ | `ios_get_app_container` | Get app file path |
254
+ | `ios_erase_device` | Factory reset simulator |
255
+ | `ios_get_ui_tree` | Accessibility UI tree |
256
+ | `ios_accessibility_audit` | Auto-audit: missing labels, small tap targets, missing identifiers |
257
+ | `ios_biometric` | Simulate Face ID / Touch ID (match or fail) |
258
+ | `ios_archive_audit` | Audit .xcarchive for App Store compliance (lighter, deprecated - use `ios_app_store_audit`) |
259
+ | `ios_app_store_audit` | Deep 18-rule App Store compliance audit on .xcarchive - covers privacy manifest, required-reason API, Info.plist, code signing, entitlements, embedded SDK, IPv6, debug-tool leak, binary size, dead refs, duplicate resources, team ID, provisioning profile, Swift ABI, extension signing, asset validation, production hygiene, SDK floor (ITMS-90725). Cross-references Apple ITMS error codes + App Store Review Guidelines |
260
+ | `ios_export_ipa` | Export a .xcarchive to a signed .ipa via `xcodebuild -exportArchive`. Generates the exportOptions.plist from arguments (method defaults to `app-store-connect`). A run that exits 0 without producing an .ipa is reported as a failure |
261
+ | `ios_testflight_validate` | Apple's own pre-submission validation via `xcrun altool --validate-app`, with returned ITMS codes mapped onto the App Store rule each implies. Catches what static analysis structurally cannot: unregistered bundle ID, profile/app-record mismatch, an already-used version+build, entitlements not provisioned for the App ID. 3-tier auth (ASC API key → Apple ID + app-specific password by keychain/env reference → `SKIPPED` with a reason). **`SKIPPED` is not a pass** |
262
+ | `ios_xcodebuild` | Build / test / clean / archive an Xcode project. Returns one-line summary + xcresult ID; full log stays out of context |
263
+ | `ios_xcresult` | Drill into a previous build by ID - modes: `summary`, `errors`, `warnings`, `log`, `tests`. Token-efficient progressive disclosure |
264
+ | `ios_visual_diff` | Compare two PNG screenshots (pixelmatch). Returns diff_pct, pass/fail vs threshold, optional diff PNG. Useful for snapshot regressions across light/dark, locale, dynamic type |
265
+
266
+ ### Android Tools (28)
267
+
268
+ | Tool | Description |
269
+ |------|-------------|
270
+ | `android_list_devices` | List connected devices |
271
+ | `android_screenshot` | Capture screenshot (base64 PNG) |
272
+ | `android_tap` | Tap at coordinates |
273
+ | `android_swipe` | Swipe gesture |
274
+ | `android_type_text` | Type text |
275
+ | `android_key_event` | Send key event (HOME, BACK, ENTER) |
276
+ | `android_launch_app` | Launch app by package |
277
+ | `android_stop_app` | Force-stop app |
278
+ | `android_list_packages` | List installed packages |
279
+ | `android_go_home` | Press home |
280
+ | `android_go_back` | Press back |
281
+ | `android_get_ui_tree` | UI hierarchy (uiautomator XML) |
282
+ | `android_set_dark_mode` | Toggle dark mode |
283
+ | `android_set_font_scale` | Set font scale |
284
+ | `android_set_locale` | Change locale |
285
+ | `android_set_location` | Mock GPS location |
286
+ | `android_grant_permission` | Grant runtime permission |
287
+ | `android_revoke_permission` | Revoke permission |
288
+ | `android_record_screen` | Screen recording |
289
+ | `android_install_apk` | Install APK |
290
+ | `android_uninstall_app` | Uninstall app |
291
+ | `android_logcat` | View logs |
292
+ | `android_get_screen_size` | Get screen resolution |
293
+ | `android_open_url` | Open URL or deep link |
294
+ | `android_clear_app_data` | Clear app data |
295
+ | `android_accessibility_audit` | Auto-audit: missing contentDescription, small touch targets, missing resource-id |
296
+ | `android_launch_time` | Measure cold start launch time (ms) |
297
+ | `android_apk_audit` | Audit APK for Play Store compliance |
298
+
299
+ ### Design Tools (6)
300
+
301
+ Mock-mode vs Figma design audit. Generic and platform-agnostic - the heavy orchestration (Figma fetch, variant matching, screen navigation, report assembly) is expected to live in the caller; these expose the mechanical primitives.
302
+
303
+ | Tool | Description |
304
+ |------|-------------|
305
+ | `design_mock_detect` | Detect whether a project supports a mock/stub mode (`true` / `false` / `debug-only`) via naming conventions, `#if DEBUG` DI, MockData fixtures, and well-known runtime switch keys (extendable). Returns activation + variant hints + evidence. |
306
+ | `design_scenario_inventory` | Enumerate every state driver the mock build exposes - relaunch flags, `*Scenario` / `*Outcome` enum cases, reference-prefix variants (`hasPrefix("F6DI")` branches inside per-screen mock repositories, typically the largest group), flow-wide scenario codes, MockData fixtures, custom-scheme deep links - each with file+line evidence. Prices every target (`relaunch` vs `in-app`) and batches them into a run `plan`, so one relaunch serves every in-app state on that screen. Gives an audit a countable target set instead of "walk the UI until it feels done". |
307
+ | `design_mock_launch` | Launch an installed app in mock mode (iOS UserDefaults launch arg / Android intent extra). |
308
+ | `design_ui_geometry` | Flat element bounding boxes of the current screen + screen size, for px-level spacing measurement. |
309
+ | `design_visual_compare` | Compare a Figma render vs a live screenshot without failing on size mismatch: normalizes scale, crops chrome, reports perceptual diff %, spacing/size/position (px), color (ΔE), and typography. Writes figma/live/diff/overlay/side-by-side PNGs. |
310
+ | `design_report` | Render a design-audit report object to self-contained HTML (base64 images, CSS-positioned annotations) + optional PDF. Enforces a coverage gate: every target must be audited or skipped with an explicit reason, so a partial audit cannot render as a clean report. Wording comes from a label pack (English default, Turkish built in). |
311
+
312
+ ### Use Cases
313
+
314
+ - **Visual bug hunting** - Screenshot every screen, AI analyzes for layout issues
315
+ - **Dark mode testing** - Toggle appearance, screenshot, compare
316
+ - **Accessibility audit** - Auto-detect missing labels, small tap targets (<44pt iOS / <48dp Android)
317
+ - **Store compliance** - Audit .xcarchive or .apk before submission (signing, debug tools, privacy manifest)
318
+ - **Biometric testing** - Simulate Face ID / Touch ID success and failure flows
319
+ - **Performance** - Measure Android cold start time (ms)
320
+ - **Localization testing** - Switch locale, screenshot all screens
321
+ - **App Store screenshots** - Clean status bar + automated navigation
322
+ - **Regression testing** - Tap through flows, verify behavior
323
+
324
+ ### How It Works
325
+
326
+ ```mermaid
327
+ graph LR
328
+ subgraph "You"
329
+ PROMPT["Prompt"]
330
+ end
331
+
332
+ subgraph "AI Assistant"
333
+ AI["Claude Code / Copilot CLI (verified)\nany other MCP client"]
334
+ end
335
+
336
+ subgraph "dev-toolkit-mcp"
337
+ MCP["MCP Server"]
338
+ IOS["iOS Tools (37)\nxcrun simctl"]
339
+ AND["Android Tools (28)\nadb"]
340
+ WEB["Web Tools (8)\nPlaywright"]
341
+ DSL["Agent DSL (1)\nBatch runner"]
342
+ end
343
+
344
+ subgraph "Devices"
345
+ SIM["📱 iOS Simulator"]
346
+ EMU["🤖 Android Emulator"]
347
+ BROWSER["🌐 Browser"]
348
+ end
349
+
350
+ PROMPT --> AI
351
+ AI -- "MCP Protocol" --> MCP
352
+ MCP --> IOS --> SIM
353
+ MCP --> AND --> EMU
354
+ MCP --> WEB --> BROWSER
355
+ MCP --> DSL
356
+ SIM -- "screenshot / UI tree" --> AI
357
+ EMU -- "screenshot / UI tree" --> AI
358
+ BROWSER -- "screenshot / text" --> AI
359
+
360
+ style MCP fill:#8b5cf6,color:#fff
361
+ style IOS fill:#3b82f6,color:#fff
362
+ style AND fill:#10b981,color:#fff
363
+ style WEB fill:#f59e0b,color:#fff
364
+ ```
365
+
366
+ 1. Your AI assistant decides it needs to interact with a device
367
+ 2. It calls a tool like `ios_screenshot` or `android_tap` via MCP protocol
368
+ 3. This server receives the call and runs the native command (`xcrun simctl` or `adb`)
369
+ 4. The result (screenshot, UI tree, action confirmation) is returned to the AI
370
+ 5. The AI analyzes the result and decides the next action
371
+
372
+ **What it wraps:**
373
+ - **iOS**: `xcrun simctl` (part of Xcode Command Line Tools)
374
+ - **Android**: `adb` (part of Android SDK Platform-Tools)
375
+ - **Web**: Playwright (Chromium / WebKit / Firefox)
376
+
377
+ **What it does NOT do:**
378
+ - Does not access your source code
379
+ - Does not send data to any server
380
+ - Does not require an account or API key
381
+ - Does not modify your project files
382
+
383
+ Everything runs locally on your machine.
384
+
385
+ ## License
386
+
387
+ MIT