peek MCP server
Exposes recorded browser sessions (rrweb DOM, console, network) to AI coding agents, fully local
7 stars51 downloads/wk
Reviews
Write oneNobody has reviewed peek yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
peek tools (19, 2 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
clear_highlightwrite actionRemove 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.
execute_actionwrite actiongenerate_playwright_reproGenerate 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
get_dom_snapshotReconstruct 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.
get_element_detailGiven a `ref` from get_page_view, return the FULL masked detail of that single element
get_page_viewReturn 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 p
get_session_console_errorsList 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.
get_session_network_errorsList 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.
get_session_summaryGet 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.
get_user_action_before_errorPre-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_error
list_recent_sessionsList 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
query_dom_historyTimeline 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 }.
request_authorizationAsk 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.
request_pairingInitiate 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.
request_user_inputPause 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 i
search_sessionsset_intentSet 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' st
suggest_elementDraw 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.
verify_audit_logVerify 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 | he
Public scan report
scanner v0.1.9 · 2026-09-26 · same rubric, same numbers if you re-run it
- Code scan79 source files scanned15/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 78 days ago12/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year9/10
Findings (2)
- mediumnpm install lifecycle script present
install.script - mediumnpm install lifecycle script present
install.scriptpackage.json: …t": "vitest run --passWithNoTests", "postinstall": "node ./scripts/postinstall-guard.mjs" …
What the publisher says
From the peek repository's README, as published. We do not edit it. Read it on GitHub
rrweb-stack
Two OSS products on one rrweb-based substrate. Both ship as npm packages today.
Above: npx @tracelane/cli init in a real WebdriverIO project — detect runner, install, edit wdio.conf.ts, ignore reports dir.
Above: peek sessions list then peek sessions show ... --format markdown — a recorded browser session as queryable structured output, AI-ready.
What's where
tracelane
Docs: tracelane.cubenest.in (source under apps/tracelane-docs/). The tracelane-wdio README is the right starting point.
peek
Docs: peek.cubenest.in (source under apps/peek-docs/).
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Install directly
Runs npx -y @peekdev/mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add peek-mcp -- npx -y @peekdev/mcp
peek: common questions
- Is peek MCP server safe?
- Mostly: it is graded B (74/100). Read the peek safety report
- How do I install peek?
- It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
- Does peek need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is peek maintained?
- The last commit was 78 days ago (2026-07-10). The latest release is v0.1.0-alpha.24.
- What can I use instead of peek?
- Servers from other publishers that do the same job: Zenrows MCP server, Hwatu MCP server and Feedthrough MCP server. Compare all peek alternatives.
Alternatives to peek
Same job from other publishers: the closest match first, then the best rated.
- ZenrowsZenrows MCP server — Fetch, Extract, Batch, and Browser Sessions for AI coding assistantsnot reviewedEstablishedA
- HwatuVerification browser for coding agents: headless WebKit, DOM eval, screenshots, pixel-diff.not reviewedGrowingA
- FeedthroughDebug bridge inside your web app: an agent reads the DOM, console and network. Any browser.not reviewedGrowingA
Slack MCP ServerCatch up on Slack without reading it. Unreads, threads, search. Browser-session or hosted OAuth.not reviewedEstablishedA- mac-control-mcpNative Swift macOS automation — 153 tools: AX, EventKit, voice, browser DOM, undo.not reviewedGrowingB