Loading...
Loading...
Drive a remote chrome-devtools-mcp server (typically on a tailnet) over HTTPS using the chrome-devtools CLI. Use this when the user wants to navigate, screenshot, inspect, or evaluate JavaScript on a browser running on another host (e.g. a Tailscale-connected Mac mini or a CI runner) — and you don't have a local Chrome to control. Examples of triggers ("open <url> on the lab mac", "take a screenshot of the browser on host X", "evaluate this on the remote browser").
npx skill4agent add dzianisv/chrome-devtools-mcp chrome-devtools-remotechrome-devtoolschrome-devtools-mcpchrome-devtools-mcp/mcpCHROME_DEVTOOLS_MCP_REMOTE_URLCHROME_DEVTOOLS_MCP_REMOTE_INSECUREchrome-devtools--remotemcp__chrome-devtools__*chrome-devtoolsnpm install -g @vibebrowser/chrome-devtools-mcp
chrome-devtools --version # should print 0.26.6 or newerhttps://.../mcpcommand not found: chrome-devtoolsPATH$(npm config get prefix)/binPATHeval "$(brew shellenv)"Cannot find package 'pkce-challenge'cd "$(npm root -g)/@vibebrowser/chrome-devtools-mcp" && npm install pkce-challenge --no-saveexport CHROME_DEVTOOLS_MCP_REMOTE_URL="https://lab.tailnet.ts.net/mcp"
chrome-devtools status --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"status=ok http=200https://<host>/mcp/mcp| Situation | What to pass |
|---|---|
| Self-signed cert (common on tailnets without Tailscale-issued certs) | |
| Bearer-token gateway | |
Custom static header (e.g. | |
Endpoint behind Tailscale and | |
statuschrome-devtools <tool> ... --remote "$URL"~/.cache/chrome-devtools-mcp/remote/<hash>.session~/.cache/chrome-devtools-mcp/remote/<hash>.sessionnavigate_pagetake_snapshotclicktake_screenshotchrome-devtools stop --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"--output-format jsonjq# Open a page
chrome-devtools navigate_page "https://example.com" --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"
# Get a structured a11y snapshot (use for finding clickable uids)
chrome-devtools take_snapshot --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL" --output-format json
# Click an element by uid from the snapshot
chrome-devtools click "$UID" --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"
# Fill an input
chrome-devtools fill "$UID" "value" --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"
# Take a screenshot (saved to /tmp/<uuid>.png locally)
chrome-devtools take_screenshot --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"
# Evaluate JS in the page — return value must be JSON-serializable
chrome-devtools evaluate_script '() => document.title' --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"
# Read console messages from the page
chrome-devtools list_console_messages --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"
# List network requests since page load
chrome-devtools list_network_requests --remote "$CHROME_DEVTOOLS_MCP_REMOTE_URL"URL="$CHROME_DEVTOOLS_MCP_REMOTE_URL"
chrome-devtools navigate_page "https://app.example.com" --remote "$URL"
chrome-devtools evaluate_script '() => ({title: document.title, ready: document.readyState})' --remote "$URL"
chrome-devtools list_console_messages --remote "$URL" --output-format json
chrome-devtools take_screenshot --remote "$URL"console_messageslevel: "error"chrome-devtools navigate_page "https://app.example.com/login" --remote "$URL"
chrome-devtools take_snapshot --remote "$URL" --output-format json > /tmp/snap.json
# Find the uid of the email input + password input + submit button from /tmp/snap.json
chrome-devtools fill "<email-uid>" "$LOGIN_EMAIL" --remote "$URL"
chrome-devtools fill "<password-uid>" "$LOGIN_PASSWORD" --remote "$URL"
chrome-devtools click "<submit-uid>" --remote "$URL"chrome-devtools performance_start_trace --remote "$URL"
chrome-devtools navigate_page "https://app.example.com" --remote "$URL"
chrome-devtools performance_stop_trace --remote "$URL" --output-format jsonSaved to /tmp/<uuid>.png.evaluate_script--output-format jsontake_snapshottake_screenshot| Symptom | Cause | Fix |
|---|---|---|
| DNS, Tailscale offline, or wrong URL | |
| Server restarted; sticky id was stale. Retried once internally — if you see this it means the retry also 404'd | |
TLS verify error ( | Server uses a self-signed cert (no Tailscale-issued cert) | Add |
| Local cache directory was wiped mid-session | First call after the wipe will mint a fresh session; just retry |
| Hangs on first call after a long idle | Server idle reaper closed the session | Same fix as the 404 row — |
navigate_pagewait_fortake_screenshot--insecurestart--remote