adb-ready 0.1.2 → 0.2.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.
@@ -0,0 +1,522 @@
1
+ {
2
+ "title": "ADB Ready agent tool contract",
3
+ "schemaVersion": 1,
4
+ "packageVersion": "0.2.0",
5
+ "protocolVersion": "2025-11-25",
6
+ "transport": "stdio",
7
+ "tools": [
8
+ {
9
+ "name": "capture_screenshot",
10
+ "description": "Capture a verified PNG inside the project without overwriting an existing file.",
11
+ "inputSchema": {
12
+ "type": "object",
13
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
14
+ "properties": {
15
+ "out": {
16
+ "type": "string",
17
+ "minLength": 1
18
+ }
19
+ }
20
+ },
21
+ "annotations": {
22
+ "readOnlyHint": false,
23
+ "destructiveHint": false,
24
+ "idempotentHint": false,
25
+ "openWorldHint": false
26
+ }
27
+ },
28
+ {
29
+ "name": "compile_debug_context",
30
+ "description": "Compile bounded redacted context. Screenshots and UI text are excluded.",
31
+ "inputSchema": {
32
+ "type": "object",
33
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
34
+ "properties": {
35
+ "sessionId": {
36
+ "type": "string",
37
+ "minLength": 1
38
+ },
39
+ "budget": {
40
+ "type": "integer",
41
+ "minimum": 1000,
42
+ "maximum": 100000
43
+ }
44
+ }
45
+ },
46
+ "annotations": {
47
+ "readOnlyHint": true,
48
+ "destructiveHint": false,
49
+ "idempotentHint": true,
50
+ "openWorldHint": false
51
+ }
52
+ },
53
+ {
54
+ "name": "doctor",
55
+ "description": "Inspect the local runtime, ADB server, capabilities, and visible Android targets.",
56
+ "inputSchema": {
57
+ "type": "object",
58
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
59
+ "properties": {}
60
+ },
61
+ "annotations": {
62
+ "readOnlyHint": true,
63
+ "destructiveHint": false,
64
+ "idempotentHint": true,
65
+ "openWorldHint": false
66
+ }
67
+ },
68
+ {
69
+ "name": "ensure_ready",
70
+ "description": "Select exactly one ready Android target and bind it for this MCP connection.",
71
+ "inputSchema": {
72
+ "type": "object",
73
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
74
+ "properties": {
75
+ "device": {
76
+ "type": "string",
77
+ "minLength": 1
78
+ },
79
+ "transportId": {
80
+ "type": "string",
81
+ "minLength": 1
82
+ }
83
+ }
84
+ },
85
+ "annotations": {
86
+ "readOnlyHint": true,
87
+ "destructiveHint": false,
88
+ "idempotentHint": true,
89
+ "openWorldHint": false
90
+ }
91
+ },
92
+ {
93
+ "name": "get_session_problems",
94
+ "description": "Read structured problems from one saved local development session.",
95
+ "inputSchema": {
96
+ "type": "object",
97
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
98
+ "properties": {
99
+ "sessionId": {
100
+ "type": "string",
101
+ "minLength": 1
102
+ }
103
+ }
104
+ },
105
+ "annotations": {
106
+ "readOnlyHint": true,
107
+ "destructiveHint": false,
108
+ "idempotentHint": true,
109
+ "openWorldHint": false
110
+ }
111
+ },
112
+ {
113
+ "name": "inspect_app",
114
+ "description": "Return bounded sensitive app, foreground, and classified-log evidence without a screenshot.",
115
+ "inputSchema": {
116
+ "type": "object",
117
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
118
+ "properties": {
119
+ "applicationId": {
120
+ "type": "string",
121
+ "minLength": 3
122
+ }
123
+ }
124
+ },
125
+ "annotations": {
126
+ "readOnlyHint": true,
127
+ "destructiveHint": false,
128
+ "idempotentHint": true,
129
+ "openWorldHint": false
130
+ }
131
+ },
132
+ {
133
+ "name": "inspect_ui",
134
+ "description": "Return a bounded sensitive accessibility snapshot with digest-scoped references.",
135
+ "inputSchema": {
136
+ "type": "object",
137
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
138
+ "properties": {
139
+ "interactiveOnly": {
140
+ "type": "boolean"
141
+ },
142
+ "maxDepth": {
143
+ "type": "integer",
144
+ "minimum": 1,
145
+ "maximum": 100
146
+ }
147
+ }
148
+ },
149
+ "annotations": {
150
+ "readOnlyHint": true,
151
+ "destructiveHint": false,
152
+ "idempotentHint": true,
153
+ "openWorldHint": false
154
+ }
155
+ },
156
+ {
157
+ "name": "install_app",
158
+ "description": "Install one project-local APK and verify its package. Downloads and split APKs are rejected.",
159
+ "inputSchema": {
160
+ "type": "object",
161
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
162
+ "properties": {
163
+ "path": {
164
+ "type": "string",
165
+ "minLength": 1
166
+ },
167
+ "applicationId": {
168
+ "type": "string",
169
+ "minLength": 3
170
+ },
171
+ "replace": {
172
+ "type": "boolean"
173
+ },
174
+ "grantRuntimePermissions": {
175
+ "type": "boolean"
176
+ }
177
+ },
178
+ "required": ["path"]
179
+ },
180
+ "annotations": {
181
+ "readOnlyHint": false,
182
+ "destructiveHint": false,
183
+ "idempotentHint": false,
184
+ "openWorldHint": false
185
+ }
186
+ },
187
+ {
188
+ "name": "launch_app",
189
+ "description": "Launch the resolved app and verify it is foreground.",
190
+ "inputSchema": {
191
+ "type": "object",
192
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
193
+ "properties": {
194
+ "applicationId": {
195
+ "type": "string",
196
+ "minLength": 3
197
+ },
198
+ "activity": {
199
+ "type": "string",
200
+ "minLength": 1
201
+ }
202
+ }
203
+ },
204
+ "annotations": {
205
+ "readOnlyHint": false,
206
+ "destructiveHint": false,
207
+ "idempotentHint": true,
208
+ "openWorldHint": false
209
+ }
210
+ },
211
+ {
212
+ "name": "list_targets",
213
+ "description": "List Android targets without changing the connection's bound target.",
214
+ "inputSchema": {
215
+ "type": "object",
216
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
217
+ "properties": {}
218
+ },
219
+ "annotations": {
220
+ "readOnlyHint": true,
221
+ "destructiveHint": false,
222
+ "idempotentHint": true,
223
+ "openWorldHint": false
224
+ }
225
+ },
226
+ {
227
+ "name": "long_press_ui",
228
+ "description": "Long-press a current digest-scoped UI ref or explicit display coordinate, then compare UI state.",
229
+ "inputSchema": {
230
+ "type": "object",
231
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
232
+ "properties": {
233
+ "target": {
234
+ "anyOf": [
235
+ {
236
+ "type": "object",
237
+ "properties": {
238
+ "ref": {
239
+ "type": "string",
240
+ "pattern": "^ui:[a-f0-9]{12}:\\d+$"
241
+ }
242
+ },
243
+ "required": ["ref"]
244
+ },
245
+ {
246
+ "type": "object",
247
+ "properties": {
248
+ "x": {
249
+ "type": "integer",
250
+ "minimum": 0,
251
+ "maximum": 100000
252
+ },
253
+ "y": {
254
+ "type": "integer",
255
+ "minimum": 0,
256
+ "maximum": 100000
257
+ }
258
+ },
259
+ "required": ["x", "y"]
260
+ }
261
+ ]
262
+ },
263
+ "dryRun": {
264
+ "type": "boolean"
265
+ }
266
+ },
267
+ "required": ["target"]
268
+ },
269
+ "annotations": {
270
+ "readOnlyHint": false,
271
+ "destructiveHint": false,
272
+ "idempotentHint": false,
273
+ "openWorldHint": false
274
+ }
275
+ },
276
+ {
277
+ "name": "open_url",
278
+ "description": "Open an absolute URL and verify an explicit app handler when provided.",
279
+ "inputSchema": {
280
+ "type": "object",
281
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
282
+ "properties": {
283
+ "url": {
284
+ "type": "string",
285
+ "format": "uri"
286
+ },
287
+ "applicationId": {
288
+ "type": "string",
289
+ "minLength": 3
290
+ }
291
+ },
292
+ "required": ["url"]
293
+ },
294
+ "annotations": {
295
+ "readOnlyHint": false,
296
+ "destructiveHint": false,
297
+ "idempotentHint": false,
298
+ "openWorldHint": false
299
+ }
300
+ },
301
+ {
302
+ "name": "press_key_ui",
303
+ "description": "Press one allowlisted Android navigation or volume key, then compare UI state.",
304
+ "inputSchema": {
305
+ "type": "object",
306
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
307
+ "properties": {
308
+ "key": {
309
+ "type": "string",
310
+ "enum": ["back", "enter", "home", "menu", "volume-down", "volume-up"]
311
+ },
312
+ "dryRun": {
313
+ "type": "boolean"
314
+ }
315
+ },
316
+ "required": ["key"]
317
+ },
318
+ "annotations": {
319
+ "readOnlyHint": false,
320
+ "destructiveHint": false,
321
+ "idempotentHint": false,
322
+ "openWorldHint": false
323
+ }
324
+ },
325
+ {
326
+ "name": "resolve_app",
327
+ "description": "Resolve the Android project application ID with provenance.",
328
+ "inputSchema": {
329
+ "type": "object",
330
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
331
+ "properties": {
332
+ "applicationId": {
333
+ "type": "string",
334
+ "minLength": 3
335
+ }
336
+ }
337
+ },
338
+ "annotations": {
339
+ "readOnlyHint": true,
340
+ "destructiveHint": false,
341
+ "idempotentHint": true,
342
+ "openWorldHint": false
343
+ }
344
+ },
345
+ {
346
+ "name": "restart_app",
347
+ "description": "Restart the resolved app and verify it is foreground.",
348
+ "inputSchema": {
349
+ "type": "object",
350
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
351
+ "properties": {
352
+ "applicationId": {
353
+ "type": "string",
354
+ "minLength": 3
355
+ },
356
+ "activity": {
357
+ "type": "string",
358
+ "minLength": 1
359
+ }
360
+ }
361
+ },
362
+ "annotations": {
363
+ "readOnlyHint": false,
364
+ "destructiveHint": false,
365
+ "idempotentHint": true,
366
+ "openWorldHint": false
367
+ }
368
+ },
369
+ {
370
+ "name": "swipe_ui",
371
+ "description": "Swipe in a screen-relative direction or between explicit display coordinates, then compare UI state.",
372
+ "inputSchema": {
373
+ "type": "object",
374
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
375
+ "properties": {
376
+ "direction": {
377
+ "type": "string",
378
+ "enum": ["down", "left", "right", "up"]
379
+ },
380
+ "x1": {
381
+ "type": "integer",
382
+ "minimum": 0,
383
+ "maximum": 100000
384
+ },
385
+ "y1": {
386
+ "type": "integer",
387
+ "minimum": 0,
388
+ "maximum": 100000
389
+ },
390
+ "x2": {
391
+ "type": "integer",
392
+ "minimum": 0,
393
+ "maximum": 100000
394
+ },
395
+ "y2": {
396
+ "type": "integer",
397
+ "minimum": 0,
398
+ "maximum": 100000
399
+ },
400
+ "dryRun": {
401
+ "type": "boolean"
402
+ }
403
+ }
404
+ },
405
+ "annotations": {
406
+ "readOnlyHint": false,
407
+ "destructiveHint": false,
408
+ "idempotentHint": false,
409
+ "openWorldHint": false
410
+ }
411
+ },
412
+ {
413
+ "name": "tap_ui",
414
+ "description": "Tap a current digest-scoped UI ref or explicit display coordinate, then compare UI state.",
415
+ "inputSchema": {
416
+ "type": "object",
417
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
418
+ "properties": {
419
+ "target": {
420
+ "anyOf": [
421
+ {
422
+ "type": "object",
423
+ "properties": {
424
+ "ref": {
425
+ "type": "string",
426
+ "pattern": "^ui:[a-f0-9]{12}:\\d+$"
427
+ }
428
+ },
429
+ "required": ["ref"]
430
+ },
431
+ {
432
+ "type": "object",
433
+ "properties": {
434
+ "x": {
435
+ "type": "integer",
436
+ "minimum": 0,
437
+ "maximum": 100000
438
+ },
439
+ "y": {
440
+ "type": "integer",
441
+ "minimum": 0,
442
+ "maximum": 100000
443
+ }
444
+ },
445
+ "required": ["x", "y"]
446
+ }
447
+ ]
448
+ },
449
+ "dryRun": {
450
+ "type": "boolean"
451
+ }
452
+ },
453
+ "required": ["target"]
454
+ },
455
+ "annotations": {
456
+ "readOnlyHint": false,
457
+ "destructiveHint": false,
458
+ "idempotentHint": false,
459
+ "openWorldHint": false
460
+ }
461
+ },
462
+ {
463
+ "name": "type_text_ui",
464
+ "description": "Type conservative shell-safe text into the focused Android field and optionally press enter.",
465
+ "inputSchema": {
466
+ "type": "object",
467
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
468
+ "properties": {
469
+ "text": {
470
+ "type": "string",
471
+ "minLength": 1,
472
+ "maxLength": 256
473
+ },
474
+ "submit": {
475
+ "type": "boolean"
476
+ },
477
+ "dryRun": {
478
+ "type": "boolean"
479
+ }
480
+ },
481
+ "required": ["text"]
482
+ },
483
+ "annotations": {
484
+ "readOnlyHint": false,
485
+ "destructiveHint": false,
486
+ "idempotentHint": false,
487
+ "openWorldHint": false
488
+ }
489
+ },
490
+ {
491
+ "name": "wait_for_ui",
492
+ "description": "Wait a bounded time for an exact id=, text=, desc=, or package= selector to be visible or gone.",
493
+ "inputSchema": {
494
+ "type": "object",
495
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
496
+ "properties": {
497
+ "selector": {
498
+ "type": "string",
499
+ "minLength": 3,
500
+ "maxLength": 264
501
+ },
502
+ "state": {
503
+ "type": "string",
504
+ "enum": ["gone", "visible"]
505
+ },
506
+ "timeoutMs": {
507
+ "type": "integer",
508
+ "minimum": 100,
509
+ "maximum": 120000
510
+ }
511
+ },
512
+ "required": ["selector"]
513
+ },
514
+ "annotations": {
515
+ "readOnlyHint": true,
516
+ "destructiveHint": false,
517
+ "idempotentHint": true,
518
+ "openWorldHint": false
519
+ }
520
+ }
521
+ ]
522
+ }
@@ -43,6 +43,9 @@
43
43
  "targets": {
44
44
  "$ref": "#/$defs/targets"
45
45
  },
46
+ "app": {
47
+ "$ref": "#/$defs/app"
48
+ },
46
49
  "dev": {
47
50
  "$ref": "#/$defs/dev"
48
51
  }
@@ -107,6 +110,9 @@
107
110
  }
108
111
  }
109
112
  },
113
+ "app": {
114
+ "$ref": "#/$defs/app"
115
+ },
110
116
  "dev": {
111
117
  "$ref": "#/$defs/dev"
112
118
  }
@@ -144,6 +150,22 @@
144
150
  }
145
151
  }
146
152
  },
153
+ "app": {
154
+ "type": "object",
155
+ "additionalProperties": false,
156
+ "properties": {
157
+ "android": {
158
+ "type": "object",
159
+ "additionalProperties": false,
160
+ "properties": {
161
+ "package": {
162
+ "type": "string",
163
+ "pattern": "^[A-Za-z][A-Za-z0-9_]*(?:\\.[A-Za-z0-9_]+)+$"
164
+ }
165
+ }
166
+ }
167
+ }
168
+ },
147
169
  "dev": {
148
170
  "type": "object",
149
171
  "additionalProperties": false,