# io.github.Samrj12/doppel (npm · doppel-mcp)

Drive your real, logged-in Chrome/Edge from AI agents over CDP. Faster. Sharper.

- Trust score: 65/100 (medium)
- Change this week: +25
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `doppel-mcp`: 65/100 (this document), [markdown](https://verifymcp.io/servers/samrj12-doppel/doppel-mcp.md), [page](https://verifymcp.io/servers/samrj12-doppel/doppel-mcp)

## Channel facts

- Registry: `npm`
- Package: `doppel-mcp`
- Version: `0.6.3`
- 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-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 19/100
  - Repository check failed: no source repository is declared.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 78/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2223 tokens (~117/item across 19 items; 19 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add samrj12-doppel -- npx -y doppel-mcp
```

### Codex

```bash
codex mcp add samrj12-doppel -- npx -y doppel-mcp
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add samrj12-doppel --command npx --arg -y --arg doppel-mcp
```

### Hermes

```yaml
mcp_servers:
  samrj12-doppel:
    command: "npx"
    args: ["-y", "doppel-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "samrj12-doppel": {
      "command": "npx",
      "args": [
        "-y",
        "doppel-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-08-03 (score 65, +1)

- [functional regression] Schema quality: pass → fail
- [functional] Package version: 0.5.0 → 0.6.3

### 2026-08-02 (score 64, +43)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional] Licence: MIT

### 2026-08-01 (score 21, +5)

- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] MCP protocol: unverified → pass

### 2026-07-31 (score 16, −2)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 18, −22)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 40)

First indexed and scored.

## MCP tools (19)

### `doppel_status` (~27 tokens)

Check whether the Doppel browser extension is connected. Call this first if other tools error out.

### `doppel_navigate` (~92 tokens)

Navigate the active tab: go to a URL, or go back/forward/reload. Waits for load. Returns the final URL plus a fresh page snapshot (by default).

Input parameters:

- `includeSnapshot` (boolean): Return a fresh snapshot after navigating. Default true.
- `type` (string): Navigation type. Default 'url'.
- `url` (string): Absolute URL (required when type is 'url').

### `doppel_snapshot` (~189 tokens)

Capture a structured accessibility snapshot of the current page. Elements are tagged with a [ref] for doppel_click/doppel_type; refs stay stable across grep/offset within a snapshot. Fast: no screenshot. On dense pages (search results, shopping) use interactive:true and/or grep to cut noise, and offset to page through results.

Input parameters:

- `grep` (string): Keep only elements whose role/name/value matches this text or regex (case-insensitive), e.g. 'Dell' or 'button'.
- `interactive` (boolean): Only actionable elements (links/buttons/inputs); skips headings/static text/lists. Best for dense pages.
- `limit` (integer): Max elements to return. Default 500; 300-1000 is a good range. Prefer interactive/grep over a huge limit.
- `offset` (integer): Skip the first N matching elements (paginate a long page).

### `doppel_click` (~87 tokens)

Click an element by its [ref] from the latest snapshot. Waits until it's actionable, then uses trusted native input. If you already know several actions from this snapshot, prefer doppel_batch to run them in one call.

Input parameters:

- `includeSnapshot` (boolean): Return a fresh snapshot after clicking. Default true.
- `ref` (integer, required): The [ref] number from a snapshot

### `doppel_type` (~86 tokens)

Type text into an element by its [ref]. Waits until actionable, focuses it, and inserts trusted text (works with React/controlled inputs).

Input parameters:

- `includeSnapshot` (boolean): Return a fresh snapshot after typing. Default true.
- `ref` (integer, required): The [ref] of the input/textarea from a snapshot
- `text` (string, required): The text to type

### `doppel_upload` (~184 tokens)

Upload local file(s) to a file input WITHOUT opening the native OS file dialog. Point `ref` at the upload control from a snapshot - the file input itself, or the button/label that opens it (Doppel finds the underlying <input type=file>). `path` is an absolute path on this machine; pass an array for a multi-file input. Fires the real change event, so the page reacts exactly as if a human picked the file.

Input parameters:

- `includeSnapshot` (boolean): Return a fresh snapshot after uploading. Default true.
- `path` (required): Absolute path to a local file (must be under Downloads/Documents/Desktop/Pictures/temp or $DOPPEL_UPLOAD_DIRS), or an array for a multi-file input.
- `ref` (integer, required): The [ref] of the upload control (the file input, or the button/label that opens it).

### `doppel_press_key` (~72 tokens)

Press a special key (Enter, Tab, Backspace, Delete, Escape, Arrow keys) via trusted native input.

Input parameters:

- `includeSnapshot` (boolean): Return a fresh snapshot after the keypress. Default true.
- `key` (string, required): Key name, e.g. Enter, Tab, ArrowDown

### `doppel_list_tabs` (~27 tokens)

List the tabs Doppel controls (its tab group), with URLs and which is active.

### `doppel_new_tab` (~125 tokens)

Open a new tab (background, no focus stealing) and make it active. Optionally load a URL. Pass `group` to name the tab group by the task's purpose (e.g. '27in Monitor'); tabs sharing a group cluster together.

Input parameters:

- `group` (string): Short purpose label for the tab group, e.g. '27in Monitor', 'Job Apply'. Defaults to 'Doppel'.
- `includeSnapshot` (boolean): Return a snapshot after opening. Default true.
- `url` (string): URL to load. Default about:blank.

### `doppel_set_group` (~79 tokens)

Name the current tab's group by the task's PURPOSE (e.g. '27in Monitor', 'Job Apply'), not the site. Call this at the start of a task so the group chip reads as what you're doing instead of 'Doppel'.

Input parameters:

- `name` (string, required): Short purpose label, e.g. '27in Monitor'.

### `doppel_select_tab` (~63 tokens)

Switch the active tab to another tab Doppel controls (tabId from doppel_list_tabs).

Input parameters:

- `includeSnapshot` (boolean): Return a snapshot of the newly active tab. Default true.
- `tabId` (integer, required): The tab id from doppel_list_tabs

### `doppel_close_tab` (~36 tokens)

Close a tab Doppel controls and drop its session.

Input parameters:

- `tabId` (integer, required): The tab id from doppel_list_tabs

### `doppel_cleanup_tabs` (~92 tokens)

Close leftover Doppel automation tabs. By default only the generic 'Doppel' / 'Doppel Test' groups (debris from past sessions), leaving purpose-named task groups alone. Pass all:true to also close every purpose-named Doppel task group. Non-Doppel tabs and groups are never touched.

Input parameters:

- `all` (boolean): Also close purpose-named Doppel task groups, not just the generic ones.

### `doppel_hover` (~64 tokens)

Hover the mouse over an element by its [ref] (reveals menus/tooltips). Waits until it's actionable.

Input parameters:

- `includeSnapshot` (boolean): Return a fresh snapshot after hovering. Default true.
- `ref` (integer, required): The [ref] from a snapshot

### `doppel_wait_for` (~105 tokens)

Wait until specific text appears on the page, or for a fixed time. Use after an action that loads content.

Input parameters:

- `includeSnapshot` (boolean): Return a snapshot after waiting. Default true.
- `text` (string): Text to wait for (case-insensitive substring).
- `timeMs` (integer): Or wait a fixed number of milliseconds (max 60000).
- `timeoutMs` (integer): Max wait when using 'text' (default 10000).

### `doppel_screenshot` (~91 tokens)

Screenshot the current page (PNG by default). Returns the image. Prefer doppel_snapshot (text) when possible; use this only when you need to SEE pixels.

Input parameters:

- `format` (string): Image format. Default png.
- `fullPage` (boolean): Capture the full scrollable page, not just the viewport.
- `quality` (integer): Quality 0-100 (jpeg/webp only).

### `doppel_batch` (~159 tokens)

Apply a SEQUENCE of actions (click/type/press_key/hover) in ONE call, in order. PREFER THIS over separate click/type calls whenever you can already see the targets in the current snapshot - e.g. filling a form, ticking several checkboxes, or 'pick an option then click Continue'. Each separate tool call costs a full model round-trip; a batch is one. Refs come from the latest snapshot, so all targets must exist on the SAME page (a batch can't span a navigation). Stops at the first failed op and reports which one. Returns one snapshot at the end.

Input parameters:

- `includeSnapshot` (boolean): Return a snapshot after the batch. Default true.
- `ops` (array, required): Ordered list of actions.

### `doppel_network` (~424 tokens)

See the page's network activity, captured read-only from the moment the tab attaches. Without `reqid`, returns a compact one-line-per-request list; pass `reqid` for full detail plus the response body. Successful static assets (images/fonts/scripts/css) are hidden unless `includeStatic`. Filter with `grep` (URL), `status`, `method`, `resourceType`, `failedOnly`, `xhrOnly` (just API calls), or `sinceLastAction` (only what the last click/type/navigate triggered).

Input parameters:

- `body` (string): With reqid: which body to include. Default 'response'.
- `failedOnly` (boolean): Only failed requests (transport error or status >= 400).
- `grep` (string): Keep requests whose URL matches this substring or regex (case-insensitive).
- `includeStatic` (boolean): Include successful images/fonts/scripts/css (hidden by default).
- `limit` (integer): Max requests in the list. Default 50.
- `maxBytes` (integer): With reqid: truncate inlined bodies to N bytes (default 10000).
- `method` (string): HTTP method, e.g. GET, POST.
- `offset` (integer): Skip the first N matching requests (paginate).
- `reqid` (integer): Drill into one request by its [id] from the list (full detail + body).
- `resourceType` (string): doc | css | img | script | font | xhr | fetch | ws | media | other.
- `saveToFile` (string): With reqid: write the FULL response body to a file (filename only) in the Doppel captures dir (~/.doppel/captures or $DOPPEL_CAPTURE_DIR), instead of inlining it.
- `sinceLastAction` (boolean): Only requests triggered since the last click/type/navigate.
- `status` (string): Status filter: "404", "5xx", ">=400".
- `xhrOnly` (boolean): Only XHR/fetch requests (the API-call case).

### `doppel_console` (~221 tokens)

See the page's console output + JS errors, captured read-only. By default shows browser-level problems (errors, warnings, failed network/CSP/deprecation), which is fully stealthy. Page console.log/info is NOT captured unless you set `pageConsole:true`, which enables the CDP Runtime domain (detectable by a hostile page while on, so off by default; captures from that point forward). Uncaught JS exceptions are merged in as errors; consecutive duplicates collapse with [xN].

Input parameters:

- `grep` (string): Keep messages whose text matches this substring or regex.
- `includeStack` (boolean): Include stack traces (capped ~50 frames).
- `level` (string): Minimum severity to show. Default 'warn' (warnings + errors + failures).
- `limit` (integer): Max messages. Default 50.
- `offset` (integer): Skip the first N matching messages (paginate).
- `pageConsole` (boolean): Capture page console.log/info too (enables Runtime; detectable while on). Set false to turn it back off.

## Diagnostics

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

## Score history

- 2026-08-03: 65
- 2026-08-02: 64
- 2026-08-01: 21
- 2026-07-31: 16
- 2026-07-30: 18
- 2026-07-28: 18
- 2026-07-27: 40

## Links

- npm package: https://www.npmjs.com/package/doppel-mcp
- Socket report: https://socket.dev/npm/package/doppel-mcp
- Changelog RSS feed: https://verifymcp.io/servers/samrj12-doppel/doppel-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/samrj12-doppel/doppel-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/samrj12-doppel/doppel-mcp
