android-dev-mcp 1.0.0

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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/adb/accessibility.d.ts +10 -0
  4. package/dist/adb/accessibility.d.ts.map +1 -0
  5. package/dist/adb/accessibility.js +52 -0
  6. package/dist/adb/accessibility.js.map +1 -0
  7. package/dist/adb/index.d.ts +4 -0
  8. package/dist/adb/index.d.ts.map +1 -0
  9. package/dist/adb/index.js +4 -0
  10. package/dist/adb/index.js.map +1 -0
  11. package/dist/adb/liveTest.d.ts +39 -0
  12. package/dist/adb/liveTest.d.ts.map +1 -0
  13. package/dist/adb/liveTest.js +148 -0
  14. package/dist/adb/liveTest.js.map +1 -0
  15. package/dist/adb/logcatAnalysis.d.ts +17 -0
  16. package/dist/adb/logcatAnalysis.d.ts.map +1 -0
  17. package/dist/adb/logcatAnalysis.js +85 -0
  18. package/dist/adb/logcatAnalysis.js.map +1 -0
  19. package/dist/adb/ocr.d.ts +6 -0
  20. package/dist/adb/ocr.d.ts.map +1 -0
  21. package/dist/adb/ocr.js +16 -0
  22. package/dist/adb/ocr.js.map +1 -0
  23. package/dist/adb/operations.d.ts +48 -0
  24. package/dist/adb/operations.d.ts.map +1 -0
  25. package/dist/adb/operations.js +119 -0
  26. package/dist/adb/operations.js.map +1 -0
  27. package/dist/adb/runner.d.ts +57 -0
  28. package/dist/adb/runner.d.ts.map +1 -0
  29. package/dist/adb/runner.js +135 -0
  30. package/dist/adb/runner.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +7 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/mcp/index.d.ts +2 -0
  36. package/dist/mcp/index.d.ts.map +1 -0
  37. package/dist/mcp/index.js +2 -0
  38. package/dist/mcp/index.js.map +1 -0
  39. package/dist/mcp/server.d.ts +4 -0
  40. package/dist/mcp/server.d.ts.map +1 -0
  41. package/dist/mcp/server.js +567 -0
  42. package/dist/mcp/server.js.map +1 -0
  43. package/dist/security/allowlist.d.ts +4 -0
  44. package/dist/security/allowlist.d.ts.map +1 -0
  45. package/dist/security/allowlist.js +59 -0
  46. package/dist/security/allowlist.js.map +1 -0
  47. package/dist/security/index.d.ts +3 -0
  48. package/dist/security/index.d.ts.map +1 -0
  49. package/dist/security/index.js +3 -0
  50. package/dist/security/index.js.map +1 -0
  51. package/dist/security/timeout.d.ts +3 -0
  52. package/dist/security/timeout.d.ts.map +1 -0
  53. package/dist/security/timeout.js +25 -0
  54. package/dist/security/timeout.js.map +1 -0
  55. package/dist/server/index.d.ts +2 -0
  56. package/dist/server/index.d.ts.map +1 -0
  57. package/dist/server/index.js +2 -0
  58. package/dist/server/index.js.map +1 -0
  59. package/dist/server-http.d.ts +3 -0
  60. package/dist/server-http.d.ts.map +1 -0
  61. package/dist/server-http.js +51 -0
  62. package/dist/server-http.js.map +1 -0
  63. package/dist/tools/definitions.d.ts +3 -0
  64. package/dist/tools/definitions.d.ts.map +1 -0
  65. package/dist/tools/definitions.js +110 -0
  66. package/dist/tools/definitions.js.map +1 -0
  67. package/dist/tools/handlers.d.ts +139 -0
  68. package/dist/tools/handlers.d.ts.map +1 -0
  69. package/dist/tools/handlers.js +155 -0
  70. package/dist/tools/handlers.js.map +1 -0
  71. package/dist/tools/index.d.ts +4 -0
  72. package/dist/tools/index.d.ts.map +1 -0
  73. package/dist/tools/index.js +4 -0
  74. package/dist/tools/index.js.map +1 -0
  75. package/dist/tools/schemas.d.ts +462 -0
  76. package/dist/tools/schemas.d.ts.map +1 -0
  77. package/dist/tools/schemas.js +164 -0
  78. package/dist/tools/schemas.js.map +1 -0
  79. package/dist/types.d.ts +16 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +65 -0
@@ -0,0 +1,567 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { z } from 'zod';
4
+ import * as handlers from '../tools/handlers.js';
5
+ const SERVER_INFO = {
6
+ name: 'android-dev-mcp',
7
+ version: '1.0.0',
8
+ };
9
+ const optionalDeviceId = z.string().optional().describe('ADB device ID. Omit for default device.');
10
+ const optionalTimeout = z.number().int().min(1000).max(120000).optional().describe('Timeout in ms (default 30000, max 120000).');
11
+ export function createServer() {
12
+ const server = new McpServer(SERVER_INFO, {
13
+ capabilities: { tools: { listChanged: true } },
14
+ });
15
+ server.registerTool('adb_mcp_list_devices', {
16
+ description: 'List connected Android devices and emulators (wraps adb devices -l).',
17
+ inputSchema: {
18
+ deviceId: optionalDeviceId,
19
+ timeoutMs: optionalTimeout,
20
+ },
21
+ }, async (args) => {
22
+ const result = await handlers.handleAdbMcpListDevices({
23
+ deviceId: args.deviceId,
24
+ timeoutMs: args.timeoutMs,
25
+ });
26
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
27
+ });
28
+ server.registerTool('adb_mcp_exec_shell', {
29
+ description: 'Execute a shell command on the device. Command must match the allowlist.',
30
+ inputSchema: {
31
+ command: z.string().min(1).describe('Shell command to run (allowlisted only).'),
32
+ deviceId: optionalDeviceId,
33
+ timeoutMs: optionalTimeout,
34
+ },
35
+ }, async (args) => {
36
+ const result = await handlers.handleAdbMcpExecShell({
37
+ command: args.command,
38
+ deviceId: args.deviceId,
39
+ timeoutMs: args.timeoutMs,
40
+ });
41
+ return { content: [{ type: 'text', text: result.stdout }] };
42
+ });
43
+ server.registerTool('adb_mcp_launch_app', {
44
+ description: 'Launch an Android app by package name (and optional activity).',
45
+ inputSchema: {
46
+ packageName: z.string().min(1).describe('Android package name (e.g. com.android.settings).'),
47
+ activity: z.string().optional().describe('Optional activity (e.g. .Settings).'),
48
+ deviceId: optionalDeviceId,
49
+ timeoutMs: optionalTimeout,
50
+ },
51
+ }, async (args) => {
52
+ const result = await handlers.handleAdbMcpLaunchApp({
53
+ packageName: args.packageName,
54
+ activity: args.activity,
55
+ deviceId: args.deviceId,
56
+ timeoutMs: args.timeoutMs,
57
+ });
58
+ return { content: [{ type: 'text', text: result.result }] };
59
+ });
60
+ server.registerTool('adb_mcp_tap', {
61
+ description: 'Perform a tap at (x, y) on the device screen.',
62
+ inputSchema: {
63
+ x: z.number().describe('X coordinate in pixels.'),
64
+ y: z.number().describe('Y coordinate in pixels.'),
65
+ deviceId: optionalDeviceId,
66
+ timeoutMs: optionalTimeout,
67
+ },
68
+ }, async (args) => {
69
+ const result = await handlers.handleAdbMcpTap({
70
+ x: args.x,
71
+ y: args.y,
72
+ deviceId: args.deviceId,
73
+ timeoutMs: args.timeoutMs,
74
+ });
75
+ return { content: [{ type: 'text', text: result.result }] };
76
+ });
77
+ server.registerTool('adb_mcp_swipe', {
78
+ description: 'Swipe from (x1,y1) to (x2,y2) with optional duration in ms.',
79
+ inputSchema: {
80
+ x1: z.number().describe('Start X.'),
81
+ y1: z.number().describe('Start Y.'),
82
+ x2: z.number().describe('End X.'),
83
+ y2: z.number().describe('End Y.'),
84
+ durationMs: z.number().int().min(0).optional().describe('Swipe duration ms (default 300).'),
85
+ deviceId: optionalDeviceId,
86
+ timeoutMs: optionalTimeout,
87
+ },
88
+ }, async (args) => {
89
+ const result = await handlers.handleAdbMcpSwipe({
90
+ x1: args.x1,
91
+ y1: args.y1,
92
+ x2: args.x2,
93
+ y2: args.y2,
94
+ durationMs: args.durationMs,
95
+ deviceId: args.deviceId,
96
+ timeoutMs: args.timeoutMs,
97
+ });
98
+ return { content: [{ type: 'text', text: result.result }] };
99
+ });
100
+ server.registerTool('adb_mcp_input_text', {
101
+ description: 'Type text on the device (input text).',
102
+ inputSchema: {
103
+ text: z.string().describe('Text to type.'),
104
+ deviceId: optionalDeviceId,
105
+ timeoutMs: optionalTimeout,
106
+ },
107
+ }, async (args) => {
108
+ const result = await handlers.handleAdbMcpInputText({
109
+ text: args.text,
110
+ deviceId: args.deviceId,
111
+ timeoutMs: args.timeoutMs,
112
+ });
113
+ return { content: [{ type: 'text', text: result.result }] };
114
+ });
115
+ server.registerTool('adb_mcp_screencap', {
116
+ description: 'Capture device screen and return as base64 PNG image.',
117
+ inputSchema: {
118
+ deviceId: optionalDeviceId,
119
+ timeoutMs: optionalTimeout,
120
+ },
121
+ }, async (args) => {
122
+ const result = await handlers.handleAdbMcpScreencap({
123
+ deviceId: args.deviceId,
124
+ timeoutMs: args.timeoutMs,
125
+ });
126
+ return {
127
+ content: [
128
+ {
129
+ type: 'text',
130
+ text: `data:${result.mimeType};base64,${result.imageBase64}`,
131
+ },
132
+ ],
133
+ };
134
+ });
135
+ server.registerTool('adb_mcp_screencap_analyze', {
136
+ description: 'Capture screen + OCR; returns screenshot (base64) and extracted text.',
137
+ inputSchema: {
138
+ deviceId: optionalDeviceId,
139
+ timeoutMs: optionalTimeout,
140
+ extractText: z.boolean().optional().describe('Run OCR to extract text (default true).'),
141
+ },
142
+ }, async (args) => {
143
+ const result = await handlers.handleAdbMcpScreencapAnalyze({
144
+ deviceId: args.deviceId,
145
+ timeoutMs: args.timeoutMs,
146
+ extractText: args.extractText,
147
+ });
148
+ return {
149
+ content: [
150
+ {
151
+ type: 'text',
152
+ text: JSON.stringify({
153
+ extractedText: result.extractedText,
154
+ confidence: result.confidence,
155
+ imageDataUrl: `data:${result.mimeType};base64,${result.imageBase64}`,
156
+ }, null, 2),
157
+ },
158
+ ],
159
+ };
160
+ });
161
+ server.registerTool('adb_mcp_current_activity', {
162
+ description: 'Get the current foreground activity (from dumpsys window).',
163
+ inputSchema: {
164
+ deviceId: optionalDeviceId,
165
+ timeoutMs: optionalTimeout,
166
+ },
167
+ }, async (args) => {
168
+ const result = await handlers.handleAdbMcpCurrentActivity({
169
+ deviceId: args.deviceId,
170
+ timeoutMs: args.timeoutMs,
171
+ });
172
+ return { content: [{ type: 'text', text: result.activity }] };
173
+ });
174
+ server.registerTool('adb_mcp_ui_dump', {
175
+ description: 'Dump UI hierarchy (uiautomator). Returns XML of current window.',
176
+ inputSchema: {
177
+ deviceId: optionalDeviceId,
178
+ timeoutMs: optionalTimeout,
179
+ },
180
+ }, async (args) => {
181
+ const result = await handlers.handleAdbMcpUiDump({
182
+ deviceId: args.deviceId,
183
+ timeoutMs: args.timeoutMs,
184
+ });
185
+ return { content: [{ type: 'text', text: result.xml }] };
186
+ });
187
+ server.registerTool('adb_mcp_find_and_tap', {
188
+ description: 'Find UI node by text or content-desc (case-insensitive) and tap its center. Uses uiautomator dump.',
189
+ inputSchema: {
190
+ text: z.string().min(1).describe('Text or content-desc to find.'),
191
+ deviceId: optionalDeviceId,
192
+ timeoutMs: optionalTimeout,
193
+ },
194
+ }, async (args) => {
195
+ const result = await handlers.handleAdbMcpFindAndTap({
196
+ text: args.text,
197
+ deviceId: args.deviceId,
198
+ timeoutMs: args.timeoutMs,
199
+ });
200
+ return {
201
+ content: [
202
+ {
203
+ type: 'text',
204
+ text: JSON.stringify(result, null, 2),
205
+ },
206
+ ],
207
+ };
208
+ });
209
+ server.registerTool('adb_mcp_live_test', {
210
+ description: 'Run a live test scenario from markdown. Steps: wait N seconds, tap "text", wait until progress N, wait until visible "text". See templates/live-test-scenario.md.',
211
+ inputSchema: {
212
+ scenarioMarkdown: z.string().min(1).describe('Test scenario in markdown (list of steps).'),
213
+ deviceId: optionalDeviceId,
214
+ timeoutMs: optionalTimeout,
215
+ waitProgressTimeoutMs: z.number().int().min(5000).max(120000).optional(),
216
+ waitVisibleTimeoutMs: z.number().int().min(5000).max(60000).optional(),
217
+ },
218
+ }, async (args) => {
219
+ const result = await handlers.handleAdbMcpLiveTest({
220
+ scenarioMarkdown: args.scenarioMarkdown,
221
+ deviceId: args.deviceId,
222
+ timeoutMs: args.timeoutMs,
223
+ waitProgressTimeoutMs: args.waitProgressTimeoutMs,
224
+ waitVisibleTimeoutMs: args.waitVisibleTimeoutMs,
225
+ });
226
+ return {
227
+ content: [
228
+ {
229
+ type: 'text',
230
+ text: `Live test ${result.ok ? 'PASSED' : 'FAILED'}\n${result.log}\nTotal: ${result.totalDurationMs}ms`,
231
+ },
232
+ ],
233
+ };
234
+ });
235
+ server.registerTool('adb_mcp_keyevent', {
236
+ description: 'Send key event (e.g. 3=HOME, 4=BACK, 26=POWER, 66=ENTER). See ADB key event codes.',
237
+ inputSchema: {
238
+ keycode: z.number().int().describe('Key event code.'),
239
+ deviceId: optionalDeviceId,
240
+ timeoutMs: optionalTimeout,
241
+ },
242
+ }, async (args) => {
243
+ const result = await handlers.handleAdbMcpKeyevent({
244
+ keycode: args.keycode,
245
+ deviceId: args.deviceId,
246
+ timeoutMs: args.timeoutMs,
247
+ });
248
+ return { content: [{ type: 'text', text: result.result }] };
249
+ });
250
+ server.registerTool('adb_mcp_screenrecord', {
251
+ description: 'Record device screen to path (e.g. /sdcard/record.mp4). Blocks until duration ends (max 180s).',
252
+ inputSchema: {
253
+ path: z.string().describe('Device path to save recording.'),
254
+ durationSec: z.number().int().min(1).max(180).optional(),
255
+ deviceId: optionalDeviceId,
256
+ timeoutMs: optionalTimeout,
257
+ },
258
+ }, async (args) => {
259
+ const result = await handlers.handleAdbMcpScreenrecord({
260
+ path: args.path,
261
+ durationSec: args.durationSec,
262
+ deviceId: args.deviceId,
263
+ timeoutMs: args.timeoutMs,
264
+ });
265
+ return { content: [{ type: 'text', text: result.result }] };
266
+ });
267
+ server.registerTool('adb_mcp_home', {
268
+ description: 'Press home button (am start HOME).',
269
+ inputSchema: {
270
+ deviceId: optionalDeviceId,
271
+ timeoutMs: optionalTimeout,
272
+ },
273
+ }, async (args) => {
274
+ const result = await handlers.handleAdbMcpHome({
275
+ deviceId: args.deviceId,
276
+ timeoutMs: args.timeoutMs,
277
+ });
278
+ return { content: [{ type: 'text', text: result.result }] };
279
+ });
280
+ server.registerTool('adb_mcp_connect', {
281
+ description: 'Connect to device over network (adb connect IP:port).',
282
+ inputSchema: {
283
+ host: z.string().describe('Host (IP:port or hostname:port).'),
284
+ timeoutMs: optionalTimeout,
285
+ },
286
+ }, async (args) => {
287
+ const result = await handlers.handleAdbMcpConnect({
288
+ host: args.host,
289
+ timeoutMs: args.timeoutMs,
290
+ });
291
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
292
+ });
293
+ server.registerTool('adb_mcp_disconnect', {
294
+ description: 'Disconnect device (adb disconnect [host]).',
295
+ inputSchema: {
296
+ host: z.string().optional().describe('Host to disconnect. Omit for all.'),
297
+ timeoutMs: optionalTimeout,
298
+ },
299
+ }, async (args) => {
300
+ const result = await handlers.handleAdbMcpDisconnect({
301
+ host: args.host,
302
+ timeoutMs: args.timeoutMs,
303
+ });
304
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
305
+ });
306
+ server.registerTool('adb_mcp_kill_server', {
307
+ description: 'Kill ADB server (adb kill-server).',
308
+ inputSchema: { timeoutMs: optionalTimeout },
309
+ }, async (args) => {
310
+ const result = await handlers.handleAdbMcpKillServer({ timeoutMs: args.timeoutMs });
311
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
312
+ });
313
+ server.registerTool('adb_mcp_start_server', {
314
+ description: 'Start ADB server (adb start-server).',
315
+ inputSchema: { timeoutMs: optionalTimeout },
316
+ }, async (args) => {
317
+ const result = await handlers.handleAdbMcpStartServer({ timeoutMs: args.timeoutMs });
318
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
319
+ });
320
+ server.registerTool('adb_mcp_push', {
321
+ description: 'Push file from host to device (adb push).',
322
+ inputSchema: {
323
+ localPath: z.string().describe('Local path on host.'),
324
+ remotePath: z.string().describe('Device path destination.'),
325
+ deviceId: optionalDeviceId,
326
+ timeoutMs: optionalTimeout,
327
+ },
328
+ }, async (args) => {
329
+ const result = await handlers.handleAdbMcpPush({
330
+ localPath: args.localPath,
331
+ remotePath: args.remotePath,
332
+ deviceId: args.deviceId,
333
+ timeoutMs: args.timeoutMs,
334
+ });
335
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
336
+ });
337
+ server.registerTool('adb_mcp_pull', {
338
+ description: 'Pull file from device to host (adb pull).',
339
+ inputSchema: {
340
+ remotePath: z.string().describe('Device path to pull.'),
341
+ deviceId: optionalDeviceId,
342
+ timeoutMs: optionalTimeout,
343
+ },
344
+ }, async (args) => {
345
+ const result = await handlers.handleAdbMcpPull({
346
+ remotePath: args.remotePath,
347
+ deviceId: args.deviceId,
348
+ timeoutMs: args.timeoutMs,
349
+ });
350
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
351
+ });
352
+ server.registerTool('adb_mcp_install', {
353
+ description: 'Install APK on device (adb install).',
354
+ inputSchema: {
355
+ apkPath: z.string().describe('Local path to APK.'),
356
+ replace: z.boolean().optional().describe('Replace existing (-r).'),
357
+ deviceId: optionalDeviceId,
358
+ timeoutMs: optionalTimeout,
359
+ },
360
+ }, async (args) => {
361
+ const result = await handlers.handleAdbMcpInstall({
362
+ apkPath: args.apkPath,
363
+ replace: args.replace,
364
+ deviceId: args.deviceId,
365
+ timeoutMs: args.timeoutMs,
366
+ });
367
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
368
+ });
369
+ server.registerTool('adb_mcp_uninstall', {
370
+ description: 'Uninstall app by package name (adb uninstall).',
371
+ inputSchema: {
372
+ packageName: z.string().describe('Package name.'),
373
+ keepData: z.boolean().optional().describe('Keep data (-k).'),
374
+ deviceId: optionalDeviceId,
375
+ timeoutMs: optionalTimeout,
376
+ },
377
+ }, async (args) => {
378
+ const result = await handlers.handleAdbMcpUninstall({
379
+ packageName: args.packageName,
380
+ keepData: args.keepData,
381
+ deviceId: args.deviceId,
382
+ timeoutMs: args.timeoutMs,
383
+ });
384
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
385
+ });
386
+ server.registerTool('adb_mcp_logcat', {
387
+ description: 'Get logcat output (adb logcat). Options: clear buffer (-c), dump and exit (-d).',
388
+ inputSchema: {
389
+ clear: z.boolean().optional(),
390
+ dump: z.boolean().optional(),
391
+ deviceId: optionalDeviceId,
392
+ timeoutMs: optionalTimeout,
393
+ },
394
+ }, async (args) => {
395
+ const result = await handlers.handleAdbMcpLogcat({
396
+ clear: args.clear,
397
+ dump: args.dump,
398
+ deviceId: args.deviceId,
399
+ timeoutMs: args.timeoutMs,
400
+ });
401
+ return { content: [{ type: 'text', text: result.output }] };
402
+ });
403
+ server.registerTool('adb_mcp_logcat_errors', {
404
+ description: 'Get logcat filtered by level: E (ERROR), F (FATAL), or EF (both).',
405
+ inputSchema: {
406
+ level: z.enum(['E', 'F', 'EF']).optional().describe('E=ERROR, F=FATAL, EF=both.'),
407
+ maxLines: z.number().int().min(1).max(2000).optional(),
408
+ deviceId: optionalDeviceId,
409
+ timeoutMs: optionalTimeout,
410
+ },
411
+ }, async (args) => {
412
+ const result = await handlers.handleAdbMcpLogcatErrors({
413
+ level: args.level,
414
+ maxLines: args.maxLines,
415
+ deviceId: args.deviceId,
416
+ timeoutMs: args.timeoutMs,
417
+ });
418
+ return {
419
+ content: [
420
+ {
421
+ type: 'text',
422
+ text: JSON.stringify({ lineCount: result.lines.length, output: result.output }, null, 2),
423
+ },
424
+ ],
425
+ };
426
+ });
427
+ server.registerTool('adb_mcp_logcat_crashes', {
428
+ description: 'Get logcat and detect crashes; returns hasCrash, crashSnippet, summary.',
429
+ inputSchema: {
430
+ deviceId: optionalDeviceId,
431
+ timeoutMs: optionalTimeout,
432
+ },
433
+ }, async (args) => {
434
+ const result = await handlers.handleAdbMcpLogcatCrashes({
435
+ deviceId: args.deviceId,
436
+ timeoutMs: args.timeoutMs,
437
+ });
438
+ return {
439
+ content: [
440
+ {
441
+ type: 'text',
442
+ text: JSON.stringify({
443
+ hasCrash: result.hasCrash,
444
+ summary: result.summary,
445
+ crashSnippet: result.crashSnippet || undefined,
446
+ outputLength: result.output.length,
447
+ }, null, 2),
448
+ },
449
+ ],
450
+ };
451
+ });
452
+ server.registerTool('adb_mcp_logcat_analyze', {
453
+ description: 'Analyze logcat: error/fatal counts, crash detection, crash snippet, error lines.',
454
+ inputSchema: {
455
+ deviceId: optionalDeviceId,
456
+ timeoutMs: optionalTimeout,
457
+ },
458
+ }, async (args) => {
459
+ const result = await handlers.handleAdbMcpLogcatAnalyze({
460
+ deviceId: args.deviceId,
461
+ timeoutMs: args.timeoutMs,
462
+ });
463
+ return {
464
+ content: [
465
+ {
466
+ type: 'text',
467
+ text: JSON.stringify({
468
+ errorCount: result.errorCount,
469
+ fatalCount: result.fatalCount,
470
+ hasCrash: result.hasCrash,
471
+ summary: result.summary,
472
+ crashSnippet: result.crashSnippet || undefined,
473
+ errorLinesSample: result.errorLines.slice(-50),
474
+ }, null, 2),
475
+ },
476
+ ],
477
+ };
478
+ });
479
+ server.registerTool('adb_mcp_backup', {
480
+ description: 'Backup device (adb backup). Creates backup file on host.',
481
+ inputSchema: {
482
+ outputPath: z.string().describe('Local path for backup file (e.g. backup.ab).'),
483
+ apk: z.boolean().optional(),
484
+ shared: z.boolean().optional(),
485
+ all: z.boolean().optional(),
486
+ nosystem: z.boolean().optional(),
487
+ packageName: z.string().optional().describe('Single package to backup.'),
488
+ deviceId: optionalDeviceId,
489
+ timeoutMs: optionalTimeout,
490
+ },
491
+ }, async (args) => {
492
+ const result = await handlers.handleAdbMcpBackup({
493
+ outputPath: args.outputPath,
494
+ apk: args.apk,
495
+ shared: args.shared,
496
+ all: args.all,
497
+ nosystem: args.nosystem,
498
+ packageName: args.packageName,
499
+ deviceId: args.deviceId,
500
+ timeoutMs: args.timeoutMs,
501
+ });
502
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
503
+ });
504
+ server.registerTool('adb_mcp_restore', {
505
+ description: 'Restore device from backup file (adb restore).',
506
+ inputSchema: {
507
+ backupPath: z.string().describe('Local path to backup file.'),
508
+ deviceId: optionalDeviceId,
509
+ timeoutMs: optionalTimeout,
510
+ },
511
+ }, async (args) => {
512
+ const result = await handlers.handleAdbMcpRestore({
513
+ backupPath: args.backupPath,
514
+ deviceId: args.deviceId,
515
+ timeoutMs: args.timeoutMs,
516
+ });
517
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
518
+ });
519
+ server.registerTool('adb_mcp_reboot', {
520
+ description: 'Reboot device (adb reboot [recovery|bootloader]).',
521
+ inputSchema: {
522
+ mode: z.enum(['recovery', 'bootloader']).optional(),
523
+ deviceId: optionalDeviceId,
524
+ timeoutMs: optionalTimeout,
525
+ },
526
+ }, async (args) => {
527
+ const result = await handlers.handleAdbMcpReboot({
528
+ mode: args.mode,
529
+ deviceId: args.deviceId,
530
+ timeoutMs: args.timeoutMs,
531
+ });
532
+ return { content: [{ type: 'text', text: result.stdout + (result.stderr ? '\n' + result.stderr : '') }] };
533
+ });
534
+ server.registerTool('adb_mcp_get_state', {
535
+ description: 'Get device state (adb get-state).',
536
+ inputSchema: {
537
+ deviceId: optionalDeviceId,
538
+ timeoutMs: optionalTimeout,
539
+ },
540
+ }, async (args) => {
541
+ const result = await handlers.handleAdbMcpGetState({
542
+ deviceId: args.deviceId,
543
+ timeoutMs: args.timeoutMs,
544
+ });
545
+ return { content: [{ type: 'text', text: result.state }] };
546
+ });
547
+ server.registerTool('adb_mcp_get_serialno', {
548
+ description: 'Get device serial number (adb get-serialno).',
549
+ inputSchema: {
550
+ deviceId: optionalDeviceId,
551
+ timeoutMs: optionalTimeout,
552
+ },
553
+ }, async (args) => {
554
+ const result = await handlers.handleAdbMcpGetSerialNo({
555
+ deviceId: args.deviceId,
556
+ timeoutMs: args.timeoutMs,
557
+ });
558
+ return { content: [{ type: 'text', text: result.serialNo }] };
559
+ });
560
+ return server;
561
+ }
562
+ export async function runStdio() {
563
+ const server = createServer();
564
+ const transport = new StdioServerTransport(process.stdin, process.stdout);
565
+ await server.connect(transport);
566
+ }
567
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const ALLOWED_SHELL_COMMANDS: readonly string[];
2
+ export declare const DENIED_PATTERNS: readonly string[];
3
+ export declare function isCommandAllowed(command: string): boolean;
4
+ //# sourceMappingURL=allowlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowlist.d.ts","sourceRoot":"","sources":["../../src/security/allowlist.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAa1C,CAAC;AAEX,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EA4BnC,CAAC;AAEX,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAczD"}
@@ -0,0 +1,59 @@
1
+ export const ALLOWED_SHELL_COMMANDS = [
2
+ 'getprop', 'id', 'whoami', 'pwd', 'ps ', 'ps\n',
3
+ 'dumpsys',
4
+ 'pm list', 'pm path', 'pm dump', 'pm clear', 'pm install', 'pm uninstall', 'pm enable', 'pm disable',
5
+ 'am start', 'am startservice', 'am start-service', 'am stopservice', 'am force-stop', 'am stack', 'am broadcast', 'am instrument', 'am dumpheap',
6
+ 'input ',
7
+ 'screencap', 'screenrecord',
8
+ 'settings get', 'settings list', 'settings put', 'settings delete',
9
+ 'wm size', 'wm density', 'wm overscan', 'wm dismiss-keyguard',
10
+ 'logcat',
11
+ 'service list', 'service call', 'netstat',
12
+ 'cat ', 'ls ', 'ls\n', 'run-as',
13
+ 'echo ', 'stat ', 'readlink ',
14
+ ];
15
+ export const DENIED_PATTERNS = [
16
+ 'su ',
17
+ 'su\n',
18
+ 'sh -c',
19
+ 'bash -c',
20
+ 'adb ',
21
+ '&&',
22
+ '||',
23
+ ';',
24
+ '|',
25
+ '`',
26
+ '$(',
27
+ '>',
28
+ '<',
29
+ 'chmod',
30
+ 'chown',
31
+ 'rm ',
32
+ 'rm -',
33
+ 'dd ',
34
+ 'mkfs',
35
+ 'mount ',
36
+ 'umount',
37
+ 'reboot',
38
+ 'shutdown',
39
+ 'setprop',
40
+ 'svc ',
41
+ 'iptables',
42
+ 'ndc ',
43
+ ];
44
+ export function isCommandAllowed(command) {
45
+ const trimmed = command.trim();
46
+ if (!trimmed.length)
47
+ return false;
48
+ const lower = trimmed.toLowerCase();
49
+ for (const denied of DENIED_PATTERNS) {
50
+ if (lower.includes(denied.toLowerCase()))
51
+ return false;
52
+ }
53
+ for (const allowed of ALLOWED_SHELL_COMMANDS) {
54
+ if (trimmed.startsWith(allowed))
55
+ return true;
56
+ }
57
+ return false;
58
+ }
59
+ //# sourceMappingURL=allowlist.js.map