Skip to content

Chrome DevTools MCP Architecture Analysis

This document provides a detailed analysis of the Chrome DevTools MCP (Model Context Protocol) server’s complete architecture, runtime mechanisms, and data storage locations when used in VS Code with the GitHub Copilot extension in a VS Code + WSL environment.

Important Note: This research is based on using chrome-devtools-mcp through VS Code’s GitHub Copilot extension. If you start the MCP server directly from the command line or other methods, the architecture may differ.

Research Date: 2025-10-18 Environment: Windows 11 + WSL2 (Ubuntu 24.04.3) + VS Code Remote WSL + GitHub Copilot Extension MCP Version: chrome-devtools-mcp@0.8.1 Chrome Version: 141.0.0.0

┌─────────────────────────────────────────────────────────────┐
│ Windows System │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────┐ │
│ │ VS Code (Windows Client) │ │
│ │ └── Remote WSL Extension │ │
│ └──────────────┬─────────────────────────┘ │
│ │ Connection │
│ ┌──────────────▼─────────────────────────┐ │
│ │ WSL2 (Ubuntu 24.04.3) │ │
│ │ ├── VS Code Server │ │
│ │ │ ├── GitHub Copilot Extension │ │
│ │ │ │ └── MCP Framework │ │
│ │ │ │ └── Reads config │ │
│ │ │ │ └── mcp.json │ │
│ └──────────────┬─────────────────────────┘ │
│ │ │
│ │ Calls Windows-side npx │
│ │ │
│ ┌──────────────▼─────────────────────────┐ │
│ │ Node.js Process Chain │ │
│ │ ┌──────────────────────────────────┐ │ │
│ │ │ PID: 20484 │ │ │
│ │ │ npx chrome-devtools-mcp@latest │ │ │
│ │ │ └─────┬─────────────────────────┐ │ │ │
│ │ │ │ │ │ │ │
│ │ │ ▼ │ │ │ │
│ │ │ PID: 24832 │ │ │ │
│ │ │ chrome-devtools-mcp/index.js │ │ │ │
│ │ │ (Puppeteer Control Layer) │ │ │ │
│ │ └──────┬──────────────────────────┘ │ │ │
│ └─────────┼────────────────────────────┘ │ │
│ │ │ │
│ │ Starts and controls │ │
│ │ │ │
│ ┌─────────▼──────────────────────────┐ │ │
│ │ Google Chrome Process Tree │ │ │
│ │ ┌──────────────────────────────┐ │ │ │
│ │ │ PID: 12284 (Main Process) │ │ │ │
│ │ │ chrome.exe │ │ │ │
│ │ │ ├── PID: 8008 (GPU) │ │ │ │
│ │ │ ├── PID: 13360 (Renderer) │ │ │ │
│ │ │ ├── PID: 16264 (Renderer) │ │ │ │
│ │ │ ├── PID: 18116 (Network) │ │ │ │
│ │ │ ├── PID: 19404 (Extension) │ │ │ │
│ │ │ └── PID: 21012 (Utility) │ │ │ │
│ │ └──────────────────────────────┘ │ │ │
│ └────────────────────────────────────┘ │ │
│ │ │
│ Data Storage: │ │
│ C:\Users\<username>\.cache\chrome-devtools-mcp\ │ │
└───────────────────────────────────────────┘ │

Location: C:\Users\<username>\AppData\Roaming\Code\User\mcp.json

{
"servers": {
"chromedevtools/chrome-devtools-mcp": {
"type": "stdio",
"command": "npx",
"args": ["chrome-devtools-mcp@latest"],
"gallery": "https://api.mcp.github.com/v0/servers/...",
"version": "0.0.1-seed"
}
}
}

Key Findings:

  • Configuration file is stored in Windows user directory
  • type: "stdio" indicates communication via standard input/output
  • command: "npx" executes in Windows environment

Main npx Process (PID: 20484)

Command: "C:\Program Files\nodejs\node.exe"
"C:\Users\<username>\AppData\Roaming\npm\node_modules\npm\bin\npx-cli.js"
chrome-devtools-mcp@latest

MCP Server Process (PID: 24832)

Command: "node"
"C:\Users\<username>\AppData\Local\npm-cache\_npx\<hash>\
node_modules\.bin\..\chrome-devtools-mcp\build\src\index.js"
  1. Configuration Reading: VS Code’s GitHub Copilot reads mcp.json
  2. Cross-platform Call: Although VS Code Server runs in WSL, it calls Windows-side npx via Windows interop
  3. MCP Startup: npx downloads/runs chrome-devtools-mcp package
  4. Chrome Launch: MCP server uses Puppeteer library to launch Chrome
Terminal window
"C:\Program Files\Google\Chrome\Application\chrome.exe"
# Automation-related
--enable-automation # Enable automation mode
--remote-debugging-pipe # Use pipe for remote debugging
# Disabled features
--disable-background-networking
--disable-background-timer-throttling
--disable-backgrounding-occluded-windows
--disable-breakpad # Disable crash reporting
--disable-client-side-phishing-detection
--disable-component-extensions-with-background-pages
--disable-crash-reporter
--disable-default-apps
--disable-dev-shm-usage
--disable-hang-monitor
--disable-infobars # Disable info bars
--disable-ipc-flooding-protection
--disable-popup-blocking # Disable popup blocking
--disable-prompt-on-repost
--disable-renderer-backgrounding
--disable-search-engine-choice-screen
--disable-sync # Disable sync
--disable-extensions # Disable extensions
# Enabled features
--allow-pre-commit-input
--export-tagged-pdf
--force-color-profile=srgb # Force sRGB color profile
--generate-pdf-document-outline
--metrics-recording-only
--no-first-run # Skip first-run wizard
--password-store=basic
--use-mock-keychain
# Feature flags
--disable-features=Translate,AcceptCHFrame,MediaRouter,
OptimizationHints,RenderDocument,
ProcessPerSiteUpToMainFrameThreshold,
IsolateSandboxedIframes
--enable-features=PdfOopif
# Data directory
--user-data-dir=C:\Users\<username>\.cache\chrome-devtools-mcp\chrome-profile
# Initial page
about:blank
# Other
--hide-crash-restore-bubble
ParameterPurposeImpact
--enable-automationEnable automation modeBrowser displays “Chrome is being controlled by automated test software”
--remote-debugging-pipeUse pipe communicationCommunicate with Puppeteer via stdin/stdout
--user-data-dirSpecify user data directoryPersist data to specified location
--disable-extensionsDisable all extensionsAvoid extension interference with automation
No --headlessNot headless modeBrowser has visible window
C:\Users\<username>\.cache\chrome-devtools-mcp\chrome-profile\
├── Default/ # Default user profile
│ ├── Preferences # User preferences
│ ├── History # Browsing history
│ ├── Cookies # Cookie data
│ ├── Local Storage/ # Local storage
│ ├── Session Storage/ # Session storage
│ ├── IndexedDB/ # IndexedDB databases
│ └── Cache/ # Cache files
├── CertificateRevocation/ # Certificate revocation data
├── Crashpad/ # Crash reporting system
├── component_crx_cache/ # Component cache
├── extensions_crx_cache/ # Extensions cache
├── GraphiteDawnCache/ # Graphics cache
├── GrShaderCache/ # Shader cache
├── ShaderCache/ # Shader cache (backup)
├── Safe Browsing/ # Safe browsing data
├── OnDeviceHeadSuggestModel/ # Local search suggestion model
├── MEIPreload/ # Media extension preload
├── hyphen-data/ # Hyphenation data
├── FirstPartySetsPreloaded/ # First-party sets data
├── FileTypePolicies # File type policies
├── AutofillStates # Autofill states
└── Local State # Global state file
C:\Users\<username>\AppData\Local\Temp\ # Windows temp directory
└── (Chrome runtime temporary files)
~/.claude-chrome-devtools.log # MCP service log

Log Example:

2025-10-18T08:15:33.561Z mcp:log Starting Chrome DevTools MCP Server v0.8.1
2025-10-18T08:15:33.566Z mcp:log Chrome DevTools MCP Server connected
{
// Browser identification
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36",
"platform": "Win32",
"vendor": "Google Inc.",
// Viewport information
"viewport": {
"innerWidth": 1251,
"innerHeight": 1226,
"outerWidth": 1266,
"outerHeight": 1373,
"devicePixelRatio": 1.5
},
// Screen information
"screen": {
"width": 2560,
"height": 1440,
"availWidth": 2560,
"availHeight": 1392,
"colorDepth": 24
},
// Automation detection
"automation": {
"webdriver": true, // ✅ Indicates automation mode
"chromeRuntime": false,
"permissions": true
},
// System resources
"hardwareConcurrency": 8, // 8 logical CPU cores
"deviceMemory": 8, // 8 GB memory
"maxTouchPoints": 0, // Non-touch device
// Localization
"language": "en-US",
"timeZone": "Asia/Shanghai"
}

By inspecting Chrome process launch arguments:

  1. Default configuration (only specifying chrome-devtools-mcp@latest) does not include --headless parameter
  2. Therefore Chrome runs in windowed automation mode
  3. To use headless mode, you must explicitly configure --headless parameter in mcp.json

Although VS Code Server runs in WSL, Chrome runs in Windows:

WSL (VS Code Server)
↓ Via Windows interop
Windows (npx)
↓ Launches
Windows (chrome-devtools-mcp)
↓ Via Puppeteer
Windows (Chrome)

Key Technologies:

  • Windows-WSL Interop: WSL can directly call Windows executables
  • stdio Communication: MCP uses standard input/output for inter-process communication
  • Pipe Debugging: Chrome accepts control commands via --remote-debugging-pipe

Because all key processes run on Windows:

  • ✅ Node.js (npx) - Windows process
  • ✅ chrome-devtools-mcp - Windows process
  • ✅ Chrome - Windows process
  • ❌ VS Code Server - WSL process (only as initiator)

For true headless mode, modify mcp.json:

{
"chromedevtools/chrome-devtools-mcp": {
"type": "stdio",
"command": "npx",
"args": ["chrome-devtools-mcp@latest", "--headless", "true"]
}
}
{
"args": [
"chrome-devtools-mcp@latest",
"--executablePath",
"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
]
}

Note: Windows paths require escaped backslashes

{
"args": ["chrome-devtools-mcp@latest", "--isolated", "true"]
}

This creates a temporary directory for each session and automatically cleans up on exit.

{
"args": ["chrome-devtools-mcp@latest", "--viewport", "1920x1080"]
}
{
"args": [
"chrome-devtools-mcp@latest",
"--headless",
"true",
"--isolated",
"true",
"--viewport",
"1920x1080",
"--chromeArg=--disable-gpu",
"--chromeArg=--no-sandbox"
]
}

WSL Side:

Terminal window
tail -f ~/.claude-chrome-devtools.log

Windows PowerShell:

Terminal window
Get-Process chrome | Select-Object Id, ProcessName, Path, StartTime
Terminal window
Get-CimInstance Win32_Process -Filter "name='chrome.exe'" |
Select-Object ProcessId, CommandLine |
Format-List
Terminal window
Get-ChildItem "$env:USERPROFILE\.cache\chrome-devtools-mcp\chrome-profile" -Recurse |
Measure-Object -Property Length -Sum |
Select-Object @{Name="Size(MB)";Expression={[math]::Round($_.Sum/1MB, 2)}}
Terminal window
# Stop all Chrome processes
Stop-Process -Name chrome -Force
# Delete cache
Remove-Item "$env:USERPROFILE\.cache\chrome-devtools-mcp\chrome-profile" -Recurse -Force

A: Check if the --headless parameter is being used. Default configuration (only chrome-devtools-mcp@latest) should have a window.

A: This is normal. MCP service closes Chrome when there are no active connections. Keep VS Code Copilot active.

A:

  • Default: Yes, stored in C:\Users\<username>\.cache\chrome-devtools-mcp\chrome-profile\
  • With --isolated: No, uses temporary directory and cleans up on exit

Q4: How to connect to already running Chrome?

Section titled “Q4: How to connect to already running Chrome?”

A: Use --browserUrl parameter:

{
"args": ["chrome-devtools-mcp@latest", "--browserUrl", "http://127.0.0.1:9222"]
}

First manually start Chrome:

Terminal window
chrome.exe --remote-debugging-port=9222

A: No. Even if Chrome is installed in WSL (like /usr/bin/google-chrome), MCP will still launch Windows-side Chrome because the npx command itself executes on Windows.

Typical Chrome DevTools MCP occupies:

  • Chrome Processes: ~200-500 MB
  • Node.js (MCP Server): ~50-100 MB
  • Data Directory: ~10-50 MB (depending on usage)
  • Idle: <1%
  • Page Loading: 10-30%
  • JavaScript Execution: 20-50%
  • Initial Startup: ~5-10 MB (component downloads)
  • Normal Use: Depends on websites visited

Chrome displays an “is being controlled by automated test software” info bar, which may affect:

  • Some websites’ anti-bot mechanisms
  • navigator.webdriver property is true

Default configuration disables all extensions (--disable-extensions), including:

  • Ad blockers
  • Password managers
  • Other browser extensions

Data is stored locally but includes:

  • Browsing history
  • Cookies
  • Local storage data

Recommendations:

  • Use --isolated mode for sensitive operations
  • Regularly clear cache directory
  • Don’t log into personal accounts in automated browser

Some configurations may include --no-sandbox, which:

  • Reduces security
  • Allows broader system access
  • Use only when necessary (e.g., in Docker containers)

Key characteristics of Chrome DevTools MCP architecture when used via VS Code GitHub Copilot extension:

  1. Cross-platform: VS Code Server in WSL reads config, launches Windows-side services via Windows interop
  2. Windows Execution: Node.js, MCP server, and Chrome browser all run on Windows
  3. Windowed: Not headless by default, visible and manageable in Windows Task Manager
  4. Persistent: Data saved by default in Windows user cache directory (%USERPROFILE%\.cache\chrome-devtools-mcp\)
  5. Automated: Controlled via Puppeteer, supports full Chrome DevTools Protocol
  6. Flexible Configuration: Can adjust runtime mode, viewport size, data directory, etc. via parameters in mcp.json

This design retains Chrome’s full functionality while providing programmatic control, making it well-suited for development and testing scenarios.


Document Version: 1.0 Last Updated: 2025-10-18 Applicable Scenario: VS Code + GitHub Copilot Extension + chrome-devtools-mcp