文件历史

提交图

334 次代码提交

作者 SHA1 备注 提交日期
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
Alex Rudenko a8bf3e5856 refactor: move server to a separate file (#1043)
Refs https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1038

by importing server.ts and calling calling `createMcpServer` the server
can be instantiated without a transport.
2026-02-26 08:24:01 +00:00
Alex Rudenko 080bcf6f66 chore: add additional logs to clearcut sender (#1040)
Co-authored-by: Nikolay Vitkov <34244704+Lightning00Blade@users.noreply.github.com>
2026-02-25 15:54:51 +00:00
browser-automation-bot 9c966b42f7 chore(main): release chrome-devtools-mcp 0.18.1 (#1042)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop*
---


##
[0.18.1](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.18.0...chrome-devtools-mcp-v0.18.1)
(2026-02-25)


### 🛠️ Fixes

* remove endsWith for filePath in memory tools
([#1041](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1041))
([d0622d5](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/d0622d52d46ac72a28bc22f93a337fb5007214c7))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
2026-02-25 14:47:46 +00:00
Alex Rudenko d0622d52d4 fix: remove endsWith for filePath in memory tools (#1041)
Looks like there is another incompatibility in JSON schema handling
between MCP clients.

Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1039
2026-02-25 15:27:58 +01: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
browser-automation-bot ff7ac7c499 chore(main): release chrome-devtools-mcp 0.18.0 (#1006)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop*
---


##
[0.18.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.17.3...chrome-devtools-mcp-v0.18.0)
(2026-02-24)


### 🎉 Features

* `--slim` mode for maximum token savings
([#958](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/958))
([c402b43](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/c402b43697d834994c4fc141305189082da14bee))
* add a new skill for accessibility debugging and auditing with Chrome
DevTools MCP.
([#1002](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1002))
([b0c6d04](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/b0c6d042e4d68763acf989edc8097ce07e85dc7a))
* add experimental screencast recording tools
([#941](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/941))
([33446d4](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/33446d457e4386fadcfe4ddf6c7a43b2e9098c9a))
* add skill to debug and optimize LCP
([#993](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/993))
([2cd9b95](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/2cd9b95346226aa52cce18f6ab889a2ae194806c))
* add storage-isolated browser contexts
([#991](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/991))
([59f6477](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/59f6477a70eb07585e9a510089f1dfc840a012fd))
* add take_memory_snapshot tool
([#1023](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1023))
([7ffdc5e](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/7ffdc5ee4d9df9f62f03354fa758fb4d022c3b08))
* support any-match text arrays in wait_for
([#1011](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1011))
([496ab1b](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/496ab1b45f7a283a1432643777e0795a17f33667))
* support type_text
([#1026](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1026))
([b5d01b5](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/b5d01b5fe65fa20f9b76555b86a749960a5d1738))


### 🛠️ Fixes

* detect X server display on Linux
([#1027](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1027))
([1746ed9](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/1746ed9ee11c212f78dcbb00af99a0400595e778))


### ♻️ Chores

* cleanup string and structured console formatters
([#1005](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1005))
([0d78685](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0d78685a5b37dc68bb11a1088ff8816ecff3bb82))
* extract version in a seprate file
([#1032](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1032))
([0106865](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0106865aad6d51b6cb590bf98ccaf7078e8d7436))
* move emulation settings to context
([#1000](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1000))
([bc3c40e](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/bc3c40e8f961433fb2ae858482d66f9a55fdde32))
* optimize slim tool descriptions and params
([#1028](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1028))
([ca6635d](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/ca6635d5a5d5e8b7b9944fa8b4e1063e6269a5f2))
* simplify JavaScript code examples, update code block language, and
refine descriptions in a11y debugging skill documentation.
([#1009](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1009))
([5cedcaa](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/5cedcaad2c8a5e488064e21fb56cbd8643345440))
* types for JSON output of IssueFormatter
([#1007](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1007))
([9ef4479](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/9ef4479bec39c5f2651d6ebb63e9ec0fecf8bf89))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
2026-02-25 06:52:41 +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 b9f65e62e4 chore: cleanup tool defintion context interface (#1033)
these methods are not used by tools
2026-02-24 15:38:46 +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
Nikolay Vitkov 0106865aad refactor: extract version in a seprate file (#1032) 2026-02-24 14:22:26 +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 5696cce035 test: do not suppress uncaught errors in tests (#1008)
We want to suppress uncaught errors in production because we do not want
to crash the entire server. But it might be useful in tests.
2026-02-20 13:10:24 +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
browser-automation-bot 0c4f211317 chore(main): release chrome-devtools-mcp 0.17.3 (#998)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop*
---


##
[0.17.3](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.17.2...chrome-devtools-mcp-v0.17.3)
(2026-02-19)


### 🛠️ Fixes

* remove clean from prepare
([#997](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/997))
([2016b98](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/2016b98217bf5aa8d65c6668b1e46c8a3400276f))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
2026-02-19 18:01:19 +01:00
browser-automation-bot 34882a28af chore(main): release chrome-devtools-mcp 0.17.2 (#981)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop*
---


##
[0.17.2](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.17.1...chrome-devtools-mcp-v0.17.2)
(2026-02-19)


### 🛠️ Fixes

* check that combobox is actually a select element before filling out
options
([#979](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/979))
([d2bc489](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/d2bc489e4351551ba62a104433839c4198ecae84))
* handle network request pagination correctly
([#980](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/980))
([0d9f422](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0d9f422201538aa847a50417f1ed370e3a6c95b2))


### 📄 Documentation

* Add a note about previously installed server installations
([#982](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/982))
([c0009f7](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/c0009f7ab2f15bedd1c4ceb609db77bcb3c96f2d))
* update codex doc URL
([#987](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/987))
([ebbbea7](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/ebbbea7f9d20e4dea902d06e9b86dfe1cc9b221f))


### ♻️ Chores

* **network:** de-duplicate String and JSON formatters
([#985](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/985))
([1896dbb](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/1896dbb5a7cdc3fc0bcc5e665aee986a1180b014))
* remove text from the status code for Network requests
([#778](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/778))
([327a388](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/327a3884d8443b8591c06ddb3f9081771ae973c3))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
2026-02-19 16:06:55 +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
browser-automation-bot 5e5b746b66 chore(main): release chrome-devtools-mcp 0.17.1 (#936)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop*
---


##
[0.17.1](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.17.0...chrome-devtools-mcp-v0.17.1)
(2026-02-16)


### 📄 Documentation

* Add 'Progressive Complexity' and 'Reference over Value' design
principles.
([#939](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/939))
([8d765c0](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/8d765c0aef7bbcd476c7e7fbe9ea63ee26cf4fa6))
* add Katalon Studio setup instructions to README
([#929](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/929))
([6cfef24](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/6cfef24ec734ed62221c66bdf03b09ce000f5bfe))
* add MCP config for Claude plugin + docs
([#944](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/944))
([a781da4](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/a781da4434c3490901b28017bc7aa40493ef8dcc))
* estimate tokens using tiktoken
([#959](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/959))
([fd0a919](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/fd0a9193b37be4c5cda21dc4904093c7b58d61be))
* improve Claude Code installation instructions
([#947](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/947))
([3ec5b7e](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/3ec5b7e7a2d97c9f0165c5af3317c531a9dc058f))
* Update README with WSL configuration details
([#946](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/946))
([107c46a](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/107c46a4dbd2ba7c7b9217a75ae2b1871d3c7f0d))


### ♻️ Chores

* rename files to have more consistent style
([#935](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/935))
([9e1f9ac](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/9e1f9ac69667ddc3e2917e2c30e5ee940a03d853))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
2026-02-16 11:52:36 +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
browser-automation-bot 6a3ca9875a chore(main): release chrome-devtools-mcp 0.17.0 (#892)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop*
---


##
[0.17.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.16.0...chrome-devtools-mcp-v0.17.0)
(2026-02-10)


### 🎉 Features

* include Error.cause chain for uncaught errors and logged Errors
([#906](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/906))
([05b01ec](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/05b01ecaba47cf1ce38564636663222c9cab46de))
* Integrate CrUX data into performance trace summaries
([#733](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/733))
([b747f9d](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/b747f9d74a12d2119b6531476b2f88ab66be0ff8))
* show message and stack trace in details when console.log'ging Error
objects
([#902](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/902))
([ffa00da](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/ffa00dab1b65b2eac8db215e0289317b8ed9b725))


### 🛠️ Fixes

* console formatter hides frames from ignored scripts
([#927](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/927))
([8e2380b](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/8e2380b434d9659ffa8a7043d2589261772fa04f))
* limit stack traces to 50 lines
([#923](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/923))
([caea23a](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/caea23a7cf33c87cd4ce426eb2a10724aba3cc71))


### 📄 Documentation

* add macOS Web Bluetooth troubleshooting note
([#930](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/930))
([3c9528b](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/3c9528b43d9bbff166fcfcfee321149ff44ddd21)),
closes
[#917](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/917)

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
2026-02-10 08:27:33 +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
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
Simon Zünd 1fad330bad chore: implement formatting of Error console.log arguments (#901)
This PR implements formatting for `SymbolizedError` objects that are
part of "resolved arguments". A follow-up PR will handle the actual
conversion of `Error` remote objects to `SymbolizedError`s.
2026-02-06 08:25:38 +00:00
Simon Zünd d459266414 chore: refactor ConsoleFormatter construction (#896)
This PR shuffles code around in `ConsoleFormatter` so the data flow is
more clear and flexible. Instead of augmenting an existing instance via
`#loadDetailedData` we pass the detailed data (if needed) via
constructor. The overall public API stays exactly the same, only the
internal implementation changed.

This also makes it trivial to inject "resolved arguments for testing",
which we'll need to test `SymbolizedError` instances as part of
`resolvedArgs`.

Drive-by: Make options and message ID mandatory. All call-sites already
passed these so its a no-op to tighten the type here and we can simplify
toString() a bit.
2026-02-05 10:44:22 +00:00
Simon Zünd 8228fbf207 chore: remove unused 'Error' from ConsoleFormatter (#895)
We no longer collect `pageerror` events so we don't need support for
`Error` formatting.
2026-02-05 10:06:53 +00:00
Simon Zünd f4cfd4664e chore: introduce SymbolizedError class (#890)
The "SymbolizedError" class represents a fully resolved error: The stack
trace is fully resolved and (in the future), the full `Error.cause`
chain is also fully resolved.

We'll use the `SymbolizedError` for both "uncaught exceptions" as well
as when logging `Error` objects to the console (e.g. `console.log(new
Error())`. This means the `resolvedArgs` array in `ConsoleFormatter`
will contain one `SymbolizedError` instance for every `Error` object
logged.
2026-02-05 07:57:21 +00:00
Paul Irish b747f9d74a feat: Integrate CrUX data into performance trace summaries (#733)
We upgrade the performance trace tools to include real-user experience
data from the Chrome User Experience Report (CrUX).

https://developer.chrome.com/docs/crux
https://developer.chrome.com/docs/crux/methodology

### Deets

* When a trace is stopped, the server now extracts the primary
navigation URLs from the trace (determined by insightSets).
* It calls the public CrUX API to fetch field metrics (LCP, INP, CLS)
for each unique URL/Origin.
* The formatting of crux data is handled by upstream TraceFormatter, but
it looks like this:

```md
Metrics (field / real users):
  - LCP: 2595 ms (scope: url)
  - LCP breakdown:
    - TTFB: 1273 ms (scope: url)
    - Load delay: 86 ms (scope: url)
    - Load duration: 451 ms (scope: url)
    - Render delay: 786 ms (scope: url)
  - INP: 140 ms (scope: url)
  - CLS: 0.06 (scope: url)
  - The above data is from CrUX–Chrome User Experience Report. It's how the page performs for real users.
  - The values shown above are the p75 measure of all real Chrome users
  - The scope indicates if the data came from the entire origin, or a specific url
  - Lab metrics describe how this specific page load performed, while field metrics are an aggregation of results from real-world users. Best practice is to prioritize metrics that are bad in field data. Lab metrics may be better or worse than fields metrics depending on the developer's machine, network, or the actions performed while tracing.
 ```
 
**Privacy Considerations:**

*   Updates the server README to inform users that performance analysis tools may send trace URLs to the Google CrUX API.
*   Adds a notification message to the server startup logs regarding the CrUX API interaction.


Doc: go/crux-in-bifrost 
Fixes b/446630695

---------

Co-authored-by: Alex Rudenko <alexrudenko@chromium.org>
Co-authored-by: Alex Rudenko <OrKoN@users.noreply.github.com>
2026-02-05 07:27:15 +00:00
browser-automation-bot 4f7b068983 chore(main): release chrome-devtools-mcp 0.16.0 (#877)
publish-on-tag / publish-to-npm (push) Has been cancelled
publish-on-tag / publish-to-mcp-registry (push) Has been cancelled
🤖 I have created a release *beep* *boop*
---


##
[0.16.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.15.1...chrome-devtools-mcp-v0.16.0)
(2026-02-04)


### 🎉 Features

* include source-mapped stack trace for uncaught errors
([#876](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/876))
([ecef712](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/ecef712e70b47ae81eb3364d0aed801ec1c91a70))


### 🛠️ Fixes

* accidental extra typing in the fill tool
([#886](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/886))
([3d6e59d](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/3d6e59dda42be3c6fd97446344a28cbbaa5809b3))
* update evaluateScript description formatting
([#880](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/880))
([24db9dd](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/24db9dd78cd4f054d291322685b4f47601da3f5a))
* use 1-based line/column and fix wasm offsets in stack frames
([#884](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/884))
([7e1ec81](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/7e1ec81fb63ec8b7c6d77dbdc88beef4240243ba))


### 📄 Documentation

* mention source-mapped stack traces in 'Key features'
([#883](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/883))
([579d18a](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/579d18a3f4d1d8d05bf267a39de7f2f53e719b17))
* remove outdated --channel=beta note
([#882](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/882))
([acdb5c9](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/acdb5c9bb3f249c5a9ce1d4a3e84c580af999141))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
2026-02-04 10:00:12 +00:00
kajanl 24db9dd78c fix: update evaluateScript description formatting (#880)
Fix formatting in the description of evaluateScript.

---------

Co-authored-by: Alex Rudenko <alexrudenko@chromium.org>
2026-02-04 09:51:10 +00:00
Alex Rudenko 3d6e59dda4 fix: accidental extra typing in the fill tool (#886)
Fixes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/881
2026-02-04 09:34:17 +00:00
Simon Zünd 7e1ec81fb6 fix: use 1-based line/column and fix wasm offsets in stack frames (#884)
`UILocation.linkText` does the right thing when formatting a location,
e.g. a wasm location will be formatted as `foo.wasm:0x95`.
2026-02-04 08:15:27 +00:00
Simon Zünd ecef712e70 feat: include source-mapped stack trace for uncaught errors (#876)
Note that we replace the existing "pageerror" handler with our new
`UncaughtError` handler. The latter has a structured stack trace
attached which we can source map via DevTools.

This regresses the current functionality slightly, as we lose
"pageerror"s for workers and oopif.
2026-02-03 12:24:23 +00:00
Simon Zünd a08f550b28 chore: implement formatting for UncaughtError (#875) 2026-02-03 11:42:18 +00:00