@blitzdev/iphone-mcp 0.1.7

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +219 -0
  3. package/dist/child-env.d.ts +1 -0
  4. package/dist/child-env.js +61 -0
  5. package/dist/child-env.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +318 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/device-client.d.ts +2 -0
  10. package/dist/device-client.js +15 -0
  11. package/dist/device-client.js.map +1 -0
  12. package/dist/execution-context.d.ts +33 -0
  13. package/dist/execution-context.js +66 -0
  14. package/dist/execution-context.js.map +1 -0
  15. package/dist/idb/ax-scan-client.d.ts +27 -0
  16. package/dist/idb/ax-scan-client.js +244 -0
  17. package/dist/idb/ax-scan-client.js.map +1 -0
  18. package/dist/idb/idb-client.d.ts +34 -0
  19. package/dist/idb/idb-client.js +288 -0
  20. package/dist/idb/idb-client.js.map +1 -0
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.js +15 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/logger.d.ts +3 -0
  25. package/dist/logger.js +6 -0
  26. package/dist/logger.js.map +1 -0
  27. package/dist/mcp-server.d.ts +2 -0
  28. package/dist/mcp-server.js +649 -0
  29. package/dist/mcp-server.js.map +1 -0
  30. package/dist/types.d.ts +75 -0
  31. package/dist/types.js +7 -0
  32. package/dist/types.js.map +1 -0
  33. package/dist/ui-filters.d.ts +11 -0
  34. package/dist/ui-filters.js +100 -0
  35. package/dist/ui-filters.js.map +1 -0
  36. package/dist/viewer/server.d.ts +5 -0
  37. package/dist/viewer/server.js +233 -0
  38. package/dist/viewer/server.js.map +1 -0
  39. package/dist/wda/device-discovery.d.ts +12 -0
  40. package/dist/wda/device-discovery.js +91 -0
  41. package/dist/wda/device-discovery.js.map +1 -0
  42. package/dist/wda/wda-client.d.ts +38 -0
  43. package/dist/wda/wda-client.js +314 -0
  44. package/dist/wda/wda-client.js.map +1 -0
  45. package/dist/wda/wda-manager.d.ts +29 -0
  46. package/dist/wda/wda-manager.js +263 -0
  47. package/dist/wda/wda-manager.js.map +1 -0
  48. package/dist/wda/wda-scan.d.ts +3 -0
  49. package/dist/wda/wda-scan.js +41 -0
  50. package/dist/wda/wda-scan.js.map +1 -0
  51. package/package.json +40 -0
  52. package/src/idb/ax-scan/Makefile +30 -0
  53. package/src/idb/ax-scan/ax-scan.m +168 -0
@@ -0,0 +1,288 @@
1
+ import { spawn, exec, execFile } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { existsSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { homedir, tmpdir } from 'os';
6
+ import { log } from '../logger.js';
7
+ import { childEnv } from '../child-env.js';
8
+ const execAsync = promisify(exec);
9
+ function resolveIdbPath() {
10
+ const mcpIdb = join(homedir(), '.blitz-iphone-mcp', 'python', 'bin', 'idb');
11
+ if (existsSync(mcpIdb))
12
+ return mcpIdb;
13
+ const blitzIdb = join(homedir(), '.blitz', 'python', 'bin', 'idb');
14
+ if (existsSync(blitzIdb))
15
+ return blitzIdb;
16
+ return 'idb';
17
+ }
18
+ function resolveCompanionPath() {
19
+ const mcpCompanion = join(homedir(), '.blitz-iphone-mcp', 'idb-companion', 'bin', 'idb_companion');
20
+ if (existsSync(mcpCompanion))
21
+ return mcpCompanion;
22
+ const blitzCompanion = join(homedir(), '.blitz', 'idb-companion', 'bin', 'idb_companion');
23
+ if (existsSync(blitzCompanion))
24
+ return blitzCompanion;
25
+ return null;
26
+ }
27
+ const IDB_PATH = resolveIdbPath();
28
+ const IDB_COMPANION_PATH = resolveCompanionPath();
29
+ export async function resolveBootedUdid() {
30
+ const { stdout } = await execAsync('xcrun simctl list devices booted -j');
31
+ const data = JSON.parse(stdout);
32
+ for (const runtime of Object.values(data.devices)) {
33
+ for (const device of runtime) {
34
+ if (device.state === 'Booted') {
35
+ return device.udid;
36
+ }
37
+ }
38
+ }
39
+ throw new Error('No booted simulator found');
40
+ }
41
+ function parseSimctlAppList(raw) {
42
+ const apps = [];
43
+ const entryRegex = /"([^"]+)"\s*=\s*\{([^}]*(?:\{[^}]*\}[^}]*)*)\}/g;
44
+ let match;
45
+ while ((match = entryRegex.exec(raw)) !== null) {
46
+ const bundleId = match[1];
47
+ const block = match[2];
48
+ const nameMatch = block.match(/CFBundleDisplayName\s*=\s*(?:"([^"]+)"|([^;]+));/);
49
+ const typeMatch = block.match(/ApplicationType\s*=\s*(\w+);/);
50
+ const name = (nameMatch?.[1] ?? nameMatch?.[2] ?? bundleId).trim();
51
+ const type = typeMatch?.[1] === 'User' ? 'User' : 'System';
52
+ apps.push({ bundleId, name, type });
53
+ }
54
+ return apps;
55
+ }
56
+ export class IDBClient {
57
+ static instances = new Map();
58
+ udid;
59
+ shellProcess = null;
60
+ isShuttingDown = false;
61
+ companionKillAttempts = 0;
62
+ static MAX_COMPANION_KILL_ATTEMPTS = 5;
63
+ constructor(udid) {
64
+ this.udid = udid;
65
+ }
66
+ resolvedUdid = null;
67
+ async getResolvedUdid() {
68
+ if (this.resolvedUdid)
69
+ return this.resolvedUdid;
70
+ if (this.udid === 'booted') {
71
+ this.resolvedUdid = await resolveBootedUdid();
72
+ log('IDBClient', 'log', `Resolved "booted" -> ${this.resolvedUdid}`);
73
+ }
74
+ else {
75
+ this.resolvedUdid = this.udid;
76
+ }
77
+ return this.resolvedUdid;
78
+ }
79
+ static getInstance(udid = 'booted') {
80
+ if (!IDBClient.instances.has(udid)) {
81
+ IDBClient.instances.set(udid, new IDBClient(udid));
82
+ }
83
+ return IDBClient.instances.get(udid);
84
+ }
85
+ async startShell() {
86
+ if (this.shellProcess || this.isShuttingDown)
87
+ return;
88
+ log('IDBClient', 'log', `Starting idb shell for ${this.udid}...`);
89
+ const resolvedUdid = await this.getResolvedUdid();
90
+ const args = [];
91
+ if (IDB_COMPANION_PATH) {
92
+ args.push('--companion-path', IDB_COMPANION_PATH);
93
+ }
94
+ args.push('shell', '--no-prompt', '--udid', resolvedUdid);
95
+ log('IDBClient', 'log', `IDB command - ${IDB_PATH} ${args.join(' ')}`);
96
+ const proc = spawn(IDB_PATH, args, { stdio: ['pipe', 'pipe', 'pipe'] });
97
+ this.shellProcess = proc;
98
+ proc.stderr?.on('data', (data) => {
99
+ const text = data.toString();
100
+ log('IDBClient', 'log', `[${this.udid}] stderr: ${text.trim()}`);
101
+ if (text.includes('Connection refused')) {
102
+ this.companionKillAttempts++;
103
+ if (this.companionKillAttempts > IDBClient.MAX_COMPANION_KILL_ATTEMPTS) {
104
+ log('IDBClient', 'error', `[${this.udid}] Companion connection refused after ${IDBClient.MAX_COMPANION_KILL_ATTEMPTS} attempts`);
105
+ return;
106
+ }
107
+ log('IDBClient', 'warn', `[${this.udid}] Companion connection refused (attempt ${this.companionKillAttempts}/${IDBClient.MAX_COMPANION_KILL_ATTEMPTS}) — restarting shell`);
108
+ proc.kill('SIGTERM');
109
+ if (this.shellProcess === proc)
110
+ this.shellProcess = null;
111
+ execAsync(`${IDB_PATH} kill`)
112
+ .catch(e => log('IDBClient', 'log', `[${this.udid}] idb kill error: ${e}`))
113
+ .then(() => new Promise(resolve => setTimeout(resolve, 2000)))
114
+ .then(() => this.startShell());
115
+ }
116
+ });
117
+ proc.on('error', (error) => {
118
+ log('IDBClient', 'error', `[${this.udid}] Shell process error: ${error}`);
119
+ if (this.shellProcess === proc)
120
+ this.shellProcess = null;
121
+ });
122
+ proc.on('exit', (code, signal) => {
123
+ log('IDBClient', 'log', `[${this.udid}] Shell exited code=${code} signal=${signal}`);
124
+ if (this.shellProcess === proc)
125
+ this.shellProcess = null;
126
+ });
127
+ await new Promise(resolve => setTimeout(resolve, 300));
128
+ log('IDBClient', 'log', `idb shell started for ${this.udid}`);
129
+ }
130
+ async runInShell(args) {
131
+ if (this.isShuttingDown)
132
+ throw new Error('IDB client is shutting down');
133
+ if (!this.shellProcess)
134
+ await this.startShell();
135
+ if (!this.shellProcess?.stdin)
136
+ throw new Error('Shell process not available');
137
+ log('IDBClient', 'log', `[${this.udid}] Executing: ${args}`);
138
+ this.shellProcess.stdin.write(args + '\n');
139
+ }
140
+ async runDirect(args) {
141
+ const resolvedUdid = await this.getResolvedUdid();
142
+ const companionArg = IDB_COMPANION_PATH ? `--companion-path ${IDB_COMPANION_PATH}` : '';
143
+ const udidArg = `--udid ${resolvedUdid}`;
144
+ const cmd = `${IDB_PATH} ${companionArg} ${args} ${udidArg}`.trim();
145
+ log('IDBClient', 'log', `[${this.udid}] Running direct: ${cmd}`);
146
+ const { stdout, stderr } = await execAsync(cmd);
147
+ if (stderr)
148
+ log('IDBClient', 'log', `[${this.udid}] stderr: ${stderr}`);
149
+ return stdout.trim();
150
+ }
151
+ async shutdown() {
152
+ if (this.isShuttingDown)
153
+ return;
154
+ log('IDBClient', 'log', `[${this.udid}] Shutting down...`);
155
+ this.isShuttingDown = true;
156
+ if (this.shellProcess) {
157
+ this.shellProcess.stdin?.end();
158
+ this.shellProcess.kill('SIGTERM');
159
+ await new Promise(resolve => setTimeout(resolve, 1000));
160
+ if (this.shellProcess && !this.shellProcess.killed) {
161
+ this.shellProcess.kill('SIGKILL');
162
+ }
163
+ this.shellProcess = null;
164
+ }
165
+ IDBClient.instances.delete(this.udid);
166
+ log('IDBClient', 'log', `[${this.udid}] Shutdown complete`);
167
+ }
168
+ async tap(x, y, duration) {
169
+ let args = `ui tap ${x} ${y}`;
170
+ if (duration !== undefined)
171
+ args += ` --duration ${duration}`;
172
+ args += ' --json';
173
+ await this.runInShell(args);
174
+ }
175
+ async swipe(fromX, fromY, toX, toY, duration, delta) {
176
+ let args = `ui swipe ${fromX} ${fromY} ${toX} ${toY}`;
177
+ if (duration !== undefined)
178
+ args += ` --duration ${duration}`;
179
+ if (delta !== undefined)
180
+ args += ` --delta ${delta}`;
181
+ args += ' --json';
182
+ await this.runInShell(args);
183
+ }
184
+ async pressButton(button, duration) {
185
+ let args = `ui button ${button}`;
186
+ if (duration !== undefined)
187
+ args += ` --duration ${duration}`;
188
+ args += ' --json';
189
+ await this.runInShell(args);
190
+ }
191
+ async inputText(text) {
192
+ await this.runInShell(`ui text ${JSON.stringify(text)} --json`);
193
+ }
194
+ async pressKey(key, duration) {
195
+ if (typeof key === 'string') {
196
+ await this.inputText(key);
197
+ return;
198
+ }
199
+ let args = `ui key ${key}`;
200
+ if (duration !== undefined)
201
+ args += ` --duration ${duration}`;
202
+ args += ' --json';
203
+ await this.runInShell(args);
204
+ }
205
+ async pressKeySequence(keySequence) {
206
+ const keys = keySequence.join(' ');
207
+ await this.runInShell(`ui key-sequence ${keys} --json`);
208
+ }
209
+ async describeAll(nested) {
210
+ let args = 'ui describe-all --json';
211
+ if (nested)
212
+ args += ' --nested';
213
+ let output = '';
214
+ try {
215
+ output = await this.runDirect(args);
216
+ const jsonMatch = output.match(/[{[][\s\S]*[}\]]/);
217
+ if (jsonMatch)
218
+ return JSON.parse(jsonMatch[0]);
219
+ return JSON.parse(output);
220
+ }
221
+ catch (error) {
222
+ throw new Error(`Failed to parse UI description. Raw output: ${output.substring(0, 300)}`);
223
+ }
224
+ }
225
+ async describePoint(x, y, nested) {
226
+ let args = `ui describe-point ${Math.round(x)} ${Math.round(y)} --json`;
227
+ if (nested)
228
+ args += ' --nested';
229
+ let output = '';
230
+ try {
231
+ output = await this.runDirect(args);
232
+ const jsonMatch = output.match(/[{[][\s\S]*[}\]]/);
233
+ if (jsonMatch)
234
+ return JSON.parse(jsonMatch[0]);
235
+ return JSON.parse(output);
236
+ }
237
+ catch (error) {
238
+ throw new Error(`Failed to parse UI description at point (${x}, ${y}). Raw output: ${output.substring(0, 300)}`);
239
+ }
240
+ }
241
+ async screenshot() {
242
+ const resolvedUdid = await this.getResolvedUdid();
243
+ const filePath = join(tmpdir(), `blitz-idb-screenshot-${Date.now()}.png`);
244
+ const execFileAsync = promisify(execFile);
245
+ await execFileAsync('xcrun', ['simctl', 'io', resolvedUdid, 'screenshot', '--type=png', filePath], {
246
+ env: childEnv(),
247
+ timeout: 10000,
248
+ });
249
+ const { readFile, unlink } = await import('fs/promises');
250
+ const buffer = await readFile(filePath);
251
+ await unlink(filePath).catch(() => { });
252
+ return buffer;
253
+ }
254
+ async listApps() {
255
+ const resolvedUdid = await this.getResolvedUdid();
256
+ const { stdout } = await execAsync(`xcrun simctl listapps ${resolvedUdid}`);
257
+ return parseSimctlAppList(stdout);
258
+ }
259
+ async launch(bundleId) {
260
+ const resolvedUdid = await this.getResolvedUdid();
261
+ await execAsync(`xcrun simctl launch ${resolvedUdid} ${bundleId}`);
262
+ }
263
+ }
264
+ export function getIDBClient(udid = 'booted') {
265
+ return IDBClient.getInstance(udid);
266
+ }
267
+ let isCleaningUp = false;
268
+ async function cleanupAllInstances() {
269
+ if (isCleaningUp)
270
+ return;
271
+ isCleaningUp = true;
272
+ const instances = Array.from(IDBClient.instances.values());
273
+ if (instances.length > 0) {
274
+ log('IDBClient', 'log', `Cleaning up ${instances.length} IDB client instance(s)...`);
275
+ await Promise.all(instances.map(instance => instance.shutdown()));
276
+ log('IDBClient', 'log', 'All IDB client instances cleaned up');
277
+ }
278
+ }
279
+ process.on('SIGINT', () => {
280
+ cleanupAllInstances().then(() => process.exit(0)).catch(() => process.exit(1));
281
+ });
282
+ process.on('SIGTERM', () => {
283
+ cleanupAllInstances().then(() => process.exit(0)).catch(() => process.exit(1));
284
+ });
285
+ export async function shutdownAllIDBClients() {
286
+ await cleanupAllInstances();
287
+ }
288
+ //# sourceMappingURL=idb-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb-client.js","sourceRoot":"","sources":["../../src/idb/idb-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function startServer(): Promise<void>;
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { createMcpServer } from './mcp-server.js';
3
+ import { createViewerServer } from './viewer/server.js';
4
+ import { log } from './logger.js';
5
+ const DEFAULT_VIEWER_PORT = 5150;
6
+ export async function startServer() {
7
+ log('Server', 'log', 'Starting blitz-iphone-mcp...');
8
+ const { start } = createViewerServer();
9
+ const viewerPort = await start(DEFAULT_VIEWER_PORT);
10
+ const server = createMcpServer(viewerPort);
11
+ const transport = new StdioServerTransport();
12
+ await server.connect(transport);
13
+ log('Server', 'log', `MCP server running (stdio). Viewer at http://localhost:${viewerPort}`);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,MAAM,mBAAmB,GAAG,IAAI,CAAA;AAEhC,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,8BAA8B,CAAC,CAAA;IAEpD,MAAM,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAA;IACtC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAEnD,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAE/B,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,0DAA0D,UAAU,EAAE,CAAC,CAAA;AAC9F,CAAC"}
@@ -0,0 +1,3 @@
1
+ type LogLevel = 'log' | 'warn' | 'error';
2
+ export declare function log(tag: string, level: LogLevel, message: string): void;
3
+ export {};
package/dist/logger.js ADDED
@@ -0,0 +1,6 @@
1
+ export function log(tag, level, message) {
2
+ const timestamp = new Date().toISOString().slice(11, 23);
3
+ const prefix = level === 'error' ? 'ERR' : level === 'warn' ? 'WRN' : 'LOG';
4
+ process.stderr.write(`[${timestamp}] ${prefix} [${tag}] ${message}\n`);
5
+ }
6
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,KAAe,EAAE,OAAe;IAC/D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,MAAM,KAAK,GAAG,KAAK,OAAO,IAAI,CAAC,CAAA;AACxE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createMcpServer(viewerPort: number): McpServer;