auto-chrome-mcp-shared 1.9.0 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -45,7 +45,7 @@ module.exports = __toCommonJS(index_exports);
45
45
 
46
46
  // src/constants.ts
47
47
  var DEFAULT_SERVER_PORT = 12320;
48
- var HOST_NAME = "com.chromemcpscalemaker.nativehost";
48
+ var HOST_NAME = "com.autochromemcp.nativehost";
49
49
 
50
50
  // src/types.ts
51
51
  var NativeMessageType = /* @__PURE__ */ ((NativeMessageType2) => {
@@ -133,16 +133,32 @@ var TOOL_NAMES = {
133
133
  LIST_PUBLISHED: "record_replay_list_published"
134
134
  }
135
135
  };
136
+ var P_TAB_ID = "Tab id; omit to use the session work tab.";
137
+ var P_WINDOW_ID = "Window to pick the active tab from when tabId is omitted.";
138
+ var P_FRAME_ID = "Target frame id (iframe).";
139
+ var P_SELECTOR_TYPE = 'Selector type (default "css").';
140
+ var P_WAIT_FOR_ELEMENT_MS = "Ms to wait for the element to appear/become visible before failing (default 2000; 0 = fail now).";
141
+ var P_BACKGROUND = "Do not activate the tab or focus the window (default false).";
142
+ var tabIdProp = { type: "number", description: P_TAB_ID };
143
+ var windowIdProp = { type: "number", description: P_WINDOW_ID };
144
+ var frameIdProp = { type: "number", description: P_FRAME_ID };
145
+ var selectorTypeProp = {
146
+ type: "string",
147
+ enum: ["css", "xpath"],
148
+ description: P_SELECTOR_TYPE
149
+ };
150
+ var waitForElementMsProp = { type: "number", description: P_WAIT_FOR_ELEMENT_MS };
151
+ var backgroundProp = { type: "boolean", description: P_BACKGROUND };
136
152
  var TOOL_SCHEMAS = [
137
153
  {
138
154
  name: TOOL_NAMES.BROWSER.BATCH,
139
- description: "Execute multiple browser tool steps sequentially in ONE call (cuts round-trip latency for chains like click \u2192 fill \u2192 click \u2192 screenshot). Each step targets the session work tab by default. Steps cannot include chrome_batch itself or interactive tools (switch_tab, element selection, user consent). Default stops on first error; set continueOnError to run all steps. Returns per-step results as JSON.",
155
+ description: "Run several browser steps in ONE call (fewer round-trips for chains like click -> fill -> screenshot). Steps target the session work tab. Cannot nest chrome_batch or interactive tools (switch_tab, element selection, consent). Stops on first error unless continueOnError. Returns per-step JSON.",
140
156
  inputSchema: {
141
157
  type: "object",
142
158
  properties: {
143
159
  steps: {
144
160
  type: "array",
145
- description: "Steps to run in order (max 20). Each: { tool: string, args?: object }",
161
+ description: "Steps in order (max 20). Each: { tool: string, args?: object }",
146
162
  items: {
147
163
  type: "object",
148
164
  properties: {
@@ -154,7 +170,7 @@ var TOOL_SCHEMAS = [
154
170
  },
155
171
  continueOnError: {
156
172
  type: "boolean",
157
- description: "Run remaining steps even when a step fails (default false)"
173
+ description: "Keep running after a step fails (default false)"
158
174
  }
159
175
  },
160
176
  required: ["steps"]
@@ -162,7 +178,7 @@ var TOOL_SCHEMAS = [
162
178
  },
163
179
  {
164
180
  name: TOOL_NAMES.BROWSER.FIND,
165
- description: 'Find elements on the page using natural language (Korean or English), e.g. "\uB85C\uADF8\uC778 \uBC84\uD2BC", "search input", "\uC7A5\uBC14\uAD6C\uB2C8 \uC544\uC774\uCF58". Matches element names/roles/placeholder/text via synonym + fuzzy scoring over the accessibility tree and returns ranked candidates with ref (usable directly in chrome_click_element / chrome_fill_or_select), role, name, coordinates, and frameId. Cheaper and more direct than reading the whole page when you know what you are looking for.',
181
+ description: 'Find elements by natural-language query (Korean/English, e.g. "\uB85C\uADF8\uC778 \uBC84\uD2BC", "search input"). Returns ranked candidates with ref (usable in chrome_click_element / chrome_fill_or_select), role, name, coordinates, frameId. Cheaper than reading the whole page when you know the target.',
166
182
  inputSchema: {
167
183
  type: "object",
168
184
  properties: {
@@ -170,11 +186,8 @@ var TOOL_SCHEMAS = [
170
186
  type: "string",
171
187
  description: "Natural language description of the element (Korean/English)"
172
188
  },
173
- tabId: {
174
- type: "number",
175
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
176
- },
177
- maxResults: { type: "number", description: "Max candidates to return (default 5, max 20)" },
189
+ tabId: tabIdProp,
190
+ maxResults: { type: "number", description: "Max candidates (default 5, max 20)" },
178
191
  allFrames: {
179
192
  type: "boolean",
180
193
  description: "Also search inside iframes (default true)"
@@ -185,7 +198,7 @@ var TOOL_SCHEMAS = [
185
198
  },
186
199
  {
187
200
  name: TOOL_NAMES.BROWSER.SHORTCUT,
188
- description: 'Save and run named multi-step shortcuts (macro = a chrome_batch step list stored under a name). action="save" stores {name, steps, description}; "run" executes a saved shortcut through the normal tool pipeline; "list" shows saved shortcuts; "delete" removes one. Useful for workflows you repeat across sessions (login flows, routine collection).',
201
+ description: "Save and run named macros (a chrome_batch step list stored under a name). action: save {name, steps, description} | run (through the normal pipeline) | list | delete. Use for flows you repeat across sessions (logins, routine collection).",
189
202
  inputSchema: {
190
203
  type: "object",
191
204
  properties: {
@@ -197,7 +210,7 @@ var TOOL_SCHEMAS = [
197
210
  name: { type: "string", description: "Shortcut name (save/run/delete)" },
198
211
  steps: {
199
212
  type: "array",
200
- description: 'For action="save": steps in chrome_batch format, max 20. Each: { tool: string, args?: object }',
213
+ description: 'action="save": chrome_batch steps, max 20. Each: { tool: string, args?: object }',
201
214
  items: {
202
215
  type: "object",
203
216
  properties: {
@@ -207,10 +220,10 @@ var TOOL_SCHEMAS = [
207
220
  required: ["tool"]
208
221
  }
209
222
  },
210
- description: { type: "string", description: 'For action="save": what this shortcut does' },
223
+ description: { type: "string", description: 'action="save": what this shortcut does' },
211
224
  continueOnError: {
212
225
  type: "boolean",
213
- description: 'For action="run": keep running steps after a failure (default false)'
226
+ description: 'action="run": keep running after a failure (default false)'
214
227
  }
215
228
  },
216
229
  required: ["action"]
@@ -218,36 +231,27 @@ var TOOL_SCHEMAS = [
218
231
  },
219
232
  {
220
233
  name: TOOL_NAMES.BROWSER.EXTRACT,
221
- description: "Extract ONLY the fields you need from the page via CSS selectors \u2014 far cheaper than reading the whole page when you know what you want (e.g. price, title, links). Deterministic and precise. Prefer this over chrome_get_web_content/chrome_read_page for targeted scraping.",
234
+ description: "Extract ONLY the fields you need via CSS selectors, far cheaper than reading the whole page (e.g. price, title, links). Prefer over chrome_get_web_content / chrome_read_page for targeted scraping.",
222
235
  inputSchema: {
223
236
  type: "object",
224
237
  properties: {
225
- tabId: {
226
- type: "number",
227
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
228
- },
238
+ tabId: tabIdProp,
229
239
  fields: {
230
240
  type: "object",
231
- description: "Map of fieldName \u2192 CSS selector (string) or { selector, attr?, all? }. Default value = trimmed innerText of first match; attr returns that attribute (href/src resolve to absolute URLs); all:true returns an array over every match (max 100, 2000 chars each). Max 20 fields."
241
+ description: "Map of fieldName -> CSS selector (string) or { selector, attr?, all? }. Default = trimmed innerText of first match; attr returns that attribute (href/src become absolute URLs); all:true returns an array over every match (max 100, 2000 chars each). Max 20 fields."
232
242
  },
233
- frameId: {
234
- type: "number",
235
- description: "Optional frame id to extract from a specific iframe."
236
- }
243
+ frameId: frameIdProp
237
244
  },
238
245
  required: ["fields"]
239
246
  }
240
247
  },
241
248
  {
242
249
  name: TOOL_NAMES.BROWSER.WAIT_FOR,
243
- description: 'Wait until the page is actually ready before acting \u2014 prevents "clicked/read too early" failures after navigation, clicks, or AJAX updates. Conditions (AND-combined, at least one required): selector appears/visible/hidden, text appears, document ready, or network idle. A timeout returns success:false with the observed state (not an error) so you can decide next steps.',
250
+ description: 'Wait until the page is ready before acting, avoiding "acted too early" failures after navigation/clicks/AJAX. Conditions (AND-combined, at least one required): selector state, text appears, document ready, or network idle. A timeout returns success:false with the observed state (not an error).',
244
251
  inputSchema: {
245
252
  type: "object",
246
253
  properties: {
247
- tabId: {
248
- type: "number",
249
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
250
- },
254
+ tabId: tabIdProp,
251
255
  selector: { type: "string", description: "CSS selector to wait for" },
252
256
  state: {
253
257
  type: "string",
@@ -261,7 +265,7 @@ var TOOL_SCHEMAS = [
261
265
  },
262
266
  networkIdleMs: {
263
267
  type: "number",
264
- description: "Wait until the tab has no in-flight network requests for this many ms (e.g. 500)"
268
+ description: "Wait until no in-flight requests for this many ms (e.g. 500)"
265
269
  },
266
270
  timeoutMs: { type: "number", description: "Max wait (default 15000, max 60000)" },
267
271
  pollMs: { type: "number", description: "Poll interval (default 250, min 100)" }
@@ -271,18 +275,15 @@ var TOOL_SCHEMAS = [
271
275
  },
272
276
  {
273
277
  name: TOOL_NAMES.BROWSER.SCROLL_COLLECT,
274
- description: "Collect content from infinite-scroll / lazy-loaded pages in ONE call: repeatedly scrolls to the bottom (window or a container element), waits for new content, and returns the accumulated text or links. Stops when the page stops growing, stopText appears, maxScrolls or maxChars is reached.",
278
+ description: "Collect content from infinite-scroll / lazy-loaded pages in ONE call: repeatedly scrolls to the bottom (window or a container), waits for new content, returns accumulated text or links. Stops when the page stops growing, stopText appears, or maxScrolls/maxChars is reached.",
275
279
  inputSchema: {
276
280
  type: "object",
277
281
  properties: {
278
- tabId: {
279
- type: "number",
280
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
281
- },
282
+ tabId: tabIdProp,
282
283
  maxScrolls: { type: "number", description: "Max scroll passes (default 10, max 30)" },
283
284
  delayMs: {
284
285
  type: "number",
285
- description: "Wait after each scroll for content to load (default 700, 200\u20133000)"
286
+ description: "Wait after each scroll for content to load (default 700, 200-3000)"
286
287
  },
287
288
  containerSelector: {
288
289
  type: "string",
@@ -298,7 +299,7 @@ var TOOL_SCHEMAS = [
298
299
  renderMode: {
299
300
  type: "string",
300
301
  enum: ["auto", "force", "off"],
301
- description: "Keep a background tab rendering so lazy loading actually fires (Chrome stops producing frames in inactive tabs, so IntersectionObserver never triggers). 'auto' (default) = enable only when the tab is not visible, 'force' = always, 'off' = never. Uses CDP, which shows a debugging infobar on that tab."
302
+ description: "Keep a background tab rendering so lazy loading fires (inactive tabs stop producing frames, so IntersectionObserver never triggers). 'auto' (default) = only when hidden, 'force' = always, 'off' = never. Uses CDP (shows a debug infobar)."
302
303
  }
303
304
  },
304
305
  required: []
@@ -306,7 +307,7 @@ var TOOL_SCHEMAS = [
306
307
  },
307
308
  {
308
309
  name: TOOL_NAMES.BROWSER.SET_WORK_TAB,
309
- description: "Retarget this session's default work tab WITHOUT activating/focusing anything (unlike chrome_switch_tab). Use when a tool result reports new_tabs_opened (a popup/new tab appeared, e.g. OAuth login) and you want subsequent tabId-less tool calls to target it \u2014 then call again with the original tabId to return. No args = report current work tab. clear:true = unset.",
310
+ description: "Retarget this session's default work tab WITHOUT focusing anything (unlike chrome_switch_tab). Use when a result reports new_tabs_opened (a popup/new tab, e.g. OAuth) so later tabId-less calls target it; call again with the original tabId to return. No args = report current; clear:true = unset.",
310
311
  inputSchema: {
311
312
  type: "object",
312
313
  properties: {
@@ -324,139 +325,109 @@ var TOOL_SCHEMAS = [
324
325
  },
325
326
  {
326
327
  name: TOOL_NAMES.BROWSER.GET_WINDOWS_AND_TABS,
327
- description: "Get all currently open browser windows and tabs. Marks MCP session work tabs (mcpWorkTabSessions), the dedicated MCP work window (isMcpWorkWindow), and tabs recently spawned by page actions such as popups (recentlySpawned with openerTabId).",
328
+ description: "Get all open windows and tabs. Marks MCP session work tabs (mcpWorkTabSessions), the dedicated MCP work window (isMcpWorkWindow), and tabs recently spawned by page actions like popups (recentlySpawned with openerTabId).",
328
329
  inputSchema: {
329
330
  type: "object",
330
331
  properties: {},
331
332
  required: []
332
333
  }
333
334
  },
335
+ // record_replay 두 도구는 **의도적으로 MCP 에 노출하지 않는다** (2026-09-04 Codex 3차 검토, 항목 3).
336
+ //
337
+ // replay 엔진은 대상 탭을 스스로 고른다 — rr-utils 의 ensureTab() 이 tabTarget 미지정·'current'
338
+ // 에서 사용자의 활성 탭을 잡고, legacy step executor 와 대부분의 노드(click·fill·extract·
339
+ // assert·script·wait·drag 등)가 ctx.tabId 를 무시하고 같은 조회를 다시 한다(엔진·노드 전체
340
+ // 28곳/16파일). 그래서 백그라운드 작업 게이트가 작업 탭 id 를 주입해도 소비하는 지점이 없고,
341
+ // flow_run 호출이 사용자가 보고 있는 탭을 조작한다. 엔진이 ctx.tabId 를 존중하도록 고치기 전에는
342
+ // 노출하지 않으며, 확장의 게이트도 백그라운드 모드에서 flow_run 을 거절한다
343
+ // (utils/work-tab-gate.ts 의 BACKGROUND_MODE_UNSUPPORTED_TOOLS).
344
+ //
334
345
  // {
335
346
  // name: TOOL_NAMES.RECORD_REPLAY.FLOW_RUN,
336
- // description:
337
- // 'Run a recorded flow by ID with optional variables and run options. Returns a standardized run result.',
338
- // inputSchema: {
339
- // type: 'object',
340
- // properties: {
341
- // flowId: { type: 'string', description: 'ID of the flow to run' },
342
- // args: {
343
- // type: 'object',
344
- // description: 'Variable values for the flow (flat object of key/value)',
345
- // },
346
- // tabTarget: {
347
- // type: 'string',
348
- // description: "Target tab: 'current' or 'new' (default: current)",
349
- // enum: ['current', 'new'],
350
- // },
351
- // refresh: { type: 'boolean', description: 'Refresh before running (default false)' },
352
- // captureNetwork: {
353
- // type: 'boolean',
354
- // description: 'Capture network snippets for debugging (default false)',
355
- // },
356
- // returnLogs: { type: 'boolean', description: 'Return run logs (default false)' },
357
- // timeoutMs: { type: 'number', description: 'Global timeout in ms (optional)' },
358
- // startUrl: { type: 'string', description: 'Optional start URL to open before running' },
359
- // },
360
- // required: ['flowId'],
361
- // },
347
+ // ...
362
348
  // },
363
349
  // {
364
350
  // name: TOOL_NAMES.RECORD_REPLAY.LIST_PUBLISHED,
365
- // description: 'List published flows available as dynamic tools (for discovery).',
366
- // inputSchema: {
367
- // type: 'object',
368
- // properties: {},
369
- // required: [],
370
- // },
351
+ // ...
371
352
  // },
372
353
  {
373
354
  name: TOOL_NAMES.BROWSER.PERFORMANCE_START_TRACE,
374
- description: "Starts a performance trace recording on the selected page. Optionally reloads the page and/or auto-stops after a short duration.",
355
+ description: "Start a performance trace on the selected page. Optionally reload and/or auto-stop after a short duration.",
375
356
  inputSchema: {
376
357
  type: "object",
377
358
  properties: {
378
359
  reload: {
379
360
  type: "boolean",
380
- description: "Determines if, once tracing has started, the page should be automatically reloaded (ignore cache)."
361
+ description: "Reload the page (ignoring cache) once tracing starts."
381
362
  },
382
363
  autoStop: {
383
364
  type: "boolean",
384
- description: "Determines if the trace should be automatically stopped (default false)."
365
+ description: "Automatically stop the trace (default false)."
385
366
  },
386
367
  durationMs: {
387
368
  type: "number",
388
- description: "Auto-stop duration in milliseconds when autoStop is true (default 5000)."
369
+ description: "Auto-stop duration in ms when autoStop is true (default 5000)."
389
370
  },
390
- tabId: {
391
- type: "number",
392
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
393
- }
371
+ tabId: tabIdProp
394
372
  },
395
373
  required: []
396
374
  }
397
375
  },
398
376
  {
399
377
  name: TOOL_NAMES.BROWSER.PERFORMANCE_STOP_TRACE,
400
- description: "Stops the active performance trace recording on the selected page.",
378
+ description: "Stop the active performance trace on the selected page.",
401
379
  inputSchema: {
402
380
  type: "object",
403
381
  properties: {
404
382
  saveToDownloads: {
405
383
  type: "boolean",
406
- description: "Whether to save the trace as a JSON file in Downloads (default true)."
384
+ description: "Save the trace as a JSON file in Downloads (default true)."
407
385
  },
408
386
  filenamePrefix: {
409
387
  type: "string",
410
388
  description: "Optional filename prefix for the downloaded trace JSON."
411
389
  },
412
- tabId: {
413
- type: "number",
414
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
415
- }
390
+ tabId: tabIdProp
416
391
  },
417
392
  required: []
418
393
  }
419
394
  },
420
395
  {
421
396
  name: TOOL_NAMES.BROWSER.PERFORMANCE_ANALYZE_INSIGHT,
422
- description: "Provides a lightweight summary of the last recorded trace. For deep insights (CWV, breakdowns), integrate native-side DevTools trace engine.",
397
+ description: "Lightweight summary of the last recorded trace. Deep insights (CWV, breakdowns) need the native DevTools trace engine.",
423
398
  inputSchema: {
424
399
  type: "object",
425
400
  properties: {
426
401
  insightName: {
427
402
  type: "string",
428
- description: 'Optional insight name for future deep analysis (e.g., "DocumentLatency"). Currently informational only.'
403
+ description: 'Insight name for future deep analysis (e.g. "DocumentLatency").'
429
404
  },
430
405
  timeoutMs: {
431
406
  type: "number",
432
- description: "Timeout for deep analysis via native host (milliseconds). Default 60000. Increase for large traces."
407
+ description: "Native-host deep-analysis timeout in ms (default 60000)."
433
408
  },
434
- tabId: {
435
- type: "number",
436
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
437
- }
409
+ tabId: tabIdProp
438
410
  },
439
411
  required: []
440
412
  }
441
413
  },
442
414
  {
443
415
  name: TOOL_NAMES.BROWSER.READ_PAGE,
444
- description: `Get an accessibility tree representation of visible elements on the page. Only returns elements that are visible in the viewport. Optionally filter for only interactive elements.
445
- Tip: If the returned elements do not include the specific element you need, use the computer tool's screenshot (action="screenshot") to capture the element's on-screen coordinates, then operate by coordinates.`,
416
+ description: 'Accessibility-tree view of the elements visible in the viewport; optional interactive-only filter. Prefer over a screenshot for locating/acting on elements; use chrome_extract for known fields, chrome_find for a natural-language lookup.\nCompact format (default, lossless): 1 space indent per tree level; the bare token ref_N is the element ref (pass as refId, or as ref to click/fill/computer); @x,y is the element center; empty wrappers collapsed. compact:false for verbose. With allFrames, sections read "=== frame <frameId> | <url> ===" and refs inside are frame-local (pass that frameId).\nIf an element is missing, screenshot (chrome_computer action="screenshot") for its coordinates. markedElements are user-marked with highest priority.',
446
417
  inputSchema: {
447
418
  type: "object",
448
419
  properties: {
449
420
  filter: {
450
421
  type: "string",
451
- description: 'Filter elements: "interactive" for such as buttons/links/inputs only (default: all visible elements)'
422
+ description: '"interactive" for buttons/links/inputs only (default: all visible elements)'
452
423
  },
453
424
  depth: {
454
425
  type: "number",
455
- description: "Maximum DOM depth to traverse (integer >= 0). Lower values reduce output size and can improve performance."
426
+ description: "Max DOM depth to traverse (integer >= 0). Lower = smaller output."
456
427
  },
457
428
  refId: {
458
429
  type: "string",
459
- description: 'Focus on the subtree rooted at this element refId (e.g., "ref_12"). The refId must come from a recent chrome_read_page response in the same tab (refs may expire).'
430
+ description: 'Focus on the subtree at this refId (e.g. "ref_12"), from a recent read of the same tab (refs may expire).'
460
431
  },
461
432
  tabId: {
462
433
  type: "number",
@@ -468,15 +439,15 @@ Tip: If the returned elements do not include the specific element you need, use
468
439
  },
469
440
  allFrames: {
470
441
  type: "boolean",
471
- description: "Also collect content from iframes (merged, annotated with frameId \u2014 pair frame-local refs with that frameId). Default: false"
442
+ description: "Also collect from iframes (merged, annotated with frameId). Default: false"
472
443
  },
473
444
  diff: {
474
445
  type: "boolean",
475
- description: "When true (default), returns {unchanged:true} instead of the full body if the page content is identical to your previous read \u2014 reuse the earlier content. Pass false to force full re-send."
446
+ description: "When true (default), returns {unchanged:true} if the page is identical to your last read; false forces re-send."
476
447
  },
477
448
  compact: {
478
449
  type: "boolean",
479
- description: "Lossless output compaction (collapse empty wrappers etc., ~30-50% smaller). Default: true. Pass false for the verbose format."
450
+ description: "Lossless compaction (~30-50% smaller). Default: true; false for verbose."
480
451
  }
481
452
  },
482
453
  required: []
@@ -484,34 +455,34 @@ Tip: If the returned elements do not include the specific element you need, use
484
455
  },
485
456
  {
486
457
  name: TOOL_NAMES.BROWSER.COMPUTER,
487
- description: "Use a mouse and keyboard to interact with a web browser, and take screenshots.\n* Whenever you intend to click on an element like an icon, you should consult a read_page to determine the ref of the element before moving the cursor.\n* If you tried clicking on a program or link but it failed to load, even after waiting, try screenshot and then adjusting your click location so that the tip of the cursor visually falls on the element that you want to click.\n* Make sure to click any buttons, links, icons, etc with the cursor tip in the center of the element. Don't click boxes on their edges unless asked.",
458
+ description: "Mouse/keyboard interaction and screenshots. Before clicking (especially an icon), get its ref from chrome_read_page. If a click misses, screenshot and aim the cursor tip at the target center.",
488
459
  inputSchema: {
489
460
  type: "object",
490
461
  properties: {
491
462
  tabId: { type: "number", description: "Target tab ID (default: active tab)" },
492
463
  background: {
493
464
  type: "boolean",
494
- description: "Avoid focusing/activating tab/window for certain operations (best-effort). Default: false"
465
+ description: "Avoid focusing/activating the tab or window where possible. Default: false"
495
466
  },
496
467
  fullResolution: {
497
468
  type: "boolean",
498
- description: 'For action="screenshot"/"zoom": skip the \u22641568px downscale of the returned image (default: false)'
469
+ description: "screenshot/zoom: skip the <=1568px downscale (default false)"
499
470
  },
500
471
  action: {
501
472
  type: "string",
502
- description: "Action to perform: left_click | right_click | double_click | triple_click | left_click_drag | scroll | scroll_to | type | key | fill | fill_form | hover | wait | resize_page | zoom | screenshot"
473
+ description: "Action: left_click|right_click|double_click|triple_click|left_click_drag|scroll|scroll_to|type|key|fill|fill_form|hover|wait|resize_page|zoom|screenshot"
503
474
  },
504
475
  ref: {
505
476
  type: "string",
506
- description: "Element ref from chrome_read_page. For click/scroll/scroll_to/key/type and drag end when provided; takes precedence over coordinates."
477
+ description: "Element ref from chrome_read_page (click/scroll/key/type, drag end); beats coordinates."
507
478
  },
508
479
  coordinates: {
509
480
  type: "object",
510
481
  properties: {
511
- x: { type: "number", description: "X coordinate" },
512
- y: { type: "number", description: "Y coordinate" }
482
+ x: { type: "number" },
483
+ y: { type: "number" }
513
484
  },
514
- description: "Coordinates for actions (in screenshot space if a recent screenshot was taken, otherwise viewport). Required for click/scroll and as end point for drag."
485
+ description: "Screenshot-space if a recent screenshot exists, else viewport. Required for click/scroll and the drag end."
515
486
  },
516
487
  startCoordinates: {
517
488
  type: "object",
@@ -519,15 +490,15 @@ Tip: If the returned elements do not include the specific element you need, use
519
490
  x: { type: "number" },
520
491
  y: { type: "number" }
521
492
  },
522
- description: "Starting coordinates for drag action"
493
+ description: "Starting coordinates for drag."
523
494
  },
524
495
  startRef: {
525
496
  type: "string",
526
- description: "Drag start ref from chrome_read_page (alternative to startCoordinates)."
497
+ description: "Drag start ref (alternative to startCoordinates)."
527
498
  },
528
499
  scrollDirection: {
529
500
  type: "string",
530
- description: "Scroll direction: up | down | left | right"
501
+ description: "Scroll direction: up|down|left|right"
531
502
  },
532
503
  scrollAmount: {
533
504
  type: "number",
@@ -535,15 +506,15 @@ Tip: If the returned elements do not include the specific element you need, use
535
506
  },
536
507
  text: {
537
508
  type: "string",
538
- description: 'Text to type (for action=type) or keys/chords separated by space (for action=key, e.g. "Backspace Enter" or "cmd+a")'
509
+ description: 'Text to type (action=type), or space-separated keys/chords (action=key, e.g. "Backspace Enter", "cmd+a")'
539
510
  },
540
511
  repeat: {
541
512
  type: "number",
542
- description: "For action=key: number of times to repeat the key sequence (integer 1-100, default 1)."
513
+ description: "action=key: repeat (1-100, default 1)."
543
514
  },
544
515
  modifiers: {
545
516
  type: "object",
546
- description: "Modifier keys for click actions (left_click/right_click/double_click/triple_click).",
517
+ description: "Modifier keys for clicks.",
547
518
  properties: {
548
519
  altKey: { type: "boolean" },
549
520
  ctrlKey: { type: "boolean" },
@@ -553,7 +524,7 @@ Tip: If the returned elements do not include the specific element you need, use
553
524
  },
554
525
  region: {
555
526
  type: "object",
556
- description: "For action=zoom: rectangular region to capture (x0,y0)-(x1,y1) in viewport pixels (or screenshot-space if a recent screenshot context exists).",
527
+ description: "action=zoom: region (x0,y0)-(x1,y1) in viewport px (or screenshot-space if a recent screenshot exists).",
557
528
  properties: {
558
529
  x0: { type: "number" },
559
530
  y0: { type: "number" },
@@ -569,29 +540,29 @@ Tip: If the returned elements do not include the specific element you need, use
569
540
  },
570
541
  value: {
571
542
  oneOf: [{ type: "string" }, { type: "boolean" }, { type: "number" }],
572
- description: "Value to set for action=fill (string | boolean | number)"
543
+ description: "Value for action=fill (string|boolean|number)"
573
544
  },
574
545
  elements: {
575
546
  type: "array",
576
- description: "For action=fill_form: list of elements to fill (ref + value)",
547
+ description: "action=fill_form: elements to fill (ref + value)",
577
548
  items: {
578
549
  type: "object",
579
550
  properties: {
580
551
  ref: { type: "string", description: "Element ref from chrome_read_page" },
581
- value: { type: "string", description: "Value to set (stringified if non-string)" }
552
+ value: { type: "string", description: "Value to set (stringified if non-string)." }
582
553
  },
583
554
  required: ["ref", "value"]
584
555
  }
585
556
  },
586
- width: { type: "number", description: "For action=resize_page: viewport width" },
587
- height: { type: "number", description: "For action=resize_page: viewport height" },
557
+ width: { type: "number", description: "action=resize_page: viewport width" },
558
+ height: { type: "number", description: "action=resize_page: viewport height" },
588
559
  appear: {
589
560
  type: "boolean",
590
- description: "For action=wait with text: whether to wait for the text to appear (true, default) or disappear (false)"
561
+ description: "action=wait+text: appear (true, default) or disappear (false)"
591
562
  },
592
563
  timeout: {
593
564
  type: "number",
594
- description: "For action=wait with text: timeout in milliseconds (default 10000, max 120000)"
565
+ description: "action=wait+text: timeout in ms (default 10000, max 120000)"
595
566
  },
596
567
  duration: {
597
568
  type: "number",
@@ -601,133 +572,53 @@ Tip: If the returned elements do not include the specific element you need, use
601
572
  required: ["action"]
602
573
  }
603
574
  },
604
- // {
605
- // name: TOOL_NAMES.BROWSER.USERSCRIPT,
606
- // description:
607
- // 'Unified userscript tool (create/list/get/enable/disable/update/remove/send_command/export). Paste JS/CSS/Tampermonkey script and the system will auto-select the best strategy (insertCSS / persistent script in ISOLATED or MAIN world / once by CDP) with CSP-aware fallbacks.',
608
- // inputSchema: {
609
- // type: 'object',
610
- // properties: {
611
- // action: {
612
- // type: 'string',
613
- // description:
614
- // 'Operation to perform',
615
- // enum: [
616
- // 'create',
617
- // 'list',
618
- // 'get',
619
- // 'enable',
620
- // 'disable',
621
- // 'update',
622
- // 'remove',
623
- // 'send_command',
624
- // 'export',
625
- // ],
626
- // },
627
- // args: {
628
- // type: 'object',
629
- // description:
630
- // 'Arguments for the specified action.\n- create: { script (required), name?, description?, matches?: string[], excludes?: string[], persist?: boolean (default true), runAt?: "document_start"|"document_end"|"document_idle"|"auto", world?: "auto"|"ISOLATED"|"MAIN", allFrames?: boolean (default true), mode?: "auto"|"css"|"persistent"|"once", dnrFallback?: boolean (default true), tags?: string[] }\n- list: { query?: string, status?: "enabled"|"disabled", domain?: string }\n- get: { id (required) }\n- enable/disable: { id (required) }\n- update: { id (required), script?, name?, description?, matches?, excludes?, runAt?, world?, allFrames?, persist?, dnrFallback?, tags? }\n- remove: { id (required) }\n- send_command: { id (required), payload?: string, tabId?: number }\n- export: {}\nTip: For a one-off execution that returns a value, use create with args.mode="once". The returned value is included as onceResult in the tool response.',
631
- // properties: {
632
- // // Common identifiers
633
- // id: { type: 'string', description: 'Userscript id (for get/enable/disable/update/remove/send_command)' },
634
- // // Create / Update fields
635
- // script: { type: 'string', description: 'JS/CSS/Tampermonkey script source (required for create)' },
636
- // name: { type: 'string', description: 'Userscript name (optional)' },
637
- // description: { type: 'string', description: 'Userscript description (optional)' },
638
- // matches: {
639
- // type: 'array',
640
- // items: { type: 'string' },
641
- // description: 'Match patterns for pages to apply to (e.g., https://*.example.com/*)'
642
- // },
643
- // excludes: {
644
- // type: 'array',
645
- // items: { type: 'string' },
646
- // description: 'Exclude patterns'
647
- // },
648
- // persist: { type: 'boolean', description: 'Persist userscript for matched pages (default true)' },
649
- // runAt: {
650
- // type: 'string',
651
- // description: 'Injection timing',
652
- // enum: ['document_start', 'document_end', 'document_idle', 'auto'],
653
- // },
654
- // world: {
655
- // type: 'string',
656
- // description: 'Execution world',
657
- // enum: ['auto', 'ISOLATED', 'MAIN'],
658
- // },
659
- // allFrames: { type: 'boolean', description: 'Inject into all frames (default true)' },
660
- // mode: {
661
- // type: 'string',
662
- // description:
663
- // 'Injection strategy: auto | css | persistent | once. Use once to evaluate immediately (no persistence) and include the return value in onceResult.',
664
- // enum: ['auto', 'css', 'persistent', 'once'],
665
- // },
666
- // dnrFallback: { type: 'boolean', description: 'Use DNR fallback when needed (default true)' },
667
- // tags: { type: 'array', items: { type: 'string' }, description: 'Custom tags' },
668
- // // List filters
669
- // query: { type: 'string', description: 'Search by name/description (list action)' },
670
- // status: { type: 'string', enum: ['enabled', 'disabled'], description: 'Filter by status (list action)' },
671
- // domain: { type: 'string', description: 'Filter by domain (list action)' },
672
- // // Send command
673
- // payload: { type: 'string', description: 'Arbitrary payload (stringified) for send_command' },
674
- // tabId: { type: 'number', description: 'Target tab for send_command (default active tab)' },
675
- // },
676
- // },
677
- // },
678
- // required: ['action'],
679
- // },
680
- // },
681
575
  {
682
576
  name: TOOL_NAMES.BROWSER.NAVIGATE,
683
- description: "Navigate to a URL, refresh the current tab, or navigate browser history (back/forward)",
577
+ description: "Navigate to a URL, refresh the current tab, or go back/forward in history",
684
578
  inputSchema: {
685
579
  type: "object",
686
580
  properties: {
687
581
  url: {
688
582
  type: "string",
689
- description: 'URL to navigate to. Special values: "back" or "forward" to navigate browser history in the target tab.'
583
+ description: 'URL to navigate to. Special values "back"/"forward" navigate history in the target tab.'
690
584
  },
691
585
  newWindow: {
692
586
  type: "boolean",
693
- description: "Create a new window to navigate to the URL or not. Defaults to false"
587
+ description: "Create a new window for the URL (default false)."
694
588
  },
695
589
  waitUntil: {
696
590
  type: "string",
697
591
  enum: ["none", "domcontentloaded", "load", "networkidle"],
698
- description: 'How far to wait for the page to load before returning. Default "domcontentloaded" \u2014 prevents reading/clicking an empty page right after navigating. Use "networkidle" for data-heavy SPAs, "none" to return immediately. The observed load state is reported back in the result as "load" (a timeout is reported, not an error).'
592
+ description: 'How far to wait before returning. Default "domcontentloaded" (avoids reading an empty page); "networkidle" for data-heavy SPAs, "none" to return immediately. The observed load state is reported back (a timeout is reported, not an error).'
699
593
  },
700
594
  waitTimeoutMs: {
701
595
  type: "number",
702
- description: "Max time (ms) to wait for waitUntil. Default 15000, max 60000."
596
+ description: "Max wait for waitUntil (default 15000, max 60000)."
703
597
  },
704
598
  tabId: {
705
599
  type: "number",
706
- description: "Target an existing tab by ID (if provided, navigate/refresh/back/forward that tab instead of the active tab)."
600
+ description: "Navigate/refresh/back/forward this existing tab instead of the active tab."
707
601
  },
708
602
  windowId: {
709
603
  type: "number",
710
- description: "Target an existing window by ID (when creating a new tab in existing window, or picking active tab if tabId is not provided)."
711
- },
712
- background: {
713
- type: "boolean",
714
- description: "Perform the operation without stealing focus (do not activate the tab or focus the window). Default: false"
604
+ description: "Existing window for a new tab, or to pick the active tab when tabId is omitted."
715
605
  },
606
+ background: backgroundProp,
716
607
  newTab: {
717
608
  type: "boolean",
718
- description: "Force a brand-new tab. By default this session keeps working in ONE tab: if it already has an MCP-created work tab, that tab is navigated instead of piling up new tabs. Tabs you assigned yourself via chrome_set_work_tab are never reused this way."
609
+ description: "Force a brand-new tab. By default the session works in ONE tab: an existing MCP work tab is navigated instead of piling up tabs. Tabs set via chrome_set_work_tab are never reused this way."
719
610
  },
720
611
  width: {
721
612
  type: "number",
722
- description: "Window width in pixels (default: 1280). When width or height is provided, a new window will be created."
613
+ description: "Window width px (default 1280). Providing width or height creates a new window."
723
614
  },
724
615
  height: {
725
616
  type: "number",
726
- description: "Window height in pixels (default: 720). When width or height is provided, a new window will be created."
617
+ description: "Window height px (default 720). Providing width or height creates a new window."
727
618
  },
728
619
  refresh: {
729
620
  type: "boolean",
730
- description: "Refresh the current active tab instead of navigating to a URL. When true, the url parameter is ignored. Defaults to false"
621
+ description: "Refresh the active tab instead of navigating (url ignored). Default false."
731
622
  }
732
623
  },
733
624
  required: []
@@ -735,7 +626,7 @@ Tip: If the returned elements do not include the specific element you need, use
735
626
  },
736
627
  {
737
628
  name: TOOL_NAMES.BROWSER.SCREENSHOT,
738
- description: '[Prefer read_page over taking a screenshot and Prefer chrome_computer] Take a screenshot of the current page or a specific element. For new usage, use chrome_computer with action="screenshot". Use this tool if you need advanced options.',
629
+ description: '[Prefer chrome_read_page, or chrome_computer action="screenshot"] Take a screenshot of the page or an element. Use this tool only when you need its advanced options.',
739
630
  inputSchema: {
740
631
  type: "object",
741
632
  properties: {
@@ -747,21 +638,21 @@ Tip: If the returned elements do not include the specific element you need, use
747
638
  },
748
639
  windowId: {
749
640
  type: "number",
750
- description: "Target window ID to pick active tab from when tabId is not provided."
641
+ description: "Target window ID to pick active tab when tabId is not provided."
751
642
  },
752
643
  background: {
753
644
  type: "boolean",
754
- description: "Attempt capture without bringing tab/window to foreground. CDP-based capture is used for simple viewport captures. For element/full-page capture, the tab may still be made active in its window without focusing the window. Default: false"
645
+ description: "Capture without bringing the tab/window to the foreground. For element/full-page capture the tab may still be activated in its window without focusing it. Default: false"
755
646
  },
756
647
  width: { type: "number", description: "Width in pixels (default: 800)" },
757
648
  height: { type: "number", description: "Height in pixels (default: 600)" },
758
649
  storeBase64: {
759
650
  type: "boolean",
760
- description: "Return the screenshot as an MCP image content block (default: false). Recommended when you want to SEE the page. The image is auto-downscaled to \u22641568px long edge (metadata reports imageScale vs the CSS viewport for coordinate math); pass fullResolution:true to skip downscaling."
651
+ description: "Return the image as an MCP image content block (default: false). Auto-downscaled to <=1568px long edge (metadata reports imageScale); pass fullResolution:true to skip."
761
652
  },
762
653
  fullResolution: {
763
654
  type: "boolean",
764
- description: "Skip the \u22641568px downscale for the returned image (default: false)"
655
+ description: "Skip the <=1568px downscale for the returned image (default: false)"
765
656
  },
766
657
  fullPage: {
767
658
  type: "boolean",
@@ -769,15 +660,15 @@ Tip: If the returned elements do not include the specific element you need, use
769
660
  },
770
661
  savePng: {
771
662
  type: "boolean",
772
- description: "Save screenshot as PNG file (default: true)\uFF0Cif you want to see the page, recommend set this to be false, and set storeBase64 to be true"
663
+ description: "Save as a PNG file (default: true). To see the page, set false and storeBase64 true."
773
664
  },
774
665
  saveToDownloads: {
775
666
  type: "boolean",
776
- description: "Also auto-save the captured image to Downloads/mcp-screenshots/ without any user interaction (default: false)"
667
+ description: "Also auto-save to Downloads/mcp-screenshots/ (default: false)"
777
668
  },
778
669
  filename: {
779
670
  type: "string",
780
- description: "Filename for saveToDownloads (sanitized, kept under mcp-screenshots/). Default: screenshot-<timestamp>.png"
671
+ description: "Filename for saveToDownloads (sanitized, under mcp-screenshots/)."
781
672
  }
782
673
  },
783
674
  required: []
@@ -792,7 +683,7 @@ Tip: If the returned elements do not include the specific element you need, use
792
683
  tabIds: {
793
684
  type: "array",
794
685
  items: { type: "number" },
795
- description: "Array of tab IDs to close. If not provided, will close the active tab."
686
+ description: "Tab IDs to close. If not provided, closes the active tab."
796
687
  },
797
688
  url: {
798
689
  type: "string",
@@ -804,7 +695,7 @@ Tip: If the returned elements do not include the specific element you need, use
804
695
  },
805
696
  {
806
697
  name: TOOL_NAMES.BROWSER.SWITCH_TAB,
807
- description: "Bring a tab to the front (activates it and can take OS focus). Use ONLY when the user explicitly asked to switch/show a tab. To retarget automation at another tab without disturbing the user, use chrome_set_work_tab instead - this tool is exempt from the no-interference gate, so it will actually change what the user is looking at.",
698
+ description: "Bring a tab to the front (activates it and can take OS focus). Use ONLY when the user explicitly asked to switch/show a tab. To retarget automation without disturbing the user, use chrome_set_work_tab; this tool is exempt from the no-interference gate, so it changes what the user sees.",
808
699
  inputSchema: {
809
700
  type: "object",
810
701
  properties: {
@@ -822,45 +713,42 @@ Tip: If the returned elements do not include the specific element you need, use
822
713
  },
823
714
  {
824
715
  name: TOOL_NAMES.BROWSER.WEB_FETCHER,
825
- description: "Read a page as text (reader view by default: nav/footer/cookie-banner noise stripped) or as cleaned HTML. Repeat reads of an unchanged tab return {unchanged:true} instead of the body. Both modes are length-capped and report fullTextChars/fullHtmlChars vs returnedChars so you can tell what was cut. For a handful of known fields prefer chrome_extract, and for clicking/typing prefer chrome_read_page (it returns element refs); use this when you want the page content itself.",
716
+ description: "Read a page as text (reader view by default: nav/footer/cookie-banner noise stripped) or cleaned HTML. Repeat reads of an unchanged tab return {unchanged:true}; both modes are length-capped (report fullTextChars/fullHtmlChars vs returnedChars). For known fields prefer chrome_extract; for clicking/typing prefer chrome_read_page (returns refs); use this for the page content itself.",
826
717
  inputSchema: {
827
718
  type: "object",
828
719
  properties: {
829
720
  url: {
830
721
  type: "string",
831
- description: "URL to fetch content from. If not provided, uses the current active tab"
722
+ description: "URL to fetch. If not provided, uses the current active tab"
832
723
  },
833
724
  tabId: {
834
725
  type: "number",
835
726
  description: "Target an existing tab by ID (default: active tab)."
836
727
  },
837
- background: {
838
- type: "boolean",
839
- description: "Do not activate tab/focus window while fetching (default: false)"
840
- },
728
+ background: backgroundProp,
841
729
  htmlContent: {
842
730
  type: "boolean",
843
- description: "Return cleaned HTML (scripts/styles/SVG stripped) instead of text. Much more expensive than text \u2014 use it only when you need markup/attributes, and pair it with selector. If true, textContent is ignored (default: false)"
731
+ description: "Return cleaned HTML (scripts/styles/SVG stripped) instead of text. Much more expensive; use only for markup/attributes and pair with selector. If true, textContent is ignored (default: false)"
844
732
  },
845
733
  textContent: {
846
734
  type: "boolean",
847
- description: "Get the visible text content of the page with metadata. Ignored if htmlContent is true (default: true)"
735
+ description: "Visible text with metadata. Ignored if htmlContent is true (default true)"
848
736
  },
849
737
  selector: {
850
738
  type: "string",
851
- description: "CSS selector to get content from a specific element. If provided, only content from this element will be returned"
739
+ description: "CSS selector to return content from a specific element only."
852
740
  },
853
741
  maxChars: {
854
742
  type: "number",
855
- description: "Cap on returned HTML length (default 100000). Only applies to htmlContent mode; the result reports fullHtmlChars/returnedChars and truncated:true when it was cut."
743
+ description: "Cap on returned HTML length (default 100000, htmlContent mode only); reports truncated:true when cut."
856
744
  },
857
745
  raw: {
858
746
  type: "boolean",
859
- description: "Text mode returns reader-view content by default (navigation/footer/cookie-banner noise stripped, main content kept \u2014 fullTextChars vs returnedChars reported). Pass true for the unfiltered full text. Default: false"
747
+ description: "Text mode: reader-view by default (noise stripped); true = unfiltered full text. Default false"
860
748
  },
861
749
  diff: {
862
750
  type: "boolean",
863
- description: "When true (default), returns {unchanged:true} instead of the body if identical to your previous read of this tab (text and HTML modes are tracked separately) \u2014 reuse the earlier content. Pass false to force full re-send."
751
+ description: "When true (default), returns {unchanged:true} if identical to your last read (text/HTML tracked separately); false forces re-send."
864
752
  }
865
753
  },
866
754
  required: []
@@ -894,11 +782,11 @@ Tip: If the returned elements do not include the specific element you need, use
894
782
  },
895
783
  formData: {
896
784
  type: "object",
897
- description: "Multipart/form-data descriptor. If provided, overrides body and builds FormData with optional file attachments. Shape: { fields?: Record<string,string|number|boolean>, files?: Array<{ name: string, fileUrl?: string, filePath?: string, base64Data?: string, filename?: string, contentType?: string }> }. Also supports a compact array form: [ [name, fileSpec, filename?], ... ] where fileSpec may be url:, file:, or base64:."
785
+ description: "Multipart/form-data descriptor. Overrides body and builds FormData with optional file attachments. Shape: { fields?: Record<string,string|number|boolean>, files?: Array<{ name, fileUrl?, filePath?, base64Data?, filename?, contentType? }> }. Also a compact array form: [ [name, fileSpec, filename?], ... ] where fileSpec is url:, file:, or base64:."
898
786
  },
899
787
  tabId: {
900
788
  type: "number",
901
- description: "Optional tab id whose browser context (cookies, origin) is used. Defaults to the MCP work tab (background work mode) or the active tab."
789
+ description: "Tab id whose browser context (cookies, origin) is used. Omit to use this session's work tab."
902
790
  }
903
791
  },
904
792
  required: ["url"]
@@ -906,42 +794,39 @@ Tip: If the returned elements do not include the specific element you need, use
906
794
  },
907
795
  {
908
796
  name: TOOL_NAMES.BROWSER.NETWORK_CAPTURE,
909
- description: 'Unified network capture tool. Use action="start" to begin capturing, action="stop" to end and retrieve results. Set needResponseBody=true to capture response bodies (uses Debugger API, may conflict with DevTools). Default mode uses webRequest API (lightweight, no debugger conflict, but no response body).',
797
+ description: 'Unified network capture. action="start" begins, action="stop" ends and returns results. needResponseBody=true captures response bodies (Debugger API, may conflict with DevTools); the default webRequest mode is lightweight but has no response body.',
910
798
  inputSchema: {
911
799
  type: "object",
912
800
  properties: {
913
801
  action: {
914
802
  type: "string",
915
803
  enum: ["start", "stop"],
916
- description: 'Action to perform: "start" begins capture, "stop" ends and returns results'
804
+ description: '"start" begins capture, "stop" ends and returns results'
917
805
  },
918
806
  needResponseBody: {
919
807
  type: "boolean",
920
- description: "When true, captures response body using Debugger API (default: false). Only use when you need to inspect response content."
808
+ description: "Capture response bodies via the Debugger API (default: false)."
921
809
  },
922
810
  url: {
923
811
  type: "string",
924
- description: 'URL to capture network requests from. For action="start". If not provided, uses the current active tab.'
812
+ description: 'action="start": URL to capture from. If omitted, uses the current active tab.'
925
813
  },
926
814
  maxCaptureTime: {
927
815
  type: "number",
928
- description: "Maximum capture time in milliseconds (default: 180000)"
816
+ description: "Maximum capture time in ms (default: 180000)"
929
817
  },
930
818
  inactivityTimeout: {
931
819
  type: "number",
932
- description: "Stop after inactivity in milliseconds (default: 60000). Set 0 to disable."
820
+ description: "Stop after inactivity in ms (default: 60000). Set 0 to disable."
933
821
  },
934
822
  includeStatic: {
935
823
  type: "boolean",
936
824
  description: "Include static resources like images/scripts/styles (default: false)"
937
825
  },
938
- tabId: {
939
- type: "number",
940
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
941
- },
826
+ tabId: tabIdProp,
942
827
  limit: {
943
828
  type: "number",
944
- description: 'action="stop": return at most this many captured requests (default 100; paginate with offset)'
829
+ description: 'action="stop": max requests to return (default 100; paginate with offset)'
945
830
  },
946
831
  offset: {
947
832
  type: "number",
@@ -949,7 +834,7 @@ Tip: If the returned elements do not include the specific element you need, use
949
834
  },
950
835
  countOnly: {
951
836
  type: "boolean",
952
- description: 'action="stop": return only counts/summary without the request array (default: false)'
837
+ description: 'action="stop": counts/summary only, no request array (default false)'
953
838
  }
954
839
  },
955
840
  required: ["action"]
@@ -976,23 +861,23 @@ Tip: If the returned elements do not include the specific element you need, use
976
861
  properties: {
977
862
  text: {
978
863
  type: "string",
979
- description: "Text to search for in history URLs and titles. Leave empty to retrieve all history entries within the time range."
864
+ description: "Text to search in history URLs/titles. Empty = all entries in the time range."
980
865
  },
981
866
  startTime: {
982
867
  type: "string",
983
- description: 'Start time as a date string. Supports ISO format (e.g., "2023-10-01", "2023-10-01T14:30:00"), relative times (e.g., "1 day ago", "2 weeks ago", "3 months ago", "1 year ago"), and special keywords ("now", "today", "yesterday"). Default: 24 hours ago'
868
+ description: 'Start time: ISO, relative ("1 day ago"), or keyword ("now"/"today"/"yesterday"). Default: 24 hours ago'
984
869
  },
985
870
  endTime: {
986
871
  type: "string",
987
- description: 'End time as a date string. Supports ISO format (e.g., "2023-10-31", "2023-10-31T14:30:00"), relative times (e.g., "1 day ago", "2 weeks ago", "3 months ago", "1 year ago"), and special keywords ("now", "today", "yesterday"). Default: current time'
872
+ description: 'End time: ISO, relative, or keyword ("now"/"today"/"yesterday"). Default: now'
988
873
  },
989
874
  maxResults: {
990
875
  type: "number",
991
- description: "Maximum number of history entries to return. Use this to limit results for performance or to focus on the most relevant entries. (default: 100)"
876
+ description: "Max history entries to return (default: 100)"
992
877
  },
993
878
  excludeCurrentTabs: {
994
879
  type: "boolean",
995
- description: "When set to true, filters out URLs that are currently open in any browser tab. Useful for finding pages you've visited but don't have open anymore. (default: false)"
880
+ description: "When true, exclude URLs currently open in any tab. Default false"
996
881
  },
997
882
  limit: {
998
883
  type: "number",
@@ -1018,15 +903,15 @@ Tip: If the returned elements do not include the specific element you need, use
1018
903
  properties: {
1019
904
  query: {
1020
905
  type: "string",
1021
- description: "Search query to match against bookmark titles and URLs. Leave empty to retrieve all bookmarks."
906
+ description: "Query matched against bookmark titles and URLs. Empty = all bookmarks."
1022
907
  },
1023
908
  maxResults: {
1024
909
  type: "number",
1025
- description: "Maximum number of bookmarks to return (default: 50)"
910
+ description: "Max bookmarks to return (default: 50)"
1026
911
  },
1027
912
  folderPath: {
1028
913
  type: "string",
1029
- description: 'Optional folder path or ID to limit search to a specific bookmark folder. Can be a path string (e.g., "Work/Projects") or a folder ID.'
914
+ description: 'Limit to a folder: a path string (e.g. "Work/Projects") or a folder ID.'
1030
915
  }
1031
916
  },
1032
917
  required: []
@@ -1044,19 +929,19 @@ Tip: If the returned elements do not include the specific element you need, use
1044
929
  },
1045
930
  title: {
1046
931
  type: "string",
1047
- description: "Title for the bookmark. If not provided, uses the page title from the URL."
932
+ description: "Title. If not provided, uses the page title."
1048
933
  },
1049
934
  parentId: {
1050
935
  type: "string",
1051
- description: 'Parent folder path or ID to add the bookmark to. Can be a path string (e.g., "Work/Projects") or a folder ID. If not provided, adds to the "Bookmarks Bar" folder.'
936
+ description: 'Parent folder: path (e.g. "Work/Projects") or folder ID. Default: "Bookmarks Bar".'
1052
937
  },
1053
938
  createFolder: {
1054
939
  type: "boolean",
1055
- description: "Whether to create the parent folder if it does not exist (default: false)"
940
+ description: "Create the parent folder if missing (default: false)"
1056
941
  },
1057
942
  tabId: {
1058
943
  type: "number",
1059
- description: "Optional tab id to bookmark when url is omitted. Defaults to the MCP work tab (background work mode) or the active tab."
944
+ description: "Tab id to bookmark when url is omitted. Omit to use this session's work tab."
1060
945
  }
1061
946
  },
1062
947
  required: []
@@ -1070,7 +955,7 @@ Tip: If the returned elements do not include the specific element you need, use
1070
955
  properties: {
1071
956
  bookmarkId: {
1072
957
  type: "string",
1073
- description: "ID of the bookmark to delete. Either bookmarkId or url must be provided."
958
+ description: "ID of the bookmark to delete. Either bookmarkId or url is required."
1074
959
  },
1075
960
  url: {
1076
961
  type: "string",
@@ -1078,112 +963,33 @@ Tip: If the returned elements do not include the specific element you need, use
1078
963
  },
1079
964
  title: {
1080
965
  type: "string",
1081
- description: "Title of the bookmark to help with matching when deleting by URL."
966
+ description: "Title to help match when deleting by URL."
1082
967
  }
1083
968
  },
1084
969
  required: []
1085
970
  }
1086
971
  },
1087
- // {
1088
- // name: TOOL_NAMES.BROWSER.SEARCH_TABS_CONTENT,
1089
- // description:
1090
- // 'search for related content from the currently open tab and return the corresponding web pages.',
1091
- // inputSchema: {
1092
- // type: 'object',
1093
- // properties: {
1094
- // query: {
1095
- // type: 'string',
1096
- // description: 'the query to search for related content.',
1097
- // },
1098
- // },
1099
- // required: ['query'],
1100
- // },
1101
- // },
1102
- // {
1103
- // name: TOOL_NAMES.BROWSER.INJECT_SCRIPT,
1104
- // description:
1105
- // 'inject the user-specified content script into the webpage. By default, inject into the currently active tab',
1106
- // inputSchema: {
1107
- // type: 'object',
1108
- // properties: {
1109
- // url: {
1110
- // type: 'string',
1111
- // description:
1112
- // 'If a URL is specified, inject the script into the webpage corresponding to the URL.',
1113
- // },
1114
- // tabId: {
1115
- // type: 'number',
1116
- // description:
1117
- // 'Target an existing tab by ID to inject into. Overrides url/active tab selection when provided.',
1118
- // },
1119
- // windowId: {
1120
- // type: 'number',
1121
- // description:
1122
- // 'Target window ID for selecting active tab or creating new tab when url is provided and tabId is omitted.',
1123
- // },
1124
- // background: {
1125
- // type: 'boolean',
1126
- // description:
1127
- // 'Do not activate tab/focus window during injection when true (default: false).',
1128
- // },
1129
- // type: {
1130
- // type: 'string',
1131
- // description:
1132
- // 'the javaScript world for a script to execute within. must be ISOLATED or MAIN',
1133
- // },
1134
- // jsScript: {
1135
- // type: 'string',
1136
- // description: 'the content script to inject',
1137
- // },
1138
- // },
1139
- // required: ['type', 'jsScript'],
1140
- // },
1141
- // },
1142
- // {
1143
- // name: TOOL_NAMES.BROWSER.SEND_COMMAND_TO_INJECT_SCRIPT,
1144
- // description:
1145
- // 'if the script injected using chrome_inject_script listens for user-defined events, this tool can be used to trigger those events',
1146
- // inputSchema: {
1147
- // type: 'object',
1148
- // properties: {
1149
- // tabId: {
1150
- // type: 'number',
1151
- // description:
1152
- // 'the tab where you previously injected the script(if not provided, use the currently active tab)',
1153
- // },
1154
- // eventName: {
1155
- // type: 'string',
1156
- // description: 'the eventName your injected content script listen for',
1157
- // },
1158
- // payload: {
1159
- // type: 'string',
1160
- // description: 'the payload passed to event, must be a json string',
1161
- // },
1162
- // },
1163
- // required: ['eventName'],
1164
- // },
1165
- // },
1166
972
  {
1167
973
  name: TOOL_NAMES.BROWSER.JAVASCRIPT,
1168
- description: "Execute JavaScript code in a browser tab and return the result. Uses CDP Runtime.evaluate with awaitPromise and returnByValue; automatically falls back to chrome.scripting.executeScript if the debugger is busy. Output is sanitized (sensitive data redacted) and truncated by default.",
974
+ description: "Execute JavaScript in a tab and return the result. Uses CDP Runtime.evaluate (awaitPromise, returnByValue) and falls back to chrome.scripting.executeScript if the debugger is busy. Output is sanitized (sensitive data redacted) and truncated by default.",
1169
975
  inputSchema: {
1170
976
  type: "object",
1171
977
  properties: {
1172
978
  code: {
1173
979
  type: "string",
1174
- description: 'JavaScript code to execute. Runs inside an async function body, so top-level await and "return ..." are supported.'
980
+ description: 'JavaScript to run (async function body; top-level await and "return ..." supported).'
1175
981
  },
1176
982
  tabId: {
1177
983
  type: "number",
1178
- description: "Target tab ID. If omitted, uses the current active tab."
984
+ description: "Target tab id. Omit to use this session's work tab."
1179
985
  },
1180
986
  timeoutMs: {
1181
987
  type: "number",
1182
- description: "Execution timeout in milliseconds (default: 15000)."
988
+ description: "Execution timeout in ms (default: 15000)."
1183
989
  },
1184
990
  maxOutputBytes: {
1185
991
  type: "number",
1186
- description: "Maximum output size in bytes after sanitization (default: 51200). Output exceeding this limit will be truncated."
992
+ description: "Max output bytes after sanitization (default 51200); excess truncated."
1187
993
  }
1188
994
  },
1189
995
  required: ["code"]
@@ -1191,7 +997,7 @@ Tip: If the returned elements do not include the specific element you need, use
1191
997
  },
1192
998
  {
1193
999
  name: TOOL_NAMES.BROWSER.CLICK,
1194
- description: 'Click on an element in a web page. Supports multiple targeting methods: CSS selector, XPath, element ref (from chrome_read_page), or viewport coordinates. More focused than chrome_computer for simple click operations. Waits briefly for the element by default (waitForElementMs). When the click is blocked or the element is covered, the result carries an "obstruction" object naming the element/overlay on top of the target \u2014 read it instead of retrying the same click.',
1000
+ description: 'Click an element by CSS selector, XPath, element ref (from chrome_read_page), or viewport coordinates. More focused than chrome_computer for simple clicks; waits briefly (waitForElementMs). If blocked/covered, the result carries an "obstruction" object naming the overlay on top; read it instead of retrying.',
1195
1001
  inputSchema: {
1196
1002
  type: "object",
1197
1003
  properties: {
@@ -1199,15 +1005,8 @@ Tip: If the returned elements do not include the specific element you need, use
1199
1005
  type: "string",
1200
1006
  description: "CSS selector or XPath for the element to click."
1201
1007
  },
1202
- waitForElementMs: {
1203
- type: "number",
1204
- description: 'How long (ms) to wait for the target element to appear and become visible before failing. Default 2000; set 0 to fail immediately. Removes the usual "click failed -> chrome_wait_for -> click again" round-trip on SPA/lazy-rendered pages.'
1205
- },
1206
- selectorType: {
1207
- type: "string",
1208
- enum: ["css", "xpath"],
1209
- description: 'Type of selector (default: "css").'
1210
- },
1008
+ waitForElementMs: waitForElementMsProp,
1009
+ selectorType: selectorTypeProp,
1211
1010
  ref: {
1212
1011
  type: "string",
1213
1012
  description: "Element ref from chrome_read_page (takes precedence over selector)."
@@ -1223,12 +1022,12 @@ Tip: If the returned elements do not include the specific element you need, use
1223
1022
  },
1224
1023
  double: {
1225
1024
  type: "boolean",
1226
- description: "Perform double click when true (default: false)."
1025
+ description: "Double click when true (default: false)."
1227
1026
  },
1228
1027
  button: {
1229
1028
  type: "string",
1230
1029
  enum: ["left", "right", "middle"],
1231
- description: 'Mouse button to click (default: "left").'
1030
+ description: 'Mouse button (default: "left").'
1232
1031
  },
1233
1032
  modifiers: {
1234
1033
  type: "object",
@@ -1242,31 +1041,25 @@ Tip: If the returned elements do not include the specific element you need, use
1242
1041
  },
1243
1042
  waitForNavigation: {
1244
1043
  type: "boolean",
1245
- description: "Wait for navigation to complete after click (default: false)."
1044
+ description: "Wait for navigation after click (default: false)."
1246
1045
  },
1247
1046
  timeout: {
1248
1047
  type: "number",
1249
- description: "Timeout in milliseconds for waiting (default: 5000)."
1048
+ description: "Timeout in ms for waiting (default: 5000)."
1250
1049
  },
1251
1050
  tabId: {
1252
1051
  type: "number",
1253
- description: "Target tab ID. If omitted, uses the current active tab."
1052
+ description: "Target tab id. Omit to use this session's work tab."
1254
1053
  },
1255
- windowId: {
1256
- type: "number",
1257
- description: "Window ID to select active tab from (when tabId is omitted)."
1258
- },
1259
- frameId: {
1260
- type: "number",
1261
- description: "Target frame ID for iframe support."
1262
- }
1054
+ windowId: windowIdProp,
1055
+ frameId: frameIdProp
1263
1056
  },
1264
1057
  required: []
1265
1058
  }
1266
1059
  },
1267
1060
  {
1268
1061
  name: TOOL_NAMES.BROWSER.FILL,
1269
- description: "Fill or select a form element on a web page. Supports input, textarea, select, checkbox, radio, and contenteditable elements (the prompt boxes used by modern editors such as Google Flow, Gemini, ChatGPT and Notion). Use CSS selector, XPath, or element ref to target the element.",
1062
+ description: "Fill or select a form element. Supports input, textarea, select, checkbox, radio, and contenteditable (editor prompt boxes like Google Flow, Gemini, ChatGPT, Notion). Target by CSS selector, XPath, or element ref.",
1270
1063
  inputSchema: {
1271
1064
  type: "object",
1272
1065
  properties: {
@@ -1274,63 +1067,50 @@ Tip: If the returned elements do not include the specific element you need, use
1274
1067
  type: "string",
1275
1068
  description: "CSS selector or XPath for the form element."
1276
1069
  },
1277
- waitForElementMs: {
1278
- type: "number",
1279
- description: 'How long (ms) to wait for the target element to appear and become visible before failing. Default 2000; set 0 to fail immediately. Removes the usual "click failed -> chrome_wait_for -> click again" round-trip on SPA/lazy-rendered pages.'
1280
- },
1281
- selectorType: {
1282
- type: "string",
1283
- enum: ["css", "xpath"],
1284
- description: 'Type of selector (default: "css").'
1285
- },
1070
+ waitForElementMs: waitForElementMsProp,
1071
+ selectorType: selectorTypeProp,
1286
1072
  ref: {
1287
1073
  type: "string",
1288
1074
  description: "Element ref from chrome_read_page (takes precedence over selector)."
1289
1075
  },
1290
1076
  value: {
1291
1077
  type: ["string", "number", "boolean"],
1292
- description: "Value to fill. For text inputs: string. For checkboxes/radios: boolean. For selects: option value or text."
1078
+ description: "Value: string (text), boolean (checkbox/radio), or option value/text (select)."
1293
1079
  },
1294
1080
  tabId: {
1295
1081
  type: "number",
1296
- description: "Target tab ID. If omitted, uses the current active tab."
1297
- },
1298
- windowId: {
1299
- type: "number",
1300
- description: "Window ID to select active tab from (when tabId is omitted)."
1082
+ description: "Target tab id. Omit to use this session's work tab."
1301
1083
  },
1302
- frameId: {
1303
- type: "number",
1304
- description: "Target frame ID for iframe support."
1305
- }
1084
+ windowId: windowIdProp,
1085
+ frameId: frameIdProp
1306
1086
  },
1307
1087
  required: ["value"]
1308
1088
  }
1309
1089
  },
1310
1090
  {
1311
1091
  name: TOOL_NAMES.BROWSER.REQUEST_ELEMENT_SELECTION,
1312
- description: "Request the user to manually select one or more elements on the current page. Use this as a human-in-the-loop fallback when you cannot reliably locate the target element after approximately 3 attempts using chrome_read_page combined with chrome_click_element/chrome_fill_or_select/chrome_computer. The user will see a panel with instructions and can click on the requested elements. Returns element refs compatible with chrome_click_element/chrome_fill_or_select (including iframe frameId for cross-frame support).",
1092
+ description: "Ask the user to manually select elements on the page. A human-in-the-loop fallback when you cannot locate the target after ~3 attempts with chrome_read_page + click/fill/computer. Returns element refs for chrome_click_element/chrome_fill_or_select (including iframe frameId).",
1313
1093
  inputSchema: {
1314
1094
  type: "object",
1315
1095
  properties: {
1316
1096
  requests: {
1317
1097
  type: "array",
1318
- description: "A list of element selection requests. Each request produces exactly one picked element. The user will see these requests in a panel and select each element by clicking on the page.",
1098
+ description: "Selection requests; each yields one picked element the user clicks on the page.",
1319
1099
  minItems: 1,
1320
1100
  items: {
1321
1101
  type: "object",
1322
1102
  properties: {
1323
1103
  id: {
1324
1104
  type: "string",
1325
- description: 'Optional stable request id for correlation. If omitted, an id is auto-generated (e.g., "req_1").'
1105
+ description: "Stable request id for correlation. Auto-generated if omitted."
1326
1106
  },
1327
1107
  name: {
1328
1108
  type: "string",
1329
- description: 'Short label shown to the user describing what element to select (e.g., "Login button", "Email input field").'
1109
+ description: 'Short label shown to the user (e.g. "Login button").'
1330
1110
  },
1331
1111
  description: {
1332
1112
  type: "string",
1333
- description: 'Optional longer instruction shown to the user with more context (e.g., "Click on the primary login button in the top-right corner").'
1113
+ description: "Optional longer instruction shown to the user."
1334
1114
  }
1335
1115
  },
1336
1116
  required: ["name"]
@@ -1338,68 +1118,55 @@ Tip: If the returned elements do not include the specific element you need, use
1338
1118
  },
1339
1119
  timeoutMs: {
1340
1120
  type: "number",
1341
- description: "Timeout in milliseconds for the user to complete all selections. Default: 180000 (3 minutes). Maximum: 600000 (10 minutes)."
1121
+ description: "Timeout ms for the user to finish (default 180000, max 600000)."
1342
1122
  },
1343
1123
  tabId: {
1344
1124
  type: "number",
1345
- description: "Target tab ID. If omitted, uses the current active tab."
1125
+ description: "Target tab id. Omit to use this session's work tab."
1346
1126
  },
1347
- windowId: {
1348
- type: "number",
1349
- description: "Window ID to select active tab from (when tabId is omitted)."
1350
- }
1127
+ windowId: windowIdProp
1351
1128
  },
1352
1129
  required: ["requests"]
1353
1130
  }
1354
1131
  },
1355
1132
  {
1356
1133
  name: TOOL_NAMES.BROWSER.KEYBOARD,
1357
- description: "Simulate keyboard input on a web page. Supports single keys (Enter, Tab, Escape), key combinations (Ctrl+C, Ctrl+V), and text input. Can target a specific element or send to the focused element.",
1134
+ description: "Simulate keyboard input: single keys (Enter, Tab, Escape), combinations (Ctrl+C, Ctrl+V), and text. Can target a specific element or send to the focused element.",
1358
1135
  inputSchema: {
1359
1136
  type: "object",
1360
1137
  properties: {
1361
1138
  keys: {
1362
1139
  type: "string",
1363
- description: 'Keys or key combinations to simulate. Examples: "Enter", "Tab", "Ctrl+C", "Shift+Tab", "Hello World".'
1140
+ description: 'Keys or combinations, e.g. "Enter", "Tab", "Ctrl+C", "Shift+Tab", "Hello World".'
1364
1141
  },
1365
1142
  selector: {
1366
1143
  type: "string",
1367
- description: "CSS selector or XPath for target element to receive keyboard events."
1368
- },
1369
- selectorType: {
1370
- type: "string",
1371
- enum: ["css", "xpath"],
1372
- description: 'Type of selector (default: "css").'
1144
+ description: "CSS selector or XPath for the element to receive keyboard events."
1373
1145
  },
1146
+ selectorType: selectorTypeProp,
1374
1147
  delay: {
1375
1148
  type: "number",
1376
- description: "Delay between keystrokes in milliseconds (default: 50)."
1149
+ description: "Delay between keystrokes in ms (default: 50)."
1377
1150
  },
1378
1151
  tabId: {
1379
1152
  type: "number",
1380
- description: "Target tab ID. If omitted, uses the current active tab."
1381
- },
1382
- windowId: {
1383
- type: "number",
1384
- description: "Window ID to select active tab from (when tabId is omitted)."
1153
+ description: "Target tab id. Omit to use this session's work tab."
1385
1154
  },
1386
- frameId: {
1387
- type: "number",
1388
- description: "Target frame ID for iframe support."
1389
- }
1155
+ windowId: windowIdProp,
1156
+ frameId: frameIdProp
1390
1157
  },
1391
1158
  required: ["keys"]
1392
1159
  }
1393
1160
  },
1394
1161
  {
1395
1162
  name: TOOL_NAMES.BROWSER.CONSOLE,
1396
- description: "Capture console output from a browser tab. Supports snapshot mode (default; one-time capture with ~2s wait) and buffer mode (persistent per-tab buffer you can read/clear instantly without waiting).",
1163
+ description: "Capture console output from a tab. Snapshot mode (default) does a one-time capture with a ~2s wait; buffer mode keeps a persistent per-tab buffer you can read/clear instantly.",
1397
1164
  inputSchema: {
1398
1165
  type: "object",
1399
1166
  properties: {
1400
1167
  url: {
1401
1168
  type: "string",
1402
- description: "URL to navigate to and capture console from. If not provided, uses the current active tab"
1169
+ description: "URL to navigate to and capture from. If omitted, uses the current active tab"
1403
1170
  },
1404
1171
  tabId: {
1405
1172
  type: "number",
@@ -1415,15 +1182,15 @@ Tip: If the returned elements do not include the specific element you need, use
1415
1182
  },
1416
1183
  includeExceptions: {
1417
1184
  type: "boolean",
1418
- description: "Include uncaught exceptions in the output (default: true)"
1185
+ description: "Include uncaught exceptions (default: true)"
1419
1186
  },
1420
1187
  maxMessages: {
1421
1188
  type: "number",
1422
- description: "Maximum number of console messages to capture in snapshot mode (default: 100). If limit is provided, it takes precedence."
1189
+ description: "Max messages in snapshot mode (default: 100). limit takes precedence."
1423
1190
  },
1424
1191
  offset: {
1425
1192
  type: "number",
1426
- description: "Skip this many messages before returning (pagination; default 0)"
1193
+ description: "Skip this many messages before returning (default 0)"
1427
1194
  },
1428
1195
  countOnly: {
1429
1196
  type: "boolean",
@@ -1432,7 +1199,7 @@ Tip: If the returned elements do not include the specific element you need, use
1432
1199
  mode: {
1433
1200
  type: "string",
1434
1201
  enum: ["snapshot", "buffer"],
1435
- description: "Console capture mode: snapshot (default; waits ~2s for messages) or buffer (persistent per-tab buffer; reads from memory instantly)."
1202
+ description: "snapshot (default; waits ~2s) or buffer (persistent per-tab buffer; instant)."
1436
1203
  },
1437
1204
  buffer: {
1438
1205
  type: "boolean",
@@ -1440,23 +1207,23 @@ Tip: If the returned elements do not include the specific element you need, use
1440
1207
  },
1441
1208
  clear: {
1442
1209
  type: "boolean",
1443
- description: "Buffer mode only: clear the buffered logs for this tab before reading (default: false). Use clearAfterRead instead to clear after reading (mcp-tools.js style)."
1210
+ description: "Buffer mode: clear the buffered logs before reading (default: false)."
1444
1211
  },
1445
1212
  clearAfterRead: {
1446
1213
  type: "boolean",
1447
- description: "Buffer mode only: clear the buffered logs for this tab AFTER reading, to avoid duplicate messages on subsequent calls (default: false). This matches mcp-tools.js behavior."
1214
+ description: "Buffer mode: clear the buffered logs AFTER reading (avoids duplicates). Default: false"
1448
1215
  },
1449
1216
  pattern: {
1450
1217
  type: "string",
1451
- description: "Optional regex filter applied to message/exception text. Supports /pattern/flags syntax."
1218
+ description: "Regex filter on message/exception text. Supports /pattern/flags."
1452
1219
  },
1453
1220
  onlyErrors: {
1454
1221
  type: "boolean",
1455
- description: "Only return error-level console messages (and exceptions when includeExceptions=true). Default: false."
1222
+ description: "Only error-level messages (plus exceptions if includeExceptions). Default: false."
1456
1223
  },
1457
1224
  limit: {
1458
1225
  type: "number",
1459
- description: "Limit returned console messages. In snapshot mode this is an alias for maxMessages; in buffer mode it limits returned messages from the buffer."
1226
+ description: "Limit returned messages (snapshot: alias for maxMessages; buffer: from the buffer)."
1460
1227
  }
1461
1228
  },
1462
1229
  required: []
@@ -1464,7 +1231,7 @@ Tip: If the returned elements do not include the specific element you need, use
1464
1231
  },
1465
1232
  {
1466
1233
  name: TOOL_NAMES.BROWSER.FILE_UPLOAD,
1467
- description: "Upload files to web forms with file input elements using Chrome DevTools Protocol",
1234
+ description: "Upload files to file-input form elements using Chrome DevTools Protocol",
1468
1235
  inputSchema: {
1469
1236
  type: "object",
1470
1237
  properties: {
@@ -1475,7 +1242,7 @@ Tip: If the returned elements do not include the specific element you need, use
1475
1242
  },
1476
1243
  selector: {
1477
1244
  type: "string",
1478
- description: 'CSS selector for the file input element (input[type="file"])'
1245
+ description: 'CSS selector for the file input (input[type="file"])'
1479
1246
  },
1480
1247
  filePath: {
1481
1248
  type: "string",
@@ -1483,7 +1250,7 @@ Tip: If the returned elements do not include the specific element you need, use
1483
1250
  },
1484
1251
  fileUrl: {
1485
1252
  type: "string",
1486
- description: "URL to download file from before uploading"
1253
+ description: "URL to download the file from before uploading"
1487
1254
  },
1488
1255
  base64Data: {
1489
1256
  type: "string",
@@ -1491,7 +1258,7 @@ Tip: If the returned elements do not include the specific element you need, use
1491
1258
  },
1492
1259
  fileName: {
1493
1260
  type: "string",
1494
- description: 'Optional filename when using base64 or URL (default: "uploaded-file")'
1261
+ description: 'Filename for base64/URL (default "uploaded-file"). Name only; path separators or ".." rejected.'
1495
1262
  },
1496
1263
  multiple: {
1497
1264
  type: "boolean",
@@ -1512,17 +1279,14 @@ Tip: If the returned elements do not include the specific element you need, use
1512
1279
  type: "string",
1513
1280
  description: "Optional prompt text when accepting a prompt"
1514
1281
  },
1515
- tabId: {
1516
- type: "number",
1517
- description: "Optional target tab id. Defaults to the MCP work tab (background work mode) or the active tab."
1518
- }
1282
+ tabId: tabIdProp
1519
1283
  },
1520
1284
  required: ["action"]
1521
1285
  }
1522
1286
  },
1523
1287
  {
1524
1288
  name: TOOL_NAMES.BROWSER.REQUEST_USER_CONSENT,
1525
- description: 'Request user consent BEFORE invoking sensitive site features (camera, microphone, geolocation). Returns { approved, source } JSON. If the matching popup toggle is ON, returns { approved: true, source: "toggle" } immediately and sticky-sets the current active tab origin to allow via chrome.contentSettings (camera/mic/location). If OFF, opens a small consent popup window and awaits the user response (max 60s). auto-chrome-mcp fork v1.0.32+ (geolocation moved from bulk-install to per-origin consent gate for parity with camera/mic and OS-permission consistency); design: docs/plans/2026-05-29-site-permissions-design.md.',
1289
+ description: "Request user consent BEFORE using sensitive site features (camera, microphone, geolocation). Returns { approved, source }. If the matching popup toggle is ON, returns approved immediately and sticky-allows the current tab origin (chrome.contentSettings); if OFF, opens a consent popup and awaits the user (max 60s).",
1526
1290
  inputSchema: {
1527
1291
  type: "object",
1528
1292
  properties: {
@@ -1533,7 +1297,7 @@ Tip: If the returned elements do not include the specific element you need, use
1533
1297
  },
1534
1298
  reason: {
1535
1299
  type: "string",
1536
- description: 'Human-readable explanation shown to the user in the consent window (e.g. "\uB179\uD654 \uC2DC\uC791\uC744 \uC704\uD574 \uB9C8\uC774\uD06C\uC5D0 \uC811\uADFC\uD569\uB2C8\uB2E4").'
1300
+ description: 'Explanation shown to the user in the consent window (e.g. "\uB179\uD654 \uC2DC\uC791\uC744 \uC704\uD574 \uB9C8\uC774\uD06C\uC5D0 \uC811\uADFC\uD569\uB2C8\uB2E4").'
1537
1301
  }
1538
1302
  },
1539
1303
  required: ["action", "reason"]
@@ -1541,66 +1305,66 @@ Tip: If the returned elements do not include the specific element you need, use
1541
1305
  },
1542
1306
  {
1543
1307
  name: TOOL_NAMES.BROWSER.GIF_RECORDER,
1544
- description: 'Record browser tab activity as an animated GIF.\n\nModes:\n- Fixed FPS mode (action="start"): Captures frames at regular intervals. Good for animations/videos.\n- Auto-capture mode (action="auto_start"): Captures frames automatically when chrome_computer or chrome_navigate actions succeed. Better for interaction recordings with natural pacing.\n\nUse "stop" to end recording and save the GIF.',
1308
+ description: 'Record browser tab activity as an animated GIF. action="start" records at a fixed FPS (good for animations); action="auto_start" captures a frame whenever a chrome_computer or chrome_navigate action succeeds (better-paced interaction recordings). Use "stop" to end and save.',
1545
1309
  inputSchema: {
1546
1310
  type: "object",
1547
1311
  properties: {
1548
1312
  action: {
1549
1313
  type: "string",
1550
1314
  enum: ["start", "stop", "status", "auto_start", "capture", "clear", "export"],
1551
- description: 'Action to perform:\n- "start": Begin fixed-FPS recording (captures frames at regular intervals)\n- "auto_start": Begin auto-capture mode (frames captured on tool actions)\n- "stop": End recording and save GIF\n- "status": Get current recording state\n- "capture": Manually trigger a frame capture in auto mode\n- "clear": Clear all recording state and cached GIF without saving\n- "export": Export the last recorded GIF (download or drag&drop upload)'
1315
+ description: "start = fixed-FPS recording; auto_start = auto-capture (frames on tool actions); stop = end and save; status = current state; capture = manually grab a frame in auto mode; clear = drop state without saving; export = download or drag&drop-upload the last GIF."
1552
1316
  },
1553
1317
  tabId: {
1554
1318
  type: "number",
1555
- description: 'Target tab ID (default: active tab). Used with "start"/"auto_start" for recording, and with "export" (download=false) for drag&drop upload target.'
1319
+ description: "Target tab (default active tab). For start/auto_start, and export (download=false) drag&drop target."
1556
1320
  },
1557
1321
  fps: {
1558
1322
  type: "number",
1559
- description: "Frames per second for fixed-FPS mode (1-30, default: 5). Higher values = smoother but larger file."
1323
+ description: "FPS for fixed-FPS mode (1-30, default: 5)."
1560
1324
  },
1561
1325
  durationMs: {
1562
1326
  type: "number",
1563
- description: "Maximum recording duration in milliseconds (default: 5000, max: 60000). Only for fixed-FPS mode."
1327
+ description: "Max duration in ms (default: 5000, max: 60000). Fixed-FPS only."
1564
1328
  },
1565
1329
  maxFrames: {
1566
1330
  type: "number",
1567
- description: "Maximum number of frames to capture (default: 50 for fixed-FPS, 100 for auto mode, max: 300)."
1331
+ description: "Max frames (default: 50 fixed-FPS, 100 auto; max: 300)."
1568
1332
  },
1569
1333
  width: {
1570
1334
  type: "number",
1571
- description: "Output GIF width in pixels (default: 800, max: 1920)."
1335
+ description: "Output width in px (default: 800, max: 1920)."
1572
1336
  },
1573
1337
  height: {
1574
1338
  type: "number",
1575
- description: "Output GIF height in pixels (default: 600, max: 1080)."
1339
+ description: "Output height in px (default: 600, max: 1080)."
1576
1340
  },
1577
1341
  maxColors: {
1578
1342
  type: "number",
1579
- description: "Maximum colors in palette (default: 256). Lower values = smaller file size."
1343
+ description: "Max palette colors (default: 256). Lower = smaller file."
1580
1344
  },
1581
1345
  filename: {
1582
1346
  type: "string",
1583
- description: "Output filename (without extension). Defaults to timestamped name."
1347
+ description: "Output filename (no extension). Defaults to a timestamped name."
1584
1348
  },
1585
1349
  captureDelayMs: {
1586
1350
  type: "number",
1587
- description: "Auto-capture mode only: Delay in ms after action before capturing frame (default: 150). Allows UI to stabilize."
1351
+ description: "Auto mode: delay in ms after an action before capturing (default: 150)."
1588
1352
  },
1589
1353
  frameDelayCs: {
1590
1354
  type: "number",
1591
- description: "Auto-capture mode only: Display duration per frame in centiseconds (default: 20 = 200ms per frame)."
1355
+ description: "Auto mode: display duration per frame in centiseconds (default: 20 = 200ms)."
1592
1356
  },
1593
1357
  annotation: {
1594
1358
  type: "string",
1595
- description: 'Auto-capture mode only (action="capture"): Optional text label to render on the captured frame.'
1359
+ description: 'Auto mode (action="capture"): optional text label on the frame.'
1596
1360
  },
1597
1361
  download: {
1598
1362
  type: "boolean",
1599
- description: "Export action only: Set to true (default) to download the GIF, or false to upload via drag&drop."
1363
+ description: "Export only: true (default) to download, false to upload via drag&drop."
1600
1364
  },
1601
1365
  coordinates: {
1602
1366
  type: "object",
1603
- description: "Export action only (when download=false): Target coordinates for drag&drop upload.",
1367
+ description: "Export (download=false): target coordinates for drag&drop.",
1604
1368
  properties: {
1605
1369
  x: { type: "number" },
1606
1370
  y: { type: "number" }
@@ -1609,15 +1373,15 @@ Tip: If the returned elements do not include the specific element you need, use
1609
1373
  },
1610
1374
  ref: {
1611
1375
  type: "string",
1612
- description: "Export action only (when download=false): Element ref from chrome_read_page for drag&drop target."
1376
+ description: "Export (download=false): element ref for the drag&drop target."
1613
1377
  },
1614
1378
  selector: {
1615
1379
  type: "string",
1616
- description: "Export action only (when download=false): CSS selector for drag&drop target element."
1380
+ description: "Export (download=false): CSS selector for the drag&drop target."
1617
1381
  },
1618
1382
  enhancedRendering: {
1619
1383
  type: "object",
1620
- description: "Auto-capture mode only: Configure visual overlays for recorded actions (click indicators, drag paths, labels). Pass `true` to enable all defaults.",
1384
+ description: "Auto mode: visual overlays for recorded actions. Pass `true` for all defaults, or an object. Each overlay group accepts true or an object with the listed props (all optional, sensible defaults).",
1621
1385
  properties: {
1622
1386
  clickIndicators: {
1623
1387
  oneOf: [
@@ -1625,31 +1389,16 @@ Tip: If the returned elements do not include the specific element you need, use
1625
1389
  {
1626
1390
  type: "object",
1627
1391
  properties: {
1628
- enabled: {
1629
- type: "boolean",
1630
- description: "Enable click indicators (default: true)"
1631
- },
1632
- color: {
1633
- type: "string",
1634
- description: 'CSS color for click indicator (default: "rgba(255, 87, 34, 0.8)")'
1635
- },
1636
- radius: { type: "number", description: "Initial radius in px (default: 20)" },
1637
- animationDurationMs: {
1638
- type: "number",
1639
- description: "Animation duration in ms (default: 400)"
1640
- },
1641
- animationFrames: {
1642
- type: "number",
1643
- description: "Number of animation frames (default: 3)"
1644
- },
1645
- animationIntervalMs: {
1646
- type: "number",
1647
- description: "Interval between animation frames in ms (default: 80)"
1648
- }
1392
+ enabled: { type: "boolean" },
1393
+ color: { type: "string" },
1394
+ radius: { type: "number" },
1395
+ animationDurationMs: { type: "number" },
1396
+ animationFrames: { type: "number" },
1397
+ animationIntervalMs: { type: "number" }
1649
1398
  }
1650
1399
  }
1651
1400
  ],
1652
- description: "Click indicator overlay config (true for defaults, or object for custom)."
1401
+ description: "Click indicator overlay."
1653
1402
  },
1654
1403
  dragPaths: {
1655
1404
  oneOf: [
@@ -1657,28 +1406,15 @@ Tip: If the returned elements do not include the specific element you need, use
1657
1406
  {
1658
1407
  type: "object",
1659
1408
  properties: {
1660
- enabled: {
1661
- type: "boolean",
1662
- description: "Enable drag path rendering (default: true)"
1663
- },
1664
- color: {
1665
- type: "string",
1666
- description: 'CSS color for drag path (default: "rgba(33, 150, 243, 0.7)")'
1667
- },
1668
- lineWidth: { type: "number", description: "Line width in px (default: 3)" },
1669
- lineDash: {
1670
- type: "array",
1671
- items: { type: "number" },
1672
- description: "Dash pattern (default: [6, 4])"
1673
- },
1674
- arrowSize: {
1675
- type: "number",
1676
- description: "Arrow head size in px (default: 10)"
1677
- }
1409
+ enabled: { type: "boolean" },
1410
+ color: { type: "string" },
1411
+ lineWidth: { type: "number" },
1412
+ lineDash: { type: "array", items: { type: "number" } },
1413
+ arrowSize: { type: "number" }
1678
1414
  }
1679
1415
  }
1680
1416
  ],
1681
- description: "Drag path overlay config (true for defaults, or object for custom)."
1417
+ description: "Drag path overlay."
1682
1418
  },
1683
1419
  labels: {
1684
1420
  oneOf: [
@@ -1686,37 +1422,24 @@ Tip: If the returned elements do not include the specific element you need, use
1686
1422
  {
1687
1423
  type: "object",
1688
1424
  properties: {
1689
- enabled: {
1690
- type: "boolean",
1691
- description: "Enable action labels (default: true)"
1692
- },
1693
- font: {
1694
- type: "string",
1695
- description: 'Font for labels (default: "bold 12px sans-serif")'
1696
- },
1697
- textColor: { type: "string", description: 'Text color (default: "#fff")' },
1698
- bgColor: {
1699
- type: "string",
1700
- description: 'Background color (default: "rgba(0,0,0,0.7)")'
1701
- },
1702
- padding: { type: "number", description: "Padding in px (default: 4)" },
1703
- borderRadius: {
1704
- type: "number",
1705
- description: "Border radius in px (default: 4)"
1706
- },
1425
+ enabled: { type: "boolean" },
1426
+ font: { type: "string" },
1427
+ textColor: { type: "string" },
1428
+ bgColor: { type: "string" },
1429
+ padding: { type: "number" },
1430
+ borderRadius: { type: "number" },
1707
1431
  offset: {
1708
1432
  type: "object",
1709
- properties: { x: { type: "number" }, y: { type: "number" } },
1710
- description: "Offset from action position (default: {x: 10, y: -20})"
1433
+ properties: { x: { type: "number" }, y: { type: "number" } }
1711
1434
  }
1712
1435
  }
1713
1436
  }
1714
1437
  ],
1715
- description: "Action label overlay config (true for defaults, or object for custom)."
1438
+ description: "Action label overlay."
1716
1439
  },
1717
1440
  durationMs: {
1718
1441
  type: "number",
1719
- description: "How long overlays remain visible in ms (default: 1500)."
1442
+ description: "How long overlays stay visible in ms (default: 1500)."
1720
1443
  }
1721
1444
  }
1722
1445
  }
@@ -1727,14 +1450,14 @@ Tip: If the returned elements do not include the specific element you need, use
1727
1450
  // ===== auto-chrome-mcp fork (B1~B4) =====
1728
1451
  {
1729
1452
  name: TOOL_NAMES.BROWSER.STORAGE,
1730
- description: "Read or modify cookies, localStorage, or sessionStorage. Use it to save/restore a login session, test the logged-out state, pre-seed a consent cookie so the banner never appears, or inspect front-end state. Cookie/storage VALUES are hidden by default (names, domains and expiry are still returned) - pass includeValues:true only when you actually need the secrets.",
1453
+ description: "Read or modify cookies, localStorage, or sessionStorage. Use it to save/restore a login session, test the logged-out state, pre-seed a consent cookie, or inspect front-end state. VALUES are masked by default (names/domains/expiry still returned); pass includeValues:true only when you need the secrets.",
1731
1454
  inputSchema: {
1732
1455
  type: "object",
1733
1456
  properties: {
1734
1457
  kind: {
1735
1458
  type: "string",
1736
1459
  enum: ["cookies", "local", "session"],
1737
- description: 'What to operate on: browser cookies, localStorage, or sessionStorage. Default "cookies".'
1460
+ description: 'cookies, localStorage, or sessionStorage. Default "cookies".'
1738
1461
  },
1739
1462
  action: {
1740
1463
  type: "string",
@@ -1766,30 +1489,24 @@ Tip: If the returned elements do not include the specific element you need, use
1766
1489
  },
1767
1490
  includeValues: {
1768
1491
  type: "boolean",
1769
- description: "Return real values instead of masked placeholders. Default false - these are usually auth tokens."
1492
+ description: "Return real values instead of masks. Default false (usually auth tokens)."
1770
1493
  },
1771
1494
  tabId: { type: "number", description: "Target tab. Defaults to the session work tab." },
1772
- windowId: {
1773
- type: "number",
1774
- description: "Window to pick the active tab from (when tabId is omitted)."
1775
- }
1495
+ windowId: windowIdProp
1776
1496
  }
1777
1497
  }
1778
1498
  },
1779
1499
  {
1780
1500
  name: TOOL_NAMES.BROWSER.SAVE_PDF,
1781
- description: "Save the page as a PDF into the Downloads folder (via Page.printToPDF). Unlike a screenshot the text stays selectable and multi-page documents are captured in full - use it to archive notices, contracts, invoices and reports. The PDF bytes are NOT returned (that would be enormous); the result carries the saved filename.",
1501
+ description: "Save the page as a PDF into Downloads (via Page.printToPDF). Unlike a screenshot the text stays selectable and multi-page documents are captured in full; use it to archive notices, contracts, invoices, reports. The PDF bytes are NOT returned (too large); the result carries the saved filename.",
1782
1502
  inputSchema: {
1783
1503
  type: "object",
1784
1504
  properties: {
1785
1505
  tabId: { type: "number", description: "Target tab. Defaults to the session work tab." },
1786
- windowId: {
1787
- type: "number",
1788
- description: "Window to pick the active tab from (when tabId is omitted)."
1789
- },
1506
+ windowId: windowIdProp,
1790
1507
  filename: {
1791
1508
  type: "string",
1792
- description: 'File name (".pdf" added automatically). Saved under Downloads/mcp-pdf/.'
1509
+ description: 'File name (".pdf" added). Saved under Downloads/mcp-pdf/.'
1793
1510
  },
1794
1511
  paperFormat: {
1795
1512
  type: "string",
@@ -1819,7 +1536,7 @@ Tip: If the returned elements do not include the specific element you need, use
1819
1536
  },
1820
1537
  {
1821
1538
  name: TOOL_NAMES.BROWSER.EMULATE,
1822
- description: 'Emulate a device viewport (size, pixel density, touch, User-Agent) on a tab for responsive/mobile checking. The real window is never resized, so this works on background work tabs. Emulation persists until action="reset" - always reset when finished, since Chrome shows an automation notice on an emulated tab.',
1539
+ description: 'Emulate a device viewport (size, pixel density, touch, User-Agent) on a tab for responsive/mobile checking. The real window is never resized, so it works on background work tabs. Emulation persists until action="reset"; always reset when done (Chrome shows an automation notice on an emulated tab).',
1823
1540
  inputSchema: {
1824
1541
  type: "object",
1825
1542
  properties: {
@@ -1848,28 +1565,25 @@ Tip: If the returned elements do not include the specific element you need, use
1848
1565
  hasTouch: { type: "boolean", description: "Enable touch event emulation." },
1849
1566
  userAgent: { type: "string", description: "Override the User-Agent string." },
1850
1567
  tabId: { type: "number", description: "Target tab. Defaults to the session work tab." },
1851
- windowId: {
1852
- type: "number",
1853
- description: "Window to pick the active tab from (when tabId is omitted)."
1854
- }
1568
+ windowId: windowIdProp
1855
1569
  }
1856
1570
  }
1857
1571
  },
1858
1572
  {
1859
1573
  name: TOOL_NAMES.BROWSER.NETWORK_RULES,
1860
- description: "Block network requests with declarativeNetRequest session rules. Blocking ads/trackers or heavy images makes pages load noticeably faster and cuts the boilerplate that read_page/get_web_content would otherwise return (fewer tokens). Rules are session-scoped (gone on Chrome restart) and can be limited to one tab. Beware: some sites depend on tracker domains for login.",
1574
+ description: "Block network requests with declarativeNetRequest session rules. Blocking ads/trackers or heavy images speeds up pages and cuts boilerplate tokens. Rules are session-scoped (gone on Chrome restart) and can be limited to one tab. Note: some sites need tracker domains for login.",
1861
1575
  inputSchema: {
1862
1576
  type: "object",
1863
1577
  properties: {
1864
1578
  action: {
1865
1579
  type: "string",
1866
1580
  enum: ["block", "unblock", "list", "clear"],
1867
- description: 'Default "block". "list" shows active rules with their ids, "clear" removes all of them.'
1581
+ description: 'Default "block". "list" shows active rules with ids, "clear" removes all.'
1868
1582
  },
1869
1583
  preset: {
1870
1584
  type: "string",
1871
1585
  enum: ["ads", "trackers", "images", "media", "fonts"],
1872
- description: "Built-in rule set. ads/trackers block known domains; images/media/fonts block those resource types entirely."
1586
+ description: "Rule set: ads/trackers block known domains; images/media/fonts block those resource types."
1873
1587
  },
1874
1588
  patterns: {
1875
1589
  type: "array",
@@ -1883,7 +1597,7 @@ Tip: If the returned elements do not include the specific element you need, use
1883
1597
  ruleIds: {
1884
1598
  type: "array",
1885
1599
  items: { type: "number" },
1886
- description: 'For action="unblock": rule ids to remove (get them from action="list").'
1600
+ description: 'action="unblock": rule ids to remove (from action="list").'
1887
1601
  }
1888
1602
  }
1889
1603
  }
@@ -1896,10 +1610,16 @@ var LANE_EXEMPT_TOOLS = /* @__PURE__ */ new Set([
1896
1610
  TOOL_NAMES.BROWSER.BOOKMARK_SEARCH,
1897
1611
  TOOL_NAMES.BROWSER.BOOKMARK_ADD,
1898
1612
  TOOL_NAMES.BROWSER.BOOKMARK_DELETE,
1899
- TOOL_NAMES.BROWSER.REQUEST_USER_CONSENT
1613
+ TOOL_NAMES.BROWSER.REQUEST_USER_CONSENT,
1614
+ // record_replay 두 도구는 레인 대상이 아니다: flow_run 은 대상 탭을 엔진이 스스로 잡아
1615
+ // 레인→작업탭 주입 경로를 타지 않고, list_published 는 순수 조회다. 지금은 두 스키마가
1616
+ // 위에서 주석 처리돼 TOOL_SCHEMAS 에 없으므로 이 항목은 실질적으로 무효지만, 다시 노출할 때
1617
+ // 판단을 되풀이하지 않도록 남겨 둔다.
1618
+ TOOL_NAMES.RECORD_REPLAY.FLOW_RUN,
1619
+ TOOL_NAMES.RECORD_REPLAY.LIST_PUBLISHED
1900
1620
  ]);
1901
- var LANE_DESCRIPTION_SHORT = 'Parallel lane id. Concurrent agents share one MCP session \u2014 give each agent its own lane (e.g. "agent-1") and pass it on every call so they get isolated work tabs. Omit when not parallel.';
1902
- var LANE_DESCRIPTION_LONG = 'Parallel lane id. Sub-agents of one Claude Code session share a single MCP session, so without a lane they overwrite each other\u2019s work tab. Give each concurrent agent a distinct lane (e.g. "agent-1") and pass the SAME lane on every subsequent call: the tab opened for a lane is never retargeted or closed by another lane. Omit when not running agents in parallel.';
1621
+ var LANE_DESCRIPTION_SHORT = "Parallel-agent lane id (same value every call). Omit if solo.";
1622
+ var LANE_DESCRIPTION_LONG = "Parallel lane id. Sub-agents of one Claude Code session share one MCP session, so without a lane they overwrite each other's work tab. Give each concurrent agent a distinct lane (same value every call): a lane keeps its own work tab that no other lane closes or retargets.";
1903
1623
  for (const tool of TOOL_SCHEMAS) {
1904
1624
  if (LANE_EXEMPT_TOOLS.has(tool.name)) continue;
1905
1625
  const schema = tool.inputSchema;