JS Reverse MCP
JS Reverse MCP
English | 中文
AI-first / AI-native MCP-сервер для обратной разработки JavaScript, который позволяет вашим AI-ассистентам для программирования (таким как Claude, Cursor, Copilot) непрерывно отлаживать, локализовать, сохранять и анализировать поведение JavaScript на веб-страницах, как настоящий аналитик.
Это не просто перенос Chrome DevTools API в модель, а реорганизация скриптов, точек останова, сети, WebSocket, состояния браузера и локального файлового I/O в инструменты, пригодные для непрерывного рассуждения и действий AI-агента. Антидетект — одна из возможностей: по умолчанию используется специально перекомпилированный и независимо поддерживаемый форк Patchright, обеспечивающий stealth на уровне протокола, а для сайтов с сильной анти-парсинг-защитой опционально доступен режим маскировки на уровне исходного кода CloakBrowser.
☁️ Спонсор · Sponsored by IPWO
IPWO 住宅代理支持灵活的代理配置,开发者可以根据不同任务选择相应的网络环境,用于网页访问、请求测试、地区化内容分析及自动化工作流。
对于涉及 JS 逆向、浏览器调试和 Web 网络分析的项目,住宅代理也可以作为网络环境的一种补充选择,帮助开发者更灵活地满足不同地区的访问与测试需求。
👉 免费测试入口,9 折优惠码:0204
Related MCP server: Chrome DevTools MCP
☁️ Спонсор · Sponsored by Infistar.cc 无限星河
js-reverse-mcp × Infistar.cc 无限星河|全模型 API · стабильная поддержка AI-отладки
Благодарим Infistar.cc 无限星河 за спонсорство и предоставление сервиса моделей для js-reverse-mcp!
⚡ Стабильная обработка сложных задач отладки: корпоративные каналы с высокой пропускной способностью и многоузловое резервирование, цены от 1/10 официального канала, меньше ограничений, ошибок 429 и разрывов соединения при длительных задачах.
🧠 Один API Key для подключения основных моделей: поддержка ChatGPT, Claude, Gemini, Kimi, GLM, DeepSeek и других моделей, совместимость с AI-инструментами программирования Claude Code, Codex, Cursor и др.
🔎 Помощь в авторизованной отладке и исследованиях безопасности: подходит для многошаговых задач, таких как поиск скриптов, анализ точек останова, отслеживание сетевых запросов, проверка стека вызовов и понимание логики кода.
📦 Эксклюзивные льготы для пользователей проекта: зарегистрируйтесь по эксклюзивной партнёрской ссылке и выполните первый вызов, чтобы получить тестовый баланс на 5 долларов / эксклюзивную скидку на первое пополнение.
Позиционирование: поддержка конфигурации API моделей Claude Code / Codex.
Возможности
AI-native дизайн инструментов: гранулярность инструментов, границы вывода и сообщения об ошибках спроектированы вокруг принятия решений агентом, чтобы не подталкивать модель к бесполезным следующим шагам
Воспроизводимый рабочий процесс: исходный код скриптов, сырые сетевые данные и бинарные результаты можно экспортировать в локальные файлы, а затем использовать как входные данные для дальнейшего анализа
Выполнение в контексте точки останова: при паузе можно вычислять выражения непосредственно в call frame, проверять переменные области видимости, выполнять пошагово и получать контекст исходного кода
Анализ скриптов: список всех загруженных JS, поиск по коду, получение/сохранение исходного кода, автоматическое форматирование больших минифицированных скриптов
Анализ сети и WebSocket: стек вызовов запросов, точки останова XHR, определение Set-Cookie, экспорт сырых body/header, группировка сообщений WebSocket
Воспроизведение состояния браузера: очистка cookies / cache / storage / sessionStorage текущего сайта, воспроизведение cookie и процессов анти-риск-контроля с перезагрузкой
Окно по умолчанию + постоянный статус входа: браузер виден, cookies / localStorage сохраняются между сессиями
Специализированное ядро Patchright: по умолчанию используется независимо поддерживаемый форк Patchright, который постоянно исправляет известные общие черты реализации из апстрима
Опциональный слой антидетекта: stealth на уровне протокола специализированного Patchright включён по умолчанию; для сайтов с сильной анти-парсинг-защитой можно добавить
--cloakдля использования бинарника CloakBrowser
Специализированный форк Patchright
js-reverse-mcp больше не зависит напрямую от публичного пакета Patchright, а использует специально скомпилированный для этого MCP @zhizhuodemao/patchright. Этот форк постоянно поддерживается в отдельном репозитории и развивается вместе с реальными образцами детекта этого MCP.
Больше нет прямой зависимости от публичного пакета Patchright
Корректировка на уровне протокола и перекомпиляция для подтверждённых общих черт реализации из апстрима
Настройки антидетекта не зависят от JS-инъекций на уровне страницы
Сохранены исходные возможности evaluate, locator и управления страницей
Форк постоянно поддерживается в специализированном репозитории для этого MCP
Публичная документация описывает только границы дизайна и не раскрывает внутренние образцы детекта и детали реализации. Цель специализированного форка — уменьшить подтверждённые общие черты реализации, а не гарантировать абсолютную необнаружимость автоматизации браузера.
Системные требования
Быстрый старт (npx)
Установка не требуется, просто добавьте в конфигурацию MCP-клиента:
{
"mcpServers": {
"js-reverse": {
"command": "npx",
"args": ["js-reverse-mcp"]
}
}
}Claude Code
claude mcp add js-reverse npx js-reverse-mcpЕсли у вас ещё нет доступного API моделей или нужно настроить собственный адрес API, обратитесь к: Учебник по настройке API сторонних моделей Claude Code / Codex.
Codex
codex mcp add js-reverse -- npx js-reverse-mcpЕсли у вас ещё нет доступного API моделей или нужно настроить собственный адрес API, обратитесь к: Учебник по настройке API сторонних моделей Claude Code / Codex.
Cursor
Перейдите в Cursor Settings -> MCP -> New MCP Server и используйте конфигурацию выше.
VS Code Copilot
code --add-mcp '{"name":"js-reverse","command":"npx","args":["js-reverse-mcp"]}'Локальная установка (опционально)
git clone https://github.com/zhizhuodemao/js-reverse-mcp.git
cd js-reverse-mcp
npm install
npm run buildЗатем используйте локальный путь в конфигурации MCP:
{
"mcpServers": {
"js-reverse": {
"command": "node",
"args": ["/你的路径/js-reverse-mcp/build/src/index.js"]
}
}
}AI-first дизайн
Основная цель этого проекта — не «уметь управлять браузером», а позволить AI-агенту стабильно выполнять полный цикл реальной задачи JS-реверса: открыть страницу, пройти анти-риск-контроль, локализовать скрипт, сохранить исходный код, установить точку останова, вызвать поведение, проверить рантайм, экспортировать сетевые материалы, воспроизвести состояние, а затем продолжить рассуждение.
Несколько принципов дизайна проходят через весь код:
Инструменты — это примитивы агента, а не отображение меню DevTools:
list_network_requestsможет выводить индекс, запрашивать детали поreqidи экспортировать точные материалы черезoutputFile;evaluate_scriptможет выполняться на странице, в call frame точки останова, а также принимать входной файл черезlocalFilePath.Вывод должен направлять следующий шаг: вывод списков остаётся коротким и сканируемым; вывод деталей имеет границы; длинные результаты предлагают экспорт; для pending-запросов явно предлагается сначала возобновить выполнение, чтобы агент не ждал ответ, который никогда не завершится.
Локальные файлы — это рабочая среда анализа:
save_script_source,list_network_requests(..., outputFile),evaluate_script(..., localFilePath)позволяют агенту перемещаться между браузером, сетью и локальными файлами, а не впихивать большие фрагменты кода или бинарные данные в контекст чата.Состояние можно очищать, процесс можно воспроизводить: профиль по умолчанию сохраняет статус входа;
--isolatedпредоставляет одноразовую чистую среду;clear_site_dataочищает только состояние, связанное с текущим сайтом, для многократного воспроизведения генерации cookie, инициализации анти-риск-контроля и цепочек запросов.Антидетект служит цепочке отладки: тихая навигация CDP, реальный viewport, Google referer, специализированный форк Patchright и CloakBrowser нацелены на то, чтобы агент мог войти на целевую страницу и продолжить анализ, а не превращать проект в универсальный краулер-фреймворк.
Механизм антидетекта (поддерживающая возможность)
Антидетект — одна из базовых поддерживающих возможностей js-reverse-mcp. Слой-обёртка (сам этот MCP) использует ноль JS-инъекций, не делает хаков Object.defineProperty (это само по себе сигнал для детекта). Весь антидетект реализован в двух непересекающихся слоях:
Слой | Режим по умолчанию | Режим |
Слой протокола (CDP) | Специализированный форк Patchright: не вызывает | То же |
Слой исходного кода (бинарный патч C++) | Нет — напрямую используется системный Google Chrome | Бинарник CloakBrowser (патчи маскировки на уровне исходного кода по платформам, покрывают |
Каталог профиля |
|
|
Фактический браузер | Установленный вами Google Chrome (с Web Store, расширениями, sync) | Специальная сборка Chromium (без сервисов Google, без Web Store) |
Дополнительные меры на уровне навигации (действуют в обоих режимах):
Тихая навигация CDP — при загрузке страницы не активируются
Network.enable/Debugger.enable, сбор запросов/консоли идёт только через слушатели Playwright, пока какой-либо инструмент явно не потребует CDPGoogle Referer —
new_pageпо умолчанию используетreferer: https://www.google.com/Реальный viewport — отключён фейковый viewport Playwright 1280×720 по умолчанию, браузер показывает реальный размер экрана
Когда включать --cloak: только если вышеперечисленного недостаточно и сайт блокирует по отпечатку. Подробнее в docs/cloak.md.
Список инструментов (24)
Страница и навигация
Инструмент | Описание |
| Список открытых страниц или выбор контекста отладки по индексу |
| Создание новой страницы и переход по URL |
| Навигация, назад, вперёд или обновление страницы |
| Список всех frame (iframe) или выбор контекста выполнения |
| Строгое совпадение и клик по единственному видимому элементу в текущем frame |
| Снимок экрана страницы |
Анализ скриптов
Инструмент | Описание |
| Список всех загруженных JavaScript-скриптов на странице |
| Получение фрагмента исходного кода скрипта, поддержка диапазона строк или смещения символов |
| Сохранение полного исходного кода скрипта в локальный файл (для больших/минифицированных/WASM-файлов) |
| Поиск строки или регулярного выражения во всех скриптах |
Точки останова и управление выполнением
Инструмент | Описание |
| Автоматическая установка точки останова по поиску текста в коде (для минифицированного кода) |
| Установка точки останова XHR/Fetch по шаблону URL |
| Удаление точки останова по ID, URL или всех с явным action |
| Список всех активных точек останова |
| Получение статуса паузы, стека вызовов и переменных области видимости |
| Пауза или возобновление выполнения с явным action |
| Пошаговая отладка (over/into/out), возврат позиции и контекста исходного кода |
Сеть и WebSocket
Инструмент | Описание |
| Список сетевых запросов, просмотр деталей или экспорт сырых материалов header/body/query |
| Очистка собранных запросов и body cache текущей страницы после явного подтверждения |
| Получение JavaScript-стека вызовов сетевого запроса |
| Список WebSocket-соединений, анализ паттернов сообщений или получение деталей сообщений |
Состояние браузера
Инструмент | Описание |
| Очистка cookies, origin storage и sessionStorage, связанных с текущим сайтом; возможность явно выбрать очистку глобального HTTP cache |
Инструменты проверки
Инструмент | Описание |
| Выполнение JavaScript на странице или в контексте точки останова, поддержка main world, сохранения результата и чтения одного локального входного файла |
| Список сообщений консоли или получение деталей одного сообщения по msgid |
Примеры использования
Базовый процесс JS-реверса
Открыть целевую страницу
打开 https://example.com 并列出所有加载的 JS 脚本Найти целевую функцию
在所有脚本中搜索包含 "encrypt" 的代码Установить точку останова
在加密函数入口处设置断点Вызвать и проанализировать
在页面上触发操作,断点命中后检查参数、调用栈和作用域变量Анализ протокола WebSocket
列出 WebSocket 连接,分析消息模式,查看特定类型的消息内容Рекомендуемый агентом полный процесс захвата
Поскольку на этапе навигации CDP намеренно остаётся тихим, при первом входе на целевую страницу домены Network / Debugger не открываются сразу. Рекомендуемый процесс: сначала пройти анти-риск-контроль, затем обновить страницу для захвата:
1. new_page 打开目标页
2. 调用 list_network_requests 激活 collectors
3. navigate_page(type="reload") 刷新页面
4. 再次 list_network_requests 查看完整请求
5. 对关键 reqid 使用 outputFile 导出原始材料Процесс воспроизведения Cookie / анти-риск-контроля
1. clear_site_data(confirm=true) 清理当前站点状态
2. navigate_page(type="reload") 重新触发初始化
3. list_network_requests 找到设置 cookie 或提交 sensor 的请求
4. 导出 requestBody / responseHeaders / responseBody
5. 用 evaluate_script + localFilePath 在页面上下文中复算或验证Параметры конфигурации
CLI остаётся минималистичным, все флаги опциональны. Для 99% сценариев достаточно настроек по умолчанию. При работе с локальными файлами рекомендуется использовать --allowedRoots для ограничения каталогов, доступных агенту на чтение/запись.
Параметр | Описание | Значение по умолчанию |
| Переключение на скрытый бинарник CloakBrowser (вместо системного Chrome). Включает патчи маскировки на уровне исходного кода C++ по платформам. При первом запуске автоматически загружается бинарник ~200MB; идентичность отпечатка сохраняется в профиле. Подробнее в docs/cloak.md. |
|
| Использование временного user-data-dir (cookies/localStorage не сохраняются, автоматическая очистка при закрытии) |
|
| Подключение к уже запущенному экземпляру Chrome (CDP HTTP endpoint, например | – |
| Запись MCP-журнала отладки в обычный файл с правами | – |
| Повторяемый параметр для указания локальных каталогов, доступных агенту на чтение/запись; разрешаются реальные пути, символьные ссылки за пределы отклоняются. При включении отключаются страницы браузера | – |
Примеры конфигурации
По умолчанию — системный Chrome + постоянный статус входа (рекомендуется для большинства сценариев отладки):
{
"mcpServers": {
"js-reverse": {
"command": "npx",
"args": ["js-reverse-mcp"]
}
}
}--cloak — сайты с сильной анти-парсинг-защитой (защита Cloudflare Turnstile / DataDome / FingerprintJS):
Настоятельно рекомендуется: заранее скачать бинарник (одноразово, ~30–60 секунд). Если этого не сделать, при первом запуске MCP с
--cloakбудет тихо загружаться ~200MB, и будет выглядеть, будто MCP завис:npx cloakbrowser install(пакет
cloakbrowserуже установлен черезoptionalDependencies, эта команда просто запускает его встроенную логику загрузки бинарника, с индикатором прогресса)
{
"mcpServers": {
"js-reverse-cloak": {
"command": "npx",
"args": ["js-reverse-mcp", "--cloak"]
}
}
}Два параллельных экземпляра — профили двух экземпляров MCP физически изолированы, переключение в зависимости от целевого сайта:
{
"mcpServers": {
"js-reverse": {
"command": "npx",
"args": ["js-reverse-mcp"]
},
"js-reverse-cloak": {
"command": "npx",
"args": ["js-reverse-mcp", "--cloak"]
}
}
}--isolated — каждый раз новый профиль (cookies/localStorage не сохраняются):
{
"mcpServers": {
"js-reverse": {
"command": "npx",
"args": ["js-reverse-mcp", "--isolated"]
}
}
}Подключение к уже запущенному Chrome / стороннему браузеру с отпечатком
--browserUrl принимает только CDP endpoint (HTTP endpoint, отвечающий на /json/version), а не приватный Local API вендора. Как получить CDP-порт для локального Chrome, AdsPower, BitBrowser и других сценариев — в отдельной документации:
📖 docs/cdp-endpoint.md — как получить CDP-порт для отладки
Кратчайший путь (локальный Chrome):
# 先关掉所有 Chrome 窗口,然后
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug{
"mcpServers": {
"js-reverse": {
"command": "npx",
"args": ["js-reverse-mcp", "--browserUrl", "http://127.0.0.1:9222"]
}
}
}CDP-порт браузеров с отпечатком (AdsPower, BitBrowser и др.) меняется случайным образом при каждом запуске, поэтому сначала нужно запустить браузер через Local API вендора и извлечь порт. Шаги и примеры скриптов — в документации выше.
Устранение неполадок
Блокировка анти-парсинг-системой
Если доступ к некоторым сайтам блокируется (например, Zhihu возвращает 40362, бесконечный цикл вызова Cloudflare):
Сначала попробуйте
--isolated— используйте новый профиль, чтобы исключить загрязнение остаточным состоянием:"args": ["js-reverse-mcp", "--isolated"]Если не помогло, включите
--cloak— включите патчи маскировки на уровне исходного кода по платформам:"args": ["js-reverse-mcp", "--cloak"]В последнюю очередь рассмотрите ручную очистку постоянного профиля (статус входа будет потерян):
rm -rf ~/.cache/chrome-devtools-mcp/chrome-profile
Когда стоит включать --cloak, а когда нет — в docs/cloak.md.
Оценка маршрутизации агента (для мейнтейнеров)
npm run eval:routing:validate офлайн проверяет фактические tools/list MCP, server instructions и 30 контрактов выбора инструментов из evals/tool-routing.json; эта команда не обращается к модельным endpoint'ам и включена в presubmit.
Оценка реальных моделей — явный opt-in, она вызывает OpenAI-compatible Chat Completions endpoint для каждого пункта и может привести к расходам:
MCP_ROUTING_EVAL_ENDPOINT=https://api.example.com/v1/chat/completions \
MCP_ROUTING_EVAL_MODEL=model-name \
MCP_ROUTING_EVAL_API_KEY=secret \
npm run eval:routingMCP_ROUTING_EVAL_API_KEY можно опустить для локальных endpoint'ов без аутентификации; удалённые endpoint'ы с учётными данными должны использовать HTTPS, HTTP разрешён только для loopback. Таймаут одного запроса можно настроить через MCP_ROUTING_EVAL_TIMEOUT_MS. По умолчанию требуется 100% прохождение, при сравнении моделей можно задать порог (0, 1] через MCP_ROUTING_EVAL_MIN_PASS_RATE. Оценка не выводит API key, endpoint или тело ответа об ошибке endpoint'а.
Предупреждение о безопасности
Этот инструмент раскрывает содержимое браузера MCP-клиенту, позволяя проверять, отлаживать и изменять любые данные в браузере. Не используйте его на страницах, содержащих конфиденциальную информацию.
evaluate_script.localFilePath и различные outputFile/filePath позволяют процессу MCP читать или записывать файлы на хост-машине. В производственных или общих средах следует использовать один или несколько --allowedRoots, чтобы сузить доступ до выделенной рабочей директории; при отсутствии конфигурации область доступа ничем не ограничена. После включения --allowedRoots страницы браузера file:, view-source:file: и filesystem:file: также отклоняются, что предотвращает обход границ директорий через навигацию в браузере; при необходимости отладки локальных страниц этот параметр можно не настраивать только в сеансах, где явно принимается риск раскрытия локальных файлов.
Лицензия
Apache-2.0
Available Tools
24 toolsbreak_on_xhrA
Sets a URL-substring breakpoint for a future XHR/Fetch when runtime request arguments, local variables, or payload construction must be inspected. For an already captured request, call get_request_initiator first because it is non-pausing; use this only when that evidence is insufficient. Set it before reproducing the user action—it does not inspect past traffic—then call get_paused_info/evaluate_script and finally step or resume. The URL pattern identifies this breakpoint for list_breakpoints and remove_breakpoint(action="remove_xhr").
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Case-sensitive URL substring matched against future XHR/Fetch requests. Prefer a narrow endpoint path from list_network_requests; retain the exact string to remove the breakpoint later. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false) and non-destructive (destructiveHint=false). Description adds that the breakpoint is for future requests only, does not inspect past traffic, and requires subsequent steps. Also explains how the URL pattern ties to list_breakpoints and remove_breakpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is a single paragraph of about 100 words, front-loaded with purpose, then usage sequence, then relation to other tools. Every sentence contributes. Could be slightly more compact, but efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema, return values are not needed in description. Covers what, when, how, and parameter details. Could explicitly mention that the breakpoint causes a pause on request, but context is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has one parameter 'url' with description. Tool description adds context: case-sensitive, should be a narrow endpoint path from list_network_requests, retain exact string for removal. This goes beyond the schema description. With 100% schema coverage, baseline is 3, but added value justifies 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: setting a URL-substring breakpoint for future XHR/Fetch to inspect runtime arguments, variables, or payloads. It distinguishes from get_request_initiator, which handles already captured requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use when need to inspect request details at runtime, avoid for already captured requests (use get_request_initiator instead). Specifies the workflow: set before reproducing action, then call get_paused_info/evaluate_script, then step/resume. Also notes it does not inspect past traffic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_network_requestsADestructiveIdempotent
Discard captured HTTP(S) evidence for the currently selected page after confirm=true. Use this immediately before reproducing an action when a clean network capture window is needed; do not use it to reset login, cookies, cache, or other browser state. It irreversibly clears the in-memory request queue, cached response bodies, and initiator maps only. Browser cookies, HTTP cache, origin storage, console messages, and WebSocket connections/messages are unchanged; use clear_site_data for cookie and storage reset. New captures continue above the previous reqid high-water mark because reqids are never reused.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to irreversibly delete the selected page's captured request history, response-body cache, and initiator evidence. This confirms capture cleanup, not browser-state cleanup. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite destructiveHint=true annotation, description adds detail on what is irreversibly cleared (request queue, cached response bodies, initiator maps) and what is unchanged (cookies, HTTP cache, storage), exceeding annotation info.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise paragraph with front-loaded action, followed by usage guidance, behavioral specifics, and contrast with sibling; every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simple single-parameter tool with output schema, description fully covers purpose, usage, behavioral boundaries, and parameter semantics without missing critical context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'confirm', and description reinforces its meaning as required for irreversible capture cleanup, adding nuance beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'discard' and resource 'captured HTTP(S) evidence', clearly distinguishing from sibling clear_site_data by stating what it does not affect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('immediately before reproducing an action when a clean network capture window is needed') and when not to use ('do not use it to reset login, cookies, cache'), with reference to alternative clear_site_data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_site_dataADestructiveIdempotent
Irreversibly clear browser state after confirm=true to create a clean replay environment for the selected page. Use this before replaying login, session creation, storage initialization, or other state-dependent flows; do not use it to inspect cookies or determine which response set one. For cookie provenance, including HttpOnly, Secure, and SameSite attributes, use list_network_requests with cookieName first. Cleanup covers cookies affecting the selected page's HTTP(S) frames—including HttpOnly and Secure cookies through the browser context—persistent storage for those frame origins, and each HTTP(S) frame's sessionStorage. It does not reload the page. The browser HTTP cache is global and is preserved by default; set clearBrowserCache=true only when that wider cross-page effect is explicitly intended.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to irreversibly delete cookies affecting the selected page's HTTP(S) frames, persistent storage for those frame origins, and HTTP(S) frame sessionStorage. This confirms state reset for replay, not inspection. | |
| clearBrowserCache | No | Also clear the browser-wide HTTP cache. Leave false for site-scoped replay cleanup. Setting true has a wider global effect on every page and origin in this browser, not only the selected page or its frame origins. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details what is cleared (cookies, persistent storage, sessionStorage) and what is not (page reload, HTTP cache by default), and explains the effect of clearBrowserCache. Annotations indicate destructiveHint=true and readOnlyHint=false, which align with 'irreversibly clear'; no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is slightly verbose but front-loaded with the main purpose. Every sentence adds value, and the structure logically flows from purpose to usage to details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (context: 'Has output schema: true'), the description does not need to explain return values. It covers purpose, usage, parameters, and behavioral details comprehensively for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning by explaining that confirm=true is required for irreversible action and that clearBrowserCache has a global effect, providing context beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool irreversibly clears browser state for a clean replay environment, specifying the verb ('clear') and resource ('browser state for selected page'). It distinguishes from sibling tool 'list_network_requests' for cookie inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use ('before replaying login, session creation...') and when not to use ('do not use it to inspect cookies'), and provides an alternative tool ('list_network_requests') for cookie provenance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
click_elementADestructive
Performs one verified, auditable click in the currently selected frame. Use it when the task requires activating a known button, link, or control after selecting the correct page/frame and identifying a CSS selector; it is the preferred minimal interaction primitive over arbitrary evaluate_script code. It does not discover elements, type text, or silently guess among matches: the selector must resolve to exactly one element unless index is explicit, and the chosen element must be visible. A click can submit data, navigate, or trigger external effects, so confirm=true is required and the result reports the exact resolved element.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Explicit zero-based match index. Required when the selector matches more than one element. | |
| button | No | Mouse button. Defaults to left. | left |
| confirm | No | Must be true to authorize this specific click because it can submit data, navigate, or trigger external side effects. | |
| timeout | No | Maximum wait time in milliseconds. If set to 0, the default timeout will be used. | |
| selector | Yes | CSS selector evaluated only in the currently selected frame. Use select_frame first when the target is inside an iframe. | |
| modifiers | No | Optional keyboard modifiers held during the click. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Disclosures beyond annotations: confirms destructive side effects, requirement for visibility and exact match, and mentions confirm flag authorizes side effects. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph is front-loaded with core purpose, then usage guidelines, then constraints; every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, destructive nature, and output schema, the description covers purpose, usage, parameter roles, and behavioral notes comprehensively, leaving no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds contextual value for each parameter (e.g., selector limited to current frame, index needed for multiple matches, confirm to authorize effects), justifying a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states it performs a verified, auditable click on a known button, link, or control, distinguishing itself from siblings like evaluate_script and select_frame.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (activating known controls after frame selection) and when not (does not discover elements, type text, or guess matches), and mentions prerequisite of selecting frame and requirement of confirm=true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_scriptADestructive
Evaluates one focused JavaScript function for DOM/page state, web storage, page-defined globals, a paused-frame expression, or browser-side processing of one local file. Use it when those runtime values are the goal and no narrower evidence tool applies. Do not use document.cookie or page evaluation to investigate HttpOnly/Secure cookies, Set-Cookie provenance, or captured HTTP evidence; use list_network_requests with cookieName/reqid, and use search_in_sources/get_script_source for source discovery. While running, evaluation uses the selected frame's isolated world by default or its page main world with mainWorld=true; while paused, it always uses the chosen call frame and ignores mainWorld. Call get_paused_info before paused evaluation, then step or resume when finished. Arbitrary code can change page/external state and requires confirm=true; inline results are bounded, so use outputFile for exact large or binary results.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to authorize this exact arbitrary-code evaluation, which may mutate page state, send requests, or cause external side effects. Prefer a read-only expression when inspection is sufficient. | |
| function | Yes | JavaScript function declaration invoked by the tool, for example `() => document.title` or `async () => await Promise.resolve(location.href)`. Return JSON-serializable data; ArrayBuffer/typed arrays require outputFile for exact bytes. With localFilePath, accept `async ({localFile}) => ...` and read localFile.text for UTF-8 or localFile.base64 for exact bytes. Keep the function focused; use mainWorld=true only when page-defined globals are required. | |
| mainWorld | No | Running-page mode only: false uses the selected frame's isolated context; true uses that frame's page main world to access application-defined globals. When execution is paused, evaluation always targets frameIndex and this option is ignored. | |
| frameIndex | No | Paused mode only: zero-based call frame from get_paused_info (default: top frame). The index and its callFrameId expire after any step or resume. | |
| outputFile | No | Save the exact result locally instead of returning bounded inline content. JSON-serializable values are written as JSON text and ArrayBuffer/typed arrays as raw bytes; the returned filename is resolved and subject to --allowedRoots. | |
| localFilePath | No | Absolute path to one host file passed as localFile; the browser never reads the path directly. Relative paths, file:// URLs, globs, ~, and directories are rejected, access is subject to --allowedRoots, and file contents may expose sensitive host data. | |
| confirmOverwrite | No | Set true only to authorize replacing an existing outputFile. A new file does not require overwrite confirmation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, openWorldHint=true, destructiveHint=true. The description adds significant context: arbitrary code can change page state, requires confirm=true, inline results are bounded, paused mode ignores mainWorld, and frameIndex expires. No contradiction with annotations; instead, it elaborates on safety and behavioral edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loading the core purpose and then providing specific usage notes. It uses clear, separate sentences for distinct points. While slightly verbose, every sentence conveys necessary information without redundancy. It could be marginally tighter but remains highly effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool complexity (7 parameters, 1 required, annotations, output schema, 23 siblings), the description covers all necessary aspects: purpose, usage alternatives, behavioral details (paused vs running, confirm, outputFile), and parameter semantics. It implicitly addresses return values by distinguishing inline vs outputFile results. No gaps are evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. However, the description adds meaningful context beyond schema: function parameter explains async functions, localFile argument, JSON serialization limits; mainWorld clarifies its behavior in paused vs running mode; frameIndex mentions expiration; outputFile specifies JSON or raw bytes; localFilePath warns about rejected patterns and host data exposure. This adds value, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it evaluates JavaScript functions for runtime values like DOM state, web storage, or expressions. It distinguishes itself from siblings by explicitly naming narrower tools (list_network_requests, search_in_sources, get_script_source) and specifying when not to use them. The verb 'evaluate' is specific and the resource ('JavaScript function') is well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use (when runtime values are the goal and no narrower tool applies) and when not to use (for cookies, Set-Cookie provenance). It lists alternative tools (list_network_requests, search_in_sources). It also covers paused vs running mode, confirm requirement, and outputFile usage, giving a complete usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_paused_infoARead-only
Inspects the current call stack, source locations, and selected call-frame scopes after a code/XHR breakpoint or explicit pause has stopped execution. It neither creates a pause nor resumes one. Returned frameIndex values and callFrameIds belong only to the current pause and expire after any step or resume; use evaluate_script with frameIndex for a focused expression, then step or pause_or_resume(action="resume").
| Name | Required | Description | Default |
|---|---|---|---|
| frameIndex | No | Zero-based frame from this pause whose scopes should be read (default: top frame). Frame indices change after a step and expire on resume. | |
| includeScopes | No | Include bounded variables from the selected call frame (default: true). Set false when only the stack and source locations are needed. | |
| maxScopeDepth | No | Scope categories to include for frameIndex (default: 2): 1 reads arguments/locals, 2 also reads closures, and 3+ includes other non-global scopes. Increase only when the needed value is absent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds critical behavioral details: frame indices expire after step/resume, scopes are per pause. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Slightly long but every sentence is informative. Front-loaded with main purpose and key constraints. Could trim some redundancy but still effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and sibling tools, the description covers the lifecycle of pause information, how to combine with evaluate_script, step, and resume, making it complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds valuable context beyond schema: frameIndex expiration, includeScopes usage for efficiency, maxScopeDepth level meanings. Helps agent pick correct values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it inspects current call stack, source locations, and scopes after a pause. Distinguishes from siblings like step and pause_or_resume.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (after a pause), what not to do (doesn't create/resume pause), and provides alternatives like evaluate_script with frameIndex followed by step or resume.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_request_initiatorARead-only
Non-pausing first action for tracing which JavaScript initiated a retained HTTP request when CDP initiator evidence was active. Pass the reqid from list_network_requests; because initiator capture starts lazily and is not retroactive, an older request may have no stack—in that case reproduce the action and inspect the new reqid, or set break_on_xhr before reproduction when runtime values are required. If the captured stack identifies the code, inspect its URL/location with get_script_source. If arguments, locals, or a dynamically built payload are still needed, use break_on_xhr, reproduce, then call get_paused_info or evaluate_script before stepping or resuming. This tool only reads retained evidence and does not pause or reproduce the request.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes | Numeric reqid returned by list_network_requests, not a raw CDP request ID. It survives navigation while retained, but becomes stale after FIFO eviction or clear_network_requests; list requests again if needed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark as read-only and non-destructive. Description adds key behavioral details: non-pausing, reads retained evidence, initiator capture is lazy and not retroactive. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph that is front-loaded with purpose and then flows into usage and alternatives. Every sentence is informative, though slightly dense; could be restructured but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of annotations and output schema, the description covers all contextual aspects: limitations, reproduction strategies, and references to sibling tools. Complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers requestId fully with description. Tool description adds operational context: pass reqid from list_network_requests, notes on staleness and reproducibility. Provides value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it retrieves the JavaScript initiator for a retained HTTP request, with a specific verb and resource. Distinguishes from siblings by mentioning alternatives like get_script_source, break_on_xhr.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (pass reqid from list_network_requests), when-not-to-use (older request may have no stack), and alternatives (reproduce, set break_on_xhr, use get_paused_info, evaluate_script).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_script_sourceARead-only
Reads a small source region around a search match, paused location, or known statement without executing or pausing the page. Select by URL when available because URL-backed scripts can be resolved again after navigation; use the debugger-context-scoped scriptId only for current inline/eval scripts. Use line ranges for normal source and offset/length for minified single-line bundles. For a whole, minified, or WASM source, use save_script_source; to observe runtime values next, call set_breakpoint_on_text against the original loaded source.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL from list_scripts, search_in_sources, or a call stack. Preferred stable selector for URL-backed scripts; resolution tries an exact match before a substring match, so provide enough of the URL to avoid ambiguity. | |
| length | No | Maximum characters to return from offset (default: 1000). This is ignored unless offset is provided. | |
| offset | No | Zero-based character offset into the original source. Use for a bounded read of minified single-line code when line ranges would be too large. | |
| endLine | No | Inclusive 1-based end line for a bounded multi-line snippet. Omit both line bounds and use offset/length for a minified single-line bundle. | |
| scriptId | No | Debugger-context-scoped script ID from list_scripts, search_in_sources, or paused information. Required for unnamed inline/eval scripts, but invalid after reload, navigation, or debugger target/frame change; prefer url for external scripts. | |
| startLine | No | Inclusive 1-based start line, typically copied from search_in_sources or paused information. Use with endLine for normal multi-line source. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds that it doesn't execute or pause the page, and discloses that scriptId is invalid after reload/navigation. This provides critical behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and core guidance. It is slightly verbose but each sentence serves a distinct instructional purpose. Could be tightened, but remains efficient for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 6 parameters and many sibling tools, the description covers selection strategies (URL vs scriptId), parameter combinations (line ranges vs offset/length), edge cases (scriptId invalidation, default length), and explicit alternatives (save_script_source, set_breakpoint_on_text). The output schema exists, so return values are not needed in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all 6 parameters. However, the description adds meaningful usage guidance: 'preferred stable selector' for url, 'ignored unless offset is provided' for length, 'for minified single-line code' for offset, 'inclusive 1-based' for lines, and invalidation conditions for scriptId. This enriches the schema without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb ('Reads') and resource ('small source region'), and immediately clarifies scope ('around a search match, paused location, or known statement') and what it does not do ('without executing or pausing the page'). It also distinguishes from sibling tools like save_script_source and set_breakpoint_on_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises when to use URL vs scriptId ('prefer URL for external scripts'), when to use line ranges vs offset/length ('normal source' vs 'minified single-line bundles'), and provides alternatives for whole/minified/WASM source ('use save_script_source') and for runtime values ('call set_breakpoint_on_text'). Also explains when scriptId becomes invalid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_websocket_messagesARead-only
Inspect captured bidirectional WebSocket connections and frame payloads for the selected page. Use this for WebSocket, socket, live-update, push, streaming, or realtime message flows; use list_network_requests for ordinary HTTP/XHR/fetch traffic and WebSocket upgrade request headers. WebSocket capture starts lazily on this tool's first use and is not retroactive: if the relevant socket already connected or exchanged frames, call this tool once to initialize capture, then reload or reproduce the flow. Without wsid it lists connections so you can choose one. With wsid it lists paginated sent/received frames; add show_content=true for payload previews. With wsid and analyze=true it groups frames by payload pattern and returns group IDs and sample frame indices; then use groupId to inspect one pattern. With wsid and frameIndex it returns one retained frame's detailed payload using the stable index shown in frame tables or analysis samples.
| Name | Required | Description | Default |
|---|---|---|---|
| wsid | No | Select a WebSocket connection by the wsid returned from connection-list mode. Omit it to list captured connections before inspecting their frames. | |
| analyze | No | With wsid, group retained frames by payload pattern/fingerprint. Use this to discover message types in noisy realtime traffic; it returns traffic statistics, group IDs, and sample stable frame indices. Follow with groupId or frameIndex for focused inspection. | |
| groupId | No | With wsid, list only frames from a pattern group such as A, B, or C. Run analyze=true first to discover group IDs. If analysis used direction, repeat the same direction because grouping is computed over that filtered frame set. | |
| pageIdx | No | Zero-based page for the active connection-list, frame-list, group-list, or analysis-group mode. Omit it for the first page. | |
| pageSize | No | Items per page: connections when wsid is omitted, frames in normal/group mode, or pattern groups when analyze=true. Defaults to 10. | |
| direction | No | With wsid, restrict frame-list, analysis, or group results to frames "sent" by the page or "received" from the server. It does not filter connection-list mode. | |
| urlFilter | No | In connection-list mode only (without wsid), return WebSocket URLs containing this substring. Use it to narrow by host, path, or query text. | |
| frameIndex | No | With wsid, return one retained frame and its payload by stable frame index. This is the Idx shown in frame tables or analyze=true samples, not a page-relative array offset. Indices are monotonic and may begin above 0 after older frames are evicted. | |
| show_content | No | With wsid in normal or group frame-list mode, include payload previews up to 10,000 characters for frames on the current page. Leave false for compact metadata, or use frameIndex when one exact frame needs detailed inspection. | |
| includePreservedConnections | No | In connection-list mode only (without wsid), include connections preserved from the last three navigations. Use this when the relevant socket belonged to a previous page state. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint and destructiveHint annotations, the description discloses key behaviors: lazy capture start, non‑retroactivity, stable frame indices, monotonic but non‑zero starting indices, and eviction of old frames. This adds substantial value over annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph covering all modes and behaviours. While efficient, it could benefit from breaking into bullet points or sections for easier scanning. Still, it earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, multiple modes, and the existence of an output schema, the description is fully complete. It covers initialisation, pagination, filtering, analysis mode, frame indices, and preservation of connections across navigations. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds operational meaning: explaining mode combinations (e.g., without wsid lists connections, with wsid lists frames, with analyze=true groups frames). Clarifies that frameIndex is stable, not page‑relative, and that direction filters but does not apply in connection‑list mode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool inspects captured bidirectional WebSocket connections and frame payloads. It names the resource (WebSocket messages) and accurately contrasts with sibling tool list_network_requests for ordinary HTTP traffic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when to use (WebSocket, socket, live-update, etc.) and when not (use list_network_requests for HTTP/XHR/fetch). Details initialisation caveat (lazy capture, not retroactive) and mode switching between connection listing and frame inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_breakpointsARead-only
Inspects code and XHR/Fetch breakpoints managed by this MCP session before reproducing an action or cleaning up debugger state. Returns current code breakpointIds and the exact XHR URL patterns needed by remove_breakpoint; URL-backed definitions are restored after navigation when possible, but a rebuilt debugger session may assign new IDs. This does not show why or where execution is currently paused—use get_paused_info for the active call stack.
| Name | Required | Description | Default |
|---|---|---|---|
| pageIdx | No | Page number (0-based). Defaults to 0. | |
| pageSize | No | Maximum items per page. Defaults to 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show readOnlyHint=true and destructiveHint=false. Description adds that URL-backed definitions may restore after navigation but IDs may change in rebuilt sessions, and that it returns breakpointIds and XHR patterns. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise with three sentences, front-loaded with main purpose. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Has output schema, so return details are covered. Description provides enough behavioral context for breakpoint inspection and restoration, given tool complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description does not add extra meaning beyond schema for pageIdx and pageSize parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool inspects code and XHR/Fetch breakpoints managed by the session. It uses specific verbs and resource, distinguishing itself from siblings like get_paused_info and remove_breakpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool: before reproducing an action or cleaning up debugger state. Also directs to use get_paused_info for active call stack, providing clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_console_messagesARead-only
Inspects console messages and uncaught page errors captured for the selected page. Use it to diagnose runtime failures, warnings, application logs, or values already emitted by page code; use search_in_sources for source text and list_network_requests for HTTP evidence instead. Without msgid it lists messages 20 per page by default, optionally filtered by type or retained navigation history. With msgid it returns one message by its stable ID for focused inspection. Capture begins when this MCP attaches and is not retroactive, so reload or reproduce code that logged before attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| msgid | No | Stable message ID returned by list mode. Pass it to inspect one captured console message; omit it to list messages. | |
| types | No | Console levels/types to include in list mode, such as error, warn, log, or trace. Values are OR-ed; omit or pass an empty array for all types. | |
| pageIdx | No | Page number to return (0-based). When omitted, returns the first page. | |
| pageSize | No | Maximum number of messages to return. Defaults to 20. | |
| includePreservedMessages | No | Include retained console messages from the last 3 navigations. Leave false when only the current page load is relevant. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, destructiveHint), description adds critical non-obvious behavior: capture starts on attachment and is not retroactive. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise 4-sentence description with front-loaded purpose and alternatives, then clear parameter and behavior details. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, output schema, and sibling tools, the description covers all essential aspects: modes, filtering, pagination, capture timing. Complete enough for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description adds value by explaining the dual modes (list vs single message), default page size, and optional filters. Slightly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool inspects console messages and uncaught page errors, with specific verb and resource. Differentiates from siblings by naming alternatives search_in_sources and list_network_requests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (diagnose runtime failures, logs, etc.) and when not to (use other tools for source or network). Also describes modes and parameters affecting usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_network_requestsA
Inspect captured HTTP(S) traffic for the currently selected page. Use this for API calls, request or response headers and bodies, redirects, authentication/session flows, replay or signing inputs, and determining which response created, refreshed, rotated, overwritten, or deleted a cookie. Without reqid it lists and filters requests; with cookieName it traces exact response Set-Cookie updates oldest-first, including cookies with HttpOnly, Secure, or SameSite attributes that page JavaScript cannot fully inspect; with reqid it returns bounded request details; with reqid plus outputFile it exports exact data. To inspect complete Set-Cookie values and attributes, export outputPart="responseHeaders" for a reqid returned by cookieName mode. cookieName never searches outbound Cookie request headers. Use get_websocket_messages for WebSocket frame payloads; this tool only represents the HTTP upgrade request. Capture begins when this MCP attaches and is not retroactive, so reload or reproduce traffic that occurred earlier. Captures then survive navigation in a 5000-request FIFO queue. List and cookie-flow modes default to 20 items per page; filters combine with AND and multiple values inside one filter combine with OR.
| Name | Required | Description | Default |
|---|---|---|---|
| reqid | No | Inspect one captured request by the reqid returned by request-list or cookie-flow mode. Omit it to list/filter requests or trace cookie setters. Add outputFile when exact, complete, or large data is needed. | |
| methods | No | Filter requests by HTTP method (the request verb). Matched case-insensitively. Pass one or more of GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS; multiple values are OR-ed (e.g. ["POST"] shows only POSTs, ["GET","POST"] shows both). Use this to hunt for submissions (POST/PUT/PATCH) versus reads (GET). This is the HTTP verb, distinct from resourceTypes which filters by resource category (xhr, document, ...). When omitted or empty, methods are not filtered. | |
| pageIdx | No | Zero-based page to return in request-list or cookie-flow mode. Omit it for the first page. | |
| pageSize | No | Maximum requests or Set-Cookie updates per page in list or cookie-flow mode. Defaults to 20. | |
| urlFilter | No | Filter request-list results to URLs containing this substring. Use an endpoint path, host, query fragment, or other known URL text; combine with methods/resourceTypes to narrow an API flow. | |
| cookieName | No | Trace an exact cookie name in response Set-Cookie headers. Use this when asked where, when, or by which response a cookie was created, refreshed, rotated, overwritten, or deleted, including HttpOnly cookies and cookies carrying Secure or SameSite attributes. Matching setter responses are returned oldest-first with reqids and use pageSize/pageIdx. Export outputPart="responseHeaders" for a returned reqid to inspect the complete value and Path, Domain, HttpOnly, Secure, SameSite, Expires, or Max-Age attributes. This mode does not search outbound Cookie request headers. | |
| outputFile | No | With reqid, save selected network data to a local file. Use export instead of bounded inline details for complete Set-Cookie headers, exact bytes, large or binary bodies, long query payloads, replay/signature inputs, or external decoding. Absolute paths and paths relative to the current working directory are supported. The response reports the resolved absolute path; use it with evaluate_script localFilePath for browser-side processing. Subject to --allowedRoots when configured. | |
| outputPart | No | Select what outputFile receives for the chosen reqid. Use "responseHeaders" for complete cookie attributes and repeated Set-Cookie headers, "responseBody" for raw response bytes, "requestBody" for captured request bytes, "queryParams" for parsed URL parameters, or "all" for a JSON bundle of metadata, headers, query parameters, and body content/metadata. Defaults to "all". | all |
| resourceTypes | No | Filter requests to only return requests of the specified resource types (xhr, fetch, document, script, ...). This is the resource category, NOT the HTTP verb — use methods for GET/POST filtering. When omitted or empty, returns all requests. | |
| confirmOverwrite | No | Must be true when outputFile already exists. New files do not require confirmation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are readOnlyHint=false, destructiveHint=false. The description adds rich behavioral context: capture starts on attach, not retroactive, survives navigation with 5000-request FIFO, filter logic, default pagination, cookieName limitations. No contradictions. Provides details beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with front-loaded purpose. Every sentence adds value, covering many modes and details. However, it is dense and could be slightly streamlined for a quick read, but given the complexity, it remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, multiple modes, output schema exists, the description is exceptionally complete. It addresses capture behavior, filter logic, pagination, export options, cookie tracing details, and limitations. No significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% so baseline is 3. The description adds extra meaning by explaining parameter interplay (e.g., cookieName + reqid flow, outputFile usage, pageSize default, filter AND/OR). Goes beyond schema by clarifying usage scenarios and combinations, but doesn't introduce entirely new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it inspects captured HTTP(S) traffic for the currently selected page, listing specific use cases like API calls, headers, auth flows, cookie tracing. It distinguishes from siblings by explicitly mentioning 'Use get_websocket_messages for WebSocket frame payloads; this tool only represents the HTTP upgrade request.' This provides a specific verb and resource, well differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Extensive usage guidance is provided: when to use cookieName vs reqid, when to export, default page sizes, AND/OR logic, non-retroactive capture, FIFO queue, and explicit alternative tool mention for WebSockets. Clear context for when and when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scriptsARead-only
Discovers JavaScript currently loaded in the selected debugger context—the main frame by default, or the frame chosen with select_frame. Use select_frame first for iframe-specific source/debugger work. Includes external, inline, and eval scripts in that context; if you already know a function name, endpoint, or code literal, use search_in_sources instead. Each result includes a context-scoped scriptId that expires on reload, navigation, or debugger target change and, for external scripts, a URL that is the preferred selector for get_script_source or save_script_source.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Case-insensitive URL substring used to narrow external scripts. It does not search source text or match unnamed inline/eval scripts; use search_in_sources for code-content queries. | |
| pageIdx | No | Page number (0-based). Defaults to 0. | |
| pageSize | No | Maximum items per page. Defaults to 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive. The description adds valuable context: scriptId expires on reload/navigation/target change, and URL is the preferred selector for get/save_script_source. This goes beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is informative but not overly verbose. It front-loads the purpose, then usage notes, then parameter clarifications, and ends with result structure. Could be slightly more concise but overall well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters, annotations, and an output schema (not shown but present), the description covers necessary context: result items include scoped scriptId and URL, with expiration behavior. No gaps for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters with descriptions. Description adds clarity: filter is case-insensitive URL substring and does not search source text, with a reference to search_in_sources for code queries. This extra guidance justifies a 4 instead of baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it discovers JavaScript loaded in the selected debugger context, specifying script types (external, inline, eval) and context scope (main frame or selected frame). It distinguishes from sibling tool search_in_sources by indicating when to use that alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells users to use select_frame first for iframe-specific work, and to use search_in_sources when they know a function name, endpoint, or code literal. Also clarifies that filter does not search source text, so users know its limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_pageA
Opens a separate browser page for a URL, reusing an existing about:blank startup tab when available. Use this when the task needs another tab or should preserve the currently selected page; use navigate_page to change the URL in the existing selected page instead. It waits for DOMContentLoaded, not every background resource, and then makes the opened page the target for later tools. It preserves cookies, storage, cache, and other browser state; use clear_site_data separately when a clean replay is required.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute URL to load in a separate or reusable blank page. Use navigate_page instead when the current selected page should be reused. | |
| timeout | No | Maximum wait time in milliseconds. If set to 0, the default timeout will be used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations (readOnlyHint: false, destructiveHint: false) by detailing behavioral traits: it waits for DOMContentLoaded (not every resource), makes the opened page the target for later tools, and preserves cookies/storage/cache. It also mentions using clear_site_data separately for a clean replay. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, well-structured: first sentence states the main action, second provides usage guidance, third adds behavioral details, fourth mentions state preservation. No redundant or unnecessary information; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and parameters are fully described in the schema, the description provides sufficient context: what the tool does, when to use it, behavioral characteristics, and contrast with sibling. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the context of the url parameter (absolute URL, reusing about:blank tab), which is not fully captured in the schema's description. However, the timeout parameter is not elaborated beyond the schema, so not a perfect 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool opens a separate browser page for a URL, reusing an existing about:blank startup tab. It distinguishes itself from the sibling navigate_page by specifying that navigate_page changes the URL in the existing selected page, making the purpose specific and well-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool (when the task needs another tab or should preserve the currently selected page) and when to use the alternative (navigate_page to change the URL in the existing selected page). This provides clear guidelines for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_or_resumeA
Explicitly requests an immediate pause or resumes an existing paused execution; it never toggles implicitly. Use a code breakpoint or break_on_xhr instead when a specific statement/request should stop, and use get_paused_info before resuming if evidence must be collected. Resuming invalidates current callFrameIds and frame indices.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Use "pause" only while running, or "resume" only after a breakpoint/manual pause. Resume after get_paused_info/evaluate_script/step inspection is complete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses state-changing behavior and invalidation side effect. While annotations are limited, description adds useful context beyond them. Could be improved by noting error scenarios.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, front-loaded with main purpose, then alternatives and side effects. No redundant sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a simple tool: single parameter fully described, usage prerequisites, side effect noted. Given schema coverage and output schema presence, further detail unnecessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers enum with descriptions; description adds valuable usage tips (when to use each value, ordering) that go beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it pauses or resumes execution explicitly, never toggles. Contrasts with break_on_xhr and step, providing clear purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when to use alternatives (break_on_xhr, get_paused_info) and warns that resuming invalidates callFrameId, offering clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_breakpointADestructiveIdempotent
Removes a known code breakpoint, XHR/Fetch breakpoint, or every MCP-managed breakpoint after explicit confirmation. Use breakpointId from set_breakpoint_on_text/list_breakpoints for remove_code, or reuse the exact URL pattern from break_on_xhr/list_breakpoints for remove_xhr. Removal does not resume an already paused page; call pause_or_resume(action="resume") separately after inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Exact URL substring pattern previously passed to break_on_xhr or returned by list_breakpoints. Used only with action="remove_xhr". | |
| action | Yes | Required removal mode: remove_code needs breakpointId, remove_xhr needs url, and remove_all removes both kinds. | |
| confirm | No | Must be true to authorize the selected removal action. This does not authorize or trigger resuming execution. | |
| breakpointId | No | Current breakpoint ID returned by set_breakpoint_on_text or list_breakpoints. Used only with action="remove_code"; list again after a debugger/page-session rebuild because restoration may assign a new ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that removal does not resume a paused page, requires confirmation, and that breakpointId may need to be re-obtained after a debugger rebuild. This adds context beyond annotations (destructiveHint, idempotentHint, readOnlyHint) without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that are front-loaded with the primary action and then provide usage specifics. No redundant or extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, 1 required, and an output schema, the description covers all essential aspects: removal modes, parameter usage, confirmation requirement, post-removal behavior, and edge case handling (breakpointId rebuild). Complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds meaning to each parameter: explains url as an exact substring pattern, breakpointId caveat about session rebuild, confirm's authorization role, and action enum values. This enhances understanding beyond the schema's brief descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the verb 'removes' and the resource 'breakpoint' with three distinct removal modes (code, XHR, all). It references sibling tools (set_breakpoint_on_text, break_on_xhr, list_breakpoints, pause_or_resume) to differentiate when each mode is applicable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance on when to use each action: use breakpointId from set_breakpoint_on_text/list_breakpoints for remove_code, use exact URL pattern from break_on_xhr/list_breakpoints for remove_xhr. Also clarifies that removal does not resume a paused page and suggests calling pause_or_resume separately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_script_sourceA
Saves one complete JavaScript or WASM source for local inspection when an inline snippet is insufficient, especially for large or minified bundles. Prefer get_script_source for a small known region and search_in_sources to locate text across loaded scripts first. With format=true, destinations using a supported JavaScript/TypeScript extension are formatted by default; other extensions preserve raw source, and formatted line numbers may differ from the live page. Use distinctive text plus the original URL with set_breakpoint_on_text for runtime debugging. The returned filename is the resolved local path, while scriptId remains scoped to the current debugger context.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL from list_scripts, search_in_sources, or a call stack. Preferred over scriptId because it can be resolved again after navigation; exact match is tried before substring match. | |
| format | No | Format supported JavaScript/TypeScript extensions for readability (default: true). Set false when exact source bytes or original line layout matter; formatted line numbers cannot be used as live breakpoint locations. | |
| filePath | Yes | Destination path for the complete source, absolute or relative to the server working directory and subject to --allowedRoots. A JavaScript/TypeScript extension enables formatting; use .wasm for bytecode or another extension to preserve raw text. | |
| scriptId | No | Debugger-context-scoped script ID from list_scripts or search_in_sources. Use for unnamed inline/eval scripts; it becomes invalid after reload, navigation, or debugger target/frame change. | |
| confirmOverwrite | No | Set true only to authorize replacing an existing filePath. A new file does not require overwrite confirmation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: formatted line numbers may differ from live page, filePath is the resolved local path, and scriptId is scoped to current debugger context and becomes invalid after navigation/refresh. Annotations show readOnlyHint=false and destructiveHint=false, which are consistent. One minor gap: it doesn't mention that the saved file persists or any access restrictions beyond --allowedRoots.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but every sentence is informative. It is front-loaded with the main purpose. While slightly long, it avoids redundancy. Could be trimmed slightly, but overall effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters with rich schema, output schema present, the description covers purpose, sibling differentiation, behavioral nuances, and parameter semantics. It mentions the returned filename implicitly. No obvious gaps for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant context for each parameter. For url, it explains preferred source and matching strategy. format is described with clear use cases. filePath explains extension implications. scriptId clarifies scoping and invalidation. confirmOverwrite notes authorization. This goes well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool saves a complete JavaScript or WASM source for local inspection when an inline snippet is insufficient. It differentiates from siblings by mentioning 'Prefer get_script_source for a small known region and search_in_sources to locate text across loaded scripts first.' The specific verb 'saves' and resource 'source' make purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: prefer get_script_source for small regions, use search_in_sources first, and use set_breakpoint_on_text for debugging. It also clarifies when to set format=false and when to use confirmOverwrite. This helps the agent decide when to invoke this tool over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_in_sourcesARead-only
Finds a known function name, endpoint, string literal, token, or code pattern in JavaScript loaded by the selected debugger context—the main frame by default, or the frame chosen with select_frame. It searches external, inline/eval, and minified sources in that context without executing or pausing the page, returning 1-based lines plus context-scoped scriptIds; URLs are the preferred selectors for URL-backed matches. Use select_frame first for iframe-specific source work, get_script_source for nearby context, save_script_source for a whole bundle, or set_breakpoint_on_text when runtime values are needed. For a known captured request, prefer get_request_initiator before a broad source search.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Source text to locate, or a regular-expression pattern when isRegex=true. Prefer a distinctive function name, endpoint, property, or literal that can also anchor set_breakpoint_on_text. | |
| isRegex | No | Interpret query as a regular expression when true. Leave false for literal endpoint, token, and code-text searches. | |
| urlFilter | No | Case-insensitive script-URL substring used to narrow matches to a known bundle or domain. It excludes unnamed inline/eval scripts. | |
| maxResults | No | Maximum matches to return (default: 30). Narrow with urlFilter before increasing this for common text. | |
| caseSensitive | No | Match case exactly when true. Leave false for discovery; set true when choosing exact code text for a breakpoint. | |
| maxLineLength | No | Maximum characters in each matched-line preview (default: 150). Use get_script_source rather than a very large preview when surrounding context is needed. | |
| excludeMinified | No | Skip sources with very long lines when true. Keep the default false for reverse engineering because relevant code often exists only in compressed bundles. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false. The description adds behavioral details: searches without executing or pausing the page, returns 1-based lines plus context-scoped scriptIds, and URLs are preferred selectors. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into two paragraphs: first explaining what the tool does and how it works, second providing usage guidance. Every sentence adds value, and there is no redundancy. It is appropriately sized for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, output schema exists), the description is complete. It covers behavioral aspects, return elements, and usage context. The output schema exists, so return values need not be elaborated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. However, the description adds extra meaning for several parameters: urlFilter 'excludes unnamed inline/eval scripts', maxLineLength suggests using get_script_source for surrounding context, excludeMinified explains why keeping default false is best for reverse engineering. This additional context pushes the score to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds function names, endpoints, string literals, tokens, or code patterns in JavaScript sources. It specifies the scope (selected debugger context, main frame or chosen frame) and distinguishes from siblings by mentioning related tools like select_frame, get_script_source, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool vs alternatives: use select_frame first for iframe-specific work, get_script_source for nearby context, save_script_source for whole bundle, set_breakpoint_on_text when runtime values are needed, and get_request_initiator for a known captured request. It also mentions to prefer get_request_initiator before a broad source search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_frameA
Lists or selects frames, including iframes, within the current page. Use it when the target element, page-defined global, script, or execution context may live in an iframe: first list frames, then pass frameIdx before click_element or evaluate_script. Omitting frameIdx lists 20 frames per page without changing context; passing frameIdx changes the shared frame target, with 0 restoring the main frame. It does not switch browser tabs or navigate—use select_page or navigate_page for those actions—and listPageIdx only paginates this listing.
| Name | Required | Description | Default |
|---|---|---|---|
| frameIdx | No | Frame index from the latest frame listing. Pass it to target later frame-aware tools; 0 restores the main frame. Omit it to list frames without changing context, and re-list after navigation or frame attachment/detachment because indices can shift. | |
| pageSize | No | Maximum frames to list per response. Defaults to 20. | |
| listPageIdx | No | Zero-based pagination index for the frame listing only. This is not the frameIdx used to select a frame. Defaults to 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavioral traits beyond annotations: omitting frameIdx lists without changing context; passing frameIdx changes target; indices shift after navigation or frame changes. No contradiction with readOnlyHint=false (mutates state) and destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense paragraph front-loads purpose, then usage, then behavior, then exclusions. Each sentence adds value; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (3 params, output schema), the description covers purpose, workflow, side effects, and exclusions. It references sibling tools for related actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds workflow context but does not significantly expand parameter meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Lists or selects frames, including iframes, within the current page.' It specifies the verb (lists or selects) and resource (frames within current page), and distinguishes from siblings like select_page and navigate_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use: 'when the target element... may live in an iframe' and provides a workflow: first list frames, then pass frameIdx before click_element or evaluate_script. Also tells when not to use: 'It does not switch browser tabs or navigate—use select_page or navigate_page for those actions.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_pageA
Lists or selects open browser pages. Use it without pageIdx to identify the active page or choose the correct tab before inspecting network traffic, scripts, frames, or console output; pass pageIdx to make one listed page the shared target for later tools. It does not navigate or create pages: use navigate_page to change the selected page's URL and new_page when a separate tab is required. listPageIdx only paginates the page listing and never changes selection.
| Name | Required | Description | Default |
|---|---|---|---|
| pageIdx | No | Snapshot index from the latest page listing. Pass it to make that page the target for later tools; omit it to list pages without changing selection. Re-list after pages open or close because indices can shift. | |
| pageSize | No | Maximum pages to list per response. Defaults to 20. | |
| listPageIdx | No | Zero-based pagination index for the page listing only. This is not the pageIdx used to select a browser page. Defaults to 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the behavioral nuance: listing does not change selection, passing pageIdx makes it the target. This adds value beyond the annotations, which only indicate non-destructive behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no fluff, front-loaded with the core purpose. Every sentence adds necessary detail without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of selection and pagination, the description is complete. It covers all key behaviors and constraints, and an output schema exists so return values need not be detailed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good descriptions, but the tool description adds context about how each parameter affects behavior (e.g., pageIdx changes selection, listPageIdx only paginates). This enhances understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists or selects open browser pages, with a specific verb and resource. It distinguishes from sibling tools like navigate_page and new_page by stating what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use without pageIdx vs with pageIdx, and provides alternatives (navigate_page, new_page). It also clarifies that listPageIdx only paginates and never changes selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_breakpoint_on_textA
Sets a restorable URL-backed breakpoint when distinctive code text is known and its runtime values must be observed. Call it directly when the user already supplies precise text plus any URL/occurrence disambiguation; use search_in_sources/get_script_source first only when the location is unknown or ambiguous. For an API with no known code location, start with list_network_requests and get_request_initiator or use break_on_xhr. On a hit, call get_paused_info, optionally evaluate_script, then step or resume. Returns the current breakpointId for remove_breakpoint; list breakpoints again after a rebuilt debugger session, and note that unnamed inline/eval scripts cannot use this URL breakpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Exact case-sensitive source text used to locate the breakpoint, such as a distinctive function declaration, call, or statement. Prefer a snippet confirmed by search_in_sources and avoid common tokens. | |
| condition | No | Optional simple synchronous expression evaluated in the future call frame; the breakpoint pauses only when it is true. Use it to reduce repeated hits after the location is precise, never for async work, complex discovery, or side effects. | |
| urlFilter | No | Case-insensitive URL substring that limits candidate scripts. Use the URL from search_in_sources/get_script_source to avoid the same text in unrelated bundles. | |
| occurrence | No | One-based occurrence among matching loaded-source results (default: 1). Use only after reviewing multiple search matches; urlFilter is usually the more stable disambiguator. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond annotations: restorable, returns breakpointId, limitation for inline/eval scripts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense single paragraph, front-loads purpose, but could be slightly more structured for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, workflow, return value, and limitations; output schema covers return details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds valuable guidance for each parameter (e.g., prefer confirmed snippet, condition restrictions, urlFilter source, occurrence usage).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it sets a URL-backed breakpoint on text, distinguishes from siblings like search_in_sources, break_on_xhr.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call directly vs. use alternatives (search_in_sources, break_on_xhr) and provides workflow after hit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stepA
Advances JavaScript execution by one debugger operation from an existing pause and returns the next stopped call frame with concise source context. Use after get_paused_info or evaluate_script when control flow still needs tracing; it cannot start from running execution. Each advance invalidates prior callFrameIds, so inspect the new pause again as needed, then use pause_or_resume(action="resume") to finish.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | Yes | Choose "over" for the next statement without entering calls, "into" to follow a call, or "out" to continue until the current function returns. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false. The description adds critical behavioral details: invalidates prior callFrameIds, requires existing pause, and returns next call frame. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is efficient and front-loaded with the main action. Three sentences cover behavior, prerequisites, and follow-up without fluff. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given full parameter schema, annotations, and output schema, the description is complete. It covers prerequisites, invalidation, and next steps, leaving no gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for the direction parameter. The tool description does not add extra meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it advances JavaScript execution by one debugger operation from a pause, with a specific verb and resource. It distinguishes from siblings like pause_or_resume and get_paused_info by specifying its role in tracing control flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use after get_paused_info or evaluate_script when control flow needs tracing, and not from running execution. Also directs to use pause_or_resume to finish, providing clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_screenshotA
Captures the visual state of the currently selected page. Use it to verify page layout, visible UI state, selector targets, in-page dialogs/modals, or the effect of a navigation/click; it is not a substitute for DOM values, network evidence, or script inspection. By default it returns the visible viewport, while fullPage=true captures the whole document; oversized captures may be saved as a temporary artifact instead of attached. Pass filePath for a reusable local artifact; existing files require confirmOverwrite=true and remain subject to --allowedRoots.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Image format for the attachment or saved file. Defaults to png; use jpeg when smaller lossy output is preferred. | png |
| quality | No | Compression quality for JPEG format (0-100). Higher values mean better quality but larger file sizes. Ignored for PNG format. | |
| filePath | No | Optional absolute or working-directory-relative path for a reusable screenshot artifact. Omit it to attach the image directly. Subject to --allowedRoots when configured. | |
| fullPage | No | Capture the entire scrollable document when true; leave false or omit it for the currently visible viewport. | |
| confirmOverwrite | No | Must be true when filePath already exists. New files do not require confirmation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the tool completed successfully. |
| data | No | Machine-readable result payload. |
| tool | Yes | Stable MCP tool name. |
| error | No | |
| summary | Yes | Concise human-readable outcome. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, destructiveHint=false); description adds critical behavioral details: default viewport vs. fullPage, oversized capture handling, filePath behavior and confirmOverwrite requirement, fully disclosing tool behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise 4-sentence description, front-loaded with purpose and usage, no repetition or fluff, efficiently communicates all necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 optional parameters, full schema documentation, and presence of output schema, the description covers purpose, usage, behavioral nuances, and key parameter implications, making it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. Description adds minimal param-specific insight beyond schema (e.g., fullPage behavior, oversized captures), but does not significantly enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Captures the visual state of the currently selected page.' and distinguishes from sibling tools by specifying it is not a substitute for DOM values, network evidence, or script inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists use cases (verify page layout, UI state, etc.) and explicitly states when not to use it (not for DOM, network, or script), providing clear guidance for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
24 tool updates
v4.0.1- First observed
break_on_xhr - First observed
clear_network_requests - First observed
clear_site_data - First observed
click_element - First observed
evaluate_script - First observed
get_paused_info - First observed
get_request_initiator - First observed
get_script_source - First observed
get_websocket_messages - First observed
list_breakpoints - First observed
list_console_messages - First observed
list_network_requests - First observed
list_scripts - First observed
navigate_page - First observed
new_page - First observed
pause_or_resume - First observed
remove_breakpoint - First observed
save_script_source - First observed
search_in_sources - First observed
select_frame - First observed
select_page - First observed
set_breakpoint_on_text - First observed
step - First observed
take_screenshot
TDQS
Scored across 24 tools
Tools are organized around specific debugging actions, but many overlap in purpose (e.g., multiple breakpoint and pause/resume tools, multiple request inspection tools). While descriptions are precise, an agent could easily confuse which tool to use for a given step, especially with 24 tools.
Most tools follow a verb_noun pattern in snake_case (e.g., clear_network_requests, click_element). A few deviate slightly (e.g., 'break_on_xhr', 'get_paused_info'), but overall the naming is predictable and readable.
24 tools is on the higher side for a focused reverse engineering server. The set is comprehensive but some tools could be merged (e.g., clear_network_requests and clear_site_data are distinct but very similar). Still, each tool has a clear role, so the count is borderline but acceptable.
The tool surface covers all major aspects of JavaScript reverse engineering: network interception, source inspection, breakpoint management, page control, and evaluation. Minor gaps exist (e.g., no direct DOM query tool), but the set is largely complete for its purpose.
Maintenance
Related MCP Connectors
Live browser debugging for AI assistants — DOM, console, network via MCP.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Captured web interfaces, screenshots, flows and structured evidence for AI coding agents.
Headless browser primitives for AI agents when sites need real JS rendering.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to debug frontend applications by providing direct access to browser DevTools, React state, DOM inspection, and runtime debugging capabilities. Bridges the gap between AI and complex web applications for autonomous debugging and issue resolution.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI coding assistants to control and inspect a live Chrome browser through Chrome DevTools. Provides browser automation, performance analysis, debugging capabilities, and network request monitoring.1,737,496 npm53,859Apache 2.0
- AlicenseAqualityCmaintenanceEnables AI assistants to debug JavaScript and TypeScript applications by connecting to Chrome DevTools Protocol-compatible debuggers, allowing them to set breakpoints, step through code, inspect variables, and evaluate expressions with full source map support.1810 npm2Apache 2.0
- AlicenseNot gradedqualityDmaintenanceProvides comprehensive Chrome browser debugging capabilities including DOM inspection, network monitoring, console logs, JavaScript execution, breakpoint debugging, and screenshot capture for AI-assisted frontend development.5MIT