mobile-device-mcp 0.2.4 → 0.2.6

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.
package/README.md CHANGED
@@ -1,328 +1,328 @@
1
- <p align="center">
2
- <img src="assets/icon.png" alt="mobile-device-mcp" width="128" height="128" />
3
- </p>
4
-
5
- <h1 align="center">mobile-device-mcp</h1>
6
-
7
- <p align="center">
8
- <a href="https://www.npmjs.com/package/mobile-device-mcp"><img src="https://img.shields.io/npm/v/mobile-device-mcp" alt="npm version" /></a>
9
- <a href="https://www.npmjs.com/package/mobile-device-mcp"><img src="https://img.shields.io/npm/dm/mobile-device-mcp" alt="npm downloads" /></a>
10
- <a href="https://github.com/saranshbamania/mobile-device-mcp"><img src="https://img.shields.io/github/stars/saranshbamania/mobile-device-mcp" alt="GitHub stars" /></a>
11
- <a href="LICENSE"><img src="https://img.shields.io/badge/License-BSL%201.1-blue.svg" alt="License: BSL 1.1" /></a>
12
- </p>
13
-
14
- MCP server that gives AI coding assistants (Claude Code, Cursor, Windsurf) the ability to **see and interact with mobile devices**. 49 tools for screenshots, UI inspection, touch interaction, AI-powered visual analysis, Flutter widget tree inspection, video recording, and test generation.
15
-
16
- > AI assistants can read your code but can't see your phone. This fixes that.
17
-
18
- ## Why This One?
19
-
20
- | Feature | mobile-device-mcp | mobile-next/mobile-mcp | appium/appium-mcp |
21
- |---------|:-:|:-:|:-:|
22
- | Total tools | **49** | 20 | ~15 |
23
- | Setup | `npx` (30 sec) | `npx` | Requires Appium server |
24
- | AI visual analysis | **12 tools** (Claude + Gemini) | None | Vision-based finding |
25
- | Flutter widget tree | **10 tools** (Dart VM Service) | None | None |
26
- | Smart element finding | **4-tier** (<1ms local search) | Accessibility tree only | XPath/selectors |
27
- | Companion app (23x faster UI tree) | Yes | No | No |
28
- | Video recording | Yes | No | No |
29
- | Test script generation | **TS, Python, JSON** | No | Java/TestNG only |
30
- | iOS simulator support | Yes | Yes | Yes |
31
- | iOS real device | Planned | Yes | Yes |
32
- | Screenshot compression | **89%** (251KB->28KB) | None | 50-80% |
33
- | Multi-provider AI | Claude + Gemini | N/A | Single provider |
34
- | Price | Free tier + Pro | Free | Free |
35
-
36
- ## The Problem
37
-
38
- Web developers have browser DevTools, Playwright, and Puppeteer -- AI assistants can click around, take screenshots, and verify fixes. Mobile developers? They're stuck manually screenshotting, copying logs, and describing what's on screen. They're **human middleware** between the AI and the device.
39
-
40
- ## What This Does
41
-
42
- ```
43
- Developer: "The login button doesn't work"
44
-
45
- Without this tool: With this tool:
46
- 1. Manually screenshot 1. AI calls take_screenshot -> sees the screen
47
- 2. Paste into AI chat 2. AI calls smart_tap("login button") -> taps it
48
- 3. AI guesses what's wrong 3. AI calls verify_screen("error message shown") -> sees result
49
- 4. Apply fix, rebuild 4. AI calls visual_diff -> confirms fix worked
50
- 5. Repeat 4-5 times 5. Done.
51
- ```
52
-
53
- ## Quick Start
54
-
55
- ### Prerequisites
56
- - Node.js 18+
57
- - Android device/emulator connected via ADB
58
- - ADB installed (Android SDK Platform Tools)
59
-
60
- ### Setup (One-time, 30 seconds)
61
-
62
- 1. **Get a Google AI key** (free tier available): [aistudio.google.com/apikey](https://aistudio.google.com/apikey)
63
-
64
- 2. **Add `.mcp.json` to your project root:**
65
-
66
- ```json
67
- {
68
- "mcpServers": {
69
- "mobile-device": {
70
- "type": "stdio",
71
- "command": "npx",
72
- "args": ["-y", "mobile-device-mcp"],
73
- "env": {
74
- "GOOGLE_API_KEY": "your-google-api-key"
75
- }
76
- }
77
- }
78
- }
79
- ```
80
-
81
- 3. **Open your AI coding assistant** from that directory. That's it.
82
-
83
- The server starts and stops automatically -- you never run it manually. Your AI assistant manages it as a background process via the MCP protocol.
84
-
85
- ### Verify It Works
86
-
87
- **Claude Code:** type `/mcp` -- you should see `mobile-device: Connected`
88
-
89
- **Cursor:** check MCP panel in settings
90
-
91
- Then just talk to your phone:
92
-
93
- ```
94
- You: "Open my app, tap the login button, type test@email.com in the email field"
95
- AI: [takes screenshot -> sees the screen -> smart_tap("login button") -> smart_type("email field", "test@email.com")]
96
-
97
- You: "Find all the bugs on this screen"
98
- AI: [analyze_screen -> inspects layout, checks for overflow, missing labels, broken states]
99
-
100
- You: "Navigate to settings and verify dark mode works"
101
- AI: [smart_tap("settings") -> take_screenshot -> smart_tap("dark mode toggle") -> visual_diff -> reports result]
102
- ```
103
-
104
- No test scripts. No manual screenshots. Just describe what you want in plain English.
105
-
106
- ### Works with Any AI Coding Assistant
107
-
108
- | Tool | Config file | Docs |
109
- |------|------------|------|
110
- | **Claude Code** | `.mcp.json` in project root | [claude.ai/docs](https://claude.ai/docs) |
111
- | **Cursor** | `.cursor/mcp.json` | [cursor.com/docs](https://cursor.com/docs) |
112
- | **VS Code + Copilot** | MCP settings | [code.visualstudio.com](https://code.visualstudio.com) |
113
- | **Windsurf** | MCP settings | [windsurf.com](https://windsurf.com) |
114
-
115
- All use the same JSON config -- just put it in the right file for your editor.
116
-
117
- ### Drop Into Any Project
118
-
119
- Copy `.mcp.json` into any mobile project -- Flutter, React Native, Kotlin, Swift -- and your AI assistant gets device superpowers in that directory. No global install needed.
120
-
121
- ## Free vs Pro
122
-
123
- <a name="pro"></a>
124
-
125
- ### Free (14 tools) -- no license key needed
126
-
127
- | Tool | What it does |
128
- |------|-------------|
129
- | `list_devices` | List all connected Android devices/emulators |
130
- | `get_device_info` | Model, manufacturer, Android version, SDK level |
131
- | `get_screen_size` | Screen resolution in pixels |
132
- | `take_screenshot` | Capture screenshot (PNG or JPEG, configurable quality & resize) |
133
- | `get_ui_elements` | Get the accessibility/UI element tree as structured JSON |
134
- | `tap` | Tap at coordinates |
135
- | `double_tap` | Double tap at coordinates |
136
- | `long_press` | Long press at coordinates |
137
- | `swipe` | Swipe between two points |
138
- | `type_text` | Type text into the focused field |
139
- | `press_key` | Press a key (home, back, enter, volume, etc.) |
140
- | `list_apps` | List installed apps |
141
- | `get_current_app` | Get the foreground app |
142
- | `get_logs` | Get logcat entries with filtering |
143
-
144
- ### Pro (35 additional tools) -- [$9/mo](https://rzp.io/rzp/fCvY9mNK)
145
-
146
- **[Get Pro License](https://rzp.io/rzp/fCvY9mNK)** -- unlock all 49 tools. After payment, you'll receive a license key. Add it to your `.mcp.json`:
147
-
148
- ```json
149
- {
150
- "mcpServers": {
151
- "mobile-device": {
152
- "type": "stdio",
153
- "command": "npx",
154
- "args": ["-y", "mobile-device-mcp"],
155
- "env": {
156
- "GOOGLE_API_KEY": "your-google-api-key",
157
- "MOBILE_MCP_LICENSE_KEY": "your-license-key"
158
- }
159
- }
160
- }
161
- }
162
- ```
163
-
164
- #### AI Visual Analysis (12 tools)
165
-
166
- Use AI vision (Claude or Gemini) to understand what's on screen.
167
-
168
- | Tool | What it does |
169
- |------|-------------|
170
- | `analyze_screen` | AI describes the screen: app name, screen type, interactive elements, visible text, suggestions |
171
- | `find_element` | Find a UI element by description: *"the login button"*, *"email input field"* |
172
- | `smart_tap` | Find an element by description and tap it in one step |
173
- | `smart_type` | Find an input field by description, focus it, and type text |
174
- | `suggest_actions` | Plan actions to achieve a goal: *"log into the app"*, *"add item to cart"* |
175
- | `visual_diff` | Compare current screen with a previous screenshot -- what changed? |
176
- | `extract_text` | Extract all visible text from the screen (AI-powered OCR) |
177
- | `verify_screen` | Verify an assertion: *"the login was successful"*, *"error message is showing"* |
178
- | `wait_for_settle` | Wait until the screen stops changing |
179
- | `wait_for_element` | Wait for a specific element to appear on screen |
180
- | `handle_popup` | Detect and dismiss popups, dialogs, permission prompts |
181
- | `fill_form` | Fill multiple form fields in one step |
182
-
183
- #### Flutter Widget Tree (10 tools)
184
-
185
- Connect to running Flutter apps via Dart VM Service Protocol. Maps every widget to its source code location (`file:line`).
186
-
187
- | Tool | What it does |
188
- |------|-------------|
189
- | `flutter_connect` | Discover and connect to a running Flutter app on the device |
190
- | `flutter_disconnect` | Disconnect from the Flutter app and clean up resources |
191
- | `flutter_get_widget_tree` | Get the full widget tree (summary or detailed) |
192
- | `flutter_get_widget_details` | Get detailed properties of a specific widget by ID |
193
- | `flutter_find_widget` | Search the widget tree by type, text, or description |
194
- | `flutter_get_source_map` | Map every widget to its source code location (file:line:column) |
195
- | `flutter_screenshot_widget` | Screenshot a specific widget in isolation |
196
- | `flutter_debug_paint` | Toggle debug paint overlay (shows widget boundaries & padding) |
197
- | `flutter_hot_reload` | Hot reload Flutter app (preserves state) |
198
- | `flutter_hot_restart` | Hot restart Flutter app (resets state) |
199
-
200
- #### iOS Simulator (4 tools)
201
-
202
- macOS only. Control iOS simulators via `xcrun simctl`.
203
-
204
- | Tool | What it does |
205
- |------|-------------|
206
- | `ios_list_simulators` | List available iOS simulators |
207
- | `ios_boot_simulator` | Boot a simulator by name or UDID |
208
- | `ios_shutdown_simulator` | Shut down a running simulator |
209
- | `ios_screenshot` | Take a screenshot of a simulator |
210
-
211
- #### Video Recording (2 tools)
212
-
213
- | Tool | What it does |
214
- |------|-------------|
215
- | `record_screen` | Start recording the device screen |
216
- | `stop_recording` | Stop recording and save the video |
217
-
218
- #### Test Generation (3 tools)
219
-
220
- | Tool | What it does |
221
- |------|-------------|
222
- | `start_test_recording` | Start recording your MCP tool calls |
223
- | `stop_test_recording` | Stop recording and generate a test script |
224
- | `get_recorded_actions` | Get recorded actions as TypeScript, Python, or JSON |
225
-
226
- #### App Management (4 tools)
227
-
228
- | Tool | What it does |
229
- |------|-------------|
230
- | `launch_app` | Launch an app by package name |
231
- | `stop_app` | Force stop an app |
232
- | `install_app` | Install an APK |
233
- | `uninstall_app` | Uninstall an app |
234
-
235
- ## Performance
236
-
237
- The server is optimized to minimize latency and AI token costs:
238
-
239
- - **4-tier element search**: companion app (instant) -> local text match (<1ms) -> cached AI -> fresh AI. `smart_tap` is **35x faster** than naive AI calls (205ms vs 7.6s).
240
- - **Companion app**: AccessibilityService-based Android app provides UI tree in 105ms (23x faster than UIAutomator's 2448ms). Auto-installs on first use.
241
- - **Screenshot compression**: AI tools auto-compress to JPEG q=60, 400w -- **89% smaller** (251KB -> 28KB) with zero AI quality loss.
242
- - **Parallel capture**: Screenshot + UI tree fetched simultaneously via `Promise.all()`.
243
- - **TTL caching**: 5-second cache avoids redundant ADB calls for rapid-fire tool usage.
244
-
245
- ## Environment Variables
246
-
247
- | Variable | Description | Default |
248
- |----------|-------------|---------|
249
- | `GOOGLE_API_KEY` or `GEMINI_API_KEY` | Google API key for Gemini vision (recommended) | -- |
250
- | `ANTHROPIC_API_KEY` | Anthropic API key for Claude vision | -- |
251
- | `MOBILE_MCP_LICENSE_KEY` | License key to unlock Pro tools | -- |
252
- | `MCP_AI_PROVIDER` | Force AI provider: `"anthropic"` or `"google"` | Auto-detected |
253
- | `MCP_AI_MODEL` | Override AI model | `gemini-2.5-flash` / `claude-sonnet-4-20250514` |
254
- | `MCP_ADB_PATH` | Custom ADB binary path | Auto-discovered |
255
- | `MCP_DEFAULT_DEVICE` | Default device serial | Auto-discovered |
256
- | `MCP_SCREENSHOT_FORMAT` | `"png"` or `"jpeg"` | `jpeg` |
257
- | `MCP_SCREENSHOT_QUALITY` | JPEG quality (1-100) | `80` |
258
- | `MCP_SCREENSHOT_MAX_WIDTH` | Resize screenshots to this max width | `720` |
259
-
260
- ## Architecture
261
-
262
- ```
263
- src/
264
- |-- index.ts # CLI entry point (auto-discovery, env config)
265
- |-- server.ts # MCP server factory
266
- |-- license.ts # License validation and tier gating
267
- |-- types.ts # Shared interfaces
268
- |-- drivers/android/ # ADB driver (DeviceDriver implementation)
269
- | |-- adb.ts # Low-level ADB command wrapper
270
- | |-- companion-client.ts # TCP client for companion app
271
- | +-- index.ts # AndroidDriver class (4-strategy UI element retrieval)
272
- |-- drivers/flutter/ # Dart VM Service driver
273
- | |-- index.ts # FlutterDriver (discovery, inspection, source mapping, hot reload)
274
- | +-- vm-service.ts # JSON-RPC 2.0 WebSocket client (DDS redirect handling)
275
- |-- drivers/ios/ # iOS Simulator driver (macOS only)
276
- | |-- index.ts # IOSSimulatorDriver via xcrun simctl
277
- | +-- simctl.ts # Low-level simctl command wrapper
278
- |-- tools/ # MCP tool registrations (free + pro gating)
279
- | |-- device-tools.ts # Device management
280
- | |-- screen-tools.ts # Screenshots & UI inspection
281
- | |-- interaction-tools.ts # Touch, type, keys
282
- | |-- app-tools.ts # App management
283
- | |-- log-tools.ts # Logcat
284
- | |-- ai-tools.ts # AI-powered tools
285
- | |-- flutter-tools.ts # Flutter widget inspection
286
- | |-- ios-tools.ts # iOS simulator tools
287
- | |-- video-tools.ts # Screen recording
288
- | +-- recording-tools.ts # Test generation
289
- |-- recording/ # Test script generation
290
- | |-- recorder.ts # ActionRecorder (records MCP tool calls)
291
- | +-- generator.ts # TestGenerator (TypeScript/Python/JSON output)
292
- |-- ai/ # AI visual analysis engine
293
- | |-- client.ts # Multi-provider client (Anthropic + Google)
294
- | |-- prompts.ts # System prompts & UI element summarizer
295
- | |-- analyzer.ts # ScreenAnalyzer orchestrator (caching, parallel capture)
296
- | +-- element-search.ts # Local element search (text/alias matching, no AI needed)
297
- +-- utils/
298
- |-- discovery.ts # ADB auto-discovery
299
- +-- image.ts # PNG parsing, JPEG compression, bilinear resize
300
-
301
- companion-app/ # Android companion app (Kotlin)
302
- # AccessibilityService + TCP JSON-RPC for fast UI tree
303
- ```
304
-
305
- ## Roadmap
306
-
307
- - [ ] iOS physical device support
308
- - [ ] Multi-device orchestration
309
- - [ ] CI/CD integration
310
- - [ ] Cloud device farm support
311
-
312
- ## Tested On
313
-
314
- - **Devices**: Pixel 8 (Android 16), Samsung Galaxy series, Android emulators
315
- - **Apps**: Telegram, Instagram, Spotify, WhatsApp, YouTube, Chrome, Settings, and Flutter apps
316
- - **AI Providers**: Google Gemini 2.5 Flash, Anthropic Claude
317
- - **Platforms**: Windows 11, macOS (iOS simulators)
318
- - **Connection**: USB and wireless ADB
319
-
320
- ## License
321
-
322
- [Business Source License 1.1](LICENSE)
323
-
324
- - **Free for individuals and non-commercial use**
325
- - **Commercial use requires a paid license**
326
- - Converts to Apache 2.0 on March 23, 2030
327
-
328
- See [LICENSE](LICENSE) for full terms.
1
+ <p align="center">
2
+ <img src="assets/icon.png" alt="mobile-device-mcp" width="128" height="128" />
3
+ </p>
4
+
5
+ <h1 align="center">mobile-device-mcp</h1>
6
+
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/mobile-device-mcp"><img src="https://img.shields.io/npm/v/mobile-device-mcp" alt="npm version" /></a>
9
+ <a href="https://www.npmjs.com/package/mobile-device-mcp"><img src="https://img.shields.io/npm/dm/mobile-device-mcp" alt="npm downloads" /></a>
10
+ <a href="https://github.com/saranshbamania/mobile-device-mcp"><img src="https://img.shields.io/github/stars/saranshbamania/mobile-device-mcp" alt="GitHub stars" /></a>
11
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-BSL%201.1-blue.svg" alt="License: BSL 1.1" /></a>
12
+ </p>
13
+
14
+ MCP server that gives AI coding assistants (Claude Code, Cursor, Windsurf) the ability to **see and interact with mobile devices**. 49 tools for screenshots, UI inspection, touch interaction, AI-powered visual analysis, Flutter widget tree inspection, video recording, and test generation.
15
+
16
+ > AI assistants can read your code but can't see your phone. This fixes that.
17
+
18
+ ## Why This One?
19
+
20
+ | Feature | mobile-device-mcp | mobile-next/mobile-mcp | appium/appium-mcp |
21
+ |---------|:-:|:-:|:-:|
22
+ | Total tools | **49** | 20 | ~15 |
23
+ | Setup | `npx` (30 sec) | `npx` | Requires Appium server |
24
+ | AI visual analysis | **12 tools** (Claude + Gemini) | None | Vision-based finding |
25
+ | Flutter widget tree | **10 tools** (Dart VM Service) | None | None |
26
+ | Smart element finding | **4-tier** (<1ms local search) | Accessibility tree only | XPath/selectors |
27
+ | Companion app (23x faster UI tree) | Yes | No | No |
28
+ | Video recording | Yes | No | No |
29
+ | Test script generation | **TS, Python, JSON** | No | Java/TestNG only |
30
+ | iOS simulator support | Yes | Yes | Yes |
31
+ | iOS real device | Planned | Yes | Yes |
32
+ | Screenshot compression | **89%** (251KB->28KB) | None | 50-80% |
33
+ | Multi-provider AI | Claude + Gemini | N/A | Single provider |
34
+ | Price | Free tier + Pro | Free | Free |
35
+
36
+ ## The Problem
37
+
38
+ Web developers have browser DevTools, Playwright, and Puppeteer -- AI assistants can click around, take screenshots, and verify fixes. Mobile developers? They're stuck manually screenshotting, copying logs, and describing what's on screen. They're **human middleware** between the AI and the device.
39
+
40
+ ## What This Does
41
+
42
+ ```
43
+ Developer: "The login button doesn't work"
44
+
45
+ Without this tool: With this tool:
46
+ 1. Manually screenshot 1. AI calls take_screenshot -> sees the screen
47
+ 2. Paste into AI chat 2. AI calls smart_tap("login button") -> taps it
48
+ 3. AI guesses what's wrong 3. AI calls verify_screen("error message shown") -> sees result
49
+ 4. Apply fix, rebuild 4. AI calls visual_diff -> confirms fix worked
50
+ 5. Repeat 4-5 times 5. Done.
51
+ ```
52
+
53
+ ## Quick Start
54
+
55
+ ### Prerequisites
56
+ - Node.js 18+
57
+ - Android device/emulator connected via ADB
58
+ - ADB installed (Android SDK Platform Tools)
59
+
60
+ ### Setup (One-time, 30 seconds)
61
+
62
+ 1. **Get a Google AI key** (free tier available): [aistudio.google.com/apikey](https://aistudio.google.com/apikey)
63
+
64
+ 2. **Add `.mcp.json` to your project root:**
65
+
66
+ ```json
67
+ {
68
+ "mcpServers": {
69
+ "mobile-device": {
70
+ "type": "stdio",
71
+ "command": "npx",
72
+ "args": ["-y", "mobile-device-mcp"],
73
+ "env": {
74
+ "GOOGLE_API_KEY": "your-google-api-key"
75
+ }
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ 3. **Open your AI coding assistant** from that directory. That's it.
82
+
83
+ The server starts and stops automatically -- you never run it manually. Your AI assistant manages it as a background process via the MCP protocol.
84
+
85
+ ### Verify It Works
86
+
87
+ **Claude Code:** type `/mcp` -- you should see `mobile-device: Connected`
88
+
89
+ **Cursor:** check MCP panel in settings
90
+
91
+ Then just talk to your phone:
92
+
93
+ ```
94
+ You: "Open my app, tap the login button, type test@email.com in the email field"
95
+ AI: [takes screenshot -> sees the screen -> smart_tap("login button") -> smart_type("email field", "test@email.com")]
96
+
97
+ You: "Find all the bugs on this screen"
98
+ AI: [analyze_screen -> inspects layout, checks for overflow, missing labels, broken states]
99
+
100
+ You: "Navigate to settings and verify dark mode works"
101
+ AI: [smart_tap("settings") -> take_screenshot -> smart_tap("dark mode toggle") -> visual_diff -> reports result]
102
+ ```
103
+
104
+ No test scripts. No manual screenshots. Just describe what you want in plain English.
105
+
106
+ ### Works with Any AI Coding Assistant
107
+
108
+ | Tool | Config file | Docs |
109
+ |------|------------|------|
110
+ | **Claude Code** | `.mcp.json` in project root | [claude.ai/docs](https://claude.ai/docs) |
111
+ | **Cursor** | `.cursor/mcp.json` | [cursor.com/docs](https://cursor.com/docs) |
112
+ | **VS Code + Copilot** | MCP settings | [code.visualstudio.com](https://code.visualstudio.com) |
113
+ | **Windsurf** | MCP settings | [windsurf.com](https://windsurf.com) |
114
+
115
+ All use the same JSON config -- just put it in the right file for your editor.
116
+
117
+ ### Drop Into Any Project
118
+
119
+ Copy `.mcp.json` into any mobile project -- Flutter, React Native, Kotlin, Swift -- and your AI assistant gets device superpowers in that directory. No global install needed.
120
+
121
+ ## Free vs Pro
122
+
123
+ <a name="pro"></a>
124
+
125
+ ### Free (14 tools) -- no license key needed
126
+
127
+ | Tool | What it does |
128
+ |------|-------------|
129
+ | `list_devices` | List all connected Android devices/emulators |
130
+ | `get_device_info` | Model, manufacturer, Android version, SDK level |
131
+ | `get_screen_size` | Screen resolution in pixels |
132
+ | `take_screenshot` | Capture screenshot (PNG or JPEG, configurable quality & resize) |
133
+ | `get_ui_elements` | Get the accessibility/UI element tree as structured JSON |
134
+ | `tap` | Tap at coordinates |
135
+ | `double_tap` | Double tap at coordinates |
136
+ | `long_press` | Long press at coordinates |
137
+ | `swipe` | Swipe between two points |
138
+ | `type_text` | Type text into the focused field |
139
+ | `press_key` | Press a key (home, back, enter, volume, etc.) |
140
+ | `list_apps` | List installed apps |
141
+ | `get_current_app` | Get the foreground app |
142
+ | `get_logs` | Get logcat entries with filtering |
143
+
144
+ ### Pro (35 additional tools) -- [$6/mo](https://rzp.io/rzp/r4ijQsJY)
145
+
146
+ **[Get Pro License](https://rzp.io/rzp/r4ijQsJY)** -- unlock all 49 tools. After payment, you'll receive a license key. Add it to your `.mcp.json`:
147
+
148
+ ```json
149
+ {
150
+ "mcpServers": {
151
+ "mobile-device": {
152
+ "type": "stdio",
153
+ "command": "npx",
154
+ "args": ["-y", "mobile-device-mcp"],
155
+ "env": {
156
+ "GOOGLE_API_KEY": "your-google-api-key",
157
+ "MOBILE_MCP_LICENSE_KEY": "your-license-key"
158
+ }
159
+ }
160
+ }
161
+ }
162
+ ```
163
+
164
+ #### AI Visual Analysis (12 tools)
165
+
166
+ Use AI vision (Claude or Gemini) to understand what's on screen.
167
+
168
+ | Tool | What it does |
169
+ |------|-------------|
170
+ | `analyze_screen` | AI describes the screen: app name, screen type, interactive elements, visible text, suggestions |
171
+ | `find_element` | Find a UI element by description: *"the login button"*, *"email input field"* |
172
+ | `smart_tap` | Find an element by description and tap it in one step |
173
+ | `smart_type` | Find an input field by description, focus it, and type text |
174
+ | `suggest_actions` | Plan actions to achieve a goal: *"log into the app"*, *"add item to cart"* |
175
+ | `visual_diff` | Compare current screen with a previous screenshot -- what changed? |
176
+ | `extract_text` | Extract all visible text from the screen (AI-powered OCR) |
177
+ | `verify_screen` | Verify an assertion: *"the login was successful"*, *"error message is showing"* |
178
+ | `wait_for_settle` | Wait until the screen stops changing |
179
+ | `wait_for_element` | Wait for a specific element to appear on screen |
180
+ | `handle_popup` | Detect and dismiss popups, dialogs, permission prompts |
181
+ | `fill_form` | Fill multiple form fields in one step |
182
+
183
+ #### Flutter Widget Tree (10 tools)
184
+
185
+ Connect to running Flutter apps via Dart VM Service Protocol. Maps every widget to its source code location (`file:line`).
186
+
187
+ | Tool | What it does |
188
+ |------|-------------|
189
+ | `flutter_connect` | Discover and connect to a running Flutter app on the device |
190
+ | `flutter_disconnect` | Disconnect from the Flutter app and clean up resources |
191
+ | `flutter_get_widget_tree` | Get the full widget tree (summary or detailed) |
192
+ | `flutter_get_widget_details` | Get detailed properties of a specific widget by ID |
193
+ | `flutter_find_widget` | Search the widget tree by type, text, or description |
194
+ | `flutter_get_source_map` | Map every widget to its source code location (file:line:column) |
195
+ | `flutter_screenshot_widget` | Screenshot a specific widget in isolation |
196
+ | `flutter_debug_paint` | Toggle debug paint overlay (shows widget boundaries & padding) |
197
+ | `flutter_hot_reload` | Hot reload Flutter app (preserves state) |
198
+ | `flutter_hot_restart` | Hot restart Flutter app (resets state) |
199
+
200
+ #### iOS Simulator (4 tools)
201
+
202
+ macOS only. Control iOS simulators via `xcrun simctl`.
203
+
204
+ | Tool | What it does |
205
+ |------|-------------|
206
+ | `ios_list_simulators` | List available iOS simulators |
207
+ | `ios_boot_simulator` | Boot a simulator by name or UDID |
208
+ | `ios_shutdown_simulator` | Shut down a running simulator |
209
+ | `ios_screenshot` | Take a screenshot of a simulator |
210
+
211
+ #### Video Recording (2 tools)
212
+
213
+ | Tool | What it does |
214
+ |------|-------------|
215
+ | `record_screen` | Start recording the device screen |
216
+ | `stop_recording` | Stop recording and save the video |
217
+
218
+ #### Test Generation (3 tools)
219
+
220
+ | Tool | What it does |
221
+ |------|-------------|
222
+ | `start_test_recording` | Start recording your MCP tool calls |
223
+ | `stop_test_recording` | Stop recording and generate a test script |
224
+ | `get_recorded_actions` | Get recorded actions as TypeScript, Python, or JSON |
225
+
226
+ #### App Management (4 tools)
227
+
228
+ | Tool | What it does |
229
+ |------|-------------|
230
+ | `launch_app` | Launch an app by package name |
231
+ | `stop_app` | Force stop an app |
232
+ | `install_app` | Install an APK |
233
+ | `uninstall_app` | Uninstall an app |
234
+
235
+ ## Performance
236
+
237
+ The server is optimized to minimize latency and AI token costs:
238
+
239
+ - **4-tier element search**: companion app (instant) -> local text match (<1ms) -> cached AI -> fresh AI. `smart_tap` is **35x faster** than naive AI calls (205ms vs 7.6s).
240
+ - **Companion app**: AccessibilityService-based Android app provides UI tree in 105ms (23x faster than UIAutomator's 2448ms). Auto-installs on first use.
241
+ - **Screenshot compression**: AI tools auto-compress to JPEG q=60, 400w -- **89% smaller** (251KB -> 28KB) with zero AI quality loss.
242
+ - **Parallel capture**: Screenshot + UI tree fetched simultaneously via `Promise.all()`.
243
+ - **TTL caching**: 5-second cache avoids redundant ADB calls for rapid-fire tool usage.
244
+
245
+ ## Environment Variables
246
+
247
+ | Variable | Description | Default |
248
+ |----------|-------------|---------|
249
+ | `GOOGLE_API_KEY` or `GEMINI_API_KEY` | Google API key for Gemini vision (recommended) | -- |
250
+ | `ANTHROPIC_API_KEY` | Anthropic API key for Claude vision | -- |
251
+ | `MOBILE_MCP_LICENSE_KEY` | License key to unlock Pro tools | -- |
252
+ | `MCP_AI_PROVIDER` | Force AI provider: `"anthropic"` or `"google"` | Auto-detected |
253
+ | `MCP_AI_MODEL` | Override AI model | `gemini-2.5-flash` / `claude-sonnet-4-20250514` |
254
+ | `MCP_ADB_PATH` | Custom ADB binary path | Auto-discovered |
255
+ | `MCP_DEFAULT_DEVICE` | Default device serial | Auto-discovered |
256
+ | `MCP_SCREENSHOT_FORMAT` | `"png"` or `"jpeg"` | `jpeg` |
257
+ | `MCP_SCREENSHOT_QUALITY` | JPEG quality (1-100) | `80` |
258
+ | `MCP_SCREENSHOT_MAX_WIDTH` | Resize screenshots to this max width | `720` |
259
+
260
+ ## Architecture
261
+
262
+ ```
263
+ src/
264
+ |-- index.ts # CLI entry point (auto-discovery, env config)
265
+ |-- server.ts # MCP server factory
266
+ |-- license.ts # License validation and tier gating
267
+ |-- types.ts # Shared interfaces
268
+ |-- drivers/android/ # ADB driver (DeviceDriver implementation)
269
+ | |-- adb.ts # Low-level ADB command wrapper
270
+ | |-- companion-client.ts # TCP client for companion app
271
+ | +-- index.ts # AndroidDriver class (4-strategy UI element retrieval)
272
+ |-- drivers/flutter/ # Dart VM Service driver
273
+ | |-- index.ts # FlutterDriver (discovery, inspection, source mapping, hot reload)
274
+ | +-- vm-service.ts # JSON-RPC 2.0 WebSocket client (DDS redirect handling)
275
+ |-- drivers/ios/ # iOS Simulator driver (macOS only)
276
+ | |-- index.ts # IOSSimulatorDriver via xcrun simctl
277
+ | +-- simctl.ts # Low-level simctl command wrapper
278
+ |-- tools/ # MCP tool registrations (free + pro gating)
279
+ | |-- device-tools.ts # Device management
280
+ | |-- screen-tools.ts # Screenshots & UI inspection
281
+ | |-- interaction-tools.ts # Touch, type, keys
282
+ | |-- app-tools.ts # App management
283
+ | |-- log-tools.ts # Logcat
284
+ | |-- ai-tools.ts # AI-powered tools
285
+ | |-- flutter-tools.ts # Flutter widget inspection
286
+ | |-- ios-tools.ts # iOS simulator tools
287
+ | |-- video-tools.ts # Screen recording
288
+ | +-- recording-tools.ts # Test generation
289
+ |-- recording/ # Test script generation
290
+ | |-- recorder.ts # ActionRecorder (records MCP tool calls)
291
+ | +-- generator.ts # TestGenerator (TypeScript/Python/JSON output)
292
+ |-- ai/ # AI visual analysis engine
293
+ | |-- client.ts # Multi-provider client (Anthropic + Google)
294
+ | |-- prompts.ts # System prompts & UI element summarizer
295
+ | |-- analyzer.ts # ScreenAnalyzer orchestrator (caching, parallel capture)
296
+ | +-- element-search.ts # Local element search (text/alias matching, no AI needed)
297
+ +-- utils/
298
+ |-- discovery.ts # ADB auto-discovery
299
+ +-- image.ts # PNG parsing, JPEG compression, bilinear resize
300
+
301
+ companion-app/ # Android companion app (Kotlin)
302
+ # AccessibilityService + TCP JSON-RPC for fast UI tree
303
+ ```
304
+
305
+ ## Roadmap
306
+
307
+ - [ ] iOS physical device support
308
+ - [ ] Multi-device orchestration
309
+ - [ ] CI/CD integration
310
+ - [ ] Cloud device farm support
311
+
312
+ ## Tested On
313
+
314
+ - **Devices**: Pixel 8 (Android 16), Samsung Galaxy series, Android emulators
315
+ - **Apps**: Telegram, Instagram, Spotify, WhatsApp, YouTube, Chrome, Settings, and Flutter apps
316
+ - **AI Providers**: Google Gemini 2.5 Flash, Anthropic Claude
317
+ - **Platforms**: Windows 11, macOS (iOS simulators)
318
+ - **Connection**: USB and wireless ADB
319
+
320
+ ## License
321
+
322
+ [Business Source License 1.1](LICENSE)
323
+
324
+ - **Free for individuals and non-commercial use**
325
+ - **Commercial use requires a paid license**
326
+ - Converts to Apache 2.0 on March 23, 2030
327
+
328
+ See [LICENSE](LICENSE) for full terms.
package/dist/license.d.ts CHANGED
@@ -14,12 +14,14 @@ export declare const PRO_UPGRADE_MESSAGE: {
14
14
  isError: boolean;
15
15
  };
16
16
  /**
17
- * Validate the license key.
18
- *
19
- * Current implementation: presence check.
20
- * Future: integrate with Keygen.sh or xPay for real validation.
17
+ * Validate a license key offline.
21
18
  */
22
19
  export declare function validateLicense(): LicenseInfo;
20
+ /**
21
+ * Generate a license key (for internal use — run via: node -e "...")
22
+ * Usage: SALT must match the one compiled in the server.
23
+ */
24
+ export declare function generateLicenseKey(): string;
23
25
  /** Log the license tier on startup */
24
26
  export declare function logLicenseStatus(info: LicenseInfo): void;
25
27
  //# sourceMappingURL=license.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,sCAAsC;AACtC,eAAO,MAAM,UAAU,aAoBrB,CAAC;AAEH,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB;;;;;;CAiB/B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAU7C;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAMxD"}
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,sCAAsC;AACtC,eAAO,MAAM,UAAU,aAoBrB,CAAC;AAEH,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB;;;;;;CAiB/B,CAAC;AAsBF;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAqB7C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAQxD"}
package/dist/license.js CHANGED
@@ -34,7 +34,7 @@ export const PRO_UPGRADE_MESSAGE = {
34
34
  "",
35
35
  "Pro includes: AI vision, Flutter inspection, iOS simulator, video recording, test generation, and more.",
36
36
  "",
37
- "Get Pro: https://rzp.io/rzp/fCvY9mNK",
37
+ "Get Pro: https://rzp.io/rzp/r4ijQsJY",
38
38
  "",
39
39
  "After payment, you'll receive a license key. Add it to your .mcp.json:",
40
40
  ' "MOBILE_MCP_LICENSE_KEY": "your-key-here"',
@@ -44,25 +44,61 @@ export const PRO_UPGRADE_MESSAGE = {
44
44
  isError: true,
45
45
  };
46
46
  /**
47
- * Validate the license key.
47
+ * License key format: MDMCP-XXXXX-XXXXX-XXXXX-CHECK
48
48
  *
49
- * Current implementation: presence check.
50
- * Future: integrate with Keygen.sh or xPay for real validation.
49
+ * The last segment (CHECK) is a hash of the first 3 segments + a secret salt.
50
+ * This runs offline — no network call needed. Keys are generated by the developer
51
+ * and can't be guessed because the salt is compiled into the binary.
52
+ */
53
+ const SALT = "m0b1l3-d3v1c3-mcp-2026-s4r4nsh";
54
+ function simpleHash(input) {
55
+ let hash = 0;
56
+ for (let i = 0; i < input.length; i++) {
57
+ const char = input.charCodeAt(i);
58
+ hash = ((hash << 5) - hash + char) | 0;
59
+ }
60
+ // Convert to positive 5-char alphanumeric
61
+ const positive = Math.abs(hash);
62
+ return positive.toString(36).toUpperCase().padStart(5, "0").slice(0, 5);
63
+ }
64
+ /**
65
+ * Validate a license key offline.
51
66
  */
52
67
  export function validateLicense() {
53
68
  const key = process.env.MOBILE_MCP_LICENSE_KEY;
54
69
  if (!key || key.trim() === "") {
55
70
  return { tier: "free", valid: true };
56
71
  }
57
- // TODO: Replace with Keygen.sh API validation when payment is set up
58
- // For now, any non-empty key is treated as valid pro license
59
- return { tier: "pro", valid: true };
72
+ // Check format: MDMCP-XXXXX-XXXXX-XXXXX-CHECK
73
+ const parts = key.trim().split("-");
74
+ if (parts.length !== 5 || parts[0] !== "MDMCP") {
75
+ return { tier: "free", valid: false };
76
+ }
77
+ const body = parts.slice(0, 4).join("-");
78
+ const expectedCheck = simpleHash(body + SALT);
79
+ if (parts[4] === expectedCheck) {
80
+ return { tier: "pro", valid: true };
81
+ }
82
+ return { tier: "free", valid: false };
83
+ }
84
+ /**
85
+ * Generate a license key (for internal use — run via: node -e "...")
86
+ * Usage: SALT must match the one compiled in the server.
87
+ */
88
+ export function generateLicenseKey() {
89
+ const seg = () => Math.random().toString(36).substring(2, 7).toUpperCase();
90
+ const body = `MDMCP-${seg()}-${seg()}-${seg()}`;
91
+ const check = simpleHash(body + SALT);
92
+ return `${body}-${check}`;
60
93
  }
61
94
  /** Log the license tier on startup */
62
95
  export function logLicenseStatus(info) {
63
96
  if (info.tier === "pro") {
64
97
  process.stderr.write(`${PREFIX} License: Pro (all 49 tools enabled)\n`);
65
98
  }
99
+ else if (!info.valid) {
100
+ process.stderr.write(`${PREFIX} License: Invalid key. Get a valid Pro key at https://rzp.io/rzp/r4ijQsJY\n`);
101
+ }
66
102
  else {
67
103
  process.stderr.write(`${PREFIX} License: Free (14 tools — upgrade to Pro for all 49)\n`);
68
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,6CAA6C;AAC7C,+DAA+D;AAE/D,MAAM,MAAM,GAAG,qBAAqB,CAAC;AASrC,sCAAsC;AACtC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IAChC,kBAAkB;IAClB,cAAc;IACd,iBAAiB;IACjB,iBAAiB;IACjB,4BAA4B;IAC5B,iBAAiB;IACjB,iBAAiB;IACjB,wBAAwB;IACxB,KAAK;IACL,YAAY;IACZ,YAAY;IACZ,OAAO;IACP,WAAW;IACX,WAAW;IACX,2BAA2B;IAC3B,WAAW;IACX,iBAAiB;IACjB,WAAW;IACX,UAAU;CACX,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,OAAO,EAAE;QACP;YACE,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE;gBACJ,+DAA+D;gBAC/D,EAAE;gBACF,yGAAyG;gBACzG,EAAE;gBACF,sCAAsC;gBACtC,EAAE;gBACF,wEAAwE;gBACxE,6CAA6C;aAC9C,CAAC,IAAI,CAAC,IAAI,CAAC;SACb;KACF;IACD,OAAO,EAAE,IAAI;CACd,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAE/C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,qEAAqE;IACrE,6DAA6D;IAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,wCAAwC,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,yDAAyD,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobile-device-mcp",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "MCP server that gives AI coding assistants (Claude, Cursor, Windsurf) the ability to see and interact with Android mobile devices via ADB — AI-powered visual inspection, element finding, and device automation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",