peek
NPM · @PEEKDEV/MCP · SCANNED SEP 20
Exposes recorded browser sessions (rrweb DOM, console, network) to AI coding agents, fully local
Available components
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. How we score → Why this is hard to score →
Supply Chain Security91
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs a script at install time (postinstall) that we could not recognise. It may be perfectly ordinary, but we do not read the published tarball, so we cannot say what it does. View diagnostics → Partial
- 62 of 150 dependencies flagged as unhealthy (6 deprecated). View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Cubenest/rrweb-stack). View diagnostics → Pass
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 72 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability71
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3862 tokens (~203/item across 19 items; 19 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
- Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the peek MCP server?
peek runs locally as an npm package, launched with npx -y @peekdev/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @peekdev/mcp
claude mcp add cubenest-peek-mcp -- npx -y @peekdev/mcp
{
"mcpServers": {
"cubenest-peek-mcp": {
"command": "npx",
"args": [
"-y",
"@peekdev/mcp"
]
}
}
} {
"servers": {
"cubenest-peek-mcp": {
"command": "npx",
"args": [
"-y",
"@peekdev/mcp"
]
}
}
} codex mcp add cubenest-peek-mcp -- npx -y @peekdev/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cubenest-peek-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"@peekdev/mcp"
],
"enabled": true
}
}
} openclaw mcp add cubenest-peek-mcp --command npx --arg -y --arg @peekdev/mcp
mcp_servers:
cubenest-peek-mcp:
command: "npx"
args: ["-y", "@peekdev/mcp"] {
"McpServers": {
"cubenest-peek-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@peekdev/mcp"
]
}
}
} assistant mcp add cubenest-peek-mcp -t stdio -c npx -a -y @peekdev/mcp
{
"mcpServers": {
"cubenest-peek-mcp": {
"command": "npx",
"args": [
"-y",
"@peekdev/mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 −3
- Stability: pass → 0.80 functional
- 16 Sept 26 0
- Stability: 0.97 → pass security
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 9 Sept 26 −3
- Stability: pass → 0.77 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed npm/@peekdev/mcp@0.1.0-alpha.24
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Cubenest/rrweb-stack |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Cubenest/rrweb-stack/.github/workflows/release.yml@refs/heads/main |
| Rekor log index | 2124700408 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:20c5203a02eb3f78ab559f58cc4fe5243827828ccdcdc2b6ee2586c4649242c4cd990c80821178616f680d2af88e35de1f2c5fb682d0f1e003ae697f6 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| postinstall | unreviewed | node ./scripts/postinstall-guard.mjs |
Background: Why install scripts are a supply-chain risk →
Dependencies 150 packages
| Packages resolved | 150 |
|---|---|
| Deprecated | 6 |
| Stale | 56 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
clear_highlight Clear the highlight overlay ~75
Remove the highlight overlay previously drawn by suggest_element in the user's live browser. Available at per-origin permission Level 2 (Suggest) and above. Idempotent. Recorded to ~/.peek/audit.log.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | yes | Session id (origin context) from list_recent_sessions; determines the per-origin permission level. |
No output schema declared.
No examples provided.
execute_action Execute a browser action ~314
Execute an action (click/type/navigate/...) in the user's live browser. Requires per-origin permission Level 3+: Level 3 raises a confirm banner unless a valid confirmToken from request_authorization is passed; Level 4 auto-allows non-destructive actions; Level <3 denies. The destructive-action override (delete/remove/transfer/send/pay/purchase/buy/confirm/subscribe/logout/sign out/unsubscribe/cancel subscription/wire/withdraw) always prompts, even at Level 4. Every call is recorded to ~/.peek/audit.log. After a mutating action, re-read to confirm it took: get_element_detail on the target (its value should match what you intended) and get_page_view (no validation error should have appeared) before advancing; if it did not take, stop and report rather than blind-retrying. Password/email/PII values return masked — verify those by the absence of an error.
| Name | Type | Req | Description |
|---|---|---|---|
| action | – | yes | The browser action to execute (e.g. click/type/navigate; see the action schema). |
| confirmToken | string | – | One-shot token from a prior request_authorization Allow, to skip the Level-3 banner. Omit to trigger the banner (Level 3) or rely on Level-4 auto-allow. |
| connectorSecret | string | – | SP4: paired-connector secret; presented by connectors, ignored for direct clients. |
| sessionId | string | yes | Session id (origin context) from list_recent_sessions; determines the per-origin permission level. |
No output schema declared.
No examples provided.
generate_playwright_repro Generate Playwright repro ~215
Generate a runnable Playwright test (TypeScript) reproducing the user actions in a session: clicks, typing, navigation, and <select> changes. Optionally limit to a [startTs, endTs] epoch-ms window. Pass errorId (from get_session_console_errors) to seed a console-error-absence regression assertion — the generated test will capture console errors and assert the given error is not reproduced. Returns the test source as text. Note: only single-value <select> is represented (rrweb captures one value per input).
| Name | Type | Req | Description |
|---|---|---|---|
| endTs | integer | – | Only include actions at or before this epoch-ms timestamp. Omit to run through the session end. |
| errorId | integer | – | Console error id (from get_session_console_errors) to seed a console-error-absence regression assertion. |
| sessionId | string | yes | Session id from list_recent_sessions. |
| startTs | integer | – | Only include actions at or after this epoch-ms timestamp. Omit to start at the session beginning. |
No output schema declared.
No examples provided.
get_dom_snapshot Reconstruct DOM at a time ~152
Reconstruct the page DOM as it existed at a timestamp (or a selector subtree within it) and return it as HTML. Applies structural/attribute/text mutations on top of the nearest full snapshot at or before ts. Returns JSON { baseSnapshotTs, mutationsApplied, html }; html clipped to 24000 chars. Fails if no full snapshot exists at or before ts.
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | – | CSS selector to return only that subtree. Omit to return the full document. |
| sessionId | string | yes | Session id from list_recent_sessions. |
| ts | integer | yes | Epoch-ms timestamp to reconstruct the DOM at. Use timestamps from get_session_summary, error rows, or get_user_action_before_error. |
No output schema declared.
No examples provided.
get_element_detail Get full masked detail for one element by ref ~196
Given a `ref` from get_page_view, return the FULL masked detail of that single element (role, accessible name, accessible description, all aria-*, effective aria-hidden/disabled, a curated computed-style bag, state, value, href, position, nearby heading, and its interactive descendants with their refs, capped). The compact get_page_view stays cheap; call this only for the one element you need to disambiguate or act on. Refs expire on navigation. Level 1+; non-mutating; audited. Values for password/email/PII inputs are masked; free-text values may be returned (like the recorder). For live console/network state use get_session_console_errors / get_session_network_errors.
| Name | Type | Req | Description |
|---|---|---|---|
| ref | string | yes | An element ref (e.g. "e5") from a recent get_page_view. |
| sessionId | string | yes | Session id (origin context) from list_recent_sessions. |
No output schema declared.
No examples provided.
get_page_view Get a live, ref-tagged view of the current page ~226
Return a compact, masked snapshot of the user's LIVE page as a list of interactive/labeled elements, each with a stable `ref` (e.g. e5). Pass a `ref` to execute_action / request_authorization (click/type/scroll/enter/dblclick) instead of authoring a CSS selector — deterministic and far cheaper than reading get_dom_snapshot's HTML. Refs expire on navigation; re-call after navigating. Available at per-origin Level 1+; non-mutating; recorded to ~/.peek/audit.log. Password/email/tel and PII-autofill (card/address/etc.) input values, and fields marked private, are masked; structured PII is scrubbed, but free-text field values may be returned.
| Name | Type | Req | Description |
|---|---|---|---|
| maxElements | integer | – | Cap on elements returned (1-500; default 200). |
| selector | string | – | Scope the snapshot to a CSS subtree. Omit for the whole page. |
| sessionId | string | yes | Session id (origin context) from list_recent_sessions; determines the per-origin permission level. |
No output schema declared.
No examples provided.
get_session_console_errors List console errors ~145
List console error messages recorded in a session, oldest first. Each row has a numeric id to pass to get_user_action_before_error. Returns JSON rows ({ id, ts, level, message, stack }); message clipped to 500 and stack to 800 chars. For error counts at a glance, use get_session_summary first.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum errors to return (1-200, oldest first; default 50). |
| sessionId | string | yes | Session id from list_recent_sessions. |
| since | integer | – | Only return errors with ts >= this epoch-ms timestamp (to page forward through a long session). Omit to start from the beginning. |
No output schema declared.
No examples provided.
get_session_network_errors List failed network requests ~150
List failed or notable network requests in a session (HTTP status >= statusGte, or a transport-level network error), oldest first. Returns JSON rows ({ id, ts, method, url, status, statusText, resourceType, durationMs, errorText }); url and errorText clipped to 300 chars.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum requests to return (1-200, oldest first; default 50). |
| sessionId | string | yes | Session id from list_recent_sessions. |
| statusGte | integer | – | Minimum HTTP status treated as notable (100-599; default 400, i.e. 4xx/5xx). Transport-level errors are always included regardless. |
No output schema declared.
No examples provided.
get_session_summary Summarize a session ~79
Get an LLM-readable narrative summary of one session — your orientation for debugging what already happened: pages visited, click/input/navigation counts, and error counts. Use this first for an overview before drilling into get_session_console_errors / get_session_network_errors. Returns a structured JSON summary.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | yes | Session id from list_recent_sessions. |
No output schema declared.
No examples provided.
get_user_action_before_error Actions before an error ~181
Pre-assembled causal chain for a console error: the user actions, DOM mutations, and network errors in the window before it, merged into one time-ordered timeline with a deterministic narrative — to explain how the error was triggered. Returns JSON { errorId, errorTs, error, windowMs, actions, domMutations, networkErrors, timeline, narrative, truncated }. Get errorId from get_session_console_errors first.
| Name | Type | Req | Description |
|---|---|---|---|
| errorId | integer | yes | Console error id from get_session_console_errors. |
| sessionId | string | yes | Session id from list_recent_sessions. |
| window | integer | – | How many preceding user actions to return (1-50; default 10). |
| windowMs | integer | – | Time window (ms) before the error for correlated DOM mutations + network errors (100-60000; default 5000). |
No output schema declared.
No examples provided.
list_recent_sessions List recent browser sessions ~172
List the user's recorded browser sessions, newest first — the entry point for debugging what already happened (the get_session_* and DOM tools). Returns compact JSON rows ({ sessionId, origin, url, title, startedAt, ... }); free-text fields are clipped (origin 100, url 300, title 200 chars). If the MCP client scoped roots to specific origins and no origin filter is given, results are restricted to the client's scoped origins. Start here to obtain a sessionId, then call get_session_summary.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum sessions to return (1-50, newest first; default 10). |
| origin | string | – | Filter to one origin, e.g. 'https://app.example.com'. Omit to list across all recorded origins (subject to client roots scoping). |
No output schema declared.
No examples provided.
query_dom_history DOM change timeline ~278
Timeline of DOM changes in a session. Two modes: (1) selector mode — pass `selector` to track one node's attribute/text history (use `op` to restrict). (2) window mode — pass `ts` (and optional `windowMs`) instead, to get ALL DOM changes in [ts - windowMs, ts] with per-change `target` hints, no selector needed. Returns JSON { selector, changes } or { ts, windowMs, changes }.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum changes to return (1-500; default 100). Selector mode keeps the earliest matches; window mode keeps the most recent (closest to `ts`). |
| op | string | – | Selector mode only: restrict to 'attributeChanges' or 'innerText'. Omit for both. |
| selector | string | – | Selector mode: CSS selector to track one node, e.g. '#status'. Omit and pass `ts` for window mode. |
| sessionId | string | yes | Session id from list_recent_sessions. |
| ts | integer | – | Window mode: anchor (epoch-ms). Returns DOM changes in [ts - windowMs, ts]. Ignored if `selector` is given. |
| windowMs | integer | – | Window mode size in ms (100-60000; default 5000). |
No output schema declared.
No examples provided.
request_authorization Request action authorization ~137
Ask the user to authorize a browser action via the side-panel banner (Level-3 act-with-confirm). On Allow, returns a one-shot confirmToken to pass to execute_action; on Deny, returns the denial. Every call - allowed or denied - is recorded to ~/.peek/audit.log. Use before execute_action when the origin is at permission Level 3, or to pre-authorize.
| Name | Type | Req | Description |
|---|---|---|---|
| action | – | yes | The browser action to authorize (e.g. click/type/navigate; see the action schema). |
| sessionId | string | yes | Session id (origin context) from list_recent_sessions; determines the per-origin permission level. |
No output schema declared.
No examples provided.
request_pairing Request connector pairing ~88
Initiate a connector-pairing handshake: present a pairing code and receive a one-shot secret on approval. The connecting client name is taken from the MCP connection identity. Returns JSON { approved, secret? }. Every attempt is recorded to ~/.peek/audit.log; the secret is never written to the log.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | The pairing code generated by the connector for this handshake. |
No output schema declared.
No examples provided.
request_user_input Pause and ask the user to fill something in on the page ~309
Pause the agent and hand the keyboard back to the user for ONE editable, non-destructive field (or a free-text prompt), then resume. Requires the origin at Level 4 with the control shield up. Blocks until the user clicks Done, a timeout fires, or the run is stopped. Returns { resumed:true, value? } or { resumed:false, reason }. The returned value is only included when readBack:true and the field isn't a password/OTP/credit-card field. Recorded to ~/.peek/audit.log (prompt + selector only — never the value).
| Name | Type | Req | Description |
|---|---|---|---|
| prompt | string | yes | What to ask the user to do (shown in the card, below a peek-authored framing line). |
| readBack | boolean | – | If true, return what the user typed to the agent (never for password/OTP/cc fields). Default false. |
| scope | string | – | 'field' (default) unlocks one editable field; 'page' hands full page control back (CAPTCHAs, native widgets, final review) until Resume. Inherits the handoff recording-suspension. |
| selector | string | – | CSS selector of the editable field to unlock for the user. Omit for a free-text prompt card. |
| sessionId | string | yes | Session id (origin context) from list_recent_sessions; determines the per-origin permission level. |
| timeoutMs | integer | – | How long to wait for the user (default 120000, max 600000). |
No output schema declared.
No examples provided.
search_sessions Search recorded sessions ~318
Search your recorded browser sessions by metadata and facets — free text in title/URL/origin (q), exact origin, recorded date range (createdAfter/createdBefore, ISO-8601), status (active/finalized), and whether the session has console errors (hasConsoleErrors) or network errors (hasNetworkErrors). Returns the same compact rows as list_recent_sessions, newest first. Read-only and local. Use it to find a sessionId when you don't already have one, then call get_session_summary. Matches session metadata only — not page content or error-message text. Multiple facets combine with AND (e.g. hasConsoleErrors + hasNetworkErrors returns sessions that have BOTH); to find sessions with either kind of error, search for each separately.
| Name | Type | Req | Description |
|---|---|---|---|
| createdAfter | string | – | Only sessions first recorded at or after this ISO-8601 time. |
| createdBefore | string | – | Only sessions first recorded at or before this ISO-8601 time. |
| hasConsoleErrors | boolean | – | Only sessions with at least one console error. |
| hasNetworkErrors | boolean | – | Only sessions with a failed/4xx-5xx network request. |
| limit | integer | – | Maximum sessions to return (1-50, newest first; default 10). |
| origin | string | – | Exact origin filter, e.g. 'https://app.example.com'. |
| q | string | – | Free text matched (case-insensitive) against session title, URL, and origin. |
| status | string | – | Filter by session status. |
No output schema declared.
No examples provided.
set_intent Set the control-shield banner text ~256
Set the agent's status banner shown on the control shield (e.g. 'Applying to Senior Frontend · step 2/4'), so the user can follow what you're doing. Up to 80 chars, plain text. Requires the origin at Level 4 with the shield up; auto-allowed. Recorded to ~/.peek/audit.log. Advance the step only after the previous step verified (re-read it took); on a failure, set a 'stopped — <what> didn't take' status instead of advancing. End an assisted-apply loop by calling set_intent with a short summary text plus status:'done' (success) or status:'failed' (with a brief reason), so the user sees a clear outcome.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | yes | Session id (origin context) from list_recent_sessions; determines the per-origin permission level. |
| status | string | – | Set 'done' when the task is fully complete, or 'failed' when you stopped because a step didn't take, to show a terminal banner on the shield. Omit for an ongoing status update. |
| text | string | yes | Status text shown in the shield banner (<=80 chars). Pass an empty string to clear it. |
No output schema declared.
No examples provided.
suggest_element Highlight an element in the live browser ~141
Draw a non-destructive highlight overlay on a CSS selector in the user's live browser, with an optional label, to point something out. Available at per-origin permission Level 2 (Suggest) and above; it never clicks, types, or navigates. The overlay persists until clear_highlight is called. Every call is recorded to ~/.peek/audit.log.
| Name | Type | Req | Description |
|---|---|---|---|
| label | string | – | Optional short text shown in a badge next to the highlight (<=120 chars). |
| selector | string | yes | CSS selector of the element to highlight. |
| sessionId | string | yes | Session id (origin context) from list_recent_sessions; determines the per-origin permission level. |
No output schema declared.
No examples provided.
verify_audit_log Verify the action audit log ~149
Verify the integrity of peek's local action audit log (~/.peek/audit.log) — the append-only, hash-chained record of every browser action peek authorized or attempted. Returns JSON { logPresent, status, entriesVerified, prelude, headPresent, brokenAtLine?, expected?, got?, gaps?, summary }. status is one of intact | broken | truncated | tail-tampered | prefix-tampered | incomplete-final | gaps | head-missing. Local and read-only. The log is tamper-EVIDENT, not tamper-proof: it has no cryptographic signature and no external timestamp anchor. Use it to confirm the action trail on this machine has not been altered.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
What is the peek MCP server?
peek is an MCP server listed in the public MCP registry as io.github.Cubenest/peek-mcp. Exposes recorded browser sessions (rrweb DOM, console, network) to AI coding agents, fully local. This page covers its npm package (@peekdev/mcp).
Is the peek MCP server safe to use?
peek scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. Its build provenance is signed and verified. 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 peek MCP server expose?
peek exposes 19 tools: list_recent_sessions, search_sessions, get_session_summary, get_session_console_errors, get_session_network_errors, and 14 more. Their descriptions and schemas cost roughly 3,581 tokens of context every time the server is loaded.
Is the peek MCP server still maintained?
peek is still listed as active in the MCP registry. We last reached this channel on 20 September 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 peek MCP server under?
peek declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.