| name | chrome-cdp |
| description | Interact with local Chrome browser session (only on explicit user approval after being asked to inspect, debug, or interact with a page open in Chrome) |
Chrome CDP
Lightweight Chrome DevTools Protocol CLI. Connects directly via WebSocket — no Puppeteer, works with 100+ tabs, instant connection.
Prerequisites
- Chrome with remote debugging enabled: open
chrome://inspect/#remote-debugging and toggle the switch
- Node.js 22+ (uses built-in WebSocket)
Commands
All commands use ~/.claude/skills/chrome-cdp/~/.claude/skills/chrome-cdp/scripts/cdp.mjs. The <target> is a unique targetId prefix from list; copy the full prefix shown in the list output (for example 6BE827FA). The CLI rejects ambiguous prefixes.
List open pages
~/.claude/skills/chrome-cdp/scripts/cdp.mjs list
Take a screenshot
~/.claude/skills/chrome-cdp/scripts/cdp.mjs shot <target> [file]
Captures the viewport only. Scroll first with eval if you need content below the fold. Output includes the page's DPR and coordinate conversion hint (see Coordinates below).
Accessibility tree snapshot
~/.claude/skills/chrome-cdp/scripts/cdp.mjs snap <target>
Evaluate JavaScript
~/.claude/skills/chrome-cdp/scripts/cdp.mjs eval <target> <expr>
Watch out: avoid index-based selection (querySelectorAll(...)[i]) across multiple eval calls when the DOM can change between them (e.g. after clicking Ignore, card indices shift). Collect all data in one eval or use stable selectors.
Other commands
~/.claude/skills/chrome-cdp/scripts/cdp.mjs html <target> [selector]
~/.claude/skills/chrome-cdp/scripts/cdp.mjs nav <target> <url>
~/.claude/skills/chrome-cdp/scripts/cdp.mjs net <target>
~/.claude/skills/chrome-cdp/scripts/cdp.mjs click <target> <selector>
~/.claude/skills/chrome-cdp/scripts/cdp.mjs clickxy <target> <x> <y>
~/.claude/skills/chrome-cdp/scripts/cdp.mjs type <target> <text>
~/.claude/skills/chrome-cdp/scripts/cdp.mjs loadall <target> <selector> [ms]
~/.claude/skills/chrome-cdp/scripts/cdp.mjs evalraw <target> <method> [json]
~/.claude/skills/chrome-cdp/scripts/cdp.mjs stop [target]
Coordinates
shot saves an image at native resolution: image pixels = CSS pixels × DPR. CDP Input events (clickxy etc.) take CSS pixels.
CSS px = screenshot image px / DPR
shot prints the DPR for the current page. Typical Retina (DPR=2): divide screenshot coords by 2.
Tips
- Prefer
snap --compact over html for page structure.
- Use
type (not eval) to enter text in cross-origin iframes — click/clickxy to focus first, then type.
- Chrome shows an "Allow debugging" modal once per tab on first access. A background daemon keeps the session alive so subsequent commands need no further approval. Daemons auto-exit after 20 minutes of inactivity.