Skip to content
CAI
Software that uses CAICheck a score

ChromeDevTools/chrome-devtools-mcp

52.8

Adequate · 28 September 2026

22.2k

lines of production code

TypeScript

with JavaScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Chrome DevTools Model Context Protocol (MCP) server that exposes browser automation and debugging capabilities to AI agents and developer tools. It provides a comprehensive suite of tools for inspecting CSS, managing extensions, auditing performance with Lighthouse, and analyzing memory via heap snapshots, alongside a lightweight 'slim' mode for basic navigation and screenshot tasks. The architecture supports persistent background sessions through a daemon, handles large trace data efficiently, and includes structured telemetry for usage tracking.

How it got here

2025 — SDK v2 migration and architecture refactor

14 changes.

The project upgraded to MCP SDK v2 and migrated to ESM, while refactoring the core architecture into dedicated BrowserManager, McpPage, and ToolHandler classes. This period introduced extensive new tooling for CSS, memory, extensions, and Lighthouse, supported by comprehensive test coverage and stricter ESLint rules to ensure code quality and bundling safety.

2026 — Daemon infrastructure and telemetry subsystem

20 changes.

This period focused on establishing a persistent background daemon for Chrome DevTools sessions and implementing a robust, structured telemetry system with a dedicated watchdog process. Significant work also went into expanding test coverage for the new daemon, telemetry, and slim-mode tools, alongside improvements to memory handling for large performance traces.

Features

DevTools integration bridge and configuration layer

This change introduces the core infrastructure for integrating the DevTools frontend with the application's MCP server. It adds a comment bridge to synchronize DevTools UI comments with server notifications, a host binding adapter to satisfy DevTools frontend API requirements, and utility functions to configure the DevTools universe (including source map and lazy loading settings) while suppressing redundant Audits subscriptions to improve performance. It also includes a loader for issue descriptions and type definitions for CSS-in-JS and skills.

src/devtools · high confidence

Introduce 'slim' mode with core browser interaction tools

Adds a new 'slim' toolset in src/tools/slim/tools.ts designed for maximum token efficiency. This set includes three specific tools: 'screenshot' for capturing page images, 'navigate' for loading URLs (which now proactively handles 'beforeunload' dialogs), and 'evaluate' for running JavaScript scripts, which is gated by a 'javascriptEvaluation' condition to allow users to disable JS execution entirely.

src/tools/slim · high confidence

Introduce background MCP daemon for persistent Chrome DevTools sessions

Users can now run the Chrome DevTools MCP server as a persistent background daemon rather than a short-lived process. A new client component (src/daemon/client.ts) manages the daemon lifecycle—starting it with configurable arguments, waiting for it to become ready via socket health checks, and stopping it—while the daemon itself (src/daemon/daemon.ts) maintains a long-running connection to the Chrome DevTools MCP tool and exposes a local socket for commands like status and tool invocation. The daemon writes a PID file with secure permissions (0o700 for the directory, 0o600 for the file) and validates ownership to prevent tampering, ensuring reliable session management across CLI interactions.

src/daemon · high confidence

Introduces chrome-devtools CLI and MCP server binaries with improved update checks and graceful shutdown

This change adds the executable entry points for the Chrome DevTools CLI (\chrome-devtools\) and the MCP server (\chrome-devtools-mcp\). The CLI now includes a \status\ command to check daemon health and version mismatches, and provides detailed error guidance for AI agents and developers when arguments are malformed. The MCP server binary enforces minimum Node.js LTS versions (20.19+ or 22.12+), respects the user's npm registry configuration for update checks, and ensures clean shutdown by exiting on stdin EOF and termination signals (SIGTERM/SIGINT/SIGHUP) to prevent hanging processes.

src/bin · high confidence

Introduces structured telemetry collection and reporting

The telemetry subsystem has been rebuilt to collect and report structured usage data via a dedicated watchdog process. The system now persists local state (such as last active time and last tool call) to a platform-specific JSON file, enabling daily active user tracking. It logs tool invocations with sanitized parameters, latency buckets, and context (e.g., localhost status, DevTools state), and identifies the MCP client (e.g., Claude Code, Gemini CLI, Copilot) to report usage by third-party developer tools. CLI flag usage is also recorded to track which options are explicitly set by users.

src/telemetry · high confidence

New profiling scenarios for CSS styles and console messages

The profiling tooling in scripts/profile now includes dedicated scenarios for measuring memory usage during CSS style retrieval and console message handling. The new get\_css\_styles scenario exercises the get\_css\_styles tool by navigating to a page, taking a snapshot, and repeatedly querying styles for elements with pagination, while the get\_console\_messages scenario measures the cost of navigating to a page and fetching up to 25 console messages. These scenarios allow users to profile the memory footprint of these specific MCP tool interactions.

scripts/profile · high confidence

New standalone watchdog process for reliable telemetry delivery

A new external watchdog process has been introduced to handle telemetry reporting, ensuring events are delivered even if the main application crashes. The watchdog runs as a separate process, receiving telemetry events via stdin and sending them to the Clearcut HTTP endpoint. It implements a buffering mechanism with a maximum size of 1000 events, automatic session rotation every 24 hours, and configurable flush intervals. On shutdown, it ensures a final flush of pending events before exiting, improving the reliability of telemetry data collection.

src/telemetry/watchdog · high confidence

New tooling for DevTools comments, CSS inspection, extensions, Lighthouse, memory, PWA, screencast, and third-party tools

The \src/tools\ directory has been reorganized into modular files, introducing a suite of new capabilities. Users can now interact with DevTools comments via \open\_devtools\, \get\_devtools\_comments\, \resolve\_devtools\_comment\, and \reveal\_in\_devtools\. CSS inspection is available through \get\_css\_styles\, which returns matched rules and cascade information. Chrome extension management is supported with \install\_extension\, \uninstall\_extension\, \list\_extensions\, \reload\_extension\, and \trigger\_extension\_action\. Lighthouse auditing is provided by \lighthouse\_audit\ for accessibility, SEO, and best practices. Memory debugging is expanded with \take\_heapsnapshot\, \get\_heapsnapshot\_summary\, \get\_heapsnapshot\_details\, \get\_heapsnapshot\_class\_nodes\, and \get\_heapsnapshot\_retainers\. PWA automation includes \install\_pwa\, \uninstall\_pwa\, \launch\_pwa\, and \get\_os\_app\_state\. Experimental screencast recording is available via \screencast\_start\ and \screencast\_stop\. Third-party developer tools can be listed and executed using \list\_3p\_developer\_tools\ and \execute\_3p\_developer\_tool\. Additionally, WebMCP tools are exposed through \list\_webmcp\_tools\ and \execute\_webmcp\_tool\. The tool categories have been updated to include \EXTENSIONS\, \THIRD\_PARTY\, \MEMORY\, \WEBMCP\, and \PWA\.

src/tools · high confidence

New utility functions for URL validation, byte sizes, and stable DOM waiting

The \src/utils\ directory now includes several new utility modules that enhance URL handling, resource management, and browser interaction. \url.ts\ introduces \isLocalhost\ for detecting loopback addresses, \isAllowedUrl\ for enforcing protocol and extension restrictions, and \validateUrl\ which now rejects URL patterns containing regular expression groups to prevent silent failures in network blocking rules. \bytes.ts\ adds \parseByteSize\ and \parseByteSizeRange\ to support human-readable size inputs with both decimal and binary units. \WaitForHelper.ts\ provides a robust mechanism for waiting on DOM stability and handling JavaScript dialogs during actions, ensuring that tool actions do not hang indefinitely when the renderer is paused. Additional utilities include \check-for-updates.ts\ for background version checking, \pagination.ts\ for list pagination, and \files.ts\ for canonical path resolution.

src/utils · high confidence

Removals

Removed legacy trace parsing and insight formatting logic

The \parse.ts\ file in \src/trace-processing\ has been deleted, removing the previous implementation for parsing raw trace buffers and formatting performance insights using the \PerformanceInsightFormatter\. This change eliminates the direct dependency on specific Chrome DevTools frontend modules for this parsing step and removes the helper function that outputted text from tool calls for development purposes.

src/trace-processing · high confidence

Architecture

Refactor browser and page management into dedicated classes

The internal architecture for managing the browser instance and per-page state has been reorganized. Browser launch and connection logic is now encapsulated in a new \BrowserManager\ class, which handles user data directories, display detection, and root-sandbox error reporting. Page-specific state (snapshots, emulation, collectors) is consolidated into a new \McpPage\ class, replacing the previous scattered Maps in \McpContext\. This refactoring also introduces a \ToolHandler\ class to manage tool execution, validation, and mutex locking, and extracts the application version into a dedicated \version.ts\ file.

src · high confidence

Behavioural changes

Build scripts migrate to sparse-checkout submodules and generate CLI/docs from tool definitions

The build process now initializes the devtools-frontend dependency as a sparse-checkout Git submodule (scripts/prepare.ts, scripts/clean-submodules.ts) instead of a full node\_modules package, and the post-build step (scripts/post-build.ts) creates mocks for DevTools internals (i18n, CodeMirror, skills) to support this layout. Additionally, the CLI is now auto-generated from tool schemas (scripts/generate-cli.ts), and documentation is generated directly from tool definitions (scripts/generate-docs.ts) rather than parsing runtime help output, with the README no longer being updated by the docs script.

scripts · high confidence

Chrome DevTools MCP server v1.10.1 release with ESM migration and SDK v2 upgrade

The chrome-devtools-mcp server has been updated to version 1.10.1, which includes a migration to ESM (renaming configuration files like eslint.config.mjs to eslint.config.js and .prettierrc.cjs to prettier.config.js) and an upgrade to the MCP SDK v2. The project now targets Node.js v24 (via .nvmrc) and bundles the chrome-devtools-frontend as a git submodule. This release also introduces new tools for CSS styling (get\_css\_style, get\_css\_styles), performance trace buffering, and heap snapshot querying, alongside fixes for console history retention and Puppeteer log handling.

(repo-wide) · high confidence

Improved memory handling for large performance traces and heap snapshots

Users can now process large Chrome DevTools performance traces and heap snapshots without hitting memory limits or causing leaks. The new chunked trace parser in src/processors/ChunkedTraceParser.ts breaks down large trace files into manageable batches, preventing heap exhaustion on files that exceed V8 string length limits. Additionally, the trace engine model is now instantiated fresh for each parse operation (src/processors/PerformanceTrace.ts) to prevent unbounded memory retention across sessions. Heap snapshot processing (src/processors/HeapSnapshotManager.ts) now strictly requires .heapsnapshot or .heaptimeline file extensions and provides detailed summaries of memory retained by specific contexts.

src/processors · high confidence

New ESLint rules enforce resource management, schema standards, and import safety

The project introduces several new ESLint rules in the \scripts/eslint\_rules\ directory to improve code quality and bundling safety. The \enforce-using\ rule ensures temporary file and directory helpers are declared with \using\ statements to guarantee automatic disposal, while the \enforce-zod-schema\ rule disallows \.nullable()\ and \.object()\ in tool schemas, requiring \.optional()\ and string representations instead. A new \no-direct-third-party-imports\ rule prevents value imports of third-party packages outside the \src/third\_party/\ barrel file, avoiding bundling failures. Additionally, \require-parsed-arguments\ enforces type annotations on \defineTool\ and \definePageTool\ callbacks, and the \check-license\ rule now requires an empty line after license headers.

_scripts/eslint\rules · high confidence

Refactored CLI configuration into modular option files

The CLI configuration logic has been reorganized into dedicated modules: \browser-options.ts\ now defines browser connection and launch flags (such as \--browserUrl\, \--wsEndpoint\, and \--channel\), while \category-options.ts\ manages tool category toggles (like \--categoryMemory\ and \--categoryNavigation\). This structural change supports the new default behavior where most tool categories are enabled by default, with specific categories like WebMCP, Extensions, and PWA remaining disabled until explicitly enabled by the user.

src/config · high confidence

Replaced legacy formatter functions with new class-based formatters

The \src/formatters\ directory has been refactored to replace the previous standalone functions (found in \consoleFormatter.ts\, \networkFormatter.ts\, and \snapshotFormatter.ts\) with dedicated class-based formatters. This change introduces \CommentFormatter\, \ConsoleFormatter\, \CssFormatter\, \HeapSnapshotFormatter\, \IssueFormatter\, \NetworkFormatter\, and \SnapshotFormatter\. These new classes provide structured output capabilities via \toJSON()\ methods alongside the existing \toString()\ text formatting, and introduce new features such as CSS cascade rule analysis (including pseudo-elements, keyframes, and container queries), detailed heap snapshot context analysis, and improved network request body handling with file saving support.

src/formatters · high confidence

Fixes

Preserve console history across same-document navigations

The PageCollector now retains console and error logs during same-document (SPA) navigations instead of clearing them. It achieves this by listening for the \FrameNavigatedWithinDocument\ event to flag these navigations, preventing the history rotation that normally occurs on standard \framenavigated\ events. This ensures that debugging information remains available as users interact with single-page applications.

src/collectors · high confidence

Test coverage

Add heap snapshot test fixture; Added comprehensive test coverage for core MCP components; Added end-to-end tests for chrome-devtools CLI and telemetry; Added tests for DevTools comment bridge and utility functions; Added tests for DevTools comments, CSS, extensions, Lighthouse, memory, pages, and performance tools; Added tests for HeapSnapshotManager validation and caching; Added tests for PageCollector navigation handling and ServiceWorkerCollector log retention; Added tests for chunked trace parsing and trace model isolation; Added tests for daemon client, utilities, and security checks; Added tests for telemetry infrastructure components; Added tests for the slim mode navigation and evaluation tools; Added unit tests for utility functions; Expanded test coverage for browser automation and evaluation scenarios.

Dependencies

Lighthouse MCP bundle updated to v13.4.1 with devtools-frontend integration

The bundled Lighthouse engine in src/third\_party has been updated to version 13.4.1, bringing the latest auditing capabilities and performance metrics to the MCP server. This change also integrates the devtools-frontend as a submodule, exposing its MCP exports and formatter/heap-snapshot workers through the third\_party index, allowing the server to leverage Chrome DevTools protocols and UI components for richer tool interactions.

_src/third\party · high confidence

Updated DevTools frontend submodule to commit 4057d3a

The third\_party/devtools-frontend submodule has been updated to commit 4057d3a. This change incorporates the latest upstream modifications from the DevTools frontend project into the codebase.

_third\party · high confidence

Upgrade to MCP SDK v2 and add experimental CLI

The chrome-devtools-mcp package has been upgraded to version 1.10.1, migrating the Model Context Protocol SDK from v1 to v2 (split into @modelcontextprotocol/client, @modelcontextprotocol/core, and @modelcontextprotocol/server). This release introduces an experimental 'chrome-devtools' CLI command alongside the existing 'chrome-devtools-mcp' binary, adds Lighthouse 13.4.1 for performance auditing, and updates the supported Node.js versions to 20.19.0+, 22.12.0+, and 23+. Additionally, it includes optional peer dependencies for GCF and TOON formats, and updates dev dependencies including ESLint to v10, Puppeteer to 25.11.0, and TypeScript to v6.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 52 → 53 (+0.5)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.16) — scores are not directly comparable.

Lenses

  • Code Health 81 → 75 (-5.9)
  • Architecture 82 (new)
  • Maturity 67 → 65 (-2.1)
  • Readiness 32 → 37 (+5.7)
  • Security 78 → 84 (+5.9)
  • Performance 60 (new)

Resolved (26)

  • Boundary-crossing change coupling: HeapSnapshotFormatter.ts ↔ ToolDefinition.ts (src/formatters/HeapSnapshotFormatter.ts)
  • Boundary-crossing change coupling: HeapSnapshotFormatter.ts ↔ memory.ts (src/formatters/HeapSnapshotFormatter.ts)
  • Change coupling: HeapSnapshotManager.ts ↔ memory.ts (src/HeapSnapshotManager.ts)
  • Change coupling: McpContext.ts ↔ extensions.ts (src/McpContext.ts)
  • Change coupling: McpContext.ts ↔ memory.ts (src/McpContext.ts)
  • Change coupling: McpContext.ts ↔ snapshot.ts (src/McpContext.ts)
  • Change coupling: input.ts ↔ screenshot.ts (src/tools/input.ts)
  • Change coupling: input.ts ↔ snapshot.ts (src/tools/input.ts)
  • Change coupling: screenshot.ts ↔ snapshot.ts (src/tools/screenshot.ts)
  • Dimension evaluation failed
  • High CVE: [GHSA redacted] (package-lock.json)
  • Hotspot: src/browser.ts (src/browser.ts)
  • Hotspot: src/index.ts (src/index.ts)
  • Low CVE: [GHSA redacted] (package-lock.json)
  • Medium CVE: [GHSA redacted] (package-lock.json)
  • Medium CVE: [GHSA redacted] (package-lock.json)
  • Medium CVE: [GHSA redacted] (package-lock.json)
  • Medium CVE: [GHSA redacted] (package-lock.json)
  • Medium CVE: [GHSA redacted] (package-lock.json)
  • No automated tests
  • …and 6 more

New (124)

  • BrowserManager.#connect (cognitive 28) (src/BrowserManager.ts)
  • BrowserManager.#connect (cyclomatic 18) (src/BrowserManager.ts)
  • BrowserManager.#launch (cognitive 21) (src/BrowserManager.ts)
  • BrowserManager.#launch (cyclomatic 21) (src/BrowserManager.ts)
  • Change coupling: McpResponse.ts ↔ console.ts (src/McpResponse.ts)
  • Change coupling: McpResponse.ts ↔ network.ts (src/McpResponse.ts)
  • ChunkedTraceParser.parseEventsArray (cognitive 52) (src/processors/ChunkedTraceParser.ts)
  • ChunkedTraceParser.parseEventsArray (cyclomatic 27) (src/processors/ChunkedTraceParser.ts)
  • ChunkedTraceParser.parseTraceEventsFromBuffer (cognitive 56) (src/processors/ChunkedTraceParser.ts)
  • ChunkedTraceParser.parseTraceEventsFromBuffer (cyclomatic 29) (src/processors/ChunkedTraceParser.ts)
  • ChunkedTraceParser.skipValue (cognitive 30) (src/processors/ChunkedTraceParser.ts)
  • ChunkedTraceParser.skipValue (cyclomatic 23) (src/processors/ChunkedTraceParser.ts)
  • ClassTooLong: McpContext (src/McpContext.ts)
  • ConsoleFormatter.from (cyclomatic 18) (src/formatters/ConsoleFormatter.ts)
  • CssFormatter.#collectAtRules (cognitive 19) (src/formatters/CssFormatter.ts)
  • CssFormatter.#collectKeyframes (cognitive 17) (src/formatters/CssFormatter.ts)
  • CssFormatter.#collectNodeStyles (cognitive 17) (src/formatters/CssFormatter.ts)
  • CssFormatter.appendCssSectionsToString (cognitive 16) (src/formatters/CssFormatter.ts)
  • CssFormatter.formatAncestorRuleHeader (cognitive 16) (src/formatters/CssFormatter.ts)
  • CssFormatter.formatAncestorRuleHeader (cyclomatic 19) (src/formatters/CssFormatter.ts)
  • …and 104 more

Changes since last survey

  • 201 commits — 154 feature/other, 47 fixes

By area

  • (root) — 41 commits
  • src/tools — 28 commits
  • third_party/devtools-frontend — 16 commits
  • tests/tools — 11 commits
  • tests/formatters — 9 commits
  • src/bin — 8 commits
  • src/config — 7 commits
  • src/telemetry — 7 commits
  • docs/configuration.md — 6 commits
  • .github/workflows — 5 commits
  • src/ToolHandler.ts — 5 commits
  • src/formatters — 4 commits
  • src/third_party — 4 commits
  • tests/utils — 4 commits
  • .github/dependabot.yml — 3 commits
  • docs/tool-reference.md — 3 commits
  • scripts/profile — 3 commits
  • src/McpContext.ts — 3 commits
  • src/devtools — 3 commits
  • scripts/eval_scenarios — 2 commits

Notable commits

  • fix: build: fix bundled packages metadata (#2538)
  • fix: build: fix devtools-frontend dependabot (#2540)
  • fix: build: fix devtools-frontend dependabot ignore rule (#2681)
  • fix: build: fix ignore condition for dependabot (#2548)
  • fix: ci: fix shallow checkout (#2526)
  • fix: fix(build): resolve node export conditions in rollup bundle (#2814)
  • fix: fix(clI): print the errror message alone instead of JSON in the CLI (#2580)
  • fix: fix(cli): adjust chrome-devtools start defaults (#2597)
  • fix: fix(cli): enable tools which require --memoryDebugging on the CLI (#2585)
  • fix: fix(cli): forward explicit false options on start (#2702)
  • fix: fix(cli): update the CLI skill (#2569)
  • fix: fix(config): preserve raw values for config coercion (#2747)
  • fix: fix(input): select empty-value options by text (#2501)
  • fix: fix(memory): expliclity mention the need of a flag (#2620)
  • fix: fix(performance): prevent memory leak by scoping trace engine model per parse (#2720)
  • fix: fix: accept multiple file paths for upload_file in the CLI (#2668)
  • fix: fix: better config support for chrome-devtools CLI (#2819)
  • fix: fix: bound ConsoleCollector retention per navigation (#2773)
  • fix: fix: detect scheduled script navigations (#2622)
  • fix: fix: do not append page url when the previously selected page is gone. (#2588)
  • …and 181 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

ChromeDevTools/chrome-devtools-mcp was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 28 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit ae0aaef884c41445d83f86f099ef211f4584b791 — the exact code this score is about.
  • Scored under rubric-2026.09.16 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-eb9197011364.