From 070e88cd63169e54e9049c8da470cb1c5bace96a Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Sat, 11 Oct 2025 21:15:10 +0200 Subject: [PATCH 01/18] docs: update browser URL from localhost to 127.0.0.1 (#342) Chrome only listens on IPv4 and localhost might resolve to an IPv6 in some environments. Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/341 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index be44ccaa..07f1b7e4 100644 --- a/README.md +++ b/README.md @@ -340,7 +340,7 @@ Here is a step-by-step guide on how to connect to a running Chrome Stable instan **Step 1: Configure the MCP client** -Add the `--browser-url` option to your MCP client configuration. The value of this option should be the URL of the running Chrome instance. `http://localhost:9222` is a common default. +Add the `--browser-url` option to your MCP client configuration. The value of this option should be the URL of the running Chrome instance. `http://127.0.0.1:9222` is a common default. ```json { @@ -349,7 +349,7 @@ Add the `--browser-url` option to your MCP client configuration. The value of th "command": "npx", "args": [ "chrome-devtools-mcp@latest", - "--browser-url=http://localhost:9222" + "--browser-url=http://127.0.0.1:9222" ] } } From b1d239ece17bf2157643bb72f42a4ea94c121cc8 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov <34244704+Lightning00Blade@users.noreply.github.com> Date: Sun, 12 Oct 2025 13:14:27 +0200 Subject: [PATCH 02/18] refactor: use release-please to bump version in files (#349) --- .github/workflows/publish-to-npm-on-tag.yml | 3 --- package.json | 3 +-- release-please-config.json | 19 ++++++++++++- scripts/sync-server-json-version.ts | 16 ----------- src/main.ts | 30 +++++---------------- 5 files changed, 26 insertions(+), 45 deletions(-) delete mode 100644 scripts/sync-server-json-version.ts diff --git a/.github/workflows/publish-to-npm-on-tag.yml b/.github/workflows/publish-to-npm-on-tag.yml index ceeaa377..d50cdd97 100644 --- a/.github/workflows/publish-to-npm-on-tag.yml +++ b/.github/workflows/publish-to-npm-on-tag.yml @@ -77,9 +77,6 @@ jobs: - name: Build run: npm run build - - name: Bump - run: npm run sync-server-json-version - - name: Install MCP Publisher run: | export VERSION="1.2.1" diff --git a/package.json b/package.json index 06137f00..7c198264 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,7 @@ "test:only": "npm run build && node --require ./build/tests/setup.js --no-warnings=ExperimentalWarning --test-reporter spec --test-force-exit --test --test-only \"build/tests/**/*.test.js\"", "test:only:no-build": "node --require ./build/tests/setup.js --no-warnings=ExperimentalWarning --test-reporter spec --test-force-exit --test --test-only \"build/tests/**/*.test.js\"", "test:update-snapshots": "npm run build && node --require ./build/tests/setup.js --no-warnings=ExperimentalWarning --test-force-exit --test --test-update-snapshots \"build/tests/**/*.test.js\"", - "prepare": "node --experimental-strip-types scripts/prepare.ts", - "sync-server-json-version": "node --experimental-strip-types scripts/sync-server-json-version.ts && npm run format" + "prepare": "node --experimental-strip-types scripts/prepare.ts" }, "files": [ "build/src", diff --git a/release-please-config.json b/release-please-config.json index 826a6b2f..1cfd0ac1 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -1,5 +1,22 @@ { "packages": { - ".": {} + ".": { + "extra-files": [ + { + "type": "generic", + "path": "src/main.ts" + }, + { + "type": "json", + "path": "server.json", + "jsonpath": "version" + }, + { + "type": "json", + "path": "server.json", + "jsonpath": "packages[0].version" + } + ] + } } } diff --git a/scripts/sync-server-json-version.ts b/scripts/sync-server-json-version.ts deleted file mode 100644 index 27fe176e..00000000 --- a/scripts/sync-server-json-version.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @license - * Copyright 2025 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ -import fs from 'node:fs'; - -const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf-8')); -const serverJson = JSON.parse(fs.readFileSync('./server.json', 'utf-8')); - -serverJson.version = packageJson.version; -for (const pkg of serverJson.packages) { - pkg.version = packageJson.version; -} - -fs.writeFileSync('./server.json', JSON.stringify(serverJson, null, 2)); diff --git a/src/main.ts b/src/main.ts index ada8cb30..3452620e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -6,10 +6,6 @@ import './polyfill.js'; -import assert from 'node:assert'; -import fs from 'node:fs'; -import path from 'node:path'; - import {McpServer} from '@modelcontextprotocol/sdk/server/mcp.js'; import {StdioServerTransport} from '@modelcontextprotocol/sdk/server/stdio.js'; import type {CallToolResult} from '@modelcontextprotocol/sdk/types.js'; @@ -33,33 +29,21 @@ import * as scriptTools from './tools/script.js'; import * as snapshotTools from './tools/snapshot.js'; import type {ToolDefinition} from './tools/ToolDefinition.js'; -function readPackageJson(): {version?: string} { - const currentDir = import.meta.dirname; - const packageJsonPath = path.join(currentDir, '..', '..', 'package.json'); - if (!fs.existsSync(packageJsonPath)) { - return {}; - } - try { - const json = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); - assert.strict(json['name'], 'chrome-devtools-mcp'); - return json; - } catch { - return {}; - } -} - -const version = readPackageJson().version ?? 'unknown'; +// If moved update release-please config +// x-release-please-start-version +const VERSION = '0.8.0'; +// x-release-please-end -export const args = parseArguments(version); +export const args = parseArguments(VERSION); const logFile = args.logFile ? saveLogsToFile(args.logFile) : undefined; -logger(`Starting Chrome DevTools MCP Server v${version}`); +logger(`Starting Chrome DevTools MCP Server v${VERSION}`); const server = new McpServer( { name: 'chrome_devtools', title: 'Chrome DevTools MCP server', - version, + version: VERSION, }, {capabilities: {logging: {}}}, ); From e83ba0db5fe09449dcda53b8376f0732131a8a5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 15:55:07 +0200 Subject: [PATCH 03/18] chore(deps): bump the dependencies group across 1 directory with 2 updates (#355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the dependencies group with 2 updates in the / directory: [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) and [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js). Updates `@modelcontextprotocol/sdk` from 1.19.1 to 1.20.0
Release notes

Sourced from @​modelcontextprotocol/sdk's releases.

1.20.0

What's Changed

New Contributors 🙏

Full Changelog: https://github.com/modelcontextprotocol/typescript-sdk/compare/1.19.0...1.20.0

Commits

Updates `core-js` from 3.45.1 to 3.46.0
Changelog

Sourced from core-js's changelog.

3.46.0 - 2025.10.09

Commits

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) ---
Dependabot commands and options
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 merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore 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 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 ` 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 ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index b83debe7..407c26e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "0.8.0", "license": "Apache-2.0", "dependencies": { - "@modelcontextprotocol/sdk": "1.19.1", - "core-js": "3.45.1", + "@modelcontextprotocol/sdk": "1.20.0", + "core-js": "3.46.0", "debug": "4.4.3", "puppeteer-core": "^24.24.0", "yargs": "18.0.0", @@ -372,9 +372,9 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.19.1.tgz", - "integrity": "sha512-3Y2h3MZKjec1eAqSTBclATlX+AbC6n1LgfVzRMJLt3v6w0RCYgwLrjbxPDbhsYHt6Wdqc/aCceNJYgj448ELQQ==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.20.0.tgz", + "integrity": "sha512-kOQ4+fHuT4KbR2iq2IjeV32HiihueuOf1vJkq18z08CLZ1UQrTc8BXJpVfxZkq45+inLLD+D4xx4nBjUelJa4Q==", "license": "MIT", "dependencies": { "ajv": "^6.12.6", @@ -1907,9 +1907,9 @@ } }, "node_modules/core-js": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", - "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", + "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", "hasInstallScript": true, "license": "MIT", "funding": { diff --git a/package.json b/package.json index 7c198264..57feb412 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,8 @@ "homepage": "https://github.com/ChromeDevTools/chrome-devtools-mcp#readme", "mcpName": "io.github.ChromeDevTools/chrome-devtools-mcp", "dependencies": { - "@modelcontextprotocol/sdk": "1.19.1", - "core-js": "3.45.1", + "@modelcontextprotocol/sdk": "1.20.0", + "core-js": "3.46.0", "debug": "4.4.3", "puppeteer-core": "^24.24.0", "yargs": "18.0.0", From 323a063e25a0d338220c783543dd30b89592f37d Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Sun, 12 Oct 2025 15:57:44 +0200 Subject: [PATCH 04/18] ci: extract devtools frontend to a separate group (#353) --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 18e7d6a4..63c22745 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,6 +12,7 @@ updates: dependency-type: production exclude-patterns: - 'puppeteer*' + - 'chrome-devtools-frontend' patterns: - '*' dev-dependencies: @@ -23,6 +24,9 @@ updates: puppeteer: patterns: - 'puppeteer*' + chrome-devtools-frontend: + patterns: + - 'chrome-devtools-frontend' - package-ecosystem: github-actions directory: / schedule: From a4b5cb65d1591d0d4cd90cb59a9192015ad85698 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Sun, 12 Oct 2025 16:23:35 +0200 Subject: [PATCH 05/18] refactor: sort tools alphabetically (#346) --- src/main.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index 3452620e..d35e1f14 100644 --- a/src/main.ts +++ b/src/main.ts @@ -151,9 +151,14 @@ const tools = [ ...Object.values(screenshotTools), ...Object.values(scriptTools), ...Object.values(snapshotTools), -]; +] as ToolDefinition[]; + +tools.sort((a, b) => { + return a.name.localeCompare(b.name); +}); + for (const tool of tools) { - registerTool(tool as unknown as ToolDefinition); + registerTool(tool); } const transport = new StdioServerTransport(); From a8c7d51f5ec07830b7f252ba058711027defb4c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 16:36:23 +0200 Subject: [PATCH 06/18] chore(deps-dev): bump the dev-dependencies group across 1 directory with 4 updates (#356) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the dev-dependencies group with 4 updates in the / directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint). Updates `@types/node` from 24.7.0 to 24.7.2
Commits

Updates `@typescript-eslint/eslint-plugin` from 8.45.0 to 8.46.0
Release notes

Sourced from @​typescript-eslint/eslint-plugin's releases.

v8.46.0

8.46.0 (2025-10-06)

🚀 Features

  • eslint-plugin: [no-unsafe-member-access] add allowOptionalChaining option (#11659)
  • eslint-plugin-internal: [no-dynamic-tests] new internal Lint rule to ban dynamic syntax in generating tests (#11323)
  • rule-schema-to-typescript-types: clean up and make public (#11633)
  • typescript-eslint: export util types (#10848, #10849)
  • typescript-estree: mention file specifics in project service allowDefaultProject error (#11635)
  • typescript-estree: private identifiers can only appear on LHS of in expressions (#9232)

🩹 Fixes

  • eslint-plugin: [no-floating-promises] remove excess parentheses in suggestions (#11487)
  • eslint-plugin: [unbound-method] improve wording around this: void and binding (#11634)
  • eslint-plugin: [no-deprecated] ignore deprecated export imports (#11603)
  • eslint-plugin: removed error type previously deprecated (#11674)
  • eslint-plugin: [prefer-readonly-parameter-types] ignore tagged primitives (#11660)
  • rule-tester: deprecate TestCaseError#type and LintMessage#nodeType (#11628)
  • typescript-estree: forbid abstract modifier in object methods (#11656)
  • typescript-estree: forbid abstract method and accessor to have implementation (#11657)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from @​typescript-eslint/eslint-plugin's changelog.

8.46.0 (2025-10-06)

🚀 Features

  • eslint-plugin: [no-unsafe-member-access] add allowOptionalChaining option (#11659)
  • rule-schema-to-typescript-types: clean up and make public (#11633)

🩹 Fixes

  • eslint-plugin: [prefer-readonly-parameter-types] ignore tagged primitives (#11660)
  • typescript-estree: forbid abstract method and accessor to have implementation (#11657)
  • eslint-plugin: removed error type previously deprecated (#11674)
  • eslint-plugin: [no-deprecated] ignore deprecated export imports (#11603)
  • eslint-plugin: [unbound-method] improve wording around this: void and binding (#11634)
  • rule-tester: deprecate TestCaseError#type and LintMessage#nodeType (#11628)
  • eslint-plugin: [no-floating-promises] remove excess parentheses in suggestions (#11487)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

Commits
  • aec785e chore(release): publish 8.46.0
  • a974191 fix(eslint-plugin): [prefer-readonly-parameter-types] ignore tagged primitive...
  • 02e0278 fix(typescript-estree): forbid abstract method and accessor to have implement...
  • f083798 feat(eslint-plugin): [no-unsafe-member-access] add allowOptionalChaining opti...
  • a62f625 fix(eslint-plugin): removed error type previously deprecated (#11674)
  • 7f5fed7 chore: remove unused batchedSingleLineTests test utility (#11675)
  • f8412ce fix(eslint-plugin): [no-deprecated] ignore deprecated export imports (#11603)
  • 8de997e feat(eslint-plugin): [no-unused-vars] support explicit resource management wi...
  • 740a63f feat(rule-schema-to-typescript-types): clean up and make public (#11633)
  • 692d4ee docs(eslint-plugin): [prefer-for-of] mention DOM elements and lib: dom.iterab...
  • Additional commits viewable in compare view

Updates `@typescript-eslint/parser` from 8.45.0 to 8.46.0
Release notes

Sourced from @​typescript-eslint/parser's releases.

v8.46.0

8.46.0 (2025-10-06)

🚀 Features

  • eslint-plugin: [no-unsafe-member-access] add allowOptionalChaining option (#11659)
  • eslint-plugin-internal: [no-dynamic-tests] new internal Lint rule to ban dynamic syntax in generating tests (#11323)
  • rule-schema-to-typescript-types: clean up and make public (#11633)
  • typescript-eslint: export util types (#10848, #10849)
  • typescript-estree: mention file specifics in project service allowDefaultProject error (#11635)
  • typescript-estree: private identifiers can only appear on LHS of in expressions (#9232)

🩹 Fixes

  • eslint-plugin: [no-floating-promises] remove excess parentheses in suggestions (#11487)
  • eslint-plugin: [unbound-method] improve wording around this: void and binding (#11634)
  • eslint-plugin: [no-deprecated] ignore deprecated export imports (#11603)
  • eslint-plugin: removed error type previously deprecated (#11674)
  • eslint-plugin: [prefer-readonly-parameter-types] ignore tagged primitives (#11660)
  • rule-tester: deprecate TestCaseError#type and LintMessage#nodeType (#11628)
  • typescript-estree: forbid abstract modifier in object methods (#11656)
  • typescript-estree: forbid abstract method and accessor to have implementation (#11657)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from @​typescript-eslint/parser's changelog.

8.46.0 (2025-10-06)

This was a version bump only for parser to align it with other projects, there were no code changes.

You can read about our versioning strategy and releases on our website.

Commits

Updates `typescript-eslint` from 8.45.0 to 8.46.0
Release notes

Sourced from typescript-eslint's releases.

v8.46.0

8.46.0 (2025-10-06)

🚀 Features

  • eslint-plugin: [no-unsafe-member-access] add allowOptionalChaining option (#11659)
  • eslint-plugin-internal: [no-dynamic-tests] new internal Lint rule to ban dynamic syntax in generating tests (#11323)
  • rule-schema-to-typescript-types: clean up and make public (#11633)
  • typescript-eslint: export util types (#10848, #10849)
  • typescript-estree: mention file specifics in project service allowDefaultProject error (#11635)
  • typescript-estree: private identifiers can only appear on LHS of in expressions (#9232)

🩹 Fixes

  • eslint-plugin: [no-floating-promises] remove excess parentheses in suggestions (#11487)
  • eslint-plugin: [unbound-method] improve wording around this: void and binding (#11634)
  • eslint-plugin: [no-deprecated] ignore deprecated export imports (#11603)
  • eslint-plugin: removed error type previously deprecated (#11674)
  • eslint-plugin: [prefer-readonly-parameter-types] ignore tagged primitives (#11660)
  • rule-tester: deprecate TestCaseError#type and LintMessage#nodeType (#11628)
  • typescript-estree: forbid abstract modifier in object methods (#11656)
  • typescript-estree: forbid abstract method and accessor to have implementation (#11657)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

Changelog

Sourced from typescript-eslint's changelog.

8.46.0 (2025-10-06)

🚀 Features

❤️ Thank You

You can read about our versioning strategy and releases on our website.

Commits

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) ---
Dependabot commands and options
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 merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore 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 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 ` 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 ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 126 +++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 407c26e5..5eb6888e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -692,9 +692,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", - "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "version": "24.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.2.tgz", + "integrity": "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -746,17 +746,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", - "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", + "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/type-utils": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/type-utils": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -776,16 +776,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4" }, "engines": { @@ -801,14 +801,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", "debug": "^4.3.4" }, "engines": { @@ -823,14 +823,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -841,9 +841,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", "dev": true, "license": "MIT", "engines": { @@ -858,15 +858,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", - "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", + "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -883,9 +883,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", "dev": true, "license": "MIT", "engines": { @@ -897,16 +897,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -926,16 +926,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0" + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -950,13 +950,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5757,16 +5757,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", - "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.0.tgz", + "integrity": "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.45.0", - "@typescript-eslint/parser": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0" + "@typescript-eslint/eslint-plugin": "8.46.0", + "@typescript-eslint/parser": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" From 4ca045f9c60958574267501dec967b4c88db4a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kie=C5=82bowicz?= Date: Sun, 12 Oct 2025 16:49:03 +0200 Subject: [PATCH 07/18] docs: add Amp configuration to MCP client setup docs (#343) Tool's website: https://ampcode.com --------- Co-authored-by: Alex --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 07f1b7e4..0745ebb0 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,16 @@ Add the following config to your MCP client: ### MCP Client configuration +
+ Amp + Follow https://ampcode.com/manual#mcp and use the config provided above. You can also install the Chrome DevTools MCP server using the CLI: + +```bash +amp mcp add chrome-devtools -- npx chrome-devtools-mcp@latest +``` + +
+
Claude Code Use the Claude Code CLI to add the Chrome DevTools MCP server (guide): From f415c3ec576bd5e0ee7d7fcacad6cbb7d3a59500 Mon Sep 17 00:00:00 2001 From: siegerts Date: Sun, 12 Oct 2025 11:44:21 -0400 Subject: [PATCH 08/18] docs: add instructions for Kiro (#347) Adds instructions on how to add Chrome DevTools MCP to [Kiro](https://kiro.dev). image --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 0745ebb0..8d9af355 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,15 @@ The same way chrome-devtools-mcp can be configured for JetBrains Junie in `Setti
+
+ Kiro + +In **Kiro Settings**, go to `Configure MCP` > `Open Workspace or User MCP Config` > Use the configuration snippet provided above. + +Or, from the IDE **Activity Bar** > `Kiro` > `MCP Servers` > `Click Open MCP Config`. Use the configuration snippet provided above. + +
+
Visual Studio From 0624029e0f8735345d202d29dde446b8869d9561 Mon Sep 17 00:00:00 2001 From: Mithun Gowda B Date: Mon, 13 Oct 2025 13:16:09 +0530 Subject: [PATCH 09/18] fix: improve navigate_page_history error messages (#321) --- src/tools/pages.ts | 5 +++-- tests/tools/pages.test.ts | 16 ++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/tools/pages.ts b/src/tools/pages.ts index 65d2b093..7643881d 100644 --- a/src/tools/pages.ts +++ b/src/tools/pages.ts @@ -142,15 +142,16 @@ export const navigatePageHistory = defineTool({ const options = { timeout: request.params.timeout, }; + try { if (request.params.navigate === 'back') { await page.goBack(options); } else { await page.goForward(options); } - } catch { + } catch (error) { response.appendResponseLine( - `Unable to navigate ${request.params.navigate} in currently selected page.`, + `Unable to navigate ${request.params.navigate} in currently selected page. ${error.message}`, ); } diff --git a/tests/tools/pages.test.ts b/tests/tools/pages.test.ts index 38a23ad8..43dfd918 100644 --- a/tests/tools/pages.test.ts +++ b/tests/tools/pages.test.ts @@ -163,9 +163,12 @@ describe('pages', () => { context, ); - assert.equal( - response.responseLines.at(0), - 'Unable to navigate forward in currently selected page.', + assert.ok( + response.responseLines + .at(0) + ?.startsWith( + 'Unable to navigate forward in currently selected page.', + ), ); assert.ok(response.includePages); }); @@ -178,9 +181,10 @@ describe('pages', () => { context, ); - assert.equal( - response.responseLines.at(0), - 'Unable to navigate back in currently selected page.', + assert.ok( + response.responseLines + .at(0) + ?.startsWith('Unable to navigate back in currently selected page.'), ); assert.ok(response.includePages); }); From 2e0961f36d0c52ff8665f3ee43e4b0ce289c0152 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov <34244704+Lightning00Blade@users.noreply.github.com> Date: Mon, 13 Oct 2025 12:01:30 +0200 Subject: [PATCH 10/18] ci: verify schema is correct on release PRs (#314) Also gets the latest mcp-publisher based on GitHub latest tag. --- .github/workflows/pre-release.yml | 27 ++++++++++++++++ .github/workflows/publish-to-npm-on-tag.yml | 5 +-- package.json | 3 +- scripts/verify-server-json-version.ts | 36 +++++++++++++++++++++ 4 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/pre-release.yml create mode 100644 scripts/verify-server-json-version.ts diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml new file mode 100644 index 00000000..8bf19142 --- /dev/null +++ b/.github/workflows/pre-release.yml @@ -0,0 +1,27 @@ +name: Pre-release + +permissions: read-all + +on: + push: + branches: + - release-please-* + +jobs: + pre-release: + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + fetch-depth: 2 + + - name: Install MCP Publisher + run: | + export TAG=$(curl -sL https://api.github.com/repos/modelcontextprotocol/registry/releases/latest | jq -r ".tag_name") + export VERSION="${TAG#v}" + export OS=$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/') + curl -L "https://github.com/modelcontextprotocol/registry/releases/download/${TAG}/mcp-publisher_${VERSION}_${OS}.tar.gz" | tar xz mcp-publisher + + - name: Verify server.json + run: npm run verify-server-json-version diff --git a/.github/workflows/publish-to-npm-on-tag.yml b/.github/workflows/publish-to-npm-on-tag.yml index d50cdd97..1c0fe61d 100644 --- a/.github/workflows/publish-to-npm-on-tag.yml +++ b/.github/workflows/publish-to-npm-on-tag.yml @@ -79,9 +79,10 @@ jobs: - name: Install MCP Publisher run: | - export VERSION="1.2.1" + export TAG=$(curl -sL https://api.github.com/repos/modelcontextprotocol/registry/releases/latest | jq -r ".tag_name") + export VERSION="${TAG#v}" export OS=$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/') - curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v${VERSION}/mcp-publisher_${VERSION}_${OS}.tar.gz" | tar xz mcp-publisher + curl -L "https://github.com/modelcontextprotocol/registry/releases/download/${TAG}/mcp-publisher_${VERSION}_${OS}.tar.gz" | tar xz mcp-publisher - name: Login to MCP Registry run: ./mcp-publisher login github-oidc diff --git a/package.json b/package.json index 57feb412..a278db9f 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "test:only": "npm run build && node --require ./build/tests/setup.js --no-warnings=ExperimentalWarning --test-reporter spec --test-force-exit --test --test-only \"build/tests/**/*.test.js\"", "test:only:no-build": "node --require ./build/tests/setup.js --no-warnings=ExperimentalWarning --test-reporter spec --test-force-exit --test --test-only \"build/tests/**/*.test.js\"", "test:update-snapshots": "npm run build && node --require ./build/tests/setup.js --no-warnings=ExperimentalWarning --test-force-exit --test --test-update-snapshots \"build/tests/**/*.test.js\"", - "prepare": "node --experimental-strip-types scripts/prepare.ts" + "prepare": "node --experimental-strip-types scripts/prepare.ts", + "verify-server-json-version": "node --experimental-strip-types scripts/verify-server-json-version.ts" }, "files": [ "build/src", diff --git a/scripts/verify-server-json-version.ts b/scripts/verify-server-json-version.ts new file mode 100644 index 00000000..7ffa6c5f --- /dev/null +++ b/scripts/verify-server-json-version.ts @@ -0,0 +1,36 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {execSync} from 'node:child_process'; +import fs from 'node:fs'; + +const serverJsonFilePath = './server.json'; +const serverJson = JSON.parse(fs.readFileSync(serverJsonFilePath, 'utf-8')); +fs.unlinkSync(serverJsonFilePath); + +// Create the new server.json +execSync('./mcp-publisher init'); + +const newServerJson = JSON.parse(fs.readFileSync(serverJsonFilePath, 'utf-8')); + +const propertyToVerify = ['$schema']; +const diffProps = []; + +for (const prop of propertyToVerify) { + if (serverJson[prop] !== newServerJson[prop]) { + diffProps.push(prop); + } +} + +fs.writeFileSync('./server.json', JSON.stringify(serverJson, null, 2)); + +if (diffProps.length) { + throw new Error( + `The following props did not match the latest init value:\n${diffProps.map( + prop => `- "${prop}": "${newServerJson[prop]}"`, + )}`, + ); +} From 207137edd6d8af2f49277d88a30d8afa51671631 Mon Sep 17 00:00:00 2001 From: Alina Varkki Date: Mon, 13 Oct 2025 13:25:48 +0200 Subject: [PATCH 11/18] fix: add an option value to the snapshot (#362) Fixes #185 The standard selector value is not included in the AXNode, so add it separately. --- src/McpContext.ts | 14 ++++++ src/tools/ToolDefinition.ts | 2 + src/tools/input.ts | 91 +++++++++++++++++++++++++++++-------- tests/tools/input.test.ts | 29 ++++++++++++ 4 files changed, 118 insertions(+), 18 deletions(-) diff --git a/src/McpContext.ts b/src/McpContext.ts index d1037935..cd829e16 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -272,6 +272,10 @@ export class McpContext implements Context { return page.getDefaultNavigationTimeout(); } + getAXNodeByUid(uid: string) { + return this.#textSnapshot?.idToNode.get(uid); + } + async getElementByUid(uid: string): Promise> { if (!this.#textSnapshot?.idToNode.size) { throw new Error( @@ -334,6 +338,16 @@ export class McpContext implements Context { ? node.children.map(child => assignIds(child)) : [], }; + + // The AXNode for an option doesn't contain its `value`. + // Therefore, set text content of the option as value. + if (node.role === 'option') { + const optionText = node.name; + if (optionText) { + nodeWithId.value = optionText.toString(); + } + } + idToNode.set(nodeWithId.id, nodeWithId); return nodeWithId; }; diff --git a/src/tools/ToolDefinition.ts b/src/tools/ToolDefinition.ts index fe2fae7b..56fdb53a 100644 --- a/src/tools/ToolDefinition.ts +++ b/src/tools/ToolDefinition.ts @@ -7,6 +7,7 @@ import type {Dialog, ElementHandle, Page} from 'puppeteer-core'; import z from 'zod'; +import type {TextSnapshotNode} from '../McpContext.js'; import type {TraceResult} from '../trace-processing/parse.js'; import type {ToolCategories} from './categories.js'; @@ -68,6 +69,7 @@ export type Context = Readonly<{ closePage(pageIdx: number): Promise; setSelectedPageIdx(idx: number): void; getElementByUid(uid: string): Promise>; + getAXNodeByUid(uid: string): TextSnapshotNode | undefined; setNetworkConditions(conditions: string | null): void; setCpuThrottlingRate(rate: number): void; saveTemporaryFile( diff --git a/src/tools/input.ts b/src/tools/input.ts index eda04e80..02bb8a0f 100644 --- a/src/tools/input.ts +++ b/src/tools/input.ts @@ -7,6 +7,8 @@ import type {ElementHandle} from 'puppeteer-core'; import z from 'zod'; +import type {McpContext, TextSnapshotNode} from '../McpContext.js'; + import {ToolCategories} from './categories.js'; import {defineTool} from './ToolDefinition.js'; @@ -78,6 +80,61 @@ export const hover = defineTool({ }, }); +// The AXNode for an option doesn't contain its `value`. We set text content of the option as value. +// If the form is a combobox, we need to find the correct option by its text value. +// To do that, loop through the children while checking which child's text matches the requested value (requested value is actually the text content). +// When the correct option is found, use the element handle to get the real value. +async function selectOption( + handle: ElementHandle, + aXNode: TextSnapshotNode, + value: string, +) { + let optionFound = false; + for (const child of aXNode.children) { + if (child.role === 'option' && child.name === value && child.value) { + optionFound = true; + const childHandle = await child.elementHandle(); + if (childHandle) { + try { + const childValueHandle = await childHandle.getProperty('value'); + try { + const childValue = await childValueHandle.jsonValue(); + if (childValue) { + await handle.asLocator().fill(childValue.toString()); + } + } finally { + void childValueHandle.dispose(); + } + break; + } finally { + void childHandle.dispose(); + } + } + } + } + if (!optionFound) { + throw new Error(`Could not find option with text "${value}"`); + } +} + +async function fillFormElement( + uid: string, + value: string, + context: McpContext, +) { + const handle = await context.getElementByUid(uid); + try { + const aXNode = context.getAXNodeByUid(uid); + if (aXNode && aXNode.role === 'combobox') { + await selectOption(handle, aXNode, value); + } else { + await handle.asLocator().fill(value); + } + } finally { + void handle.dispose(); + } +} + export const fill = defineTool({ name: 'fill', description: `Type text into a input, text area or select an option from a `, + ); + await context.createTextSnapshot(); + await fill.handler( + { + params: { + uid: '1_1', + value: 'two', + }, + }, + response, + context, + ); + assert.strictEqual( + response.responseLines[0], + 'Successfully filled out the element', + ); + assert.ok(response.includeSnapshot); + const selectedValue = await page.evaluate( + () => document.querySelector('select')!.value, + ); + assert.strictEqual(selectedValue, 'v2'); + }); + }); }); describe('drags', () => { From dc9a78483d2a997e11b610cbbc91edf50f103686 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov <34244704+Lightning00Blade@users.noreply.github.com> Date: Mon, 13 Oct 2025 13:34:49 +0200 Subject: [PATCH 12/18] chore: use template for feature requests (#365) --- .github/ISSUE_TEMPLATE/01-bug.yml | 7 ++++ .github/ISSUE_TEMPLATE/02-feature.yml | 44 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 19 ---------- 3 files changed, 51 insertions(+), 19 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/02-feature.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/01-bug.yml b/.github/ISSUE_TEMPLATE/01-bug.yml index 02010b90..84e64387 100644 --- a/.github/ISSUE_TEMPLATE/01-bug.yml +++ b/.github/ISSUE_TEMPLATE/01-bug.yml @@ -70,3 +70,10 @@ body: - Windows - macOS - Linux + + - type: checkboxes + id: provide-pr + attributes: + label: Extra checklist + options: + - label: I want to provide a PR to fix this bug diff --git a/.github/ISSUE_TEMPLATE/02-feature.yml b/.github/ISSUE_TEMPLATE/02-feature.yml new file mode 100644 index 00000000..0933f9f6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/02-feature.yml @@ -0,0 +1,44 @@ +name: Feature +description: Suggest an idea for for chrome-devtools-mcp +title: '' +type: 'Feature' +label: + - enhancement +body: + - id: description + type: textarea + attributes: + label: Is your feature request related to a problem? Please describe. + description: > + A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + placeholder: + validations: + required: true + + - id: solution + type: textarea + attributes: + label: Describe the solution you'd like + description: > + A clear and concise description of what you want to happen. + placeholder: + validations: + required: true + + - id: alternatives + type: textarea + attributes: + label: Describe alternatives you've considered + description: > + A clear and concise description of any alternative solutions or features you've considered. + placeholder: + validations: + required: true + + - id: additional-context + type: textarea + attributes: + label: Additional context + description: > + Add any other context or screenshots about the feature request here. + placeholder: diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 5f0a04ce..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: '' ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. From f08f8080d0be1074a48e5c2ab0a6533f01f65928 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Mon, 13 Oct 2025 13:46:18 +0200 Subject: [PATCH 13/18] fix: return the default dialog value correctly (#366) Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/364 Closes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/361 --------- Co-authored-by: Nikolay Vitkov <34244704+Lightning00Blade@users.noreply.github.com> --- src/McpResponse.ts | 6 +++++- tests/McpResponse.test.ts | 30 +++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/McpResponse.ts b/src/McpResponse.ts index bf7603bf..4ea9f796 100644 --- a/src/McpResponse.ts +++ b/src/McpResponse.ts @@ -192,8 +192,12 @@ export class McpResponse implements Response { const dialog = context.getDialog(); if (dialog) { + const defaultValueIfNeeded = + dialog.type() === 'prompt' + ? ` (default value: "${dialog.defaultValue()}")` + : ''; response.push(`# Open dialog -${dialog.type()}: ${dialog.message()} (default value: ${dialog.message()}). +${dialog.type()}: ${dialog.message()}${defaultValueIfNeeded}. Call ${handleDialog.name} to handle it before continuing.`); } diff --git a/tests/McpResponse.test.ts b/tests/McpResponse.test.ts index 586b524f..d34abe8c 100644 --- a/tests/McpResponse.test.ts +++ b/tests/McpResponse.test.ts @@ -150,7 +150,7 @@ Emulating: 4x slowdown`, }); }); - it('adds a dialog', async () => { + it('adds a prompt dialog', async () => { await withBrowser(async (response, context) => { const page = context.getSelectedPage(); const dialogPromise = new Promise(resolve => { @@ -159,7 +159,7 @@ Emulating: 4x slowdown`, }); }); page.evaluate(() => { - alert('test'); + prompt('message', 'default'); }); await dialogPromise; const result = await response.handle('test', context); @@ -168,7 +168,31 @@ Emulating: 4x slowdown`, result[0].text, `# test response # Open dialog -alert: test (default value: test). +prompt: message (default value: "default"). +Call handle_dialog to handle it before continuing.`, + ); + }); + }); + + it('adds an alert dialog', async () => { + await withBrowser(async (response, context) => { + const page = context.getSelectedPage(); + const dialogPromise = new Promise(resolve => { + page.on('dialog', () => { + resolve(); + }); + }); + page.evaluate(() => { + alert('message'); + }); + await dialogPromise; + const result = await response.handle('test', context); + await context.getDialog()?.dismiss(); + assert.strictEqual( + result[0].text, + `# test response +# Open dialog +alert: message. Call handle_dialog to handle it before continuing.`, ); }); From 5a6592d0944a009bc1a4e1bfc5f900b2cc571410 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov <34244704+Lightning00Blade@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:00:09 +0200 Subject: [PATCH 14/18] ci: fix node version for pre-release (#368) --- .github/workflows/pre-release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 8bf19142..e7d7906f 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -16,6 +16,12 @@ jobs: with: fetch-depth: 2 + - name: Set up Node.js + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + with: + cache: npm + node-version-file: '.nvmrc' + - name: Install MCP Publisher run: | export TAG=$(curl -sL https://api.github.com/repos/modelcontextprotocol/registry/releases/latest | jq -r ".tag_name") From 477eef481a2e6241121ee4aaaed34e8342a8b347 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Mon, 13 Oct 2025 15:46:00 +0200 Subject: [PATCH 15/18] fix: update puppeteer to 24.24.1 (#370) Fixes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/322 via https://github.com/puppeteer/puppeteer/pull/14304 Fixes https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/292 via https://github.com/puppeteer/puppeteer/pull/14307 and https://github.com/puppeteer/puppeteer/pull/14306 --- package-lock.json | 56 +++++++++++++++++++++++------------------------ package.json | 4 ++-- src/browser.ts | 4 +--- 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5eb6888e..cf0e46bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@modelcontextprotocol/sdk": "1.20.0", "core-js": "3.46.0", "debug": "4.4.3", - "puppeteer-core": "^24.24.0", + "puppeteer-core": "^24.24.1", "yargs": "18.0.0", "zod": "^3.25.76" }, @@ -35,7 +35,7 @@ "eslint-plugin-import": "^2.32.0", "globals": "^16.4.0", "prettier": "^3.6.2", - "puppeteer": "24.24.0", + "puppeteer": "24.24.1", "sinon": "^21.0.0", "typescript": "^5.9.2", "typescript-eslint": "^8.43.0" @@ -446,16 +446,16 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.11", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.11.tgz", - "integrity": "sha512-kp3ORGce+oC3qUMJ+g5NH9W4Q7mMG7gV2I+alv0bCbfkZ36B2V/xKCg9uYavSgjmsElhwBneahWjJP7A6fuKLw==", + "version": "2.10.12", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.12.tgz", + "integrity": "sha512-mP9iLFZwH+FapKJLeA7/fLqOlSUwYpMwjR1P5J23qd4e7qGJwecJccJqHYrjw33jmIZYV4dtiTHPD/J+1e7cEw==", "license": "Apache-2.0", "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", - "semver": "^7.7.2", + "semver": "^7.7.3", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, @@ -1537,9 +1537,9 @@ } }, "node_modules/bare-fs": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.9.tgz", - "integrity": "sha512-sh8UV8OvXBZa3Yg5rhF1LNH3U4DfHniexdqyUXelC1thQUxO9TCF37yvd1/7Ir+cgeSg/6YrXyH67xvRr7yaOg==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.10.tgz", + "integrity": "sha512-arqVF+xX/rJHwrONZaSPhlzleT2gXwVs9rsAe1p1mIVwWZI2A76/raio+KwwxfWMO8oV9Wo90EaUkS2QwVmy4w==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1604,9 +1604,9 @@ } }, "node_modules/bare-url": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", - "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.0.tgz", + "integrity": "sha512-c+RCqMSZbkz97Mw1LWR0gcOqwK82oyYKfLoHJ8k13ybi1+I80ffdDzUy0TdAburdrR/kI0/VuN8YgEnJqX+Nyw==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -4719,18 +4719,18 @@ } }, "node_modules/puppeteer": { - "version": "24.24.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.24.0.tgz", - "integrity": "sha512-jRn6T8rSrQZXIplXICpH2zYJ2XrIFY7Ug0+TxRTuwY8ZTL7+MKDvFH0aLG7Xx3ts4twzxIKZmiYo+qg7whNpZw==", + "version": "24.24.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.24.1.tgz", + "integrity": "sha512-UFTlYvk+Gnvs6NIqbYPDkTfL+5/tUauG8ysUHA5ik+dsSjMK/klxmrTlS7OBEq5filiewu54FUIv+Iz8+bVRLQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.11", + "@puppeteer/browsers": "2.10.12", "chromium-bidi": "9.1.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1508733", - "puppeteer-core": "24.24.0", + "puppeteer-core": "24.24.1", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4741,17 +4741,17 @@ } }, "node_modules/puppeteer-core": { - "version": "24.24.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.24.0.tgz", - "integrity": "sha512-RR5AeQ6dIbSepDe9PTtfgK1fgD7TuA9qqyGxPbFCyGfvfkbR7MiqNYdE7AhbTaFIqG3hFBtWwbVKVZF8oEqj7Q==", + "version": "24.24.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.24.1.tgz", + "integrity": "sha512-4R9/hCjmyUBbQqjrCa+y4Pzgl3LneLfqB+Whh2JujA5Wzg+prnO60GxDPjAJmM+uirYxDx/8jIm0hGu8yDTyiA==", "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.11", + "@puppeteer/browsers": "2.10.12", "chromium-bidi": "9.1.0", "debug": "^4.4.3", "devtools-protocol": "0.0.1508733", "typed-query-selector": "^2.12.0", - "webdriver-bidi-protocol": "0.3.6", + "webdriver-bidi-protocol": "0.3.7", "ws": "^8.18.3" }, "engines": { @@ -5045,9 +5045,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5869,9 +5869,9 @@ } }, "node_modules/webdriver-bidi-protocol": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.6.tgz", - "integrity": "sha512-mlGndEOA9yK9YAbvtxaPTqdi/kaCWYYfwrZvGzcmkr/3lWM+tQj53BxtpVd6qbC6+E5OnHXgCcAhre6AkXzxjA==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.7.tgz", + "integrity": "sha512-wIx5Gu/LLTeexxilpk8WxU2cpGAKlfbWRO5h+my6EMD1k5PYqM1qQO1MHUFf4f3KRnhBvpbZU7VkizAgeSEf7g==", "license": "Apache-2.0" }, "node_modules/which": { diff --git a/package.json b/package.json index a278db9f..ef7b18be 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@modelcontextprotocol/sdk": "1.20.0", "core-js": "3.46.0", "debug": "4.4.3", - "puppeteer-core": "^24.24.0", + "puppeteer-core": "^24.24.1", "yargs": "18.0.0", "zod": "^3.25.76" }, @@ -60,7 +60,7 @@ "eslint-plugin-import": "^2.32.0", "globals": "^16.4.0", "prettier": "^3.6.2", - "puppeteer": "24.24.0", + "puppeteer": "24.24.1", "sinon": "^21.0.0", "typescript": "^5.9.2", "typescript-eslint": "^8.43.0" diff --git a/src/browser.ts b/src/browser.ts index 76fd14f4..a54d4e4b 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -142,9 +142,7 @@ export async function launch(options: McpLaunchOptions): Promise { } catch (error) { if ( userDataDir && - ((error as Error).message.includes('The browser is already running') || - (error as Error).message.includes('Target closed') || - (error as Error).message.includes('Connection closed')) + (error as Error).message.includes('The browser is already running') ) { throw new Error( `The browser is already running for ${userDataDir}. Use --isolated to run multiple browser instances.`, From 2082641cc7cd9cf91bfc7c587bd0105db84da087 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Mon, 13 Oct 2025 15:51:49 +0200 Subject: [PATCH 16/18] refactor: simplify snapshot generation (#369) the only difference is that checked/pressed are only included if the element was checked/pressed. Refs: https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/363 --- src/formatters/snapshotFormatter.ts | 69 +++++----------------- tests/McpResponse.test.ts | 2 +- tests/formatters/snapshotFormatter.test.ts | 2 +- 3 files changed, 18 insertions(+), 55 deletions(-) diff --git a/src/formatters/snapshotFormatter.ts b/src/formatters/snapshotFormatter.ts index 4b0365f5..68885edb 100644 --- a/src/formatters/snapshotFormatter.ts +++ b/src/formatters/snapshotFormatter.ts @@ -28,69 +28,32 @@ function getAttributes(serializedAXNodeRoot: TextSnapshotNode): string[] { `"${serializedAXNodeRoot.name || ''}"`, // Corrected: Added quotes around name ]; - // Value properties - const valueProperties = [ - 'value', - 'valuetext', - 'valuemin', - 'valuemax', - 'level', - 'autocomplete', - 'haspopup', - 'invalid', - 'orientation', - 'description', - 'keyshortcuts', - 'roledescription', - ] as const; - for (const property of valueProperties) { - if ( - property in serializedAXNodeRoot && - serializedAXNodeRoot[property] !== undefined - ) { - attributes.push(`${property}="${serializedAXNodeRoot[property]}"`); - } - } + const excluded = new Set(['id', 'role', 'name', 'elementHandle', 'children']); - // Boolean properties that also have an 'able' attribute - const booleanPropertyMap = { + const booleanPropertyMap: Record = { disabled: 'disableable', expanded: 'expandable', focused: 'focusable', selected: 'selectable', }; - for (const [property, ableAttribute] of Object.entries(booleanPropertyMap)) { - if (property in serializedAXNodeRoot) { - attributes.push(ableAttribute); - if (serializedAXNodeRoot[property as keyof typeof booleanPropertyMap]) { - attributes.push(property); - } - } - } - const booleanProperties = [ - 'modal', - 'multiline', - 'readonly', - 'required', - 'multiselectable', - ] as const; - - for (const property of booleanProperties) { - if (property in serializedAXNodeRoot && serializedAXNodeRoot[property]) { - attributes.push(property); + for (const attr of Object.keys(serializedAXNodeRoot).sort()) { + if (excluded.has(attr)) { + continue; } - } - - // Mixed boolean/string attributes - for (const property of ['pressed', 'checked'] as const) { - if (property in serializedAXNodeRoot) { - attributes.push(property); - if (serializedAXNodeRoot[property]) { - attributes.push(`${property}="${serializedAXNodeRoot[property]}"`); + const value = (serializedAXNodeRoot as unknown as Record)[ + attr + ]; + if (typeof value === 'boolean') { + if (booleanPropertyMap[attr]) { + attributes.push(booleanPropertyMap[attr]); } + if (value) { + attributes.push(attr); + } + } else if (typeof value === 'string' || typeof value === 'number') { + attributes.push(`${attr}="${value}"`); } } - return attributes; } diff --git a/tests/McpResponse.test.ts b/tests/McpResponse.test.ts index d34abe8c..11416447 100644 --- a/tests/McpResponse.test.ts +++ b/tests/McpResponse.test.ts @@ -89,7 +89,7 @@ uid=1_0 RootWebArea "" ## Page content uid=1_0 RootWebArea "My test page" uid=1_1 StaticText "username" - uid=1_2 textbox "username" value="mcp" focusable focused + uid=1_2 textbox "username" focusable focused value="mcp" `, ); }); diff --git a/tests/formatters/snapshotFormatter.test.ts b/tests/formatters/snapshotFormatter.test.ts index 0e17a512..47b7d288 100644 --- a/tests/formatters/snapshotFormatter.test.ts +++ b/tests/formatters/snapshotFormatter.test.ts @@ -100,7 +100,7 @@ describe('snapshotFormatter', () => { const formatted = formatA11ySnapshot(snapshot); assert.strictEqual( formatted, - `uid=1_1 checkbox "checkbox" checked checked="true" + `uid=1_1 checkbox "checkbox" checked uid=1_2 statictext "text" `, ); From 69f293de5052b2d029cd88e0415376ec23043f60 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov <34244704+Lightning00Blade@users.noreply.github.com> Date: Mon, 13 Oct 2025 15:57:42 +0200 Subject: [PATCH 17/18] docs: fix feature template (#372) --- .github/ISSUE_TEMPLATE/02-feature.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/02-feature.yml b/.github/ISSUE_TEMPLATE/02-feature.yml index 0933f9f6..26b30697 100644 --- a/.github/ISSUE_TEMPLATE/02-feature.yml +++ b/.github/ISSUE_TEMPLATE/02-feature.yml @@ -2,7 +2,7 @@ name: Feature description: Suggest an idea for for chrome-devtools-mcp title: '' type: 'Feature' -label: +labels: - enhancement body: - id: description From dced0f0e223b035e1fbe0c97cec233fef9907129 Mon Sep 17 00:00:00 2001 From: browser-automation-bot <133232582+browser-automation-bot@users.noreply.github.com> Date: Mon, 13 Oct 2025 16:46:53 +0200 Subject: [PATCH 18/18] chore(main): release chrome-devtools-mcp 0.8.1 (#371) :robot: I have created a release *beep* *boop* --- ## [0.8.1](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.8.0...chrome-devtools-mcp-v0.8.1) (2025-10-13) ### Bug Fixes * add an option value to the snapshot ([#362](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/362)) ([207137e](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/207137edd6d8af2f49277d88a30d8afa51671631)) * improve navigate_page_history error messages ([#321](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/321)) ([0624029](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0624029e0f8735345d202d29dde446b8869d9561)) * return the default dialog value correctly ([#366](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/366)) ([f08f808](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/f08f8080d0be1074a48e5c2ab0a6533f01f65928)) * update puppeteer to 24.24.1 ([#370](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/370)) ([477eef4](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/477eef481a2e6241121ee4aaaed34e8342a8b347)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- .release-please-manifest.json | 2 +- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- server.json | 4 ++-- src/main.ts | 2 +- 6 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 64f3cdd6..02f17d9d 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.8.0" + ".": "0.8.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a42f71e..c5a333c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [0.8.1](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.8.0...chrome-devtools-mcp-v0.8.1) (2025-10-13) + + +### Bug Fixes + +* add an option value to the snapshot ([#362](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/362)) ([207137e](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/207137edd6d8af2f49277d88a30d8afa51671631)) +* improve navigate_page_history error messages ([#321](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/321)) ([0624029](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/0624029e0f8735345d202d29dde446b8869d9561)) +* return the default dialog value correctly ([#366](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/366)) ([f08f808](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/f08f8080d0be1074a48e5c2ab0a6533f01f65928)) +* update puppeteer to 24.24.1 ([#370](https://github.com/ChromeDevTools/chrome-devtools-mcp/issues/370)) ([477eef4](https://github.com/ChromeDevTools/chrome-devtools-mcp/commit/477eef481a2e6241121ee4aaaed34e8342a8b347)) + ## [0.8.0](https://github.com/ChromeDevTools/chrome-devtools-mcp/compare/chrome-devtools-mcp-v0.7.1...chrome-devtools-mcp-v0.8.0) (2025-10-10) diff --git a/package-lock.json b/package-lock.json index cf0e46bb..5f284d1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "chrome-devtools-mcp", - "version": "0.8.0", + "version": "0.8.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "chrome-devtools-mcp", - "version": "0.8.0", + "version": "0.8.1", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "1.20.0", diff --git a/package.json b/package.json index ef7b18be..f9676cfa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chrome-devtools-mcp", - "version": "0.8.0", + "version": "0.8.1", "description": "MCP server for Chrome DevTools", "type": "module", "bin": "./build/src/index.js", diff --git a/server.json b/server.json index 1f1e7f6b..0daa30fd 100644 --- a/server.json +++ b/server.json @@ -6,13 +6,13 @@ "url": "https://github.com/ChromeDevTools/chrome-devtools-mcp", "source": "github" }, - "version": "0.6.0", + "version": "0.8.1", "packages": [ { "registryType": "npm", "registryBaseUrl": "https://registry.npmjs.org", "identifier": "chrome-devtools-mcp", - "version": "0.6.0", + "version": "0.8.1", "transport": { "type": "stdio" }, diff --git a/src/main.ts b/src/main.ts index d35e1f14..d86ad6dc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -31,7 +31,7 @@ import type {ToolDefinition} from './tools/ToolDefinition.js'; // If moved update release-please config // x-release-please-start-version -const VERSION = '0.8.0'; +const VERSION = '0.8.1'; // x-release-please-end export const args = parseArguments(VERSION);