chrome-dev-mcp
Skill4 starsChanged 5 days agoMITView on GitHub
Use this skill when the user invokes /chrome-dev-mcp or asks for Chrome DevTools MCP, CDP, list_pages/select_page, UXC packaging for Chrome DevTools, DOM snapshots, Console, Network, Performance, Lighthouse, heap analysis, browser-internal debugging, connection recovery, or correct-Chrome validation across Claude Code, Codex, Grok Build/Grok002, Cursor CLI, Hermes, or WorkBuddy. Use it when the evidence is Chrome-specific (Lighthouse, a full trace, heap data) or the caller has no page session yet; a page already open in ego-browser keeps its own Console and request diagnosis. Also use it as the verification step right after the user or this session changes a web UI or asks to accept or check a page: collect a screenshot, Console, and Network evidence before calling it done. Do not use it for ordinary navigation, form filling, scraping, or desktop UI unless browser-internal signals or UI-change acceptance are required. A passing readiness or list_pages check proves the connection only, never the change.
In this repository43 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- llms.txtllms.txt
- agent-symlink-initSkill
- code-inspector-initSkill
- commitSkill
- copywritingSkill
- css-tailwind-stylingSkill
- lingui-best-practicesSkill
- lingui-workflowSkill
- repo-skill-creatorSkill
- weekly-reportSkill
- agent-dispatchSkill
- agentic-review-handoffSkill
- agent-practice-auditSkill
- agent-symlink-initSkill
- architecture-hardening-loopSkill
- ardot-mcpSkill
- branch-creatorSkill
- code-inspector-initSkill
- code-plugin-architectureSkill
- commit-pushSkill
- commitSkill
- decision-first-technical-writingSkill
- design-systemSkill
- desktop-agent-activitySkill
- dev-environment-roi-auditSkill
- disk-tidySkill
- figma-mcpSkill
- file-tidySkill
- goal-gateSkill
- grill-autopilotSkill
- kimi-computer-useSkill
- lingui-workflowSkill
- local-web-surfaceSkill
- open-code-review-loopSkill
- prompt-studioSkill
- review-prompt-composerSkill
- task-completion-loopSkill
- uxc-facadeSkill
- web-performance-auditSkill
- weekly-reportSkill
- workflow-gateSkill
- worktree-tidySkill
The file
We split this skill into the rules it gives an agent
6 rules. About 0 are common, 1 is distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 17
Run helpers with zsh from this skill's directory (under bash they abort with A: unbound variable).
- Very specific: line 26
If readiness prints STATUS=ERROR:
- Very specific: line 40
If the requested tab is not in the list, it belongs to another browser or profile.
- Distinctive: line 41
Never print the page list or unrelated URLs, titles, body text, cookies, or tokens.
- Very specific: line 56
Use waitForStableDom=false for read-only evaluate_script.
- Very specific: line 86
If one is missing, report the change UNVERIFIED and name the gap.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Chrome Dev MCP
Collect browser-internal evidence (snapshots, Console, Network, Performance, Lighthouse, heap) from one identity-checked Chrome through the shared chrome-dev-mcp-cli. Every agent on the machine reuses one daemon-backed MCP child, so the rules below exist to keep that shared session healthy and to keep your claims honest.
Everything a page task needs is in this file. Read a reference only when its trigger below applies; the uxc-facade skill is a packaging method and is not needed to run a task.
Get a proven connection
Run helpers with zsh from this skill's directory (under bash they abort with A: unbound variable).
| Invocation | Command | On success |
/chrome-dev-mcp with no task | zsh scripts/uxc-readiness.zsh | Reply only CHROME_DEV_MCP_READY |
| Any page task | zsh scripts/uxc-readiness.zsh --private-result | Keep the list_pages JSON private and use it to pick the numeric pageId |
Both run one real shared list_pages and check the UXC envelope and the tool result (data.isError). A page task runs only the private mode, once; do not run the sanitized mode first.
If readiness prints STATUS=ERROR:
- Except for
link_contract_mismatch(step 3), runzsh scripts/ensure-connection.zsh --recoveronce, then repeat the same readiness command once. The post-recovery JSON is your page list. ERROR_CLASS=exclusive_key_busymeans another MCP session holds the browser. If this session called host-native Chrome DevTools tools (for examplemcp__chrome-devtools__*), that session is the holder: stop using them. Otherwise another agent is mid-call; the single retry above is enough.ERROR_CLASS=link_contract_mismatchmeans the shared launcher was generated for a different copy of this skill (for example an installed copy while you run from a repository checkout). Recovery cannot fix it. Read the bound copy withgrep -o "UXC_LINK_SKILL_PATH='[^']*'" "$(command -v chrome-dev-mcp-cli)"and rerun the helpers from that directory. Do not rerunsetup-uxc-link.zshto repoint the launcher: it is shared by every agent and fails closed on a foreign contract by design.- Still failing: report the one failing layer (
ERROR_CLASSorREASON) and one next action.WRONG_PROFILE,WRONG_BINARY, orNOT_CHROMEfail closed; read references/profile-identity.md.
Never run uxc daemon stop, restart, or kill UXC, Chrome, or MCP processes to recover: the daemon and browser are shared, so this cuts off other agents' sessions. Never loop on retries, scan ports, read DevToolsActivePort, attach to another browser, call uxc directly, or fall back to npx/@latest. Do not substitute Playwright, Computer Use, or raw CDP for a failed connection; their evidence comes from a different browser session. If chrome-dev-mcp-cli is missing, run zsh scripts/setup-uxc-link.zsh once (it installs the launcher only when the pinned owned UXC is present and refuses foreign links); if that fails, report NATIVE_COMPAT_REQUIRED. Use host-native chrome-devtools only when the user explicitly asks for native compatibility, and label that mode.
Pick the target page
- Take
pageIdfrom this turn'slist_pages, never from an earlier turn. Other agents open, close, and navigate tabs, so ids shift: re-runlist_pagesand match by URL before each batch of writes, after recovery, and after any navigation. - The page list is the text at
data.content[0].text, one tab per line as<id>: <title> (<url>) [selected]. Match on the URL inside the last parentheses, not the title; a host/port prefix match is enough when the user gave no path. - Pass
pageId=<id>to every page-scoped call. Do not rely onselect_pagestate. - If the requested tab is not in the list, it belongs to another browser or profile. Say so. Open the URL with
new_pageonly when it needs no existing login state; otherwise ask the user to open it in the managed Chrome. - Never print the page list or unrelated URLs, titles, body text, cookies, or tokens.
Call the CLI correctly
chrome-dev-mcp-cli --timeout-ms 15000 take_snapshot pageId=3
chrome-dev-mcp-cli evaluate_script pageId=3 waitForStableDom=false 'function=() => document.title'
chrome-dev-mcp-cli list_network_requests pageId=3 pageSize=20 'resourceTypes:=["fetch","xhr"]'
chrome-dev-mcp-cli navigate_page pageId=3 type=url url='http://localhost:3000/x' timeout=30000
chrome-dev-mcp-cli <operation> -h # live schema wins over this file- Arguments are
key=value, orkey:=<json>for arrays and objects. There are no--pageId/--jsonflags and nocallsubcommand. --timeout-msis a global flag and goes before the operation.navigate_pageandnew_pagehave their own 10-second navigation timeout: passtimeout=30000for dev servers. A navigation timeout often means a slowloadevent, not a failed page; take a snapshot before retrying."ok": trueonly means UXC delivered the call. The operation failed ifdata.isErroris true; readdata.content[0].textfor the reason.- Use
waitForStableDom=falsefor read-onlyevaluate_script. Take a fresh snapshot before element work and after each interaction;uids change when the DOM changes. Re-read Console and Network after an interaction too, because earlier lists do not include what the interaction triggered.
Write artifacts to the runtime temp root
Screenshots, snapshots, traces, heap snapshots, and saved bodies go under "$(getconf DARWIN_USER_TEMP_DIR)" (the MCP child's os.tmpdir(), /var/folders/.../T/). The runtime rejects /tmp, host scratchpads, and repository paths with is not within any of the configured workspace roots. Always pass filePath for screenshots, because the inline image is truncated and unusable; format=jpeg saves with a .jpeg extension. Copy the file elsewhere afterwards if needed, and return the path with a bounded summary. Never add --allow-unrestricted-paths. If that directory is also denied, stop trying other paths and report the artifact UNVERIFIED.
Collect Network evidence
list_network_requestswith the freshpageId; pick the failing request'sreqid.get_network_request pageId=<id> reqid=<reqid>returns status, headers, and body inline. UseresponseFilePath=under the runtime temp root only for a large body. Read only the fields the task needs.- A missing body does not mean the request failed or returned nothing; Chrome may not retain bodies of failed, redirected, or streamed responses. Report the status and headers, mark the body unavailable, and never replay a request with side effects to get it.
Keep a time budget
Readiness bounds its list_pages at 45 seconds. Allow one recovery and one retry per invocation. Keep a routine diagnosis within about 90 seconds of tool time; when the budget is spent or a call fails, report what you have and mark the rest UNVERIFIED. Performance traces and Lighthouse state their own durations, so skip --timeout-ms for them.
Share the browser safely
Calls through chrome-dev-mcp-cli still run one at a time: the runtime can run tools for different pages in parallel, but the shared UXC session delivers them in order, so concurrent calls save no time. No cross-agent lock exists for multi-step writes to one tab. When another agent may own the tab, report UNVERIFIED instead of racing it. Real pointer, keyboard, focus, and screen-recording sequences share one desktop cursor, so serialize them across agents. The daemon exclusive key is a browser ownership guard: do not remove it, invent per-agent keys, or kill its holder.
Report honestly
CHROME_DEV_MCP_READY and list_pages prove the connection only. Claim a task VERIFIED only after the requested snapshot, Console, Network, Performance, or interaction call itself returned without data.isError.
When the user or this session just changed a web UI, this skill is the verification step: an agent that stops at the code diff has not seen the page. After reloading or repeating the interaction on the fresh pageId, collect three pieces of evidence before calling the change done, because each catches a different failure:
- A
take_screenshotwithfilePathunder the runtime temp root shows the resulting UI; a snapshot or diff cannot show layout or styling. list_console_messagesread after the interaction shows new errors the change introduced.- Read
list_network_requestsafter the interaction. The relevantlist_network_requestsentry shows the request the change should have made and its status. When no request is expected (for example a CSS-only change or local UI toggle), a successfully read empty Network list is valid evidence: state that no request was expected or observed. Do not invent or replay a request to satisfy this check. An expected request that is absent, or a Network call that fails, leaves the changeUNVERIFIED.
If one is missing, report the change UNVERIFIED and name the gap. A question only about Console or Network on an already open page needs just that evidence, not a screenshot.
Invoke as /chrome-dev-mcp in Claude Code, Grok, and Cursor CLI (cursor-agent), $chrome-dev-mcp in Codex; preload chrome-dev-mcp in Hermes for deterministic selection.
Read only when needed
| Trigger | Reference |
| Wrong browser, profile, or login context | references/profile-identity.md |
| Installing or relinking UXC, the runtime chain, isolated-browser parallelism | references/uxc-facade.md |
| Upgrading Chrome DevTools MCP, UXC, or this skill | references/maintenance.md |
| Multi-host acceptance, process-count checks, native compatibility rollback | references/host-verification.md |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

