dependabot[bot]
7c9ff36178
chore(deps-dev): bump chrome-devtools-frontend from 1.0.1591204 to 1.0.1592362 in the bundled-devtools group ( #1098 )
...
Bumps the bundled-devtools group with 1 update:
[chrome-devtools-frontend](https://github.com/ChromeDevTools/devtools-frontend ).
Updates `chrome-devtools-frontend` from 1.0.1591204 to 1.0.1592362
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/22b657d21f73350906f5029706d576d18817f011 "><code>22b657d</code></a>
Update DevTools DEPS (trusted)</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/0d56199f472ca4a345cc7e2d364b241c7ec01a66 "><code>0d56199</code></a>
Host experiment for JPEG XL support</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/a2886d7263db7cd56fcc024baf121ce2e4bacf51 "><code>a2886d7</code></a>
Update Context Selection Agent preamble</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/eb79da005f6e25c84235e6f077d25a12d8533a57 "><code>eb79da0</code></a>
Remove hover effect for title help keyboard accessibility in metric
card</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/9a6eb09d15986ffb176a95dccc3e1ac901bf14dd "><code>9a6eb09</code></a>
Linkify codespan to satisfy LLM</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/952a0ddc8d00a46578ae0aefa77d03123b80bec3 "><code>952a0dd</code></a>
[GreenDev] Add descriptions to investigation steps</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/ddd57a4b0abedf94bbbcfe18aff6259716e5f011 "><code>ddd57a4</code></a>
[GreenDev] Let agent execute JS in console and apply a fix to
sources</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/a22023592a98c7269216b1d23e12d6e2f77ad3f9 "><code>a220235</code></a>
DevTools: Support screen.orientation.lock() in device emulation</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/50b6db7a82db093ae58e6cf7e0b84ac6ad43a063 "><code>50b6db7</code></a>
Linkify links in the markdown response from LLM</li>
<li><a
href="https://github.com/ChromeDevTools/devtools-frontend/commit/a8f9701a9117e9e735b1bc64f35491f8f3389722 "><code>a8f9701</code></a>
Report the expected test name</li>
<li>Additional commits viewable in <a
href="https://github.com/ChromeDevTools/devtools-frontend/compare/v1.0.1591204...v1.0.1592362 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions
</details>
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: Alex Rudenko <alexrudenko@chromium.org >
2026-03-04 16:13:27 +00:00
dependabot[bot]
a073c0c54b
chore(deps-dev): bump puppeteer from 24.37.5 to 24.38.0 in the bundled group ( #1099 )
...
Bumps the bundled group with 1 update:
[puppeteer](https://github.com/puppeteer/puppeteer ).
Updates `puppeteer` from 24.37.5 to 24.38.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/puppeteer/puppeteer/releases ">puppeteer's
releases</a>.</em></p>
<blockquote>
<h2>puppeteer-core: v24.38.0</h2>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-core-v24.37.5...puppeteer-core-v24.38.0 ">24.38.0</a>
(2026-03-04)</h2>
<h3>🎉 Features</h3>
<ul>
<li>roll to Chrome 146.0.7680.31 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14729 ">#14729</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/627eb5e6572f5248286ab09d74c204e2399632e8 ">627eb5e</a>)</li>
<li>roll to Firefox 148.0 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14728 ">#14728</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/09b655a1a4b2ee389f4a63f701a347566a5b9d88 ">09b655a</a>)</li>
</ul>
<h3>🛠️ Fixes</h3>
<ul>
<li>consider browsingContext.navigationCommitted to dispose an existing
navigation (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14724 ">#14724</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/b4e92c637c503710895c842f391793018c4f35b5 ">b4e92c6</a>)</li>
<li>disable PartitionAllocSchedulerLoopQuarantineTaskControlledPurge (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14744 ">#14744</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/e6c7425d3f459adfbf5c1dd0b230da33fa9eb7c3 ">e6c7425</a>)</li>
<li>roll to Chrome 145.0.7632.117 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14719 ">#14719</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/1d407e1e69ee0f307f8819152a980fa0a24835ff ">1d407e1</a>)</li>
</ul>
<h2>puppeteer: v24.38.0</h2>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.37.5...puppeteer-v24.38.0 ">24.38.0</a>
(2026-03-04)</h2>
<h3>🎉 Features</h3>
<ul>
<li>roll to Chrome 146.0.7680.31 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14729 ">#14729</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/627eb5e6572f5248286ab09d74c204e2399632e8 ">627eb5e</a>)</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li>The following workspace dependencies were updated
<ul>
<li>dependencies
<ul>
<li>puppeteer-core bumped from 24.37.5 to 24.38.0</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md ">puppeteer's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.37.5...puppeteer-v24.38.0 ">24.38.0</a>
(2026-03-04)</h2>
<h3>🎉 Features</h3>
<ul>
<li>roll to Chrome 146.0.7680.31 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14729 ">#14729</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/627eb5e6572f5248286ab09d74c204e2399632e8 ">627eb5e</a>)</li>
<li>roll to Firefox 148.0 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14728 ">#14728</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/09b655a1a4b2ee389f4a63f701a347566a5b9d88 ">09b655a</a>)</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li>The following workspace dependencies were updated
<ul>
<li>dependencies
<ul>
<li>puppeteer-core bumped from 24.37.5 to 24.38.0</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>🛠️ Fixes</h3>
<ul>
<li>consider browsingContext.navigationCommitted to dispose an existing
navigation (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14724 ">#14724</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/b4e92c637c503710895c842f391793018c4f35b5 ">b4e92c6</a>)</li>
<li>disable PartitionAllocSchedulerLoopQuarantineTaskControlledPurge (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14744 ">#14744</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/e6c7425d3f459adfbf5c1dd0b230da33fa9eb7c3 ">e6c7425</a>)</li>
<li>roll to Chrome 145.0.7632.117 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14719 ">#14719</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/1d407e1e69ee0f307f8819152a980fa0a24835ff ">1d407e1</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/d3356fac46478974c5b88ba2b26b26954cb741ff "><code>d3356fa</code></a>
chore: release main (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14720 ">#14720</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/e6c7425d3f459adfbf5c1dd0b230da33fa9eb7c3 "><code>e6c7425</code></a>
fix: disable PartitionAllocSchedulerLoopQuarantineTaskControlledPurge
(<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14744 ">#14744</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/e24f43290280df6398e992842490631aafd9f287 "><code>e24f432</code></a>
chore(deps-dev): bump the dev-dependencies group across 1 directory with
7 up...</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/b12fca9bd9bedb9c90863c52e7359cfbf281a81e "><code>b12fca9</code></a>
test: update tests and add diagnostics (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14741 ">#14741</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/627eb5e6572f5248286ab09d74c204e2399632e8 "><code>627eb5e</code></a>
feat: roll to Chrome 146.0.7680.31 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14729 ">#14729</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/e0e3e89aa4d7e1825d411a4729a76a0852824c83 "><code>e0e3e89</code></a>
chore: enable blank issues in issue template configuration (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14739 ">#14739</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/ba19944981f4e601127a5b7b54feefd1df972cbe "><code>ba19944</code></a>
chore(deps-dev): bump rollup from 4.22.4 to 4.59.0 in
/examples/puppeteer-in-...</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/b4e92c637c503710895c842f391793018c4f35b5 "><code>b4e92c6</code></a>
fix: consider browsingContext.navigationCommitted to dispose an existing
navi...</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/57b40c03e11ec5defebfa30cb9fcea5d6f6ae572 "><code>57b40c0</code></a>
chore(deps): bump typed-query-selector from 2.12.0 to 2.12.1 in the
dependenc...</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/eca8ca4b90c9e16a86152a62ed8839119c4386a3 "><code>eca8ca4</code></a>
chore(deps): bump the all group in /website with 2 updates (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14732 ">#14732</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.37.5...puppeteer-v24.38.0 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions
</details>
---------
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Alex Rudenko <alexrudenko@chromium.org >
2026-03-04 15:58:19 +00:00
Alex Rudenko
cb0079efbb
refactor: simplify the response texts ( #1095 )
...
- removed redundant headers in Markdown
- updates more tests to use snapshots
2026-03-04 07:23:37 +00:00
Alex Rudenko
109bf43e4c
chore: fix arg forwarding in CLI ( #1084 )
...
Drive-by: e2e tests for major scenarios.
Drive-by: make stopDaemon more robust.
2026-03-03 17:47:01 +00:00
Nicholas Roscino
8dbf862549
test: installing chrome through test script ( #1085 )
...
Fixes local test failing for triggerAction on extensions.
2026-03-03 16:06:18 +00:00
Alex Rudenko
82f9e6539d
chore: handle CLI responses and formats ( #1080 )
...
Initial handling for CLI responses. Note that image responses are not
supported yet.
2026-03-03 12:30:08 +00:00
Nicholas Roscino
e5973fd021
chore: implement trigger extension action ( #1049 )
...
This PR implements the ability to trigger an extension action by passing
it an extension id.
It uses puppeteer internals and the canary chrome version in tests since
the TriggerAction CDP command is still not available in the current
stable release.
2026-03-02 16:21:58 +00:00
Alex Rudenko
9d173cd3f2
chore(deps): update lh bundle ( #1078 )
...
Produced by `npm run update-lighthouse`.
2026-03-02 15:40:15 +00:00
Alex Rudenko
e51ba47203
fix: simplify emulation and script tools ( #1073 )
...
- reduces the token usage.
- makes emulation and script compatible with CLI.
- documents .nullable() and .object() restrictions for the future.
- the emulation tools do not have nullable anymore and undefined would
clear the emulation instead. The model is thus required to provide all
emulation settings at once.
Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/918
2026-03-02 13:31:55 +00:00
Nicholas Roscino
505089c288
chore: evaluate script on service workers ( #1052 )
...
This PR introduce script evaluation on service workers behind the flag
--category-extension.
2026-02-27 13:29:17 +00:00
Alex Rudenko
f763da24a1
fix: simplify focus state management ( #1063 )
...
Simplify focus management by emulating focused state for all pages. This
is especially useful in the new multi agent use case.
2026-02-27 14:10:00 +01:00
Alex Rudenko
9628dabcb4
refactor: clean up more of the context getters ( #1062 )
...
- moves more code to the McpPage
- deleted Context specific tests
2026-02-27 12:53:20 +00:00
Alex Rudenko
4cb5a17b57
refactor: remove page passing via context ( #1061 )
...
- removes several redundant getters on the context.
- removes passing page instances via context.
2026-02-27 12:08:10 +00:00
Alex Rudenko
d6c06c56a7
refactor: make cdp resolvers use McpPage ( #1060 )
...
Makes cdp resolvers scoped to the page. Once collectors are per McpPage,
the entire method could be moved to McpPage.
2026-02-27 10:58:49 +00:00
Alex Rudenko
40c241bbfc
refactor: move dialog handling to McpPage ( #1059 )
...
- renamed getSelectedPage to getSelectedPptrPage
- removes getSelectedPptrPage from tool interfaces
- moves dialog handling to McpPage
- makes responses to be optionally McpPage-scoped
2026-02-27 11:49:43 +01:00
Alex Rudenko
302e5a0419
refactor: consistently use McpPage in tools ( #1057 )
...
Follow-up to
https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/caf601a32832bb87cfac801a6bbeacb87508412f
The work is not complete and as a follow-up I will handle other Context
methods and moved whatever is relevant to the McpPage. Also, duplicate
getters would go away.
2026-02-27 09:41:08 +00:00
Alex Rudenko
13a18e2380
chore: implement daemon client ( #1037 )
...
The client is meant to start the daemon if it is not running or connect
to the existing one. Long-running client connections are not needed yet.
Removed previous direct daemon test as we better test it via the client,
the intended way to manage the daemon.
2026-02-26 15:03:21 +00:00
Alex Rudenko
5f694c60ff
refactor: improve type safety for page scoped tools ( #1051 )
...
I think we should create proper classes for tool definitions soon.
Follow-up for
https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/1022
2026-02-26 14:33:57 +00:00
Alex Rudenko
dfdac2648e
feat: integrate Lighthouse audits ( #831 )
...
This PR adds tool to perform navigation and snapshot audits using
Lighthouse for Accessibility, SEO and Best practices. For performance
audits existing tools can be used.
Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/473
2026-02-26 12:30:45 +00:00
Stanislav Publika
caf601a328
feat: add pageId routing for parallel multi-agent workflows ( #1022 )
...
## Summary
Adds optional `pageId` routing to page-scoped tools, gated behind
`--experimental-page-id-routing`. When enabled, multi-agent callers can
target a specific page without relying on global selection state. Fully
backward-compatible: without the flag, behavior is unchanged.
### Key changes
- **`pageScoped` annotation**: tools declare `pageScoped: true`; the
server merges `pageId` into their schema at registration time (when the
flag is on)
- **`McpPage` wrapper**: consolidates per-page state (numeric id,
isolated context name, focus tracking) into a single class
- **Request-scoped page routing**: `resolvePageById()` resolves the
target page, `setRequestPage()` threads it through the handler so tools
like `getSelectedPage()` see the right page
- **`assertPageIsFocused`**: keyboard/input tools validate that the
target page holds browser focus, returning an actionable error ("call
select_page first") instead of silently dispatching to the wrong page
- **`--experimental-page-id-routing` CLI flag** (hidden): gates schema
injection and request-scoped routing so the feature can be tested before
graduating
- **Eval scenarios**: `page_id_routing_test` and
`page_focus_keyboard_test` with `serverArgs` support in the eval harness
Addresses #1019
2026-02-26 11:39:38 +00:00
Nicholas Roscino
1a4eaba95b
chore: list service workers ( #1035 )
...
This PR adds the extension service workers to the output of listPages.
This is available only behind "--category-extensions" flag
2026-02-25 13:49:37 +00:00
Nicholas Roscino
25638f093b
chore: enable dynamic tool definition based on CLI arguments ( #1031 )
...
This PR allows tools to be created dynamically based on the provided cli
arguments
2026-02-24 17:01:33 +00:00
Alex Rudenko
1746ed9ee1
fix: detect X server display on Linux ( #1027 )
...
in headful mode on Linux we should try detecting X server if DISPLAY is
not set.
2026-02-24 14:35:55 +00:00
Alex Rudenko
dd26bbf172
chore: implement a daemon process ( #1020 )
...
Implements a daemon process needed for the CLI. The daemon has commands
to start/stop itself as well as an ability to forward data to the
managed MCP server. Local sockets or named pipes are used depending on
the platform.
The .sock and .pid files are placed under
XDG_RUNTIME_DIR/chrome-devtools-mcp or /tmp/chrome-devtools-mcp for
short socket paths.
It uses Puppeteer's PipeTransport to avoid re-implementing \0 terminated
messages.
Note the code is not used anywhere at the moment.
2026-02-24 13:48:36 +00:00
Alex Rudenko
ca6635d5a5
refactor: optimize slim tool descriptions and params ( #1028 )
...
Minor changes to shorten descriptions and improve ease of use.
Note that `--slim` mode is not released yet and this is an improvement
for it.
2026-02-24 13:28:04 +00:00
Alex Rudenko
b5d01b5fe6
feat: support type_text ( #1026 )
...
`type_text` is useful for pages that do not have a11y and, thus, uid is
not known. It's also useful for testing user-like keyboard input and
testing the focus state changes. The `fill` tools force the focus change
and require an uid and therefore are not suitable for these tasks.
2026-02-24 09:05:24 +00:00
Ashutosh Kumar
496ab1b45f
feat: support any-match text arrays in wait_for ( #1011 )
...
## Summary
Enhances wait_for to support waiting on multiple possible texts and
resolve when any one appears.
This addresses long-running flows that can end in different UI outcomes
(for example, "Complete" or "Error"), avoiding unnecessary 300s waits
when only one expected string is provided.
Closes #916 .
## Tool Update
### wait_for
Waits for text on the selected page, now with any-match support.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| text | string \| string[] | yes | A single text or a non-empty list of
texts. Resolves when any value appears. |
| timeout | integer | no | Maximum wait in ms (0 keeps default
behavior). |
---
## Design / Implementation
- Kept backward compatibility: existing single-string text calls
continue to work unchanged.
- Added schema support for string | string[] with non-empty array
validation.
- Updated context API to accept string | string[].
- Matching logic now normalizes to an array and races all candidates
across all frames using both:
- aria/<text>
- text/<text>
- Added clearer response output for array input:
- Element matching one of ["Complete","Error"] found.
- Updated generated tool docs for the new wait_for contract.
- Improved docs generation to render ZodUnion types (so union params are
documented correctly, not as unknown).
---
## Tests
Added/updated coverage for:
- Schema acceptance of:
- single string
- non-empty string array
- rejection of empty array
- Any-match array success case
- Any-match array when matching text appears later (async/delayed
content)
- Existing wait_for behavior remains covered for single-text usage
Executed relevant test suites:
- tests/tools/snapshot.test.ts
- tests/McpContext.test.ts
- tests/index.test.ts
Confirmation after the change applied:
https://opncd.ai/share/8m6I4r4a
2026-02-24 07:16:47 +00:00
Alex Rudenko
7ffdc5ee4d
feat: add take_memory_snapshot tool ( #1023 )
...
Refs: https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/406
2026-02-23 18:12:29 +00:00
Alex Rudenko
c402b43697
feat: --slim mode for maximum token savings ( #958 )
...
- navigate
- run js
- take screenshot
That's it. Basic functionality for a low (~368) token price.
2026-02-23 14:42:27 +00:00
RobertWsp
59f6477a70
feat: add storage-isolated browser contexts ( #991 )
...
## Summary
Adds storage-isolated browser contexts via an optional `isolatedContext`
parameter on the `new_page` tool, following the simplified design
proposed by @OrKoN in #926 .
Pages created with the same `isolatedContext` name share cookies,
localStorage, and storage. Pages in different isolated contexts (or the
default context) are fully isolated — ideal for testing multi-user
real-time features like chat, notifications, or collaborative editing.
## Changes
### `new_page` tool
- New optional `isolatedContext: string` parameter
- If specified, creates/reuses a named `BrowserContext` and opens a page
in it
- If omitted, uses the default browser context (existing behavior
unchanged)
### `McpContext`
- `#isolatedContexts` Map: LLM-provided names → Puppeteer
`BrowserContext` instances
- `#pageToIsolatedContextName` WeakMap: GC-safe page → context name
reverse lookup
- Auto-discovery: externally created browser contexts get
`isolated-context-1`, `isolated-context-2`, etc.
- `getIsolatedContextName(page)`: returns the isolated context name for
a page (used by response formatting)
- `page.browserContext()` used for context membership detection (no
custom target event forwarding needed)
- No context cleanup in `dispose()` or `closePage()` — either the entire
browser is closed or we disconnect without destroying state
### `McpResponse`
- Page list includes `isolatedContext=${name}` labels (both text and
structured JSON output)
### `ToolDefinition`
- `Context` interface extended with `getIsolatedContextName(page)`
method
## What's NOT included (by design)
- **No `TargetEventEmitter`**: Puppeteer forwards target events from
`BrowserContext` → `Browser` internally
- **No context cleanup**: Browser contexts are not closed on `dispose()`
or page close, per maintainer guidance
- **No `about:blank` cleanup**: Default context and isolated contexts
coexist side-by-side
## Example
```
> new_page url="https://app.example.com/chat " isolatedContext="userA"
> new_page url="https://app.example.com/chat " isolatedContext="userB"
> list_pages
Page 1: [app.example.com/chat] isolatedContext=userA
Page 2: [app.example.com/chat] isolatedContext=userB [selected]
```
Pages in different isolated contexts have fully independent cookies,
localStorage, IndexedDB, and WebSocket connections.
## Tests
- 6 new tests covering `isolatedContext` feature in
`tests/tools/pages.test.ts`
- All existing tests pass (333+)
- Zero type errors, lint clean
Closes #926
---------
Co-authored-by: Alex Rudenko <alexrudenko@chromium.org >
2026-02-23 11:36:16 +00:00
Alex Rudenko
9ef4479bec
refactor: types for JSON output of IssueFormatter ( #1007 )
...
- makes the id required in types
- requires toString(), toStringDetailed() to use the JSON
representation.
2026-02-23 08:03:09 +00:00
Dobes Vandermeer
33446d457e
feat: add experimental screencast recording tools ( #941 )
...
## Summary
Adds `screencast_start` and `screencast_stop` MCP tools that allow
agents to record a video of a page using Puppeteer's `page.screencast()`
API.
Only enabled if the command line option `--experimental-screencast` is
provided
Closes #878 .
## New Tools
### `screencast_start`
Starts recording a screencast (video) of the selected page in mp4
format.
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `path` | string (optional) | temp file | Output file path |
### `screencast_stop`
Stops the active recording and reports the saved file path.
## Design
- **Start/stop pair** following the `performance_start_trace` /
`performance_stop_trace` pattern
- **State management** via `getScreenRecorder()` / `setScreenRecorder()`
on the Context interface
- **Category**: `DEBUGGING` (alongside `take_screenshot`)
- **ffmpeg dependency**: Clear error message when ffmpeg is not
installed
- **Temp file fallback**: When no `path` is provided, creates a temp
file with the correct extension
---------
Co-authored-by: Alex Rudenko <alexrudenko@chromium.org >
2026-02-20 13:15:48 +00:00
Alex Rudenko
0d78685a5b
refactor: cleanup string and structured console formatters ( #1005 )
...
- typed JSON objects for structured output
- same source is used for text formatting
2026-02-20 11:43:35 +00:00
Alex Rudenko
bc3c40e8f9
refactor: move emulation settings to context ( #1000 )
...
- reduces boilerplate
- allows easily to restore emulation settings
This is in preparation for the integration with Lighthouse.
2026-02-20 11:36:14 +00:00
Alex Rudenko
a2950e2e62
test: deflake network test ( #994 )
...
drive-by: switch to dot reporter locally and make it configurable
2026-02-19 13:34:07 +00:00
Alex Rudenko
c9691c6250
test: fix missing sinon.restore ( #989 )
2026-02-18 15:39:30 +00:00
Nikolay Vitkov
327a3884d8
refactor: remove text from the status code for Network requests ( #778 )
...
LLM are trained to know the common status code so we can rely on that
when displaying the status code and fall back to text in case of errors
or pending reponse.
2026-02-18 14:23:26 +00:00
Alex Rudenko
1896dbb5a7
refactor(network): de-duplicate String and JSON formatters ( #985 )
...
- string formatters should use the same data as the JSON formatters
- removed an extra space in network status
2026-02-18 13:08:29 +00:00
Alex Rudenko
d2bc489e43
fix: check that combobox is actually a select element before filling out options ( #979 )
...
Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/975
2026-02-18 09:17:33 +00:00
Alex Rudenko
0d9f422201
fix: handle network request pagination correctly ( #980 )
...
Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/970
2026-02-17 11:29:27 +00:00
Alex Rudenko
9e1f9ac696
refactor: rename files to have more consistent style ( #935 )
...
rename files to match the style in the rest of the code.
2026-02-11 09:30:41 +00:00
Alex Rudenko
d59bca4ddf
test: add tests for more a11y attributes ( #934 )
...
I think this covers all a11y attributes from CDP + we have now verbose
vs non-verbose mode.
Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/363
2026-02-11 09:03:10 +00:00
Simon Zünd
8e2380b434
fix: console formatter hides frames from ignored scripts ( #927 )
...
This PR wires up the default DevTools ignore listing to hide frames from
third party scripts in stack traces. By default, we ignore:
* Scripts with `/node_modules/` in their URL or where the URL starts
with `node:/`
* Scripts that are marked as ignore listed in the source map
* Content scripts from extensions
The PR adds both, unit tests and an e2e test. This is because we allow
the unit test to pass a mocked ignore checker, where-as the e2e uses the
real DevTools one.
2026-02-10 07:24:09 +00:00
Simon Zünd
caea23a7cf
fix: limit stack traces to 50 lines ( #923 )
...
This PR refactors the stack trace formatting logic a bit: We split the
`formatStackTrace` function into 2: One for the top-level stack trace
and the rest for the recursive ones. We also return lines separately so
we can slice the result later.
2026-02-09 12:06:04 +00:00
dependabot[bot]
011726d7a2
chore(deps-dev): bump puppeteer from 24.36.1 to 24.37.2 in the bundled group ( #909 )
...
Bumps the bundled group with 1 update:
[puppeteer](https://github.com/puppeteer/puppeteer ).
Updates `puppeteer` from 24.36.1 to 24.37.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/puppeteer/puppeteer/releases ">puppeteer's
releases</a>.</em></p>
<blockquote>
<h2>puppeteer-core: v24.37.2</h2>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-core-v24.37.1...puppeteer-core-v24.37.2 ">24.37.2</a>
(2026-02-06)</h2>
<h3>🛠️ Fixes</h3>
<ul>
<li>improve ConsoleMessage text() results (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14662 ">#14662</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/0bb4703fed0e6fcd7b40899d1b81a54d4b5c48c7 ">0bb4703</a>)</li>
</ul>
<h3>📄 Documentation</h3>
<ul>
<li>document signal option in Page waitFor methods (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14648 ">#14648</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/771b8854d779e04279aa2063cf97df214e7e983d ">771b885</a>)</li>
</ul>
<h2>puppeteer: v24.37.2</h2>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.37.1...puppeteer-v24.37.2 ">24.37.2</a>
(2026-02-06)</h2>
<h3>♻️ Chores</h3>
<ul>
<li><strong>puppeteer:</strong> Synchronize puppeteer versions</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li>The following workspace dependencies were updated
<ul>
<li>dependencies
<ul>
<li>puppeteer-core bumped from 24.37.1 to 24.37.2</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2>puppeteer-core: v24.37.1</h2>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-core-v24.37.0...puppeteer-core-v24.37.1 ">24.37.1</a>
(2026-02-05)</h2>
<h3>🛠️ Fixes</h3>
<ul>
<li>roll to Chrome 145.0.7632.46 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14653 ">#14653</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/d2a55914bee23a57098631f8c7cc8571d68c54ab ">d2a5591</a>)</li>
<li>roll to Firefox 147.0.3 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14658 ">#14658</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/ad5cee0a575e298ef1dd07ed4d7cba455950c524 ">ad5cee0</a>)</li>
</ul>
<h2>puppeteer: v24.37.1</h2>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.37.0...puppeteer-v24.37.1 ">24.37.1</a>
(2026-02-05)</h2>
<h3>♻️ Chores</h3>
<ul>
<li><strong>puppeteer:</strong> Synchronize puppeteer versions</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li>The following workspace dependencies were updated
<ul>
<li>dependencies</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md ">puppeteer's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.37.1...puppeteer-v24.37.2 ">24.37.2</a>
(2026-02-06)</h2>
<h3>♻️ Chores</h3>
<ul>
<li><strong>puppeteer:</strong> Synchronize puppeteer versions</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li>The following workspace dependencies were updated
<ul>
<li>dependencies
<ul>
<li>puppeteer-core bumped from 24.37.1 to 24.37.2</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>🛠️ Fixes</h3>
<ul>
<li>improve ConsoleMessage text() results (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14662 ">#14662</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/0bb4703fed0e6fcd7b40899d1b81a54d4b5c48c7 ">0bb4703</a>)</li>
</ul>
<h3>📄 Documentation</h3>
<ul>
<li>document signal option in Page waitFor methods (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14648 ">#14648</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/771b8854d779e04279aa2063cf97df214e7e983d ">771b885</a>)</li>
</ul>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.37.0...puppeteer-v24.37.1 ">24.37.1</a>
(2026-02-05)</h2>
<h3>♻️ Chores</h3>
<ul>
<li><strong>puppeteer:</strong> Synchronize puppeteer versions</li>
</ul>
<h3>Dependencies</h3>
<ul>
<li>The following workspace dependencies were updated
<ul>
<li>dependencies
<ul>
<li>puppeteer-core bumped from 24.37.0 to 24.37.1</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>🛠️ Fixes</h3>
<ul>
<li>roll to Chrome 145.0.7632.46 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14653 ">#14653</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/d2a55914bee23a57098631f8c7cc8571d68c54ab ">d2a5591</a>)</li>
<li>roll to Firefox 147.0.3 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14658 ">#14658</a>)
(<a
href="https://github.com/puppeteer/puppeteer/commit/ad5cee0a575e298ef1dd07ed4d7cba455950c524 ">ad5cee0</a>)</li>
</ul>
<h2><a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.36.1...puppeteer-v24.37.0 ">24.37.0</a>
(2026-02-04)</h2>
<h3>🎉 Features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/b163ce4593a8f014b86d67d53825fbeb679045ca "><code>b163ce4</code></a>
chore: release main (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14663 ">#14663</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/dea54fe9ca6e03f77dda80ec329bce32a20deb5c "><code>dea54fe</code></a>
test: increase protocol timeout in waittask test (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14649 ">#14649</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/771b8854d779e04279aa2063cf97df214e7e983d "><code>771b885</code></a>
docs: document signal option in Page waitFor methods (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14648 ">#14648</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/0bb4703fed0e6fcd7b40899d1b81a54d4b5c48c7 "><code>0bb4703</code></a>
fix: improve ConsoleMessage text() results (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14662 ">#14662</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/af557b44a92bb99a76c7a93ac47fd875e323acd9 "><code>af557b4</code></a>
chore(deps): bump webpack from 5.98.0 to 5.105.0 in /website (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14661 ">#14661</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/edeca3546c339360bb586af731bf9141f9290ed6 "><code>edeca35</code></a>
chore: Increase timeout values for Windows and other platforms (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14659 ">#14659</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/f0e14f0f5019fafb6cff80038bf10fb75a9de17e "><code>f0e14f0</code></a>
chore: release main (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14656 ">#14656</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/ad5cee0a575e298ef1dd07ed4d7cba455950c524 "><code>ad5cee0</code></a>
fix: roll to Firefox 147.0.3 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14658 ">#14658</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/d2a55914bee23a57098631f8c7cc8571d68c54ab "><code>d2a5591</code></a>
fix: roll to Chrome 145.0.7632.46 (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14653 ">#14653</a>)</li>
<li><a
href="https://github.com/puppeteer/puppeteer/commit/f59d6426be688f8b46da6ef34738208ca2216727 "><code>f59d642</code></a>
chore(deps): update chromium-bidi (<a
href="https://redirect.github.com/puppeteer/puppeteer/issues/14655 ">#14655</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.36.1...puppeteer-v24.37.2 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions
</details>
---------
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Alex Rudenko <alexrudenko@chromium.org >
2026-02-06 13:06:29 +00:00
Alex Rudenko
f407c0e342
chore: stabilize versions in the license snapshot ( #911 )
2026-02-06 12:50:54 +00:00
Alex Rudenko
6d0eb491fd
test: add a console error object test ( #910 )
2026-02-06 12:50:27 +00:00
Simon Zünd
05b01ecaba
feat: include Error.cause chain for uncaught errors and logged Errors ( #906 )
2026-02-06 11:57:33 +00:00
Simon Zünd
9b90564888
chore: implement formatting for Error.cause messages ( #905 )
...
A follow-up PR will add actual `cause` property resolving of remote
`Error` objects.
2026-02-06 11:28:40 +00:00
Simon Zünd
ffa00dab1b
feat: show message and stack trace in details when console.log'ging Error objects ( #902 )
...
This PR improves the `get_console_message` tool when logging `Error`
objects. We use the existing `getExceptionDetails` CDP command to
retrieve the structured stack trace, we'll then source map.
Example:
```js
try {
compute();
} catch (e) {
console.log('Compute failed', e);
}
```
Before:
```txt
### Arguments
Arg #0 : Compute failed
Arg #1 : {}
```
After:
```txt
### Arguments
Arg #0 : Compute failed
Arg #1 : ComputeError: Invariant violation
at compute (foo.ts:1:20)
at <anonymous> (main.ts:2:8)
Note: line and column numbers use 1-based indexing
```
---------
Co-authored-by: Alex Rudenko <OrKoN@users.noreply.github.com >
2026-02-06 09:38:27 +00:00