devtools-fleet-mcp
It gives each agent its own isolated, DevTools-equipped Chrome with saved logins and origin fencing, plus Google's full chrome-devtools-mcp browser toolset under its original names.
Manage per-agent browsers:
browser_start(state, headless, viewport, channel, url, allowedOrigins),browser_status,browser_restart(keep cookies/tabs, go visible for captchas),browser_stop.Saved logins:
state_savea browser's cookies/localStorage under a named, origin-bound state;state_listavailable states with origins and cookie/expiry info (never values); log in by hand viastate_login/state_login_finishand delete agent-made states.Diagnose the fleet:
fleet_doctorchecks Node, Chrome, chrome-devtools-mcp version, permissions, config, states and browsers.Navigate & manage pages:
navigate_page(URL/back/forward/reload),new_page,list_pages,select_page,close_page,resize_page.Inspect the DOM:
take_snapshot(a11y tree with uids),take_screenshot,get_css_styles,wait_for.Interact with pages:
click,hover,drag,fill,fill_form,press_key,type_text,upload_file,handle_dialog.Run JavaScript:
evaluate_script(inline or from file, with element uids as args, optional DOM-stability wait).Debug console & network:
list_console_messages,get_console_message,list_network_requests,get_network_request(headers, cookies, bodies).Performance & memory:
performance_start_trace,performance_stop_trace,performance_analyze_insight,take_heapsnapshot.Audit & record:
lighthouse_audit(accessibility, SEO, best practices; navigation or snapshot),screencast_start/screencast_stop.Emulate devices/conditions:
emulate(viewport, user agent, color scheme, geolocation, media features, HTTP headers, CPU/network throttling).
Manages a fleet of per-agent Chrome browsers with isolated profiles, saved logins, origin allowlists, and lifecycle management, while exposing Google's full DevTools toolset through the wrapped chrome-devtools-mcp.
Provides Lighthouse audit capabilities on web pages through the wrapped chrome-devtools-mcp toolset, enabling performance, accessibility, and SEO analysis.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@devtools-fleet-mcp Start a browser from my staging-admin login and check localhost:3000 for console errors"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Give every one of your AI agents its own Chrome, running Google's full DevTools toolset, already logged in, and fenced to the sites it should touch.
Why This Exists
Google's chrome-devtools-mcp is the best browser toolset an agent can have when the job is debugging a web app: console, network, performance traces, Lighthouse, heap snapshots. It stops working the moment you run more than one agent:
Agent two starts →
The browser is already running for …, because every server shares one Chrome profileSwitch on
--isolated→ every agent starts logged out and fights the wp-admin, staging or SSO login again, every timeThe MCP connection drops → the browser, its tabs and its login die with it
Ten agents are running → ten invisible headless Chromes. Nothing lists them, nothing cleans up after a crash
Other multi-agent browser tools solve pooling and logins, but on Playwright or through a browser extension. None of them carries Google's DevTools toolset.
Related MCP server: agentic-playwright-mcp
The Solution
devtools-fleet-mcp sits in front of chrome-devtools-mcp and manages the browsers. It doesn't reimplement a single browser tool: Google's tools are passed through unchanged, under the same names.
agent session A ─stdio─▶ devtools-fleet-mcp ─▶ chrome-devtools-mcp --browserUrl ─CDP─▶ Chrome A (own profile)
agent session B ─stdio─▶ devtools-fleet-mcp ─▶ chrome-devtools-mcp --browserUrl ─CDP─▶ Chrome B (own profile)
│
└──▶ ~/.devtools-fleet/ ◀── devtools-fleet CLI: ls, show, kill, gc, login, statesOne browser per agent, zero config. The first browser tool call launches that session's own Chrome. Up to 10 at once by default.
Browsers outlive the connection. An agent that reconnects inside the same session gets its browser back, tabs open. A small background reaper closes the browsers nobody comes back for.
Saved logins. Ask the agent to log you in: it opens a real window, you type the password (2FA, SSO and captchas are fine), it saves the result. Any number of agents can then start from that login in parallel, each in its own browser.
Origin allowlists. A browser started from a saved login can only reach that login's origins. Typed URLs, link clicks, redirects and popups elsewhere are blocked. Strict mode locks the whole network in Chrome itself.
Recovery. If Chrome or chrome-devtools-mcp dies, the next tool call brings it back and tells the agent what happened.
Watch any agent live. Ask it to show you its browser (
browser_show), or rundevtools-fleet show <id>for any agent's. Either opens Chrome's DevTools inspector on that page without disturbing the agent.
Quick Start
Requires Node.js 22.12+ and Google Chrome (or point chromePath at another Chromium build).
Install as a Claude Code plugin (recommended)
The plugin installs the MCP server and a skill that teaches agents the fleet workflow: check state_list, start from a saved login, respect the allowlist, recover after a crash.
Inside Claude Code:
/plugin marketplace add pluginslab/devtools-fleet-mcp
/plugin install devtools-fleet@pluginslab-devtools-fleetOr from your terminal:
claude plugin marketplace add pluginslab/devtools-fleet-mcp
claude plugin install devtools-fleet@pluginslab-devtools-fleetRestart Claude Code and check that devtools-fleet shows up under /mcp.
Already using chrome-devtools-mcp? Remove it (claude mcp remove chrome-devtools, or disable its plugin). devtools-fleet exposes the same tools under the same names, and two servers with identical tool names confuse agents.
Updating: /plugin marketplace update pluginslab-devtools-fleet, then restart. The server runs through npx, so it picks up new npm releases on its own.
Install the CLI
The plugin gives agents the MCP tools. Saving logins, watching agents and cleaning up are done by you, from the CLI:
npm install -g devtools-fleet-mcp
devtools-fleet doctorNo global install? Every command also works as npx -p devtools-fleet-mcp devtools-fleet <command>.
Other MCP clients
Claude Code without the plugin:
claude mcp add devtools-fleet -- npx -y devtools-fleet-mcpAny other client (.mcp.json, Cursor, Claude Desktop, …):
{
"mcpServers": {
"devtools-fleet": {
"command": "npx",
"args": ["-y", "devtools-fleet-mcp"]
}
}
}First test
Open two Claude Code sessions and ask both:
"Open http://localhost:3000 and check the console for errors."
Each gets its own Chrome; neither hits the profile lock. Then, in a terminal:
devtools-fleet lsFirst saved login
Ask an agent:
"Log me in to staging as staging-admin: https://staging.example.com/wp-login.php"
It calls state_login, a Chrome window opens, and you log in there. Tell the agent when you're done. It shows you which origins the login will be usable on, and saves it once you agree. Then:
"Using the staging-admin state, open the Plugins page and run a Lighthouse audit on it."
The agent calls state_list, then browser_start({ state: "staging-admin" }), and starts already logged in.
You can also log in from a terminal, with no agent involved: devtools-fleet login staging-admin https://staging.example.com/wp-login.php. Log in in the window that opens, come back to the terminal, press Enter, confirm the allowlist.
MCP Tools
devtools-fleet adds eleven tools. Everything else (navigate_page, take_snapshot, click, evaluate_script, list_network_requests, performance_start_trace, lighthouse_audit, …) is chrome-devtools-mcp's, with the same names and arguments, so its documentation and skills apply as-is.
browser_start
Starts this session's browser, or picks it up again after a reconnect. Optional: any browser tool starts one with defaults.
→ browser_start({ state: "staging-admin", url: "https://staging.example.com/wp-admin/" })
← Started: browser 3f9c2a, state "staging-admin", headless, stable
allowed origins: https://staging.example.com
tabs: https://staging.example.com/wp-admin/
uptime 2sParameter | Type | Description |
| string | Saved login to start from |
| boolean | Default from config ( |
| string | e.g. |
| string |
|
| string | Open this in the first tab |
| string[] | Without a state: restrict this browser voluntarily |
browser_status
This session's browser: id, state, allowlist, mode, open tabs, uptime, blocked requests.
→ browser_status()
← browser 3f9c2a, state "staging-admin", headless, stable
allowed origins: https://staging.example.com
tabs: https://staging.example.com/wp-admin/plugins.php
uptime 312s, 2 request(s) blocked so farbrowser_restart
Relaunches keeping cookies, storage and tabs. { headless: false } gives a visible window, for example so a person can solve a captcha.
→ browser_restart({ headless: false })
← Restarted with a visible window; reopened 2 tab(s). Page ids have changed: call list_pages.browser_show
Opens a live DevTools screencast of one of this session's tabs in the person's default browser, and returns the URL. Nothing reloads and the agent keeps working; headless browsers can be watched too. { open: false } only returns the URL. { tab: n } picks a tab.
→ browser_show()
← 1. Plugins ‹ Staging https://staging.example.com/wp-admin/plugins.php
Opened tab 1 for the person to watch:
http://127.0.0.1:52144/devtools/inspector.html?ws=127.0.0.1:52144/devtools/page/…browser_stop
Closes the browser and deletes its temporary profile.
→ browser_stop()
← Closed browser 3f9c2a.state_save
Saves the current browser's login under a name. Parameters: name, allowedOrigins (defaults to the open tabs' origins), strict, overwrite. An agent can only narrow its own allowlist, never widen it, and never overwrites a login a person made. For a fresh login by the person, state_login is the better fit.
→ state_save({ name: "local-shop" })
← Saved state "local-shop": 4 cookie(s), localStorage for 1 origin(s). Allowed: http://localhost:3000.state_list
Saved states with origins, cookie counts and expiry. Never values.
→ state_list()
← staging-admin: https://staging.example.com | 6 cookies (0 expired) | saved 2026-10-01T09:12:44.512Z by a person (CLI)
local-shop: http://localhost:3000 | 4 cookies (0 expired) | saved 2026-10-01T10:03:10.087Z by an agentstate_login and state_login_finish
The person logs in; the agent does everything else. state_login({ name, url }) opens a visible Chrome window at url (the session must have no browser running). The person logs in by hand and tells the agent. state_login_finish() then proposes the allowlist: where the login started and where it ended up, with origins only passed through (an SSO provider) left out, exactly as devtools-fleet login does. The agent shows it to the person, and state_login_finish({ confirm: true }) saves it and closes the window.
The state is recorded as made by a person: agents can't overwrite or delete it. state_login({ name, url, overwrite: true }) logs in again over an expired state and keeps its allowed origins.
Parameter | Type | Description |
| string | State name |
| string | Where the person starts, usually the login page |
| string[] | Extra origins, beyond where the login starts and ends |
| boolean | Block every request outside the allowlist when the state is used |
| boolean | Log in again over an existing state |
state_login_finish takes confirm and, for a new state, allowedOrigins to use instead of the proposal.
→ state_login({ name: "staging-admin", url: "https://staging.example.com/wp-login.php" })
← A Chrome window (browser 7d01e4) is open at https://staging.example.com/wp-login.php. …
→ state_login_finish()
← State "staging-admin" would only be usable on:
https://staging.example.com
Visited during the login but left out:
https://accounts.google.com
→ state_login_finish({ confirm: true })
← Saved state "staging-admin": 6 cookie(s), localStorage for 1 origin(s). Usable on: https://staging.example.com. …state_delete
Deletes a state an agent saved with state_save. Logins a person made are refused; remove those with devtools-fleet state rm.
fleet_doctor
The same checks as devtools-fleet doctor (Node, which Chrome, chrome-devtools-mcp version, permissions, config, states, browsers), so the agent can diagnose a browser that won't start itself.
CLI Reference
# See every fleet browser: id, status, session, state, mode, current tab
devtools-fleet ls
devtools-fleet ls --json
# Watch an agent's browser live in Chrome's DevTools inspector (doesn't disturb it)
devtools-fleet show 3f9c2a
devtools-fleet show 3f9c2a --tab 2 --print
# Close browsers
devtools-fleet kill 3f9c2a
devtools-fleet kill --all
# Close browsers whose session is gone; --detached also closes ones waiting for a reconnect
devtools-fleet gc
devtools-fleet gc --detached
# Log in by hand and save a state
devtools-fleet login staging-admin https://staging.example.com/wp-login.php
devtools-fleet login shop http://localhost:3000/login --allow https://cdn.example.com --strict
# Manage states (never prints cookie or storage values)
devtools-fleet states
devtools-fleet state show staging-admin
devtools-fleet state rm staging-admin
devtools-fleet state import shop ./storageState.json --allow http://localhost:3000
# Check Node, Chrome, permissions and config; print effective config
devtools-fleet doctor
devtools-fleet configBrowser statuses: active (an agent is connected), detached (the connection dropped; waiting for that session to reconnect), orphan (the session is gone; closed on the next cleanup), starting.
How It Works
Process Management
On the first browser tool call, devtools-fleet:
Checks the cap under a machine-wide lock (
maxBrowsers, default 10). A full fleet gets a clear error naming the running sessions anddevtools-fleet gcLaunches Chrome itself, on a port it picks, with its own temporary profile
Restores the state, if one was asked for: cookies over CDP,
localStoragethrough a throwaway tab whose request devtools-fleet answers itself, so the site is never contactedSpawns chrome-devtools-mcp from its own pinned
node_moduleswith--browserUrl, and re-exports its tool list unchangedRegisters the browser in
~/.devtools-fleet/browsers/<id>.json
When the connection drops, Chrome keeps running. When the same client session reconnects, it finds its browser in the registry and re-adopts it, tabs intact. A reaper process (one per machine, started on demand, gone when idle) closes orphans at once and detached browsers after orphanTimeoutMinutes.
How Sessions Are Recognised
MCP clients start servers through wrappers (npx, npm exec, node, shells) and restart that whole chain on reconnect, while the client session itself (the claude process, an editor's extension host) keeps running. devtools-fleet walks up the process tree past the wrappers to that session process. The same session reconnecting finds the same process and gets its browser back; a second session in the same directory finds a different one and never shares.
DEVTOOLS_FLEET_SESSION=<label> replaces the lookup with a fixed label, useful in CI or containers.
Saved Logins
devtools-fleet login opens a real Chrome window. You log in, come back to the terminal, press Enter. devtools-fleet proposes an allowlist of where you started and where you ended up. Origins you only passed through, such as an SSO provider, are listed but left out: saving their cookies would hand agents your whole SSO session. Add one with --allow if the app really needs it.
What gets saved: cookies and localStorage for the allowed origins, in Playwright's storageState format. Playwright loads these files directly, and state import takes Playwright or agent-browser files the other way.
Rules that keep states safe to hand to an agent:
States are only written outside git work trees, with mode
0600in a0700directory.No listing, CLI or MCP, ever shows cookie or storage values.
A state is always bound to an allowlist. There is no "use these cookies anywhere" mode.
The Allowlist
Allowlist entries are full origins:
Entry | Matches |
| exactly that scheme, host and port |
| ports matter: |
| any subdomain, not |
Two layers enforce it:
Argument check.
new_pageandnavigate_pageare checked before anything reaches the browser; the agent gets a plain error.Navigation interception. devtools-fleet's own CDP connection intercepts navigations in every tab, popup and frame and fails the ones outside the list. A tab that can't be put under interception is closed rather than left unguarded.
A browser with an allowlist also refuses file: URLs and extra browser contexts (new_page's isolatedContext), since pages there would sit outside the guard.
Strict mode (login --strict) is enforced by Chrome itself: the browser launches with a proxy that goes nowhere, and only the allowed origins bypass it. Every other request fails in Chrome's network stack: fetch(), XHR, beacons, workers, WebSockets, QUIC. WebRTC is pinned to the dead proxy and DNS prefetching is off. The lock holds even while no agent is connected. It's off by default because it also blocks CDNs you haven't listed. At that layer an entry means host and port, so http and https on the same port aren't told apart there; the navigation guard still tells them apart.
What the allowlist does not do:
It limits where the agent goes, not what it does there. On an allowed origin,
evaluate_scriptcan read anything the page can, including non-httpOnly cookies. Treat a saved login like handing someone your session.Without strict mode, only navigations are guarded, and only while an agent is connected. A detached browser can still be navigated away by a script already running in its pages.
Files and Paths
chrome-devtools-mcp only reads and writes files (screenshots, traces, uploads) inside the client's workspace roots and the temp directory. devtools-fleet passes your client's roots through, so take_screenshot({ filePath: "<project>/shot.png" }) works as usual. Nothing may point into ~/.devtools-fleet: not a filePath, not an upload_file, not a file: URL, symlinks included.
Data Storage
~/.devtools-fleet/
config.json # Optional configuration (see below)
browsers/
<id>.json # One registry entry per running browser
profiles/ # Temporary Chrome profiles, deleted on close
states/ # Saved logins (0700 dir, 0600 files)
<name>.json
locks/ # mkdir locks for the cap check and adoptionDEVTOOLS_FLEET_HOME moves the whole directory.
Configuration
~/.devtools-fleet/config.json, every key optional. Environment variables override the file.
Key | Env | Default | |
|
|
| |
|
|
| window size; desktop-sized so pages render their desktop layout. |
|
|
| |
|
| detected | |
|
|
| across the machine |
|
|
| how long a dropped connection's browser waits for a reconnect |
|
|
| |
|
| extra chrome-devtools-mcp flags | |
|
| extra Chrome flags, e.g. |
chrome-devtools-mcp collects usage statistics by default and may send performance trace URLs to Google's CrUX API. devtools-fleet keeps its defaults. Opt out with "upstreamArgs": ["--no-usage-statistics", "--no-performance-crux"].
Limits
Tested on macOS and Linux. Windows should work apart from reconnect re-adoption, but is untested.
Saved logins cover cookies and
localStorage. Not IndexedDB,sessionStorageor service worker caches.Sites with device-bound sessions (Device Bound Session Credentials) won't accept copied cookies.
Google accounts are not supported. Google blocks automated sign-in and binds sessions to devices.
Headless can't switch to a window in place.
browser_restartrelaunches, and the pages reload.The debugging port is local-only but not authenticated, the same as chrome-devtools-mcp and every CDP tool: other processes running as your user can drive these browsers.
Companion Tools
devtools-fleet is the look step for the PluginsLab WordPress MCPs:
MCP | Purpose |
Verified hooks/filters/APIs for writing plugin code | |
Verified block schemas for generating content | |
Ephemeral WordPress instances for testing | |
devtools-fleet-mcp (this) | One DevTools-equipped Chrome per agent for looking at the result |
Together: author → validate → test → look.
Requirements
Node.js 22.12+
Google Chrome (stable, beta, dev or canary), or any Chromium via
chromePathmacOS or Linux
Development
npm install
npm test # unit tests, no browser
npm run test:integration # launches real Chrome; ~1 minute
npm run lintLicense
MIT
Available Tools
38 toolsbrowser_restartA
Relaunch this session's browser keeping cookies, localStorage and open tabs. Pass headless: false to get a visible window (e.g. so the human can watch or solve a captcha), headless: true to hide it again. Pages reload.
Inputs: headless.
browser_startA
Start this session's own Chrome (isolated from every other agent). Optional: the first browser tool call starts one with defaults anyway. Call it explicitly to load a saved login (state), to pick headless/viewport/channel, or to open a URL. A browser started from a state can only visit that state's allowed origins. If this session already had a browser before a reconnect, it is picked up again with its tabs.
Inputs: url, state, channel, headless, +2 more.
browser_statusA
Show this session's browser: id, saved state, allowlist, headless, open tabs, uptime.
Inputs: no named parameters.
browser_stopA
Close this session's browser and delete its temporary profile.
Inputs: no named parameters.
clickC
Clicks on the provided element
Inputs: uid (required), pageId (required), dblClick, includeSnapshot.
close_pageB
Closes the page by its index. The last open page cannot be closed.
Inputs: pageId (required).
dragC
Drag an element onto another element
Inputs: pageId (required), to_uid (required), from_uid (required), includeSnapshot.
emulateA
Emulates various features on the target page. Each call replaces all emulation settings (except extraHttpHeaders), so pass all desired settings in a single call.
Inputs: pageId (required), viewport, userAgent, colorScheme, +7 more.
evaluate_scriptB
Evaluate JavaScript inside the target page. The source can be provided inline or loaded from a local file. Returns the response as JSON, so returned values have to be JSON-serializable.
Inputs: pageId (required), args, format, filePath, +4 more.
fillB
Type text into an input, text area or select an option from a element.
Inputs: uid (required), value (required), pageId (required), includeSnapshot.
fill_formA
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.
Inputs: pageId (required), elements (required), includeSnapshot.
get_console_messageARead-only
Gets a console message by its ID. You can get all messages by calling list_console_messages.
Inputs: msgid (required), pageId (required).
get_css_stylesARead-only
Retrieve matched CSS rules, inline styles (element.style), inherited styles, custom properties, and cascade wrappers (@layer, @media, @container, @scope) for an element identified by its UID. Rules are ordered from highest to lowest cascade precedence and include source line numbers (e.g. index:196). Active (winning) declarations have no prefix tag, while (losing) overridden declarations are prefixed with [overloaded]. Treat the output as authoritative and complete. Results are paginated (10 rules per page by default); use pageIdx to page through the remaining rules. Requires a UID from take_snapshot.
Inputs: uid (required), pageId (required), pageIdx, pageSize.
get_network_requestA
Gets a network request by an optional reqid, if omitted returns the currently selected request in the DevTools Network panel. Useful for inspecting request headers (including 'Cookie') and response headers (including 'Set-Cookie' and directives).
Inputs: pageId (required), reqid, requestFilePath, responseFilePath.
handle_dialogC
If a browser dialog was opened, use this command to handle it
Inputs: action (required), pageId (required), promptText.
hoverC
Hover over the provided element
Inputs: uid (required), pageId (required), includeSnapshot.
lighthouse_auditA
Get Lighthouse scores, failing audits, and the DOM nodes they flag for accessibility, SEO, best practices, and agentic browsing. Full reports are saved to disk. This excludes performance. For performance audits, run performance_start_trace
Inputs: pageId (required), mode, device, outputDirPath.
list_console_messagesBRead-only
List all console messages for the target page since the last navigation.
Inputs: pageId (required), types, pageIdx, pageSize, +3 more.
list_network_requestsARead-only
Lists the most recent requests for the target page since the last navigation.
Inputs: pageId (required), pageIdx, pageSize, resourceTypes, +1 more.
list_pagesBRead-only
Get a list of pages open in the browser.
Inputs: no named parameters.
new_pageC
Open a new tab and load a URL. Use project URL if not specified otherwise.
Inputs: url (required), timeout, background, isolatedContext.
performance_analyze_insightBRead-only
Provides more detailed information on a specific Performance Insight of an insight set that was highlighted in the results of a trace recording.
Inputs: pageId (required), insightName (required), insightSetId (required).
performance_start_traceA
Start a performance trace on the target webpage. Use to find frontend performance issues, Core Web Vitals (LCP, INP, CLS), and improve page load speed.
Inputs: pageId (required), reload, autoStop, filePath, +1 more.
performance_stop_traceB
Stop the active performance trace recording on the target webpage.
Inputs: pageId (required), filePath.
press_keyA
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).
Inputs: key (required), pageId (required), includeSnapshot.
resize_pageC
Resizes the page's window so that the page has specified dimension
Inputs: width (required), height (required), pageId (required).
screencast_startC
Starts recording a screencast (video) of the target page.
Inputs: pageId (required), filePath.
screencast_stopB
Stops the active screencast recording on the target page.
Inputs: pageId (required).
select_pageARead-only
Select a page as a context for future tool calls.
Inputs: pageId (required), bringToFront.
state_listA
List saved login states: name, allowed origins, cookie counts, when saved and when the first cookie expires. Never shows cookie values.
Inputs: no named parameters.
state_saveA
Save the current browser's login (cookies + localStorage) as a named state, so other sessions can start already logged in. Only cookies for the allowed origins are kept. allowedOrigins defaults to the http(s) origins open in tabs; it can never be wider than this browser's own allowlist. States a person created with devtools-fleet login cannot be overwritten.
Inputs: name (required), strict, overwrite, allowedOrigins.
take_heapsnapshotA
Capture a heap snapshot of the target page. Use to analyze the memory distribution of JavaScript objects and debug memory leaks.
Inputs: pageId (required), filePath (required).
take_screenshotC
Take a screenshot of the page or element.
Inputs: pageId (required), uid, format, quality, +2 more.
take_snapshotA
Take a text snapshot of the target 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).
Inputs: pageId (required), verbose, filePath.
type_textA
Type text using keyboard into a previously focused input
Inputs: text (required), pageId (required), submitKey.
upload_fileC
Upload a file through a provided element.
Inputs: uid (required), pageId (required), filePaths (required), includeSnapshot.
wait_forARead-only
Wait for the specified text to appear on the selected page. By default, hidden text is also matched. Set visible to true to wait until the matched text is visible.
Inputs: text (required), pageId (required), timeout, visible.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 38 tools
Most tools target clearly distinct browser/devtools actions, and paired tools like list_console_messages vs. get_console_message are distinguishable by their descriptions. There is some overlap among input tools (fill, fill_form, type_text, press_key) and between screenshot/snapshot tools, but the descriptions give enough guidance to choose correctly.
The set uses snake_case throughout, but the ordering and verb style are mixed: some tools are verb_noun (list_pages, take_screenshot), others are noun_verb or domain-prefixed (state_list, browser_start, screencast_start). The pattern is readable but not predictable across the whole surface.
With 38 tools, this is a large surface for a browser automation/devtools server, well above the typical well-scoped range. Many tools earn their place given the breadth of debugging features, but the count is heavy enough to increase selection burden.
The tool surface covers browser lifecycle, page interaction, snapshots, console, network, CSS, performance tracing, Lighthouse, dialogs, file upload, and saved login states. Minor gaps exist around broader cookie/storage management beyond named states, but core workflows are well covered.
Maintenance
Related MCP Connectors
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Launch, inspect, control, and share isolated cloud browsers for your agents.
Cloud browser, web extraction, screenshots, and remote CDP tools for AI agents.
Cloud browsers for AI agents: saved logins, residential IPs, live human takeover, 57 browser tools.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables AI agents and developers to automate real Chrome/Chromium browsers through the Chrome DevTools Protocol, with token-efficient snapshots, multi-action batching, shadow DOM traversal, system-page control, extension management, and network/WebSocket inspection.811MIT
- AlicenseNot gradedqualityBmaintenanceEnables multiple agents to share a single Chrome browser with isolated tabs and shared sessions, allowing coordinated browsing and automation.25 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to drive isolated, persistent Chromium browser profiles — each with its own cookies, fingerprint, and proxy — so they can complete real authenticated web workflows such as navigation, clicking, typing, extraction, screenshots, and JavaScript evaluation through a local endpoint.MIT
- AlicenseNot gradedqualityCmaintenanceProvides a hosted Chromium browser that lets AI agents navigate pages, click, type, hover, drag, fill forms and upload files, inspect network requests and console messages, run Playwright code, and capture screenshots without installing a browser locally. Each session gets an isolated headless browser with token-based authentication.MIT