Skip to content

Commit 5f96b59

Browse files
authored
Merge branch 'main' into feat/pageid-routing-always-on
2 parents e6cec43 + 66ced45 commit 5f96b59

31 files changed

Lines changed: 1040 additions & 174 deletions

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "chrome-devtools-plugins",
3-
"version": "0.20.3",
3+
"version": "0.21.0",
44
"description": "Bundled plugins for actuating and debugging the Chrome browser.",
55
"repository": "https://github.com/ChromeDevTools/chrome-devtools-mcp",
66
"owner": {

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "chrome-devtools-mcp",
3-
"version": "0.20.3",
3+
"version": "0.21.0",
44
"description": "Reliable automation, in-depth debugging, and performance analysis in Chrome using Chrome DevTools and Puppeteer",
55
"mcpServers": {
66
"chrome-devtools": {

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.20.3"
2+
".": "0.21.0"
33
}

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
# Changelog
22

3+
## [0.21.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.20.3...chrome-devtools-mcp-v0.21.0) (2026-04-01)
4+
5+
6+
### 🎉 Features
7+
8+
* add a skill for detecting memory leaks using take_memory_snapshot tool ([#1162](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1162)) ([d19a235](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/d19a2350f975ec2fbf8ee61b35163a48c0146c32))
9+
10+
11+
### 🛠️ Fixes
12+
13+
* **cli:** avoid defaulting to isolated when userDataDir is provided ([#1258](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1258)) ([73e1e24](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/73e1e24b26f9e42a83116b586e34d47276a6a2fa))
14+
* list_pages should work after selected page is closed ([#1145](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1145)) ([2664455](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/26644553028d8404fd65a005ea9c19a278671f4d))
15+
* mark lighthouse and memory as non-read-only ([#1769](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1769)) ([bec9dae](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/bec9dae2d26b728feedcd660189f386e6228f3ae))
16+
* **telemetry:** record client name ([9a47b65](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/9a47b657d7b17b9bc64508530c93d55e8033e2a6))
17+
* versioning for Claude Code plugin ([#1233](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1233)) ([966b86f](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/966b86f3aaa9f87c2599b954c4e7f990c2a697ea))
18+
* wrap .mcp.json config in mcpServers key ([#1246](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1246)) ([c7948cf](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/c7948cf0621d80b080220d4cfd36b62bef2790b9))
19+
20+
21+
### 📄 Documentation
22+
23+
* Command Code CLI instructions for MCP server ([0a7c0a7](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0a7c0a74b471935a3e2f5ca0fd93556e8e5165ec))
24+
* provide disclaimer about supported browsers ([#1237](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1237)) ([8676b72](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/8676b7216c66dfd323c2f6c272544a75dbab4dba))
25+
26+
27+
### 🏗️ Refactor
28+
29+
* set process titles for easier debugging ([#1770](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1770)) ([0fe3896](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0fe3896d85c74ce8b2dc189fe8a310727f795344))
30+
331
## [0.20.3](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.20.2...chrome-devtools-mcp-v0.20.3) (2026-03-20)
432

533

CONTRIBUTING.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,5 @@ export const scenario: TestScenario = {
145145

146146
## Restrictions on JSON schema
147147

148-
- no .nullable(), no .object() types.
148+
- no .nullable(), no .object() types. Enforced by the `@local/enforce-zod-schema` ESLint rule.
149149
- represent complex object as a short formatted string.
150-
151-
TODO: implement eslint for schema https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/1076

docs/cli.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ The CLI acts as a client to a background `chrome-devtools-mcp` daemon (uses Unix
1717

1818
- **Automatic Start**: The first time you call a tool (e.g., `list_pages`), the CLI automatically starts the MCP server and the browser in the background if they aren't already running.
1919
- **Persistence**: The same background instance is reused for subsequent commands, preserving the browser state (open pages, cookies, etc.).
20-
- **Manual Control**: You can explicitly manage the background process using `start`, `stop`, and `status`. The `start` command forwards all subsequent arguments to the underlying MCP server (e.g., `--headless`, `--userDataDir`) but not all args are supported. Run `chrome-devtools start --help` for supported args. Headless and isolated are enabled by default.
20+
- **Manual Control**: You can explicitly manage the background process using `start`, `stop`, and `status`. The `start` command forwards all subsequent arguments to the underlying MCP server (e.g., `--headless`, `--userDataDir`) but not all args are supported. Run `chrome-devtools start --help` for supported args. Headless is enabled by default. Isolated is enabled by default unless `--userDataDir` is provided.
2121

2222
```sh
2323
# Check if the daemon is running

eslint.config.mjs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,20 @@ export default defineConfig([
135135
],
136136
},
137137
},
138+
{
139+
name: 'Source files',
140+
files: ['src/**/*.ts'],
141+
rules: {
142+
'@local/no-direct-third-party-imports': 'error',
143+
},
144+
},
145+
{
146+
name: 'Tools definitions',
147+
files: ['src/tools/**/*.ts'],
148+
rules: {
149+
'@local/enforce-zod-schema': 'error',
150+
},
151+
},
138152
{
139153
name: 'Tests',
140154
files: ['**/*.test.ts'],

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "chrome-devtools-mcp",
3-
"version": "0.20.3",
3+
"version": "0.21.0",
44
"description": "MCP server for Chrome DevTools",
55
"type": "module",
66
"bin": {
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* @license
3+
* Copyright 2026 Google LLC
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
export default {
8+
name: 'enforce-zod-schema',
9+
meta: {
10+
type: 'problem',
11+
docs: {
12+
description:
13+
'Disallow .nullable() and .object() in tool schemas. Use optional strings to represent complex objects.',
14+
},
15+
schema: [],
16+
messages: {
17+
noNullable:
18+
'Do not use .nullable() in tool schemas. Use .optional() instead.',
19+
noObject:
20+
'Do not use .object() in tool schemas. Represent complex objects as a short formatted string.',
21+
},
22+
},
23+
defaultOptions: [],
24+
create(context) {
25+
return {
26+
CallExpression(node) {
27+
if (
28+
node.callee.type !== 'MemberExpression' ||
29+
node.callee.property.type !== 'Identifier'
30+
) {
31+
return;
32+
}
33+
34+
const methodName = node.callee.property.name;
35+
36+
// We don't validate that .nullable() is called on a ZodObject
37+
// specifically - this intentionally catches all .nullable() calls
38+
// in tool schema files.
39+
if (methodName === 'nullable') {
40+
context.report({
41+
node: node.callee.property,
42+
messageId: 'noNullable',
43+
});
44+
}
45+
46+
if (methodName === 'object') {
47+
// Only flag zod.object() calls, not arbitrary .object() calls.
48+
const obj = node.callee.object;
49+
if (
50+
obj.type === 'Identifier' &&
51+
(obj.name === 'zod' || obj.name === 'z')
52+
) {
53+
context.report({
54+
node: node.callee.property,
55+
messageId: 'noObject',
56+
});
57+
}
58+
}
59+
},
60+
};
61+
},
62+
};

0 commit comments

Comments
 (0)