io.github.dockndevai/mcp-cdp

Official registry Productivity

Safe-by-default MCP that drives an Electron/Chrome app over CDP: DOM, console, network, input.

Install

Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).

NPM package @dockndevai/mcp-cdp
Claude Code
claude mcp add mcp-cdp -e 'CDP_PORT=<CDP_PORT>' -e 'CDP_HOST=<CDP_HOST>' -e 'CDP_MODE=<CDP_MODE>' -e 'CDP_ALLOW_EVAL=<CDP_ALLOW_EVAL>' -e 'CDP_TARGET_ALLOWLIST=<CDP_TARGET_ALLOWLIST>' -e 'CDP_DRY_RUN=<CDP_DRY_RUN>' -- npx -y @dockndevai/mcp-cdp@0.2.3
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "mcp-cdp": {
            "command": "npx",
            "args": [
                "-y",
                "@dockndevai/mcp-cdp@0.2.3"
            ],
            "env": {
                "CDP_PORT": "<CDP_PORT>",
                "CDP_HOST": "<CDP_HOST>",
                "CDP_MODE": "<CDP_MODE>",
                "CDP_ALLOW_EVAL": "<CDP_ALLOW_EVAL>",
                "CDP_TARGET_ALLOWLIST": "<CDP_TARGET_ALLOWLIST>",
                "CDP_DRY_RUN": "<CDP_DRY_RUN>"
            }
        }
    }
}

Environment variables

  • CDP_PORT The --remote-debugging-port your app/browser exposes (default 9222).
  • CDP_HOST Host serving the DevTools endpoint (default 127.0.0.1; non-loopback needs CDP_ALLOW_REMOTE).
  • CDP_MODE Access mode: read-only | read-write | admin. Starts read-only; interactions need read-write.
  • CDP_ALLOW_EVAL Set true to allow the evaluate tool (arbitrary JS) — admin mode only. Default false.
  • CDP_TARGET_ALLOWLIST Comma-separated URL patterns; interactions are confined to matching targets. Empty = all.
  • CDP_DRY_RUN Set true to log interactions without dispatching them to the browser.

Documentation

From the project's README on GitHub, refreshed weekly. Links open on GitHub.

Contents
  1. mcp-cdp
  2. What it gives an agent
  3. Install
  4. Expose a debugging port
  5. Configure
  6. Safe by default
  7. Developing
  8. Licence

mcp-cdp

A safe-by-default Model Context Protocol server that drives an Electron or Chrome/Chromium app over the Chrome DevTools Protocol (CDP) — instead of pixel-level GUI automation. Point it at the app's --remote-debugging-port and an agent gets the DOM, console, network requests, real input (click / type / navigate), and — gated — JavaScript evaluation.

Why this beats computer-use for a desktop/web app:

  • The DOM, not a screenshot. The agent reads exact rendered HTML and can query any element — far more information, and it sees things that aren't on screen.
  • Console + network. When a test fails, the uncaught exception or the failed request is right there — no guessing from an image.
  • No collisions. Each agent attaches to its own debugging port, so parallel agents (e.g. one per git worktree) never fight over one desktop.
  • Cross-OS. CDP works identically on macOS, Linux and Windows — the same flow runs on a headless VPS.

Part of the dockndevai MCP server suite — one governance model across all of them.

What it gives an agent

Starts read-only (see Safe by default); higher-capability tools are only registered when you raise the mode.

ToolForNeeds mode
list_targetslist pages / webviews / Electron windows (id, type, title, url)read-only
dom_snapshotrendered HTML of the page or a selector's subtreeread-only
query_domouter HTML of every element matching a CSS selectorread-only
console_logsrecent console output + uncaught exceptionsread-only
network_requestsrecent requests (method, url, status, mime; headers never captured)read-only
screenshota PNG of the viewportread-only
clickclick the first element matching a selectorread-write
type_texttype into the page (focus a selector first)read-write
press_keyEnter / Tab / Escape / Backspace / Delete / Arrowsread-write
navigatenavigate a target to a URL (confirmed)read-write
evaluaterun a JavaScript expression in the pageadmin + CDP_ALLOW_EVAL

Install

npx -y @dockndevai/mcp-cdp

Expose a debugging port

Start your app (or a worktree's dev build) with an explicit port — one per agent:

  • Electron app: your-app --remote-debugging-port=9222, or in main-process code app.commandLine.appendSwitch('remote-debugging-port', '9222') before app.whenReady().
  • Plain Chrome/Chromium: chrome --headless=new --remote-debugging-port=9222 --user-data-dir=/tmp/p1 <url>.

Check it's up: curl http://127.0.0.1:9222/json/version.

Configure

{
  "mcpServers": {
    "cdp": {
      "command": "npx",
      "args": ["-y", "@dockndevai/mcp-cdp"],
      "env": {
        "CDP_PORT": "9222",
        "CDP_MODE": "read-only"
      }
    }
  }
}

See docs/CLIENTS.md for Claude Code / Cursor / Codex / VS Code / Windsurf, and .env.example for every variable.

Safe by default

Enforced by src/security.ts. The browser process is the real boundary — this keeps an agent inside the targets and actions you intend:

  • CDP_MODE — read-only (default) → read-write → admin. Tools above the mode aren't registered, so in read-only the agent cannot click, type or navigate at all.
  • CDP_TARGET_ALLOWLIST — confine interactions to targets whose URL matches your patterns (empty = all). Reads (inspection) are always allowed.
  • CDP_PROTECTED_TARGETS — targets that can be inspected but never interacted with. Defaults protect sign-in pages (accounts.google.com, login.microsoftonline.com, …) and browser internals (chrome://, devtools://, extensions).
  • CDP_ALLOW_EVAL — evaluate is arbitrary code execution in the renderer: admin mode plus this flag, refused on protected targets, with a human confirmation.
  • CDP_DRY_RUN — interactions log their intent and return without dispatching.
  • Secrets — request/response headers are never captured (cookies/auth), and sensitive URL query values are redacted. evaluate and navigate also prompt a human via MCP elicitation.
  • Loopback only — the endpoint must be 127.0.0.1 unless CDP_ALLOW_REMOTE=true.

Optional AI risk guard. Set CDP_GUARD_MODE=monitor|enforce to have the evaluate tool consult a local laya-guard daemon (pipx install laya-guard && laya-guard) that classifies the JS expression allow/confirm/block before it runs. It runs after the eval gate and can only tighten, never grant; fails closed.

There is a bundled skill, cdp-safe-operations, that teaches an agent how to expose a port, read the DOM/console/network instead of screenshots, the safety rules, and the "why did this fail?" workflow. See also SECURITY.md.

Developing

npm install
npm run build
# list the tools:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | CDP_PORT=9222 node dist/index.js
npm test

Licence

MIT

Frequently asked questions

What is io.github.dockndevai/mcp-cdp?

Safe-by-default MCP that drives an Electron/Chrome app over CDP: DOM, console, network, input.

How do I install io.github.dockndevai/mcp-cdp?

It runs on your machine. In Claude Code: claude mcp add mcp-cdp -e 'CDP_PORT=<CDP_PORT>' -e 'CDP_HOST=<CDP_HOST>' -e 'CDP_MODE=<CDP_MODE>' -e 'CDP_ALLOW_EVAL=<CDP_ALLOW_EVAL>' -e 'CDP_TARGET_ALLOWLIST=<CDP_TARGET_ALLOWLIST>' -e 'CDP_DRY_RUN=<CDP_DRY_RUN>' -- npx -y @dockndevai/mcp-cdp@0.2.3. For other clients, paste the JSON configuration from this page into their MCP settings.

Does io.github.dockndevai/mcp-cdp need an API key?

Its registry entry lists no required key or secret. Some features may still need an account with the service it connects to.

Is io.github.dockndevai/mcp-cdp open source?

Yes. Its code is on GitHub under the MIT license.

Who maintains io.github.dockndevai/mcp-cdp?

It is published by dockndevai. AI.tn lists it but does not maintain or endorse it.

From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.