mcp-scraper 0.2.19 → 0.2.21

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 (77) hide show
  1. package/README.md +36 -5
  2. package/dist/bin/api-server.cjs +1072 -349
  3. package/dist/bin/api-server.cjs.map +1 -1
  4. package/dist/bin/api-server.js +3 -3
  5. package/dist/bin/browser-agent-stdio-server.cjs +1274 -75
  6. package/dist/bin/browser-agent-stdio-server.cjs.map +1 -1
  7. package/dist/bin/browser-agent-stdio-server.js +4 -2
  8. package/dist/bin/browser-agent-stdio-server.js.map +1 -1
  9. package/dist/bin/mcp-scraper-cli.cjs +659 -210
  10. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  11. package/dist/bin/mcp-scraper-cli.js +108 -9
  12. package/dist/bin/mcp-scraper-cli.js.map +1 -1
  13. package/dist/bin/mcp-scraper-combined-stdio-server.cjs +2104 -566
  14. package/dist/bin/mcp-scraper-combined-stdio-server.cjs.map +1 -1
  15. package/dist/bin/mcp-scraper-combined-stdio-server.js +7 -4
  16. package/dist/bin/mcp-scraper-combined-stdio-server.js.map +1 -1
  17. package/dist/bin/mcp-scraper-install.cjs +3 -3
  18. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  19. package/dist/bin/mcp-scraper-install.js +2 -2
  20. package/dist/bin/mcp-stdio-server.cjs +726 -387
  21. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  22. package/dist/bin/mcp-stdio-server.js +3 -2
  23. package/dist/bin/mcp-stdio-server.js.map +1 -1
  24. package/dist/bin/paa-harvest.cjs +5 -3
  25. package/dist/bin/paa-harvest.cjs.map +1 -1
  26. package/dist/bin/paa-harvest.js +5 -2
  27. package/dist/bin/paa-harvest.js.map +1 -1
  28. package/dist/{chunk-TL7YTFLH.js → chunk-DBQDG7EH.js} +99 -27
  29. package/dist/chunk-DBQDG7EH.js.map +1 -0
  30. package/dist/chunk-DUEW4EOO.js +214 -0
  31. package/dist/chunk-DUEW4EOO.js.map +1 -0
  32. package/dist/{chunk-F44RBOJ5.js → chunk-H2R232HK.js} +216 -108
  33. package/dist/chunk-H2R232HK.js.map +1 -0
  34. package/dist/chunk-HS6OKELW.js +1786 -0
  35. package/dist/chunk-HS6OKELW.js.map +1 -0
  36. package/dist/{chunk-CQTAKXBN.js → chunk-IPW4LFOT.js} +11 -116
  37. package/dist/chunk-IPW4LFOT.js.map +1 -0
  38. package/dist/chunk-LFATOGDF.js +111 -0
  39. package/dist/chunk-LFATOGDF.js.map +1 -0
  40. package/dist/{chunk-MCBOZ2JF.js → chunk-MLNCKQ2B.js} +3 -3
  41. package/dist/chunk-MLNCKQ2B.js.map +1 -0
  42. package/dist/{chunk-4UEVYYDW.js → chunk-O5J7E4VX.js} +394 -57
  43. package/dist/chunk-O5J7E4VX.js.map +1 -0
  44. package/dist/{chunk-BSYPATSM.js → chunk-SXTXMFEQ.js} +2 -2
  45. package/dist/chunk-WN7PBKMV.js +28 -0
  46. package/dist/chunk-WN7PBKMV.js.map +1 -0
  47. package/dist/chunk-XKUDVN2E.js +7 -0
  48. package/dist/chunk-XKUDVN2E.js.map +1 -0
  49. package/dist/{db-P5X6UQ3E.js → db-BE4JVB3V.js} +8 -2
  50. package/dist/index.cjs +5 -3
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts +2 -2
  53. package/dist/index.d.ts +2 -2
  54. package/dist/index.js +3 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/{server-CRUSZA2Q.js → server-24XIQ6W6.js} +248 -40
  57. package/dist/server-24XIQ6W6.js.map +1 -0
  58. package/dist/{worker-OZSWIS3F.js → worker-SLQ375UG.js} +8 -5
  59. package/dist/{worker-OZSWIS3F.js.map → worker-SLQ375UG.js.map} +1 -1
  60. package/docs/adr/0001-in-page-graphql-interception-for-anti-bot-scraping.md +2 -2
  61. package/docs/mcp-tool-craft-lint.generated.md +51 -0
  62. package/docs/mcp-tool-manifest.generated.json +1534 -0
  63. package/docs/specs/local-competitive-audit-spec.md +1 -2
  64. package/docs/specs/mcp-tool-definition-quality-audit-spec.md +1602 -0
  65. package/package.json +4 -1
  66. package/dist/chunk-4UEVYYDW.js.map +0 -1
  67. package/dist/chunk-76P4DKWR.js +0 -793
  68. package/dist/chunk-76P4DKWR.js.map +0 -1
  69. package/dist/chunk-CQTAKXBN.js.map +0 -1
  70. package/dist/chunk-F44RBOJ5.js.map +0 -1
  71. package/dist/chunk-MCBOZ2JF.js.map +0 -1
  72. package/dist/chunk-RU2HZD55.js +0 -7
  73. package/dist/chunk-RU2HZD55.js.map +0 -1
  74. package/dist/chunk-TL7YTFLH.js.map +0 -1
  75. package/dist/server-CRUSZA2Q.js.map +0 -1
  76. /package/dist/{chunk-BSYPATSM.js.map → chunk-SXTXMFEQ.js.map} +0 -0
  77. /package/dist/{db-P5X6UQ3E.js.map → db-BE4JVB3V.js.map} +0 -0
@@ -0,0 +1,1534 @@
1
+ {
2
+ "generatedAt": "2026-06-17T18:15:10.329Z",
3
+ "counts": {
4
+ "main_stdio": 22,
5
+ "browser_agent_stdio": 21,
6
+ "combined_stdio": 43,
7
+ "hosted_http": 24,
8
+ "hosted_only": 2,
9
+ "unique_public": 45
10
+ },
11
+ "surfaces": {
12
+ "main_stdio": [
13
+ "harvest_paa",
14
+ "search_serp",
15
+ "extract_url",
16
+ "map_site_urls",
17
+ "extract_site",
18
+ "youtube_harvest",
19
+ "youtube_transcribe",
20
+ "facebook_page_intel",
21
+ "facebook_ad_search",
22
+ "facebook_ad_transcribe",
23
+ "facebook_video_transcribe",
24
+ "maps_place_intel",
25
+ "maps_search",
26
+ "directory_workflow",
27
+ "workflow_list",
28
+ "workflow_suggest",
29
+ "workflow_run",
30
+ "workflow_step",
31
+ "workflow_status",
32
+ "workflow_artifact_read",
33
+ "rank_tracker_blueprint",
34
+ "credits_info"
35
+ ],
36
+ "browser_agent_stdio": [
37
+ "browser_open",
38
+ "browser_profile_list",
39
+ "browser_profile_import",
40
+ "browser_profile_sync",
41
+ "browser_profile_onboard",
42
+ "browser_screenshot",
43
+ "browser_read",
44
+ "browser_locate",
45
+ "browser_goto",
46
+ "browser_click",
47
+ "browser_type",
48
+ "browser_scroll",
49
+ "browser_press",
50
+ "browser_replay_start",
51
+ "browser_replay_stop",
52
+ "browser_list_replays",
53
+ "browser_replay_download",
54
+ "browser_replay_mark",
55
+ "browser_replay_annotate",
56
+ "browser_close",
57
+ "browser_list_sessions"
58
+ ],
59
+ "combined_stdio": [
60
+ "harvest_paa",
61
+ "search_serp",
62
+ "extract_url",
63
+ "map_site_urls",
64
+ "extract_site",
65
+ "youtube_harvest",
66
+ "youtube_transcribe",
67
+ "facebook_page_intel",
68
+ "facebook_ad_search",
69
+ "facebook_ad_transcribe",
70
+ "facebook_video_transcribe",
71
+ "maps_place_intel",
72
+ "maps_search",
73
+ "directory_workflow",
74
+ "workflow_list",
75
+ "workflow_suggest",
76
+ "workflow_run",
77
+ "workflow_step",
78
+ "workflow_status",
79
+ "workflow_artifact_read",
80
+ "rank_tracker_blueprint",
81
+ "credits_info",
82
+ "browser_open",
83
+ "browser_profile_list",
84
+ "browser_profile_import",
85
+ "browser_profile_sync",
86
+ "browser_profile_onboard",
87
+ "browser_screenshot",
88
+ "browser_read",
89
+ "browser_locate",
90
+ "browser_goto",
91
+ "browser_click",
92
+ "browser_type",
93
+ "browser_scroll",
94
+ "browser_press",
95
+ "browser_replay_start",
96
+ "browser_replay_stop",
97
+ "browser_list_replays",
98
+ "browser_replay_download",
99
+ "browser_replay_mark",
100
+ "browser_replay_annotate",
101
+ "browser_close",
102
+ "browser_list_sessions"
103
+ ],
104
+ "hosted_http": [
105
+ "harvest_paa",
106
+ "search_serp",
107
+ "extract_url",
108
+ "map_site_urls",
109
+ "extract_site",
110
+ "youtube_harvest",
111
+ "youtube_transcribe",
112
+ "facebook_page_intel",
113
+ "facebook_ad_search",
114
+ "facebook_ad_transcribe",
115
+ "facebook_video_transcribe",
116
+ "maps_place_intel",
117
+ "maps_search",
118
+ "directory_workflow",
119
+ "workflow_list",
120
+ "workflow_suggest",
121
+ "workflow_run",
122
+ "workflow_step",
123
+ "workflow_status",
124
+ "workflow_artifact_read",
125
+ "rank_tracker_blueprint",
126
+ "credits_info",
127
+ "capture_serp_snapshot",
128
+ "capture_serp_page_snapshots"
129
+ ],
130
+ "hosted_only": [
131
+ "capture_serp_snapshot",
132
+ "capture_serp_page_snapshots"
133
+ ],
134
+ "unique_public": [
135
+ "harvest_paa",
136
+ "search_serp",
137
+ "extract_url",
138
+ "map_site_urls",
139
+ "extract_site",
140
+ "youtube_harvest",
141
+ "youtube_transcribe",
142
+ "facebook_page_intel",
143
+ "facebook_ad_search",
144
+ "facebook_ad_transcribe",
145
+ "facebook_video_transcribe",
146
+ "maps_place_intel",
147
+ "maps_search",
148
+ "directory_workflow",
149
+ "workflow_list",
150
+ "workflow_suggest",
151
+ "workflow_run",
152
+ "workflow_step",
153
+ "workflow_status",
154
+ "workflow_artifact_read",
155
+ "rank_tracker_blueprint",
156
+ "credits_info",
157
+ "browser_open",
158
+ "browser_profile_list",
159
+ "browser_profile_import",
160
+ "browser_profile_sync",
161
+ "browser_profile_onboard",
162
+ "browser_screenshot",
163
+ "browser_read",
164
+ "browser_locate",
165
+ "browser_goto",
166
+ "browser_click",
167
+ "browser_type",
168
+ "browser_scroll",
169
+ "browser_press",
170
+ "browser_replay_start",
171
+ "browser_replay_stop",
172
+ "browser_list_replays",
173
+ "browser_replay_download",
174
+ "browser_replay_mark",
175
+ "browser_replay_annotate",
176
+ "browser_close",
177
+ "browser_list_sessions",
178
+ "capture_serp_snapshot",
179
+ "capture_serp_page_snapshots"
180
+ ]
181
+ },
182
+ "tools": [
183
+ {
184
+ "name": "harvest_paa",
185
+ "surfaces": [
186
+ "main_stdio",
187
+ "combined_stdio",
188
+ "hosted_http"
189
+ ],
190
+ "tokenBudgetClass": "core",
191
+ "hasOutputSchema": true,
192
+ "hasStructuredContent": true,
193
+ "writesLocalFiles": true,
194
+ "symptomTriggers": [
195
+ "the user needs Google PAA questions, source answers, AI Overview language, or broad SERP research"
196
+ ],
197
+ "samplePrompts": [
198
+ "Find PAA questions for heat pump replacement cost in Denver",
199
+ "Do a deep PAA harvest for med spa SEO",
200
+ "What sources does Google use for this topic?"
201
+ ],
202
+ "formatExamples": [
203
+ "query=\"best hvac company\", location=\"Denver, CO\"",
204
+ "proxyMode=\"location\" only for explicit ZIP/city proxy evidence"
205
+ ],
206
+ "negativeSpace": "Use search_serp for quick rankings without PAA expansion; use maps_search for Google Maps business lists.",
207
+ "producesHandlesFor": [
208
+ "extract_url"
209
+ ],
210
+ "consumesHandles": []
211
+ },
212
+ {
213
+ "name": "search_serp",
214
+ "surfaces": [
215
+ "main_stdio",
216
+ "combined_stdio",
217
+ "hosted_http"
218
+ ],
219
+ "tokenBudgetClass": "core",
220
+ "hasOutputSchema": true,
221
+ "hasStructuredContent": true,
222
+ "writesLocalFiles": true,
223
+ "symptomTriggers": [
224
+ "the user asks for rankings, organic positions, local pack presence, or a quick Google SERP check"
225
+ ],
226
+ "samplePrompts": [
227
+ "Check the SERP for best dentist in Brooklyn NY",
228
+ "Who ranks for AI SEO tools?",
229
+ "Show organic positions for this keyword"
230
+ ],
231
+ "formatExamples": [
232
+ "query=\"best dentist\", location=\"Brooklyn, NY\"",
233
+ "pages=1 normally, pages=2 only for deeper evidence"
234
+ ],
235
+ "negativeSpace": "Use harvest_paa when the user needs People Also Ask expansion; use capture_serp_snapshot for hosted SERP Intelligence evidence.",
236
+ "producesHandlesFor": [
237
+ "extract_url",
238
+ "capture_serp_page_snapshots"
239
+ ],
240
+ "consumesHandles": []
241
+ },
242
+ {
243
+ "name": "extract_url",
244
+ "surfaces": [
245
+ "main_stdio",
246
+ "combined_stdio",
247
+ "hosted_http"
248
+ ],
249
+ "tokenBudgetClass": "core",
250
+ "hasOutputSchema": true,
251
+ "hasStructuredContent": true,
252
+ "writesLocalFiles": true,
253
+ "symptomTriggers": [
254
+ "the user provides one URL and wants content, schema, metadata, screenshots, branding, or media assets"
255
+ ],
256
+ "samplePrompts": [
257
+ "Extract this landing page",
258
+ "Get schema and headings from this URL",
259
+ "Download images from this page"
260
+ ],
261
+ "formatExamples": [
262
+ "url=\"https://example.com/service-page\"",
263
+ "screenshotDevice=\"mobile\"",
264
+ "mediaTypes=[\"image\",\"video\"]"
265
+ ],
266
+ "negativeSpace": "Use map_site_urls before extracting a whole site; use extract_site for multi-page extraction.",
267
+ "producesHandlesFor": [
268
+ "saved-report",
269
+ "local-screenshot",
270
+ "local-media"
271
+ ],
272
+ "consumesHandles": [
273
+ "public-url"
274
+ ]
275
+ },
276
+ {
277
+ "name": "map_site_urls",
278
+ "surfaces": [
279
+ "main_stdio",
280
+ "combined_stdio",
281
+ "hosted_http"
282
+ ],
283
+ "tokenBudgetClass": "core",
284
+ "hasOutputSchema": true,
285
+ "hasStructuredContent": true,
286
+ "writesLocalFiles": true,
287
+ "symptomTriggers": [
288
+ "the user wants a sitemap, URL inventory, broken-link scan, or crawl planning before extraction"
289
+ ],
290
+ "samplePrompts": [
291
+ "Map this website URLs",
292
+ "Find broken links on this site",
293
+ "Build a URL inventory before audit"
294
+ ],
295
+ "formatExamples": [
296
+ "url=\"https://example.com\"",
297
+ "maxUrls=100 for normal maps, maxUrls=500 for full inventory"
298
+ ],
299
+ "negativeSpace": "Use extract_url for one known page; use extract_site after mapping when the user wants page content.",
300
+ "producesHandlesFor": [
301
+ "extract_url",
302
+ "extract_site"
303
+ ],
304
+ "consumesHandles": [
305
+ "public-site-url"
306
+ ]
307
+ },
308
+ {
309
+ "name": "extract_site",
310
+ "surfaces": [
311
+ "main_stdio",
312
+ "combined_stdio",
313
+ "hosted_http"
314
+ ],
315
+ "tokenBudgetClass": "core",
316
+ "hasOutputSchema": true,
317
+ "hasStructuredContent": true,
318
+ "writesLocalFiles": true,
319
+ "symptomTriggers": [
320
+ "the user wants a multi-page site audit, content crawl, competitor crawl, or schema inventory"
321
+ ],
322
+ "samplePrompts": [
323
+ "Extract this site for an SEO audit",
324
+ "Crawl the top pages of this competitor",
325
+ "Get titles and schema across the site"
326
+ ],
327
+ "formatExamples": [
328
+ "url=\"https://example.com\"",
329
+ "maxPages=50 for the MCP limit"
330
+ ],
331
+ "negativeSpace": "Use map_site_urls first when the user needs URL selection; use extract_url for one page.",
332
+ "producesHandlesFor": [
333
+ "saved-report"
334
+ ],
335
+ "consumesHandles": [
336
+ "public-site-url"
337
+ ]
338
+ },
339
+ {
340
+ "name": "youtube_harvest",
341
+ "surfaces": [
342
+ "main_stdio",
343
+ "combined_stdio",
344
+ "hosted_http"
345
+ ],
346
+ "tokenBudgetClass": "core",
347
+ "hasOutputSchema": true,
348
+ "hasStructuredContent": true,
349
+ "writesLocalFiles": true,
350
+ "symptomTriggers": [
351
+ "the user wants to discover YouTube videos by topic or inspect a channel library"
352
+ ],
353
+ "samplePrompts": [
354
+ "Find YouTube videos about local SEO",
355
+ "Harvest videos from @mkbhd",
356
+ "Show the top videos for this query"
357
+ ],
358
+ "formatExamples": [
359
+ "mode=\"search\", query=\"best SEO tutorials 2026\"",
360
+ "mode=\"channel\", channelHandle=\"@mkbhd\""
361
+ ],
362
+ "negativeSpace": "Use youtube_transcribe after selecting one video ID or URL.",
363
+ "producesHandlesFor": [
364
+ "youtube_transcribe"
365
+ ],
366
+ "consumesHandles": []
367
+ },
368
+ {
369
+ "name": "youtube_transcribe",
370
+ "surfaces": [
371
+ "main_stdio",
372
+ "combined_stdio",
373
+ "hosted_http"
374
+ ],
375
+ "tokenBudgetClass": "core",
376
+ "hasOutputSchema": true,
377
+ "hasStructuredContent": true,
378
+ "writesLocalFiles": true,
379
+ "symptomTriggers": [
380
+ "the user asks what a YouTube video says, wants a transcript, or wants claims/lessons extracted from a video"
381
+ ],
382
+ "samplePrompts": [
383
+ "Transcribe this YouTube URL",
384
+ "What claims does this video make?",
385
+ "Summarize the transcript for this video ID"
386
+ ],
387
+ "formatExamples": [
388
+ "videoId=\"dQw4w9WgXcQ\"",
389
+ "url=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\""
390
+ ],
391
+ "negativeSpace": "Use youtube_harvest first when the user has a topic/channel but no selected video.",
392
+ "producesHandlesFor": [],
393
+ "consumesHandles": [
394
+ "youtube-video-id",
395
+ "youtube-url"
396
+ ]
397
+ },
398
+ {
399
+ "name": "facebook_page_intel",
400
+ "surfaces": [
401
+ "main_stdio",
402
+ "combined_stdio",
403
+ "hosted_http"
404
+ ],
405
+ "tokenBudgetClass": "core",
406
+ "hasOutputSchema": true,
407
+ "hasStructuredContent": true,
408
+ "writesLocalFiles": true,
409
+ "symptomTriggers": [
410
+ "the user wants Facebook advertiser ads, ad copy, creatives, landing URLs, or video URLs"
411
+ ],
412
+ "samplePrompts": [
413
+ "Get Facebook ads for this brand",
414
+ "Find active ads from this advertiser",
415
+ "Show ad copy and video URLs for this page"
416
+ ],
417
+ "formatExamples": [
418
+ "libraryId=\"765371849553336\"",
419
+ "country=\"US\"",
420
+ "maxAds=50"
421
+ ],
422
+ "negativeSpace": "Use facebook_ad_search when the advertiser/page is unknown; use facebook_ad_transcribe only after this returns a direct videoUrl.",
423
+ "producesHandlesFor": [
424
+ "facebook_ad_transcribe"
425
+ ],
426
+ "consumesHandles": [
427
+ "facebook-page-id",
428
+ "facebook-library-id",
429
+ "brand-query"
430
+ ]
431
+ },
432
+ {
433
+ "name": "facebook_ad_search",
434
+ "surfaces": [
435
+ "main_stdio",
436
+ "combined_stdio",
437
+ "hosted_http"
438
+ ],
439
+ "tokenBudgetClass": "core",
440
+ "hasOutputSchema": true,
441
+ "hasStructuredContent": true,
442
+ "writesLocalFiles": true,
443
+ "symptomTriggers": [
444
+ "the user wants to find advertisers or Facebook Ad Library IDs by brand, keyword, niche, or competitor"
445
+ ],
446
+ "samplePrompts": [
447
+ "Search Facebook ads for Nike",
448
+ "Find advertisers in the med spa niche",
449
+ "Which competitors are running ads?"
450
+ ],
451
+ "formatExamples": [
452
+ "query=\"Acme Co\"",
453
+ "country=\"US\"",
454
+ "maxResults=10"
455
+ ],
456
+ "negativeSpace": "Use facebook_page_intel after this returns a page or library ID.",
457
+ "producesHandlesFor": [
458
+ "facebook_page_intel"
459
+ ],
460
+ "consumesHandles": []
461
+ },
462
+ {
463
+ "name": "facebook_ad_transcribe",
464
+ "surfaces": [
465
+ "main_stdio",
466
+ "combined_stdio",
467
+ "hosted_http"
468
+ ],
469
+ "tokenBudgetClass": "specialized",
470
+ "hasOutputSchema": true,
471
+ "hasStructuredContent": true,
472
+ "writesLocalFiles": false,
473
+ "symptomTriggers": [
474
+ "the user wants the words or claims from a Facebook Ad Library video creative"
475
+ ],
476
+ "samplePrompts": [
477
+ "Transcribe this Facebook ad videoUrl",
478
+ "What does this ad say?",
479
+ "Extract the offer from this ad transcript"
480
+ ],
481
+ "formatExamples": [
482
+ "videoUrl=\"https://video.xx.fbcdn.net/.../creative.mp4\""
483
+ ],
484
+ "negativeSpace": "Use facebook_page_intel first if you only have an advertiser; use facebook_video_transcribe for public Facebook post/reel/share URLs.",
485
+ "producesHandlesFor": [],
486
+ "consumesHandles": [
487
+ "facebook-ad-video-url"
488
+ ]
489
+ },
490
+ {
491
+ "name": "facebook_video_transcribe",
492
+ "surfaces": [
493
+ "main_stdio",
494
+ "combined_stdio",
495
+ "hosted_http"
496
+ ],
497
+ "tokenBudgetClass": "specialized",
498
+ "hasOutputSchema": true,
499
+ "hasStructuredContent": true,
500
+ "writesLocalFiles": true,
501
+ "symptomTriggers": [
502
+ "the user pasted a normal Facebook reel, video, watch, post, share, or fb.watch URL and wants a transcript"
503
+ ],
504
+ "samplePrompts": [
505
+ "Transcribe this Facebook reel",
506
+ "What is said in this fb.watch video?",
507
+ "Extract lessons from this Facebook video"
508
+ ],
509
+ "formatExamples": [
510
+ "url=\"https://www.facebook.com/reel/1309788337837052\"",
511
+ "quality=\"best\""
512
+ ],
513
+ "negativeSpace": "Use facebook_ad_transcribe only for direct Ad Library videoUrl values returned by facebook_page_intel.",
514
+ "producesHandlesFor": [
515
+ "facebook-mp4-url"
516
+ ],
517
+ "consumesHandles": [
518
+ "facebook-public-video-url"
519
+ ]
520
+ },
521
+ {
522
+ "name": "maps_place_intel",
523
+ "surfaces": [
524
+ "main_stdio",
525
+ "combined_stdio",
526
+ "hosted_http"
527
+ ],
528
+ "tokenBudgetClass": "core",
529
+ "hasOutputSchema": true,
530
+ "hasStructuredContent": true,
531
+ "writesLocalFiles": true,
532
+ "symptomTriggers": [
533
+ "the user wants detailed Google Maps intelligence for one known business profile"
534
+ ],
535
+ "samplePrompts": [
536
+ "Get reviews for Elite Roofing Denver",
537
+ "Inspect this Google Business Profile",
538
+ "Find the phone, hours, and review topics for this business"
539
+ ],
540
+ "formatExamples": [
541
+ "businessName=\"Elite Roofing\", location=\"Denver, CO\"",
542
+ "includeReviews=true, maxReviews=50"
543
+ ],
544
+ "negativeSpace": "Use maps_search first for category searches, prospect lists, or multiple profiles.",
545
+ "producesHandlesFor": [],
546
+ "consumesHandles": [
547
+ "business-name",
548
+ "maps-place-url"
549
+ ]
550
+ },
551
+ {
552
+ "name": "maps_search",
553
+ "surfaces": [
554
+ "main_stdio",
555
+ "combined_stdio",
556
+ "hosted_http"
557
+ ],
558
+ "tokenBudgetClass": "core",
559
+ "hasOutputSchema": true,
560
+ "hasStructuredContent": true,
561
+ "writesLocalFiles": true,
562
+ "symptomTriggers": [
563
+ "the user asks for multiple Google Maps businesses, GBPs, GMBs, leads, prospects, or local competitors"
564
+ ],
565
+ "samplePrompts": [
566
+ "Find roofers in Denver CO",
567
+ "Give me 50 med spas in Nashville",
568
+ "Search Google Maps for local competitors"
569
+ ],
570
+ "formatExamples": [
571
+ "query=\"roofers\", location=\"Denver, CO\"",
572
+ "maxResults=10 default, maxResults=50 maximum"
573
+ ],
574
+ "negativeSpace": "Use maps_place_intel after selecting one business that needs full profile details or reviews.",
575
+ "producesHandlesFor": [
576
+ "maps_place_intel",
577
+ "directory_workflow"
578
+ ],
579
+ "consumesHandles": []
580
+ },
581
+ {
582
+ "name": "directory_workflow",
583
+ "surfaces": [
584
+ "main_stdio",
585
+ "combined_stdio",
586
+ "hosted_http"
587
+ ],
588
+ "tokenBudgetClass": "core",
589
+ "hasOutputSchema": true,
590
+ "hasStructuredContent": true,
591
+ "writesLocalFiles": true,
592
+ "symptomTriggers": [
593
+ "the user wants a directory/prospecting dataset across many US city markets"
594
+ ],
595
+ "samplePrompts": [
596
+ "Build a directory of roofers in Tennessee cities over 100k",
597
+ "Find dentists across Florida markets",
598
+ "Create a CSV of local businesses by city"
599
+ ],
600
+ "formatExamples": [
601
+ "query=\"roofers\", state=\"TN\", minPopulation=100000",
602
+ "concurrency=5, maxResultsPerCity=50"
603
+ ],
604
+ "negativeSpace": "Use maps_search for one city/category; use maps_place_intel for one selected profile.",
605
+ "producesHandlesFor": [
606
+ "local-csv",
607
+ "maps_place_intel"
608
+ ],
609
+ "consumesHandles": []
610
+ },
611
+ {
612
+ "name": "workflow_list",
613
+ "surfaces": [
614
+ "main_stdio",
615
+ "combined_stdio",
616
+ "hosted_http"
617
+ ],
618
+ "tokenBudgetClass": "specialized",
619
+ "hasOutputSchema": true,
620
+ "hasStructuredContent": true,
621
+ "writesLocalFiles": false,
622
+ "symptomTriggers": [
623
+ "the user asks what higher-level MCP Scraper workflows or recipes are available"
624
+ ],
625
+ "samplePrompts": [
626
+ "What workflows can MCP Scraper run?",
627
+ "Show local SEO workflows",
628
+ "What can this MCP do beyond single tools?"
629
+ ],
630
+ "formatExamples": [
631
+ "includeRecipes=true"
632
+ ],
633
+ "negativeSpace": "Use workflow_suggest when the user has a concrete goal and needs routing.",
634
+ "producesHandlesFor": [
635
+ "workflow_run"
636
+ ],
637
+ "consumesHandles": []
638
+ },
639
+ {
640
+ "name": "workflow_suggest",
641
+ "surfaces": [
642
+ "main_stdio",
643
+ "combined_stdio",
644
+ "hosted_http"
645
+ ],
646
+ "tokenBudgetClass": "specialized",
647
+ "hasOutputSchema": true,
648
+ "hasStructuredContent": true,
649
+ "writesLocalFiles": false,
650
+ "symptomTriggers": [
651
+ "the user gives a high-level business/research goal and needs the right workflow or tool chain"
652
+ ],
653
+ "samplePrompts": [
654
+ "Suggest a workflow for market analysis",
655
+ "How should I research this ICP?",
656
+ "Route this local SEO audit request"
657
+ ],
658
+ "formatExamples": [
659
+ "goal=\"market analysis for roofers in Tennessee\"",
660
+ "maxSuggestions=3"
661
+ ],
662
+ "negativeSpace": "Use workflow_list when the user only asks what exists; use workflow_run after choosing a workflow.",
663
+ "producesHandlesFor": [
664
+ "workflow_run"
665
+ ],
666
+ "consumesHandles": []
667
+ },
668
+ {
669
+ "name": "workflow_run",
670
+ "surfaces": [
671
+ "main_stdio",
672
+ "combined_stdio",
673
+ "hosted_http"
674
+ ],
675
+ "tokenBudgetClass": "core",
676
+ "hasOutputSchema": true,
677
+ "hasStructuredContent": true,
678
+ "writesLocalFiles": true,
679
+ "symptomTriggers": [
680
+ "the user wants to start a higher-level workflow such as market analysis, agent packet, audit, or comparison"
681
+ ],
682
+ "samplePrompts": [
683
+ "Run the local competitive audit workflow",
684
+ "Start an agent packet for this keyword",
685
+ "Run a SERP comparison workflow"
686
+ ],
687
+ "formatExamples": [
688
+ "workflowId=\"directory\"",
689
+ "input={\"query\":\"roofers\",\"state\":\"TN\"}"
690
+ ],
691
+ "negativeSpace": "Use workflow_suggest or workflow_list first when the workflow ID is unknown; use workflow_step only after this returns a runId.",
692
+ "producesHandlesFor": [
693
+ "workflow_step",
694
+ "workflow_status",
695
+ "workflow_artifact_read"
696
+ ],
697
+ "consumesHandles": [
698
+ "workflow-id"
699
+ ]
700
+ },
701
+ {
702
+ "name": "workflow_step",
703
+ "surfaces": [
704
+ "main_stdio",
705
+ "combined_stdio",
706
+ "hosted_http"
707
+ ],
708
+ "tokenBudgetClass": "core",
709
+ "hasOutputSchema": true,
710
+ "hasStructuredContent": true,
711
+ "writesLocalFiles": true,
712
+ "symptomTriggers": [
713
+ "a stepwise workflow has a nextStep and needs to advance one leg without timing out"
714
+ ],
715
+ "samplePrompts": [
716
+ "Continue this workflow run",
717
+ "Run the next step",
718
+ "Advance run wrk_123"
719
+ ],
720
+ "formatExamples": [
721
+ "runId=\"wrk_123\" from workflow_run; do not construct it"
722
+ ],
723
+ "negativeSpace": "Use workflow_status to inspect a run without advancing it; use workflow_artifact_read to read completed artifacts.",
724
+ "producesHandlesFor": [
725
+ "workflow_step",
726
+ "workflow_artifact_read"
727
+ ],
728
+ "consumesHandles": [
729
+ "workflow-run-id"
730
+ ]
731
+ },
732
+ {
733
+ "name": "workflow_status",
734
+ "surfaces": [
735
+ "main_stdio",
736
+ "combined_stdio",
737
+ "hosted_http"
738
+ ],
739
+ "tokenBudgetClass": "specialized",
740
+ "hasOutputSchema": true,
741
+ "hasStructuredContent": true,
742
+ "writesLocalFiles": false,
743
+ "symptomTriggers": [
744
+ "the user needs to recover, inspect, or poll an existing workflow run"
745
+ ],
746
+ "samplePrompts": [
747
+ "Check this workflow run status",
748
+ "List artifacts for run wrk_123",
749
+ "Did the workflow finish?"
750
+ ],
751
+ "formatExamples": [
752
+ "runId=\"wrk_123\" from workflow_run/workflow_step"
753
+ ],
754
+ "negativeSpace": "Use workflow_step to advance a stepwise run; use workflow_artifact_read to read one artifact.",
755
+ "producesHandlesFor": [
756
+ "workflow_artifact_read"
757
+ ],
758
+ "consumesHandles": [
759
+ "workflow-run-id"
760
+ ]
761
+ },
762
+ {
763
+ "name": "workflow_artifact_read",
764
+ "surfaces": [
765
+ "main_stdio",
766
+ "combined_stdio",
767
+ "hosted_http"
768
+ ],
769
+ "tokenBudgetClass": "specialized",
770
+ "hasOutputSchema": true,
771
+ "hasStructuredContent": true,
772
+ "writesLocalFiles": false,
773
+ "symptomTriggers": [
774
+ "the user or model needs to read generated workflow evidence, CSV, JSON, Markdown, report, or task files"
775
+ ],
776
+ "samplePrompts": [
777
+ "Read the evidence artifact",
778
+ "Open this workflow CSV",
779
+ "Load the generated Markdown brief"
780
+ ],
781
+ "formatExamples": [
782
+ "runId=\"wrk_123\", artifactId=\"evidence.json\"",
783
+ "maxBytes=200000"
784
+ ],
785
+ "negativeSpace": "Use workflow_status first when artifact IDs are unknown.",
786
+ "producesHandlesFor": [],
787
+ "consumesHandles": [
788
+ "workflow-run-id",
789
+ "workflow-artifact-id"
790
+ ]
791
+ },
792
+ {
793
+ "name": "rank_tracker_blueprint",
794
+ "surfaces": [
795
+ "main_stdio",
796
+ "combined_stdio",
797
+ "hosted_http"
798
+ ],
799
+ "tokenBudgetClass": "specialized",
800
+ "hasOutputSchema": true,
801
+ "hasStructuredContent": true,
802
+ "writesLocalFiles": false,
803
+ "symptomTriggers": [
804
+ "the user wants a build-ready plan for rank tracking, cron, database schema, metrics, and implementation prompt"
805
+ ],
806
+ "samplePrompts": [
807
+ "Design a rank tracker for this business",
808
+ "Create a Maps and organic rank tracker blueprint",
809
+ "Generate a database plan for AI Overview tracking"
810
+ ],
811
+ "formatExamples": [
812
+ "trackingModes=[\"maps\",\"organic\",\"ai_overview\",\"paa\"]",
813
+ "timezone=\"America/Denver\""
814
+ ],
815
+ "negativeSpace": "Use search_serp, maps_search, or harvest_paa for live rank evidence; this only plans the tracker.",
816
+ "producesHandlesFor": [],
817
+ "consumesHandles": []
818
+ },
819
+ {
820
+ "name": "credits_info",
821
+ "surfaces": [
822
+ "main_stdio",
823
+ "combined_stdio",
824
+ "hosted_http"
825
+ ],
826
+ "tokenBudgetClass": "core",
827
+ "hasOutputSchema": true,
828
+ "hasStructuredContent": true,
829
+ "writesLocalFiles": false,
830
+ "symptomTriggers": [
831
+ "the user asks about credits, tool costs, usage limits, concurrency, top-up, or billing commands"
832
+ ],
833
+ "samplePrompts": [
834
+ "How many credits do I have?",
835
+ "What does maps_search cost?",
836
+ "How do I add concurrency?"
837
+ ],
838
+ "formatExamples": [
839
+ "item=\"maps reviews\"",
840
+ "includeLedger=false"
841
+ ],
842
+ "negativeSpace": "Use this before large harvests/workflows when credit availability matters; it never exposes card details.",
843
+ "producesHandlesFor": [],
844
+ "consumesHandles": []
845
+ },
846
+ {
847
+ "name": "browser_open",
848
+ "surfaces": [
849
+ "browser_agent_stdio",
850
+ "combined_stdio"
851
+ ],
852
+ "tokenBudgetClass": "core",
853
+ "hasOutputSchema": true,
854
+ "hasStructuredContent": true,
855
+ "writesLocalFiles": false,
856
+ "symptomTriggers": [
857
+ "the user wants a controllable browser session, live website inspection, login-state browsing, or a human watch URL"
858
+ ],
859
+ "samplePrompts": [
860
+ "Open a browser to this URL",
861
+ "Start a browser I can watch",
862
+ "Use a browser session for Facebook"
863
+ ],
864
+ "formatExamples": [
865
+ "url=\"https://example.com\"",
866
+ "timeout_seconds=600"
867
+ ],
868
+ "negativeSpace": "Use browser_list_sessions to recover an existing session; call browser_close when done.",
869
+ "producesHandlesFor": [
870
+ "browser_screenshot",
871
+ "browser_read",
872
+ "browser_close"
873
+ ],
874
+ "consumesHandles": []
875
+ },
876
+ {
877
+ "name": "browser_profile_list",
878
+ "surfaces": [
879
+ "browser_agent_stdio",
880
+ "combined_stdio"
881
+ ],
882
+ "tokenBudgetClass": "specialized",
883
+ "hasOutputSchema": true,
884
+ "hasStructuredContent": true,
885
+ "writesLocalFiles": false,
886
+ "symptomTriggers": [
887
+ "the user wants to find which local Chrome account/profile should map to browser-agent sessions"
888
+ ],
889
+ "samplePrompts": [
890
+ "Find my Chrome profile for seo@example.com",
891
+ "List local Chrome profiles",
892
+ "What browser profile should I use?"
893
+ ],
894
+ "formatExamples": [
895
+ "email=\"seo@example.com\"",
896
+ "user_data_dir optional for nonstandard Chrome roots"
897
+ ],
898
+ "negativeSpace": "This reads Chrome profile metadata only; it does not import cookies or browser state. Use browser_profile_import to clone local state for local browser mode.",
899
+ "producesHandlesFor": [
900
+ "browser_profile_import",
901
+ "browser_profile_onboard"
902
+ ],
903
+ "consumesHandles": []
904
+ },
905
+ {
906
+ "name": "browser_profile_import",
907
+ "surfaces": [
908
+ "browser_agent_stdio",
909
+ "combined_stdio"
910
+ ],
911
+ "tokenBudgetClass": "specialized",
912
+ "hasOutputSchema": true,
913
+ "hasStructuredContent": true,
914
+ "writesLocalFiles": true,
915
+ "symptomTriggers": [
916
+ "the user wants MCP Scraper browser sessions to use their real local Chrome login state, cookies, history, or saved site sessions"
917
+ ],
918
+ "samplePrompts": [
919
+ "Import my Chrome profile for local browser mode",
920
+ "Make browser_open use my logged-in Chrome profile",
921
+ "Clone seo@example.com into MCP Scraper"
922
+ ],
923
+ "formatExamples": [
924
+ "email=\"seo@example.com\"",
925
+ "name=\"seo-example-com\"",
926
+ "overwrite=true to refresh an existing clone"
927
+ ],
928
+ "negativeSpace": "This creates a local managed clone only; it does not upload the profile or create a hosted Kernel profile. Use browser_profile_sync to refresh an existing clone.",
929
+ "producesHandlesFor": [
930
+ "browser_open"
931
+ ],
932
+ "consumesHandles": []
933
+ },
934
+ {
935
+ "name": "browser_profile_sync",
936
+ "surfaces": [
937
+ "browser_agent_stdio",
938
+ "combined_stdio"
939
+ ],
940
+ "tokenBudgetClass": "specialized",
941
+ "hasOutputSchema": true,
942
+ "hasStructuredContent": true,
943
+ "writesLocalFiles": true,
944
+ "symptomTriggers": [
945
+ "the user has already imported a Chrome profile and wants to refresh the managed clone from normal Chrome"
946
+ ],
947
+ "samplePrompts": [
948
+ "Sync my imported browser profile",
949
+ "Refresh local Chrome profile clone",
950
+ "Update my MCP browser profile after logging into Claude"
951
+ ],
952
+ "formatExamples": [
953
+ "name=\"seo-example-com\""
954
+ ],
955
+ "negativeSpace": "Use browser_profile_import first if no managed profile exists. Sync overwrites the managed clone from its recorded source profile.",
956
+ "producesHandlesFor": [
957
+ "browser_open"
958
+ ],
959
+ "consumesHandles": []
960
+ },
961
+ {
962
+ "name": "browser_profile_onboard",
963
+ "surfaces": [
964
+ "browser_agent_stdio",
965
+ "combined_stdio"
966
+ ],
967
+ "tokenBudgetClass": "specialized",
968
+ "hasOutputSchema": true,
969
+ "hasStructuredContent": true,
970
+ "writesLocalFiles": false,
971
+ "symptomTriggers": [
972
+ "the user wants to set up an authenticated hosted browser profile for future hosted browser-agent sessions"
973
+ ],
974
+ "samplePrompts": [
975
+ "Onboard a hosted browser profile",
976
+ "Set up seo@example.com for hosted browser sessions",
977
+ "Create a logged-in hosted browser profile"
978
+ ],
979
+ "formatExamples": [
980
+ "email=\"seo@example.com\"",
981
+ "profile=\"seo-example-com\"",
982
+ "call browser_close after the human logs in"
983
+ ],
984
+ "negativeSpace": "Hosted browser sessions cannot mount local Chrome profile folders; use browser_profile_import for local Chrome state.",
985
+ "producesHandlesFor": [
986
+ "browser_close",
987
+ "browser_screenshot",
988
+ "browser_open"
989
+ ],
990
+ "consumesHandles": []
991
+ },
992
+ {
993
+ "name": "browser_screenshot",
994
+ "surfaces": [
995
+ "browser_agent_stdio",
996
+ "combined_stdio"
997
+ ],
998
+ "tokenBudgetClass": "core",
999
+ "hasOutputSchema": true,
1000
+ "hasStructuredContent": true,
1001
+ "writesLocalFiles": false,
1002
+ "symptomTriggers": [
1003
+ "the model needs visual perception, coordinates, visible page state, CAPTCHA status, or element positions"
1004
+ ],
1005
+ "samplePrompts": [
1006
+ "Show me what the browser sees",
1007
+ "Take a screenshot of the current page",
1008
+ "Find the coordinates of the login button"
1009
+ ],
1010
+ "formatExamples": [
1011
+ "session_id from browser_open; do not construct it"
1012
+ ],
1013
+ "negativeSpace": "Use browser_read when DOM text is enough; use browser_locate for exact DOM bounds.",
1014
+ "producesHandlesFor": [
1015
+ "browser_click",
1016
+ "browser_replay_mark"
1017
+ ],
1018
+ "consumesHandles": [
1019
+ "browser-session-id"
1020
+ ]
1021
+ },
1022
+ {
1023
+ "name": "browser_read",
1024
+ "surfaces": [
1025
+ "browser_agent_stdio",
1026
+ "combined_stdio"
1027
+ ],
1028
+ "tokenBudgetClass": "core",
1029
+ "hasOutputSchema": true,
1030
+ "hasStructuredContent": true,
1031
+ "writesLocalFiles": false,
1032
+ "symptomTriggers": [
1033
+ "the model needs current page text, links, forms, or interactive elements without an image"
1034
+ ],
1035
+ "samplePrompts": [
1036
+ "Read the current page",
1037
+ "Get visible text and buttons",
1038
+ "Find the form fields on this page"
1039
+ ],
1040
+ "formatExamples": [
1041
+ "session_id from browser_open"
1042
+ ],
1043
+ "negativeSpace": "Use browser_screenshot when visual layout matters; use browser_locate for exact bounding boxes.",
1044
+ "producesHandlesFor": [
1045
+ "browser_click",
1046
+ "browser_type"
1047
+ ],
1048
+ "consumesHandles": [
1049
+ "browser-session-id"
1050
+ ]
1051
+ },
1052
+ {
1053
+ "name": "browser_locate",
1054
+ "surfaces": [
1055
+ "browser_agent_stdio",
1056
+ "combined_stdio"
1057
+ ],
1058
+ "tokenBudgetClass": "specialized",
1059
+ "hasOutputSchema": true,
1060
+ "hasStructuredContent": true,
1061
+ "writesLocalFiles": false,
1062
+ "symptomTriggers": [
1063
+ "the model needs exact DOM bounds for a selector or visible text before clicking or annotating"
1064
+ ],
1065
+ "samplePrompts": [
1066
+ "Locate the pricing button",
1067
+ "Find bounds for h1",
1068
+ "Mark the text that says Submit"
1069
+ ],
1070
+ "formatExamples": [
1071
+ "targets=[{\"selector\":\"h1\"}]",
1072
+ "targets=[{\"text\":\"Submit\",\"match\":\"exact\"}]"
1073
+ ],
1074
+ "negativeSpace": "Use browser_screenshot first if you do not know what is visible.",
1075
+ "producesHandlesFor": [
1076
+ "browser_click",
1077
+ "browser_replay_mark"
1078
+ ],
1079
+ "consumesHandles": [
1080
+ "browser-session-id"
1081
+ ]
1082
+ },
1083
+ {
1084
+ "name": "browser_goto",
1085
+ "surfaces": [
1086
+ "browser_agent_stdio",
1087
+ "combined_stdio"
1088
+ ],
1089
+ "tokenBudgetClass": "core",
1090
+ "hasOutputSchema": true,
1091
+ "hasStructuredContent": true,
1092
+ "writesLocalFiles": false,
1093
+ "symptomTriggers": [
1094
+ "the browser must navigate to a new URL inside an existing session"
1095
+ ],
1096
+ "samplePrompts": [
1097
+ "Go to this URL",
1098
+ "Navigate the browser to Facebook",
1099
+ "Open the competitor page in this session"
1100
+ ],
1101
+ "formatExamples": [
1102
+ "url=\"https://example.com/path\""
1103
+ ],
1104
+ "negativeSpace": "Use browser_open if no session exists; call browser_screenshot after navigation to inspect the result.",
1105
+ "producesHandlesFor": [
1106
+ "browser_screenshot",
1107
+ "browser_read"
1108
+ ],
1109
+ "consumesHandles": [
1110
+ "browser-session-id"
1111
+ ]
1112
+ },
1113
+ {
1114
+ "name": "browser_click",
1115
+ "surfaces": [
1116
+ "browser_agent_stdio",
1117
+ "combined_stdio"
1118
+ ],
1119
+ "tokenBudgetClass": "core",
1120
+ "hasOutputSchema": true,
1121
+ "hasStructuredContent": true,
1122
+ "writesLocalFiles": false,
1123
+ "symptomTriggers": [
1124
+ "the browser needs to activate a visible UI target using coordinates from a recent perception result"
1125
+ ],
1126
+ "samplePrompts": [
1127
+ "Click the login button",
1128
+ "Click the first result",
1129
+ "Open that menu"
1130
+ ],
1131
+ "formatExamples": [
1132
+ "x=420, y=318 from browser_screenshot/browser_read"
1133
+ ],
1134
+ "negativeSpace": "Use browser_screenshot, browser_read, or browser_locate first when coordinates are unknown; do not guess coordinates.",
1135
+ "producesHandlesFor": [
1136
+ "browser_screenshot",
1137
+ "browser_read"
1138
+ ],
1139
+ "consumesHandles": [
1140
+ "browser-session-id",
1141
+ "browser-coordinate"
1142
+ ]
1143
+ },
1144
+ {
1145
+ "name": "browser_type",
1146
+ "surfaces": [
1147
+ "browser_agent_stdio",
1148
+ "combined_stdio"
1149
+ ],
1150
+ "tokenBudgetClass": "core",
1151
+ "hasOutputSchema": true,
1152
+ "hasStructuredContent": true,
1153
+ "writesLocalFiles": false,
1154
+ "symptomTriggers": [
1155
+ "the browser needs text entered into the currently focused field"
1156
+ ],
1157
+ "samplePrompts": [
1158
+ "Type this search query",
1159
+ "Fill the email field",
1160
+ "Enter the page URL into the form"
1161
+ ],
1162
+ "formatExamples": [
1163
+ "text=\"best roofers Denver\"",
1164
+ "delay=25"
1165
+ ],
1166
+ "negativeSpace": "Use browser_click or browser_press Tab first if the target field is not focused.",
1167
+ "producesHandlesFor": [
1168
+ "browser_press",
1169
+ "browser_screenshot"
1170
+ ],
1171
+ "consumesHandles": [
1172
+ "browser-session-id"
1173
+ ]
1174
+ },
1175
+ {
1176
+ "name": "browser_scroll",
1177
+ "surfaces": [
1178
+ "browser_agent_stdio",
1179
+ "combined_stdio"
1180
+ ],
1181
+ "tokenBudgetClass": "core",
1182
+ "hasOutputSchema": true,
1183
+ "hasStructuredContent": true,
1184
+ "writesLocalFiles": false,
1185
+ "symptomTriggers": [
1186
+ "the browser needs to reveal more page content before reading, clicking, or locating"
1187
+ ],
1188
+ "samplePrompts": [
1189
+ "Scroll down",
1190
+ "Scroll to reveal more results",
1191
+ "Move back up the page"
1192
+ ],
1193
+ "formatExamples": [
1194
+ "delta_y=5 scrolls down",
1195
+ "delta_y=-5 scrolls up"
1196
+ ],
1197
+ "negativeSpace": "Use browser_screenshot after scrolling to inspect newly visible content.",
1198
+ "producesHandlesFor": [
1199
+ "browser_screenshot",
1200
+ "browser_read"
1201
+ ],
1202
+ "consumesHandles": [
1203
+ "browser-session-id"
1204
+ ]
1205
+ },
1206
+ {
1207
+ "name": "browser_press",
1208
+ "surfaces": [
1209
+ "browser_agent_stdio",
1210
+ "combined_stdio"
1211
+ ],
1212
+ "tokenBudgetClass": "core",
1213
+ "hasOutputSchema": true,
1214
+ "hasStructuredContent": true,
1215
+ "writesLocalFiles": false,
1216
+ "symptomTriggers": [
1217
+ "the browser needs keyboard input such as submit, escape, tab, select-all, or navigation keys"
1218
+ ],
1219
+ "samplePrompts": [
1220
+ "Press Enter",
1221
+ "Press Escape",
1222
+ "Select all and replace the field text"
1223
+ ],
1224
+ "formatExamples": [
1225
+ "keys=[\"Return\"]",
1226
+ "keys=[\"Ctrl+a\"]",
1227
+ "keys=[\"Ctrl+Shift+Tab\"]"
1228
+ ],
1229
+ "negativeSpace": "Use browser_type for text entry; call browser_screenshot after keypresses that may change the page.",
1230
+ "producesHandlesFor": [
1231
+ "browser_screenshot",
1232
+ "browser_read"
1233
+ ],
1234
+ "consumesHandles": [
1235
+ "browser-session-id"
1236
+ ]
1237
+ },
1238
+ {
1239
+ "name": "browser_replay_start",
1240
+ "surfaces": [
1241
+ "browser_agent_stdio",
1242
+ "combined_stdio"
1243
+ ],
1244
+ "tokenBudgetClass": "specialized",
1245
+ "hasOutputSchema": true,
1246
+ "hasStructuredContent": true,
1247
+ "writesLocalFiles": false,
1248
+ "symptomTriggers": [
1249
+ "the user wants an MP4 proof replay of browser work or later annotations"
1250
+ ],
1251
+ "samplePrompts": [
1252
+ "Start recording this browser session",
1253
+ "Record proof while I click through checkout",
1254
+ "Begin replay capture"
1255
+ ],
1256
+ "formatExamples": [
1257
+ "session_id from browser_open"
1258
+ ],
1259
+ "negativeSpace": "Use browser_replay_stop to finish the recording; use browser_replay_mark while recording for accurate callouts.",
1260
+ "producesHandlesFor": [
1261
+ "browser_replay_stop",
1262
+ "browser_replay_mark",
1263
+ "browser_replay_download"
1264
+ ],
1265
+ "consumesHandles": [
1266
+ "browser-session-id"
1267
+ ]
1268
+ },
1269
+ {
1270
+ "name": "browser_replay_stop",
1271
+ "surfaces": [
1272
+ "browser_agent_stdio",
1273
+ "combined_stdio"
1274
+ ],
1275
+ "tokenBudgetClass": "specialized",
1276
+ "hasOutputSchema": true,
1277
+ "hasStructuredContent": true,
1278
+ "writesLocalFiles": false,
1279
+ "symptomTriggers": [
1280
+ "an active replay recording needs to be finalized"
1281
+ ],
1282
+ "samplePrompts": [
1283
+ "Stop recording",
1284
+ "Finish the replay",
1285
+ "End this proof video"
1286
+ ],
1287
+ "formatExamples": [
1288
+ "replay_id returned by browser_replay_start; do not construct it"
1289
+ ],
1290
+ "negativeSpace": "Use browser_replay_download to save the MP4 locally; use browser_replay_annotate to create an annotated copy.",
1291
+ "producesHandlesFor": [
1292
+ "browser_replay_download",
1293
+ "browser_replay_annotate"
1294
+ ],
1295
+ "consumesHandles": [
1296
+ "browser-session-id",
1297
+ "browser-replay-id"
1298
+ ]
1299
+ },
1300
+ {
1301
+ "name": "browser_list_replays",
1302
+ "surfaces": [
1303
+ "browser_agent_stdio",
1304
+ "combined_stdio"
1305
+ ],
1306
+ "tokenBudgetClass": "specialized",
1307
+ "hasOutputSchema": true,
1308
+ "hasStructuredContent": true,
1309
+ "writesLocalFiles": false,
1310
+ "symptomTriggers": [
1311
+ "the model needs to recover replay IDs, view URLs, or download URLs for a browser session"
1312
+ ],
1313
+ "samplePrompts": [
1314
+ "List replays for this session",
1315
+ "Find the replay ID",
1316
+ "Show recorded videos"
1317
+ ],
1318
+ "formatExamples": [
1319
+ "session_id from browser_open"
1320
+ ],
1321
+ "negativeSpace": "Use browser_replay_start to create a new replay; use browser_replay_download to save one locally.",
1322
+ "producesHandlesFor": [
1323
+ "browser_replay_download",
1324
+ "browser_replay_annotate"
1325
+ ],
1326
+ "consumesHandles": [
1327
+ "browser-session-id"
1328
+ ]
1329
+ },
1330
+ {
1331
+ "name": "browser_replay_download",
1332
+ "surfaces": [
1333
+ "browser_agent_stdio",
1334
+ "combined_stdio"
1335
+ ],
1336
+ "tokenBudgetClass": "specialized",
1337
+ "hasOutputSchema": true,
1338
+ "hasStructuredContent": true,
1339
+ "writesLocalFiles": true,
1340
+ "symptomTriggers": [
1341
+ "the user wants a replay MP4 saved locally"
1342
+ ],
1343
+ "samplePrompts": [
1344
+ "Download this replay",
1345
+ "Save the MP4 proof video",
1346
+ "Put the replay in the output folder"
1347
+ ],
1348
+ "formatExamples": [
1349
+ "filename=\"proof\"",
1350
+ "replay_id from browser_replay_start/browser_list_replays"
1351
+ ],
1352
+ "negativeSpace": "Use browser_replay_stop first if the replay is still recording; use browser_replay_annotate for a marked-up video.",
1353
+ "producesHandlesFor": [
1354
+ "local-mp4-path"
1355
+ ],
1356
+ "consumesHandles": [
1357
+ "browser-session-id",
1358
+ "browser-replay-id"
1359
+ ]
1360
+ },
1361
+ {
1362
+ "name": "browser_replay_mark",
1363
+ "surfaces": [
1364
+ "browser_agent_stdio",
1365
+ "combined_stdio"
1366
+ ],
1367
+ "tokenBudgetClass": "specialized",
1368
+ "hasOutputSchema": true,
1369
+ "hasStructuredContent": true,
1370
+ "writesLocalFiles": false,
1371
+ "symptomTriggers": [
1372
+ "the user wants accurate replay callout coordinates and timing for a visible DOM target"
1373
+ ],
1374
+ "samplePrompts": [
1375
+ "Mark the headline in the replay",
1376
+ "Create a callout for this button",
1377
+ "Get annotation bounds for the pricing text"
1378
+ ],
1379
+ "formatExamples": [
1380
+ "target={\"selector\":\"h1\"}",
1381
+ "duration_seconds=4"
1382
+ ],
1383
+ "negativeSpace": "Use browser_locate for bounds when no replay is recording; use browser_replay_annotate after collecting marks.",
1384
+ "producesHandlesFor": [
1385
+ "browser_replay_annotate"
1386
+ ],
1387
+ "consumesHandles": [
1388
+ "browser-session-id"
1389
+ ]
1390
+ },
1391
+ {
1392
+ "name": "browser_replay_annotate",
1393
+ "surfaces": [
1394
+ "browser_agent_stdio",
1395
+ "combined_stdio"
1396
+ ],
1397
+ "tokenBudgetClass": "specialized",
1398
+ "hasOutputSchema": true,
1399
+ "hasStructuredContent": true,
1400
+ "writesLocalFiles": true,
1401
+ "symptomTriggers": [
1402
+ "the user wants a replay MP4 with boxes, circles, arrows, underlines, or labels rendered into it"
1403
+ ],
1404
+ "samplePrompts": [
1405
+ "Annotate the replay with these callouts",
1406
+ "Add boxes around the key UI elements",
1407
+ "Create a marked-up proof video"
1408
+ ],
1409
+ "formatExamples": [
1410
+ "annotations=[{\"type\":\"box\",\"start_seconds\":1,\"left\":100,\"top\":80,\"width\":400,\"height\":120}]"
1411
+ ],
1412
+ "negativeSpace": "Use browser_replay_mark while recording for accurate annotations; use browser_replay_download for an unannotated MP4.",
1413
+ "producesHandlesFor": [
1414
+ "local-annotated-mp4-path"
1415
+ ],
1416
+ "consumesHandles": [
1417
+ "browser-session-id",
1418
+ "browser-replay-id"
1419
+ ]
1420
+ },
1421
+ {
1422
+ "name": "browser_close",
1423
+ "surfaces": [
1424
+ "browser_agent_stdio",
1425
+ "combined_stdio"
1426
+ ],
1427
+ "tokenBudgetClass": "core",
1428
+ "hasOutputSchema": true,
1429
+ "hasStructuredContent": true,
1430
+ "writesLocalFiles": false,
1431
+ "symptomTriggers": [
1432
+ "the browser task is done and active billing should stop"
1433
+ ],
1434
+ "samplePrompts": [
1435
+ "Close the browser session",
1436
+ "Stop the browser meter",
1437
+ "Release this session"
1438
+ ],
1439
+ "formatExamples": [
1440
+ "session_id from browser_open"
1441
+ ],
1442
+ "negativeSpace": "Use browser_list_sessions if the active session ID is unknown.",
1443
+ "producesHandlesFor": [],
1444
+ "consumesHandles": [
1445
+ "browser-session-id"
1446
+ ]
1447
+ },
1448
+ {
1449
+ "name": "browser_list_sessions",
1450
+ "surfaces": [
1451
+ "browser_agent_stdio",
1452
+ "combined_stdio"
1453
+ ],
1454
+ "tokenBudgetClass": "core",
1455
+ "hasOutputSchema": true,
1456
+ "hasStructuredContent": true,
1457
+ "writesLocalFiles": false,
1458
+ "symptomTriggers": [
1459
+ "the model needs to recover active browser session IDs or watch URLs"
1460
+ ],
1461
+ "samplePrompts": [
1462
+ "List my browser sessions",
1463
+ "Find the active browser",
1464
+ "Show open browser sessions"
1465
+ ],
1466
+ "formatExamples": [
1467
+ "include_closed=false by default"
1468
+ ],
1469
+ "negativeSpace": "Use browser_open to create a new session; use browser_close after choosing a session to close.",
1470
+ "producesHandlesFor": [
1471
+ "browser_open",
1472
+ "browser_close",
1473
+ "browser_screenshot"
1474
+ ],
1475
+ "consumesHandles": []
1476
+ },
1477
+ {
1478
+ "name": "capture_serp_snapshot",
1479
+ "surfaces": [
1480
+ "hosted_http",
1481
+ "hosted_only"
1482
+ ],
1483
+ "tokenBudgetClass": "hosted_only",
1484
+ "hasOutputSchema": true,
1485
+ "hasStructuredContent": true,
1486
+ "writesLocalFiles": false,
1487
+ "symptomTriggers": [
1488
+ "the user needs hosted SERP Intelligence evidence through the product capture path"
1489
+ ],
1490
+ "samplePrompts": [
1491
+ "Capture a SERP Intelligence snapshot for this keyword",
1492
+ "Record hosted SERP evidence for Denver HVAC",
1493
+ "Capture Google results with debug evidence"
1494
+ ],
1495
+ "formatExamples": [
1496
+ "query=\"best hvac company\", location=\"Denver, CO\"",
1497
+ "includePageSnapshots=true, pageSnapshotLimit=3"
1498
+ ],
1499
+ "negativeSpace": "Use search_serp for quick MCP SERP lookup; use capture_serp_page_snapshots for page-only evidence.",
1500
+ "producesHandlesFor": [
1501
+ "capture_serp_page_snapshots"
1502
+ ],
1503
+ "consumesHandles": []
1504
+ },
1505
+ {
1506
+ "name": "capture_serp_page_snapshots",
1507
+ "surfaces": [
1508
+ "hosted_http",
1509
+ "hosted_only"
1510
+ ],
1511
+ "tokenBudgetClass": "hosted_only",
1512
+ "hasOutputSchema": true,
1513
+ "hasStructuredContent": true,
1514
+ "writesLocalFiles": false,
1515
+ "symptomTriggers": [
1516
+ "the user needs hosted evidence snapshots for ranking pages, AI citations, local pack websites, or configured targets"
1517
+ ],
1518
+ "samplePrompts": [
1519
+ "Capture page snapshots for these ranking URLs",
1520
+ "Snapshot the AI citation pages",
1521
+ "Capture target page evidence for SERP Intelligence"
1522
+ ],
1523
+ "formatExamples": [
1524
+ "urls=[\"https://example.com\"]",
1525
+ "targets=[{\"url\":\"https://example.com\",\"sourceKind\":\"organic\",\"sourcePosition\":1}]"
1526
+ ],
1527
+ "negativeSpace": "Use capture_serp_snapshot when the SERP itself also needs to be captured.",
1528
+ "producesHandlesFor": [],
1529
+ "consumesHandles": [
1530
+ "public-url"
1531
+ ]
1532
+ }
1533
+ ]
1534
+ }