start_chromeLABSCO SUMMARY
The browser's own record, not a picture of it.
The difference from screenshot-based tooling is what you can ask. "Which requests failed" is a list with status codes; "why is this element the wrong colour" is the matched CSS rules in cascade order; "what does it look like focused" is a forced pseudo-state rather than a description. Being able to write styles as well as read them means a fix can be tried in the live page before it is written into the source. The access this needs is real, so use it against a development browser.
What it is
A Python MCP server that speaks the Chrome DevTools Protocol to a real browser. The assistant gets what you would get from having DevTools open — the actual request list, the actual console, the live DOM and computed styles — rather than a screenshot to guess from.
What you get
- Get a browser going — start_chrome, start_chrome_with_debugging, connect_to_browser, disconnect_from_browser, get_browser_info, get_chrome_executable_path and navigate_to_url
- Network — get_network_requests for what the page actually fetched, get_network_response for one response body
- Console and JavaScript — get_console_logs, clear_console, enable_console_monitoring, disable_console_monitoring, evaluate_javascript, evaluate_in_all_frames and get_runtime_properties
- The DOM — get_document, query_selector, query_selector_all, get_element_attributes, get_element_outer_html, get_element_box_model, describe_element, get_element_at_position, search_elements and focus_element
- CSS, read and write — get_computed_styles, get_inline_styles, get_matched_styles, get_stylesheets, get_stylesheet_text, set_element_style, add_css_rule, set_stylesheet_text, force_pseudo_state for hover and focus states, and get_platform_fonts
- Storage — get_all_cookies, get_cookies, set_cookie, clear_all_cookies, get_storage_usage_and_quota, clear_storage_for_origin, get_storage_key_for_frame, track_cache_storage, track_indexeddb and override_storage_quota
- Page-level state — get_page_info and get_performance_metrics
- force_pseudo_state is the one that answers questions a screenshot cannot: what the button looks like on hover
Requirements
Chrome, and Python to run the server. It can start Chrome itself with remote debugging on — headless or not, on a port you choose — or attach to one you already have running. Everything is local; there is no account and no key. Bear in mind what remote debugging means: whatever the assistant is connected to, it can read cookies from and execute JavaScript in, so point it at your development site rather than a browser holding your real sessions.
Setup effort
Build from source — git clone https://github.com/benjaminr/chrome-devtools-mcp.git
USE CASES
A page is loading slowly and you do not know why
Read the actual request list with timings, then open the response that is holding things up.
Something is throwing and the stack trace is not enough
Read the console, then evaluate expressions against the live page state.
An element is styled wrong and the CSS looks right
Read the computed and matched styles in cascade order to find which rule actually won.
Trying a fix before writing it into the source
Set the style or add the rule in the live page and look at the result.
Checking a hover or focus state
Force the pseudo-state and read the styles that apply under it.
Reproducing a bug that only happens for logged-out users
Clear the cookies and storage for the origin and reload.
48 tools
Listed in project docs. Your client may show a different list.
start_chrome_with_debuggingconnect_to_browserdisconnect_from_browserget_browser_infoget_chrome_executable_pathnavigate_to_urlget_network_requestsget_network_responseget_console_logsclear_consoleevaluate_javascriptget_runtime_propertiesenable_console_monitoringdisable_console_monitoringget_documentquery_selectorquery_selector_allget_element_attributesget_element_outer_htmlget_element_box_modeldescribe_elementget_element_at_positionsearch_elementsfocus_elementget_computed_stylesget_inline_stylesget_matched_stylesset_element_styleadd_css_ruleget_stylesheetsget_stylesheet_textset_stylesheet_textforce_pseudo_stateget_platform_fontsget_storage_usage_and_quotaclear_storage_for_originget_all_cookiesclear_all_cookiesset_cookieget_storage_key_for_frametrack_cache_storagetrack_indexeddboverride_storage_quotaget_page_infoget_performance_metricsget_cookiesevaluate_in_all_framesBEFORE YOU INSTALL
What to know first
Tools you get
48 tools named in the project's documentation.
Requires
- Python 3.10+
- uv
- Google Chrome
INSTALLATION
Connect your client
Server setup
Clone this repository
git clone https://github.com/benjaminr/chrome-devtools-mcp.git
cd chrome-devtools-mcpInstall dependencies with uv (creates .venv)
uv syncMCP Clients
Claude Desktop
{
"mcpServers": {
"chrome-devtools": {
"command": "<YOUR_PATH_TO_CHROME_DEVTOOLS_MCP>/.venv/bin/python",
"args": [
"<YOUR_PATH_TO_CHROME_DEVTOOLS_MCP>/server.py"
],
"env": {
"CHROME_DEBUG_PORT": "9222"
}
}
}
}<YOUR_PATH_TO_CHROME_DEVTOOLS_MCP> (it appears twice) is the full path of the chrome-devtools-mcp folder the git clone step creates — run pwd inside it to print it.
Claude Code
Run this from inside the chrome-devtools-mcp folder, after uv sync — Claude Code needs absolute paths to both the Python interpreter and the server script:
claude mcp add chrome-devtools --env CHROME_DEBUG_PORT=9222 -- "$(pwd)/.venv/bin/python" "$(pwd)/server.py"Claude Desktop — Extension
Download the latest .dxt file (chrome-devtools-protocol-1.0.3.dxt) from https://github.com/benjaminr/chrome-devtools-mcp/releases
Open Claude Desktop, go to Extensions and install the downloaded .dxt file — it includes all dependencies, so no clone is needed
Configure Chrome path if needed in extension settings