# io.github.IGELHARINE/cdpm (npm · cdpm-mcp)

Lets many Claude Code sessions and subagents share numbered, logged-in Chrome instances over CDP

- Trust score: 68/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-04

## Components

- npm · `cdpm-mcp`: 68/100 (this document), [markdown](https://verifymcp.io/servers/igelharine-cdpm/cdpm-mcp.md), [page](https://verifymcp.io/servers/igelharine-cdpm/cdpm-mcp)

## Channel facts

- Registry: `npm`
- Package: `cdpm-mcp`
- Version: `0.1.9`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-04.

- **Supply Chain Security**: 81/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects zod 4.6.5, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - 30 of 114 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 17 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 11607 tokens (~322/item across 36 items; 36 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 60/100
  - Stability observed for 18 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 98/100
  - 97% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 99% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "browser_eval" implies "eval" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 37 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the io.github.IGELHARINE/cdpm MCP server?

io.github.IGELHARINE/cdpm runs locally as an npm package, launched with npx -y cdpm-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add igelharine-cdpm -- npx -y cdpm-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "igelharine-cdpm": {
      "command": "npx",
      "args": [
        "-y",
        "cdpm-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "igelharine-cdpm": {
      "command": "npx",
      "args": [
        "-y",
        "cdpm-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add igelharine-cdpm -- npx -y cdpm-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "igelharine-cdpm": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "cdpm-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add igelharine-cdpm --command npx --arg -y --arg cdpm-mcp
```

### Hermes

```yaml
mcp_servers:
  igelharine-cdpm:
    command: "npx"
    args: ["-y", "cdpm-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "igelharine-cdpm": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "cdpm-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add igelharine-cdpm -t stdio -c npx -a -y cdpm-mcp
```

### Other

```json
{
  "mcpServers": {
    "igelharine-cdpm": {
      "command": "npx",
      "args": [
        "-y",
        "cdpm-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-02 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 67, +1)

- [functional regression] Security disclosure: unverified → fail

### 2026-10-29 (score 66, +1)

- [functional regression] Security disclosure: fail → unverified

### 2026-10-27 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-25 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 63, −5)

- [security regression] CVE-2023-54404 affects this package: high
- [security regression] Known CVEs: pass → fail

### 2026-10-22 (score 68, +3)

- [functional improvement] Stability: unverified → 0.17

### 2026-10-18 (score 65, +15)

- [security improvement] Malware scan: unverified → pass

## MCP tools (36)

### `browser_status` (~114 tokens)

Slot status

Shows running Chrome slots (1-30) with their tabs, opener, last action and one-line summary. Pass slot for just that slot.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.

### `browser_launch` (~520 tokens)

Launch slot

Starts slot Chrome. Call only when the user explicitly asks (other tools never start a closed slot). Without slot, uses the lowest free slot. If already running, just attaches. The user decides windowed (visible) vs headless (hidden): headless: true only if they say "headless/hidden". If unstated, don't guess; ask first, then call with headless. Starting a closed slot without headless only returns a confirmation request. Start several slots at once with slots (list) or count (lowest first). For different jobs per slot, after launching give each slot its own subagent in parallel.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `count` (integer): When the user gives only a count ("start 3"): starts that many free slots, lowest first
- `headless` (boolean): false = windowed (visible), true = headless (hidden). true only if the user says "headless/hidden/no window", false for "visible/headful". If unstated, omit and ask first (no guessing). Applies only…
- `proxies` (array): Per-slot proxies, paired in slots order (count: launch order)
- `proxy` (string): Only when the user asks for a proxy (never otherwise). As given: "1.2.3.4:8080", "http://user:pass@host:port", "socks5://host:port", "host:port:user:pass", etc. Applies to all launched slots, first l…
- `slot` (integer): One slot to start (1-30). Omit if the user gave no number → lowest free slot
- `slots` (array): Slot numbers to start at once (e.g. [1,2,3]), lowest first
- `url` (string): Same start URL for every launched slot (e.g. "https://mail.google.com"). For per-slot or partial URLs use urls instead. Pass it when the start page is known so subagents need no separate navigation
- `urls` (array): Per-slot start URLs, paired in slots order (count: launch order). "" = blank tab. E.g. slots [1,2], urls ["https://www.wehago.com", "https://test.igel.kr"] → 1 opens wehago, 2 opens test.igel.kr

### `browser_close` (~114 tokens)

Close slot

Closes slot Chrome cleanly (session and cookies saved). The profile (logins) is kept. Reports if another agent used it recently.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.

### `browser_tabs` (~131 tokens)

List tabs

Slot tab list: number, ID, title, URL, opener, last action, per-tab summary (updated only by actions with summary). "·front" marks the tab currently in front in its window (one per window).

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.

### `browser_tab_new` (~176 tokens)

New tab

Opens a new tab in the slot and returns its ID. When agents share a slot, open your own tab and work only by its ID to avoid mixing.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `url` (string): URL to open (omit for blank tab)

### `browser_tab_close` (~114 tokens)

Close tab

Closes a tab. tab is required.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number, required): Tab to close: number or ID ("t7")

### `browser_tab_select` (~150 tokens)

Bring tab to front

Brings a tab to the front of its Chrome window. Changes what the user sees, so use only when the user wants it. (Background tabs can be read, operated and captured; no need to bring them forward to work.)

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number, required): Tab to bring forward: number or ID

### `browser_snapshot` (~360 tokens)

Snapshot

Reads the tab as accessibility-tree text. Clickable/typable elements get refs like [e12]. Long pages are split; only page 1 (top) is shown (page=2 to continue; refs stay the same across pages). find="text" shows only matching elements with their parent context; ref="e40" shows only that element's subtree. Refs change when the page changes, so re-snapshot before acting.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `find` (string): Only lines containing this text, with parent context (ignores case and spaces). If unsure of site language, use | for alternatives, e.g. "제목|subject"
- `interactive` (boolean): Only actionable elements (lines with refs): inputs, buttons, links. Use first to find inputs on big pages like Gmail
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `page` (integer): Page number for long output (default 1)
- `ref` (string): Only this ref element and its subtree
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_text` (~234 tokens)

Read text

Reads the page body text (main/article if present). With ref, only that element's text. Shorter and easier than a snapshot for articles/documents. Use page for long text.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `page` (integer): Page number for long output (default 1)
- `ref` (string): Only this element's text
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_screenshot` (~210 tokens)

Screenshot

Captures the visible area of the tab as PNG, even background tabs (without switching). Never changes window size or viewport, so full-page capture is unsupported (scroll then capture, or use snapshot/text).

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_navigate` (~293 tokens)

Navigate

Navigates the tab to a URL and waits for the body to load.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.
- `url` (string, required): URL to go to

### `browser_back` (~269 tokens)

Back

Go back.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_forward` (~273 tokens)

Forward

Go forward (after going back).

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_reload` (~311 tokens)

Reload

Reloads the page (same as Chrome reload). ignore_cache=true bypasses the cache. Careful: unsaved user input on the page is lost.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `ignore_cache` (boolean): Bypass cache (hard reload)
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_dialog` (~407 tokens)

Handle dialog

Accepts (accept: true) or dismisses (accept: false) an open dialog (alert/confirm/prompt/beforeunload). The tab is frozen while a dialog is open. Usually judge from its content and handle it yourself (accept if it is part of the requested task; close unneeded notices/ads). Ask the user only when it confirms an irreversible action they didn't request (payment, deletion, etc.). beforeunload: accept = leave page (input lost), dismiss = stay. For prompt, text is the input.

Input parameters:

- `accept` (boolean, required): true = OK, false = cancel
- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.
- `text` (string): Text for a prompt dialog (used only when accepting)

### `browser_permission` (~292 tokens)

Answer permission bubble

Lists or answers Chrome permission bubbles ("site wants to: access other apps and services on this device / show notifications / know your location…"). They are browser UI: not in snapshot/screenshot, page tools can't click them, and the page often waits until they are answered. The header warns when one is open. Without button: shows the open bubbles with their exact button names. With button: presses that button (exact name as listed, e.g. "허용", "Allow", "Block", "Allow while visiting the site"). Windows, windowed slots only.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `button` (string): Exact button name to press, as listed in the header or by calling without button
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `site` (string): Only when several bubbles are open: part of the bubble title (e.g. the site host) to pick one
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.

### `browser_hover` (~308 tokens)

Hover

Moves the real mouse over a ref element (no click). For hover menus and tooltips. Use read=changes to see the opened menu.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `ref` (string, required): ref of the element to hover
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_drag` (~414 tokens)

Drag

Drags with the real mouse (press → move in steps → release): drag and drop, sliders, reordering, drag CAPTCHAs, etc. Target: to (element ref), to_text (text at the drop spot), or dx/dy (pixels from from). HTML drag is handled without starting an OS drag.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `dx` (number): Horizontal pixels (right +)
- `dy` (number): Vertical pixels (down +)
- `from` (string, required): ref of the element to drag (including ones marked draggable)
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.
- `to` (string): ref of the drop target
- `to_text` (string): Text shown at the drop spot (when it has no ref, e.g. "Drop here")

### `browser_download_wait` (~138 tokens)

Wait for download

Waits for the most recently started download to finish and returns the saved file path (user's Chrome download folder). Call after clicking the download button. Returns as soon as it finishes.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `timeout` (number): Max wait in seconds (default 120)

### `browser_pdf` (~229 tokens)

Save as PDF

Saves the page as a PDF (receipts, articles, etc.). Without path, saves to the user's Downloads folder named after the page title. Doesn't change the screen or window.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `path` (string): File path to save (e.g. C:\Users\me\Desktop\receipt.pdf)
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_click` (~375 tokens)

Click

Clicks a ref element with real mouse events. If another element covers it, doesn't click and reports it. Waits for loading if the click navigates; reports new tabs. Clicking a file input or "attach" button intercepts the OS file picker (not shown); then use browser_upload. Doesn't click <select> dropdowns (they open a list popup on the user's screen); use browser_select.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `double` (boolean): Double-click
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `ref` (string, required): ref from browser_snapshot (e.g. "e12")
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_type` (~421 tokens)

Type

Types text into a ref element, sending real key events (keydown/keypress/input/keyup) per character like a human. clear=true clears existing content; submit=true presses Enter after. Verifies the resulting value and reports a mismatch. fast=true inserts very long text at once without key events. Date/time inputs get the value set directly in their format (time "19:30", date "2026-10-08"; change event then has isTrusted=false).

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `clear` (boolean): Clear existing content
- `fast` (boolean): Very long text: insert at once without key events
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `ref` (string, required): ref of the element to type into
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `submit` (boolean): Press Enter after
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.
- `text` (string, required): Text to type

### `browser_fill` (~366 tokens)

Fill form

Fills several inputs on the same page in order (each cleared, typed with real key events, value verified). Stops on page change, dialog, or any failed field, and reports how far it got. submit="Enter" presses Enter in the last field; a button ref clicks that button. For dropdowns use browser_select.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `fields` (array, required): Fields to fill (top to bottom)
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `submit` (string): After filling: "Enter" or a button ref to click
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_upload` (~377 tokens)

Upload file

Puts files into a file input (no OS file picker shown to the user). Give ref of the file input (<input type=file> or its label), or for a site's custom "attach" button, click it first with browser_click (CDPM intercepts the picker) and call without ref. The site gets the same events as a human file pick.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `files` (array, required): File paths on this PC (absolute recommended)
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `ref` (string): File input ref. Omit to use the file picker just opened by a click
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_select` (~355 tokens)

Select option

Picks an option in a <select> dropdown (by value or visible text; partial match OK). Focuses the dropdown and moves with keys (arrow keys on Windows/Linux, typing the first letters on macOS), so the page gets real events and no list popup opens. If nothing matches, lists the available options.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `option` (string, required): Option value or text
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `ref` (string, required): ref of the dropdown (combobox)
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_press_key` (~316 tokens)

Press key

Presses a key on the focused element. E.g. Enter, Tab, Escape, ArrowDown, PageDown, Control+A, Shift+Tab.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `key` (string, required): Key name or combo (e.g. "Control+A")
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_scroll` (~311 tokens)

Scroll

Scrolls a ref element into view, or by dy pixels (positive = down, negative = up, default 600). Reports the actual resulting position.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `dy` (number)
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `read` (string): Append the page after the action (no separate read needed): text=body text, snapshot=snapshot page 1 (with refs), changes=only lines added/removed since your last snapshot (shortest; full page if the…
- `ref` (string)
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_wait` (~581 tokens)

Wait

Waits until text appears; gone: that text disappears; url: the URL changes; enabled: that button/input becomes enabled; response: a network response for that URL completes (returns its body); network_idle: the network goes quiet; otherwise for seconds. For SPAs (search results, lists, etc.), instead of reading the page, getting the data response (JSON) with response="/api/search" after a click is faster and more accurate (it searches from this agent's last action on that tab, so responses that arrived during the click are caught). Only reads, never touches the page, so the user's input is not lost (use it to detect login: url, gone="Password" or text="Inbox"). Returns as soon as the condition is met or another agent's message arrives. Keep waits minimal: long waits only for humans (login, etc.); to wait for other agents use slot_inbox wait.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `enabled` (string): Until this ref element (button/input) becomes enabled
- `gone` (string): Until this text disappears from the page (e.g. login form's "Password" gone = logged in)
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `network_idle` (boolean): Until no network requests for 0.5s (before capture/read)
- `response` (string): Until a network response whose URL contains this completes (e.g. "/api/search"). * ? wildcards work (matched against the full URL, e.g. "*api.example.com/v1/items*"). Returns the response body
- `seconds` (number): Plain wait in seconds. Avoid: wait on a condition (text/gone/url) or slot_inbox wait instead
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.
- `text` (string): Text to wait for
- `timeout` (number): Max wait in seconds for text/gone/url/enabled/response/network_idle. 300-600 when waiting for a human login, etc.
- `url` (string): Until the URL contains this (e.g. "mail.google.com/mail"). "" = until it differs from the current URL

### `browser_eval` (~280 tokens)

Run JS

Evaluates a JavaScript expression in the tab and returns the result as JSON. Escape hatch only when other tools can't do it. Runs in an isolated world: DOM can be read and modified, but globals created by page scripts (window.appVar, etc.) are not visible.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `expression` (string, required): JS expression (Promises are awaited)
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_network` (~293 tokens)

Network requests

Tab network request list (newest at bottom). Records the latest 500 since CDPM first attached to the tab. Filter with filter (URL part), type (Document, XHR, Fetch, Script, Image, etc.), failed (failures only). For details pass the n-number to browser_network_detail.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `failed` (boolean): Failed requests only
- `filter` (string): Only requests whose URL contains this
- `limit` (integer): Max count (default 40, newest first)
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.
- `type` (string): Request type (e.g. XHR, Fetch, Document, Script, Image)

### `browser_network_detail` (~226 tokens)

Network request detail

Shows one request's headers, sent data and response body (start of it, if text). id is the n-number from browser_network.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `body` (boolean): Include response body (default true)
- `id` (string, required): Request number (e.g. "n12")
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `browser_block` (~356 tokens)

Block requests

Blocks tab network requests matching URL patterns (they fail). add adds, remove removes, clear removes all rules you set. Patterns: * any chars, ? one char. A bare domain matches every request containing it ("ads.example.com" → "*ads.example.com*"). A trailing * is added automatically so query strings still match ("*.png" → "*.png*"). The tab skips the cache while rules exist. Rules last only while this Claude session is alive and are shown to other agents in the header. With no args, shows current rules.

Input parameters:

- `add` (array): URL patterns to block
- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `clear` (boolean): Remove all rules set by this session
- `multiSlot` (boolean): true only when one agent must handle several slots together (e.g. comparing). Normally omit (one agent = one slot; use subagents for the rest)
- `remove` (array): Patterns to unblock
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `summary` (string): One-line note of what you are doing (e.g. "comparing laptop prices"). Shown in browser_status (not the status line). Omit to keep the previous one.
- `tab` (string|number): Target tab: number (1, 2…) or ID ("t7"). Use the stable ID when agents share a slot. Required for action tools when there are multiple tabs.

### `slot_pause` (~186 tokens)

Pause slot

Use only when the user says to pause (e.g. "pause 3"); agents never call it on their own. All action tools on the slot are refused and any browser_wait in progress stops at once. An action already sent to Chrome finishes. Reading still works. Applies immediately to agents in other Claude sessions too. all=true pauses every running slot.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `all` (boolean): All running slots
- `slot` (integer): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `slots` (array): Multiple slots (e.g. [1,2,3])

### `slot_resume` (~173 tokens)

Resume slot

Use only when the user says to resume (e.g. "continue 3"); the agent owning a paused slot never calls it on its own. Unpauses and messages every agent on the slot to wake it (agents re-read the page and continue). all=true resumes every paused slot.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `all` (boolean): All paused slots
- `slot` (integer): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `slots` (array): Multiple slots (e.g. [1,2,3])

### `slot_send` (~185 tokens)

Send message

Sends a message to other agents (real-time collaboration). slot = the slot the recipient owns (to reach another slot's agent, use that slot number). Omit to to send to everyone on that slot. Recipients get it instantly if waiting in slot_inbox wait, otherwise in their next tool result header (a running browser_wait stops at once). When you finish a step, notify waiting agents right away.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `text` (string, required)
- `to` (string): Recipient agent name

### `slot_inbox` (~174 tokens)

Check messages

Shows your unread messages. With wait (seconds), waits up to that long for a new message (for real-time conversation). Messages already delivered in another tool's header are not unread; when there are no new ones, recently received ones are noted for reference.

Input parameters:

- `agent` (string): Your display name, shown to other agents. Subagents must always set it. Default "claude-84f3".
- `slot` (integer, required): Browser slot 1-30. "3", "slot 3", "browser 3" → 3. If the user gives a port like 14052, subtract 14049.
- `wait` (number): Max seconds to wait for a new message; returns as soon as one arrives (use this instead of repeatedly checking the page while waiting for another agent)

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/igelharine-cdpm/cdpm-mcp#diagnostics

## Score history

- 2026-11-04: 68
- 2026-11-03: 68
- 2026-11-02: 68
- 2026-11-01: 67
- 2026-10-31: 67
- 2026-10-30: 66
- 2026-10-29: 66
- 2026-10-28: 65
- 2026-10-27: 65
- 2026-10-26: 64
- 2026-10-25: 64
- 2026-10-24: 63
- 2026-10-23: 68
- 2026-10-22: 68
- 2026-10-21: 65
- 2026-10-20: 65
- 2026-10-19: 65
- 2026-10-18: 65
- 2026-10-17: 50

## Common questions

### What is the io.github.IGELHARINE/cdpm MCP server?

io.github.IGELHARINE/cdpm is an MCP server listed in the public MCP registry as io.github.IGELHARINE/cdpm. Lets many Claude Code sessions and subagents share numbered, logged-in Chrome instances over CDP. This page covers its npm package (cdpm-mcp).

### Is the io.github.IGELHARINE/cdpm MCP server safe to use?

io.github.IGELHARINE/cdpm scores 68 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 4 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.IGELHARINE/cdpm MCP server expose?

io.github.IGELHARINE/cdpm exposes 36 tools: browser_status, browser_launch, browser_close, browser_tabs, browser_tab_new, and 31 more. Their descriptions and schemas cost roughly 10,032 tokens of context every time the server is loaded.

### Is the io.github.IGELHARINE/cdpm MCP server still maintained?

io.github.IGELHARINE/cdpm is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the io.github.IGELHARINE/cdpm MCP server under?

io.github.IGELHARINE/cdpm declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/cdpm-mcp
- Socket report: https://socket.dev/npm/package/cdpm-mcp
- Repository: https://github.com/IGELHARINE/CDPM
- Changelog RSS feed: https://verifymcp.io/servers/igelharine-cdpm/cdpm-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/igelharine-cdpm/cdpm-mcp.json
- HTML version of this page: https://verifymcp.io/servers/igelharine-cdpm/cdpm-mcp
