Verified MCP server: Chrome DevTools

The Chrome DevTools MCP server, verified live on a real Mac.

  • Verified2026-08-03macOS 14.4.1
  • Packagechrome-devtools-mcp 1.6.0
  • Self-reportedchrome_devtools 1.6.0
  • MCP protocol2025-06-18
  • Runtimev25.8.1

The short answer

Last verified 2026-08-03

The Chrome DevTools MCP server lets an AI assistant drive and inspect a real Chrome: open pages, click and fill forms, read the console and the network panel, take screenshots and accessibility snapshots, record a performance trace, and run a Lighthouse audit. It is Google's own server, built by the Chrome DevTools team on the Chrome DevTools Protocol, it runs on your own Mac over stdio, and it needs no account, no API key, and no sign-up of any kind. We did not take the README's word for any of that: we ran it, spoke the protocol to it, enumerated all 29 tools the published 1.6.0 answers with, made real tool calls against a headless Chrome it launched for itself, and kept the raw output, including the exact errors it returns when the browser cannot start. Two names sit close to it and are not it: chrome-devtools on npm is the same package under a shorter name, version-locked to it, and mcp-chrome is an unrelated third-party server from a different maintainer. [1][3][4][7][8]

  • Tools

    29, enumerated live

  • Credentials

    None needed

  • Transport

    stdio, drives Chrome on your Mac [4]

  • Maintainer

    Google, Chrome DevTools team [1][3]

  • Downloads

    1.4M last week [2]

  • License

    Apache-2.0 [3]

Verification

How this MCP server was verified.

Method

We spawned the server with npx over stdio with the --headless and --isolated flags, wrote a raw JSON-RPC initialize frame to its standard input and read the reply straight off the wire, sent notifications/initialized, called tools/list, and then made two real tool calls against the Chrome the server started for itself: new_page on about:blank, then list_pages. No credential was involved at any point, because this server takes none. The Chrome on this Mac was 145.0.7632.160. The tool table below is the tools/list capture, word for word, and the banner is everything that reached standard error while that happened, including the two Node warning lines that Node itself prints before the server says anything. We also re-ran tools/list with a visible browser and got the same 29 tools, and with the --slim flag, which collapses the set to 3.

Startup banner

(node:99761) Warning: `--localstorage-file` was provided without a valid path
(Use `node --trace-warnings ...` to show where the warning was created)
chrome-devtools-mcp exposes content of the browser instance to the MCP clients allowing them to inspect,
debug, and modify any data in the browser or DevTools.
Avoid sharing sensitive or personal information that you do not want to share with MCP clients.
Performance tools may send trace URLs to the Google CrUX API to fetch real-user experience data. To disable, run with --no-performance-crux.

Google collects usage statistics to improve Chrome DevTools MCP. To opt-out, run with --no-usage-statistics.
For more details, visit: https://github.com/ChromeDevTools/chrome-devtools-mcp#usage-statistics
[chrome-devtools-mcp] The connecting client did not negotiate the MCP roots capability. File-writing tools will be restricted to the OS temp directory. To restore the previous unrestricted behavior, start the server with --allow-unrestricted-paths.

One real tool call

tools/call new_page {"url": "about:blank"}
## Pages
1: about:blank
2: about:blank [selected]

Real lines from the captured result: enough to prove the call answered.

Tools

Every tool, enumerated from the running server.

The server answered tools/list with 29 tools on 2026-08-03. The names, descriptions and parameters below are its own words, copied from that response and never edited.

ToolWhat it does
clickuid*dblClickincludeSnapshot

Clicks on the provided element

close_pagepageId*

Closes the page by its index. The last open page cannot be closed.

dragfrom_uid*to_uid*includeSnapshot

Drag an element onto another element

emulatenetworkConditionscpuThrottlingRategeolocationuserAgentcolorSchemeviewportextraHttpHeaders

Emulates various features on the selected page.

evaluate_scriptfunction*argsfilePathdialogAction

Evaluate a JavaScript function inside the currently selected page. Returns the response as JSON, so returned values have to be JSON-serializable.

filluid*value*includeSnapshot

Type text into an input, text area or select an option from a <select> element.

fill_formelements*includeSnapshot

Fill out multiple form elements (inputs, selects, checkboxes, radios) at once. ALWAYS prefer this tool over multiple individual 'fill' or 'click' calls when interacting with forms. It is significantly faster, more reliable, and reduces turn count. Example: Fill username, password, and check "Remember Me" in one call.

get_console_messagemsgid*

Gets a console message by its ID. You can get all messages by calling list_console_messages.

get_network_requestreqidrequestFilePathresponseFilePath

Gets a network request by an optional reqid, if omitted returns the currently selected request in the DevTools Network panel.

handle_dialogaction*promptText

If a browser dialog was opened, use this command to handle it

hoveruid*includeSnapshot

Hover over the provided element

lighthouse_auditmodedeviceoutputDirPath

Get Lighthouse score and reports for accessibility, SEO, best practices, and agentic browsing. This excludes performance. For performance audits, run performance_start_trace

list_console_messagespageSizepageIdxtypesincludePreservedMessagesserviceWorkerId

List all console messages for the currently selected page since the last navigation.

list_network_requestspageSizepageIdxresourceTypesincludePreservedRequests

List all requests for the currently selected page since the last navigation.

list_pages

Get a list of pages open in the browser.

navigate_pagetypeurlignoreCachehandleBeforeUnloadinitScripttimeout

Go to a URL, or back, forward, or reload. Use project URL if not specified otherwise.

new_pageurl*backgroundisolatedContexttimeout

Open a new tab and load a URL. Use project URL if not specified otherwise.

performance_analyze_insightinsightSetId*insightName*

Provides more detailed information on a specific Performance Insight of an insight set that was highlighted in the results of a trace recording.

performance_start_tracereloadautoStopfilePath

Start a performance trace on the selected webpage. Use to find frontend performance issues, Core Web Vitals (LCP, INP, CLS), and improve page load speed.

performance_stop_tracefilePath

Stop the active performance trace recording on the selected webpage.

press_keykey*includeSnapshot

Press a key or key combination. Use this when other input methods like fill() cannot be used (e.g., keyboard shortcuts, navigation keys, or special key combinations).

resize_pagewidth*height*

Resizes the selected page's window so that the page has specified dimension

select_pagepageId*bringToFront

Select a page as a context for future tool calls.

take_heapsnapshotfilePath*

Capture a heap snapshot of the currently selected page. Use to analyze the memory distribution of JavaScript objects and debug memory leaks.

take_screenshotformatqualityuidfullPagefilePath

Take a screenshot of the page or element.

take_snapshotverbosefilePath

Take a text snapshot of the currently selected page based on the a11y tree. The snapshot lists page elements along with a unique identifier (uid). Always use the latest snapshot. Prefer taking a snapshot over taking a screenshot. The snapshot indicates the element selected in the DevTools Elements panel (if any).

type_texttext*submitKey

Type text using keyboard into a previously focused input

upload_fileuid*filePath*includeSnapshot

Upload a file through a provided element.

wait_fortext*timeout

Wait for the specified text to appear on the selected page.

Parameters marked with * are required.

Setup

Working configs, one per app.

Copy the block for the app you use. Each one is the configuration this server was verified with.

Claude Desktop

Open the file ~/Library/Application Support/Claude/claude_desktop_config.json (in Claude Desktop: Settings, then Developer, then Edit Config) and add:

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": [
        "-y",
        "chrome-devtools-mcp@latest",
        "--headless",
        "--isolated"
      ]
    }
  }
}

There is no env block because this server takes no credentials. Quit and reopen Claude Desktop. The README's own example stops at chrome-devtools-mcp@latest; we add --headless and --isolated so the server drives a throwaway browser instead of the Chrome you are signed into. Drop those two lines when you want to watch it work. [4][11]

Claude Code

One command in your terminal:

claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest

That is the command from the project README, and --scope user makes it available in every project. There is also a plugin route: /plugin marketplace add ChromeDevTools/chrome-devtools-mcp then /plugin install chrome-devtools-mcp@chrome-devtools-plugins, which installs the server together with its skills. If you switch to the plugin, remove the manual install first. [4][12]

Cursor

Add to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json inside one project:

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": [
        "-y",
        "chrome-devtools-mcp@latest",
        "--headless",
        "--isolated"
      ]
    }
  }
}

Cursor picks the file up on restart. The README also offers a one-click install button for Cursor, which writes the same block for you, minus the two flags. [13][4]

Routines

No JSON file and no terminal. In Routines: Settings, then Assistant, then Connections, then Add MCP Server. Switch the form to Command (stdio) and enter:

Name        Chrome DevTools
Command     npx
Arguments   -y chrome-devtools-mcp@latest --headless --isolated

Environment Variables
CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS    1

The Arguments field splits on spaces, so keep it to exactly those four words. There is no token to paste anywhere: the single Environment Variable above is optional and is not a credential, it turns off the usage statistics Google collects by default. Click Test Connection first: a working server answers with its tool count, twenty-nine for this one. [14][4]

No terminal needed

Set the Chrome DevTools MCP server up without the terminal.

If you have never opened Terminal and never want to, this is your path. Routines is a Mac app that runs MCP servers for you: fill in three fields once, and this server's tools are available to your AI in chat and in scheduled routines. The only thing you need beyond the app is a copy of Google Chrome.

  1. 01

    Install Routines

    Download the app from getroutines.ai/download, drag it to Applications, and sign in.

  2. 02

    Check that you have Google Chrome

    This server does not simulate a browser, it drives the real one. Open your Applications folder and look for Google Chrome; if it is not there, install it from google.com/chrome first. Chrome for Testing works too. There is nothing else to install and nothing to sign up for.

  3. 03

    Open the MCP settings

    Click your account at the bottom of the sidebar and choose Settings. Open the Assistant section, then the Connections tab, scroll to MCP Servers, and click Add MCP Server.

  4. 04

    Choose Command (stdio)

    The form opens in URL (SSE/HTTP) mode. Switch it to Command (stdio): this server is a command, not a web address. Name: Chrome DevTools. Command: npx. Arguments: -y chrome-devtools-mcp@latest --headless --isolated, exactly those four words.

  5. 05

    Test, then add

    Environment Variables can stay empty, this server needs no credential. If you would rather not send usage statistics to Google, add CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS with the value 1 while you are here. Click Test Connection: Routines starts the server and reports how many tools it found, twenty-nine for this one. Then click Add Server.

  6. 06

    Use it

    The tools work in chat right away, so you can ask for a page to be opened and checked and watch what comes back. To let a scheduled routine use them, open the routine, find the Tools & connections card, and tick the server under Apps.

Routine ideas

Routines worth scheduling.

Once the server is connected, a scheduled routine can use its tools while you are away. Copy a prompt, paste it into Routines, and pick a time.

A morning console and network check

Prompt

Every weekday at 8:00, open the home page and the pricing page of my site in Chrome, list every console error and every network request that failed, and save the result as site-check.md in my Notes folder. If both pages are clean, write one line saying so.

A weekly Core Web Vitals trace

Prompt

Every Monday at 7:00, record a performance trace of my site home page, report the Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift with the biggest single cause of each, and append the numbers to web-vitals.md so I can watch the trend over months.

A nightly signup form watchdog

Prompt

Every night at 22:00, walk through the signup form on my staging site with test details, and tell me in one paragraph whether it completed. If any step failed, take a screenshot and note the console errors from that moment.

Troubleshooting

The errors we hit, and what fixed them.

Real errors captured during the verification run, printed exactly as the server returned them.

Every tool call answers Target closed

What you see

Protocol error (Target.setDiscoverTargets): Target closed
Cause: 

The fix

The server started and Chrome did not. This is the failure mode to know about this server: it boots happily with no browser at all and only breaks on the first tool call that needs one, so the connection test passes and the work fails. We produced this line on purpose by pointing --executablePath at a file that is not a browser. You will see the same thing when Chrome is missing, when the copy on disk is too old, or when a running Chrome is holding the profile the server asked for. Install or update Google Chrome, quit any Chrome that is already open, and add --isolated so the server uses a throwaway profile instead of yours.

A click or fill fails with No snapshot found

What you see

Error: No snapshot found for page 2. Use take_snapshot to capture one.

The fix

The uid values that click, fill, hover and drag take come from a page snapshot, and they go stale the moment the page changes. The server is saying it has no current snapshot to resolve your uid against. Ask the assistant to run take_snapshot first and act on an element from that fresh list. Capable clients do this on their own; a hand-written sequence has to do it in order.

The tool refuses the arguments you sent

What you see

MCP error -32602: Input validation error: Invalid arguments for tool new_page: [
  {
    "code": "invalid_type",
    "expected": "string",
    "received": "undefined",
    "path": [
      "url"
    ],
    "message": "Required"
  }
]

The fix

We called new_page with no url at all. Every argument is validated against the tool schema before the browser is touched, and the reply names the exact field: read the path line, then the message line. The same shape comes back for a mistyped parameter name or a number sent where a string was expected.

Cannot navigate to invalid URL

What you see

Error: Protocol error (Page.navigate): Cannot navigate to invalid URL

The fix

new_page and navigate_page hand the address straight to Chrome, which only accepts a complete one. We triggered this with not-a-url. Write https://example.com rather than example.com, and remember that about:blank and file:// addresses are fine too.

Screenshots and traces land somewhere you did not ask for

What you see

[chrome-devtools-mcp] The connecting client did not negotiate the MCP roots capability. File-writing tools will be restricted to the OS temp directory. To restore the previous unrestricted behavior, start the server with --allow-unrestricted-paths.

The fix

This line is printed at startup, not at failure, and it is easy to scroll past. When your MCP client does not announce the roots capability, every tool that writes a file, take_screenshot, take_snapshot, take_heapsnapshot, performance_start_trace and lighthouse_audit, is confined to the system temp folder no matter what filePath you pass. Either use a client that negotiates roots, or start the server with --allow-unrestricted-paths and accept that it can then write anywhere you can.

Could not connect to a Chrome you started yourself

What you see

Could not connect to Chrome. Check if Chrome is running.
Cause: Failed to fetch browser webSocket URL from http://127.0.0.1:9222/json/version: fetch failed

The fix

The --browser-url flag tells the server to attach to a Chrome that is already listening for debugging connections instead of launching its own. We pointed it at port 9222 with nothing there. Either drop the flag and let the server start Chrome itself, which is what every config on this page does, or start Chrome yourself with --remote-debugging-port=9222 before the server runs.

A flag you typed seems to do nothing

The fix

We started the server with --headles instead of --headless. It accepted the unknown flag without a word, started normally, ignored it, and exited cleanly afterwards, so a browser window appeared where we expected none. There is no error to look for here. If a flag seems to have no effect, check its spelling character by character against the README.

Your MCP client cannot start the server at all

The fix

The npx command belongs to Node.js. If Node is not installed on your Mac, every client on this page fails at the spawn step before the server can say anything. Install Node from nodejs.org, restart your MCP client, and try again.

FAQ

Questions people ask.

What is the Chrome DevTools MCP server?

It is Google's own MCP server for Chrome, published by the Chrome DevTools team. Once connected, an assistant such as Claude can open pages in a real Chrome, click and type, fill forms, read the console and the network panel, take screenshots and accessibility snapshots, record a performance trace, and run a Lighthouse audit. It runs as a local process on your Mac, talks to your AI app over stdio, and drives the browser over the Chrome DevTools Protocol. [4][3]

What tools does the Chrome DevTools MCP server include?

The running server answered with 29 tools: navigation (new_page, navigate_page, list_pages, select_page, close_page, wait_for), input (click, fill, fill_form, hover, drag, type_text, press_key, upload_file, handle_dialog), inspection (take_snapshot, take_screenshot, evaluate_script, list_console_messages, get_console_message, lighthouse_audit), network (list_network_requests, get_network_request), performance and memory (performance_start_trace, performance_stop_trace, performance_analyze_insight, take_heapsnapshot), and emulation (emulate, resize_page). The table above is that tools/list output, word for word.

Why do the docs list 52 tools when this page shows 29?

Both numbers are real, and the gap is release timing rather than configuration. The tool reference on the project main branch documents 52 tools, including heap snapshot analysis, Chrome extension management and screencasting; version 1.6.0, the one published on npm and the one we ran, answered tools/list with 29. Flags do not explain it: we re-ran the same call with a visible browser and got the same 29, and the --slim flag goes the other way, collapsing the catalog to 3 basic tools. [5][1]

Does it need an API key or an account?

No. There is nothing to sign up for and no credential to paste anywhere. The requirements are Node.js and a copy of Google Chrome, current stable or newer, or Chrome for Testing, on the same Mac. The npx command downloads the package from the public npm registry on first run, so the very first start needs an internet connection; after that the package is cached on your Mac. [4][1]

Is the Chrome DevTools MCP server safe?

Treat it as a high-trust connection, and Google says so first: the README warns that the server exposes the content of the browser instance to the MCP client, which can inspect, debug and modify any data in the browser or DevTools, and repeats the warning in the startup banner captured above. Started plainly it uses a persistent Chrome profile, which puts your cookies, history and signed-in sessions within reach of whatever is driving it, and evaluate_script runs arbitrary JavaScript in the page. Two flags change that, and every config on this page uses both: --isolated gives it a throwaway profile and --headless keeps the window off your screen. Two more are worth knowing: usage statistics go to Google unless you pass --no-usage-statistics or set CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS, and the performance tools may send trace URLs to Google's CrUX API unless you pass --no-performance-crux. [4]

Do I need the terminal to set it up?

No. In Routines you fill three fields in Settings and click Test Connection; the walkthrough above shows every click. Claude Desktop needs a small JSON file edited once. Only Claude Code is terminal-first by nature, and even there the project ships a plugin that installs the server for you. [14][11][4]

Which apps can use the Chrome DevTools MCP server?

Any MCP client that can launch a local stdio server: Claude Desktop, Claude Code, Cursor and Routines all can, and the exact config for each is above. There is no hosted address to point a client at. This server only exists as a process on your own machine, with Chrome running beside it, which is also why it can read a page that is behind your own login. [4][11][12][13][14]

Sources

Every external claim, receipted.

Anything on this page we did not observe in the run is linked here, with the date we read it. The run itself is the receipt for the rest.

  1. [1]

    npm registry: chrome-devtools-mcpaccessed 2026-08-03

    Latest version 1.6.0, published 2026-07-14, license Apache-2.0, repository ChromeDevTools/chrome-devtools-mcp. Maintainer accounts mathias and orkon.

  2. [2]

    npm downloads API: last weekaccessed 2026-08-03

    1,408,230 downloads for the week 2026-07-26 to 2026-08-01.

  3. [3]

    GitHub: ChromeDevTools/chrome-devtools-mcpaccessed 2026-08-03

    48,412 stars, Apache-2.0, not archived, last push 2026-08-02, per the GitHub API. The repository sits in the ChromeDevTools organisation.

  4. [4]

    chrome-devtools-mcp README (main branch)accessed 2026-08-03

    The run invocation, the client config blocks, the requirements (Node.js and Chrome), the disclaimers and the usage-statistics behaviour.

  5. [5]

    chrome-devtools-mcp tool referenceaccessed 2026-08-03

    The main-branch catalog, 52 documented tools, ahead of the 29 that published version 1.6.0 answers with.

  6. [6]

    chrome-devtools-mcp troubleshooting docaccessed 2026-08-03

    Confirms that a Target closed error means the browser could not be started.

  7. [7]

    npm registry: chrome-devtoolsaccessed 2026-08-03

    Same repository field and same maintainer accounts as chrome-devtools-mcp, version-locked at 1.6.0: an alias for the shorter search term, not a rival.

  8. [8]

    npm registry: mcp-chromeaccessed 2026-08-03

    An unrelated third-party Chrome-extension MCP server, latest 1.0.0, different maintainer, no GitHub repository in its npm metadata.

  9. [9]

    npm registry: @playwright/mcpaccessed 2026-08-03

    Microsoft's official browser MCP server, latest 0.0.78, built on Playwright rather than the Chrome DevTools Protocol.

  10. [10]

    npm registry: @modelcontextprotocol/server-puppeteeraccessed 2026-08-03

    Deprecated on npm at version 2025.5.12, still drawing 26,452 downloads in the week ending 2026-08-01; many older browser-automation guides still point at it.

  11. [11]

    modelcontextprotocol.io: Connect to local MCP serversaccessed 2026-08-03

    The official Claude Desktop quickstart and the config file location.

  12. [12]

    Claude Code docs: MCPaccessed 2026-08-03

    The claude mcp add syntax for local stdio servers and the --scope flag.

  13. [13]

    Cursor docs: Model Context Protocolaccessed 2026-08-03

    The mcp.json shape and the file locations.

  14. [14]

    Routines: Connectorsaccessed 2026-08-03

    How Routines runs one-click OAuth connectors and any MCP server.

This page describes Chrome DevTools as it behaved in one dated run on one Mac. Versions move: if something here no longer matches what you see, the capture date at the top says how old the reading is.

Behind this directory

Routines, the app behind this directory, runs MCP servers like this one without a terminal: see how connectors work. The reports it writes stay markdown files on your Mac, and there is no cloud bill. Download Routines