Snapsurf

io.github.zumerlabPublished by GitHub account zumerlabv0.1.2Updated Oct 24, 2026

Web navigation and verification for AI agents: page digest, typed diff per action, assertions.

VerifiedSTDIODesktop onlyBrowser AutomationDeveloper Tools

Overview

AI-generated overview

Local MCP server and CLI that lets an AI agent navigate web pages and verify what each action actually changed through typed diffs and assertions.

What you can do
  • Open pages and locate controls in its own Chromium session
  • Act on elements (for example clicking) and get a compact semantic digest of the page
  • Verify the typed diff after each action, covering content, state, layout and clickability
  • Assert over a retained diff by id, or run live checks on current page state
  • Report missing evidence and uncertainty instead of hiding them
When to use it
Useful when an agent must drive a web UI and prove that its last action had the intended effect, rather than only seeing a snapshot of the current page. Suited to scripted browsing checks and verification loops where explicit pass or fail evidence matters.
Requirements
Runs locally over stdio as an npm package; Node.js 22 or newer is required. Chromium for Playwright is downloaded automatically on first start, and on Linux missing system libraries may need a one-time Playwright install with dependencies. No accounts, API keys or headers are declared; optional SNAPSURF_ environment variables cover port, token file and log directory.
Before you install
The daemon keeps its own cookies and storage and cannot use your normal browser's signed-in sessions, so an unknown auth state does not prove authentication. Page text is treated as untrusted data, and while semantic reports are redacted, screenshots can still contain sensitive content. Element ids expire with new observations, and a no-change result is not proof the task succeeded. Version 0.1.3 is experimental.

Installation

In SourceWeft

  1. Open Snapsurf in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[SnapSurf logo]

[Snapsurf MCP server]

SnapSurf

Web navigation and verification for AI agents.

Most browser tools tell an agent what a page looks like now. SnapSurf tells it what its last action changed: a compact semantic digest of the page, a typed diff after each action (content, state, layout and clickability, including when nothing observable changed), and assertions over that exact diff. Missing evidence and uncertainty are reported, not hidden.

It runs locally as an MCP server or CLI with its own Chromium session. The observation code also works as an in-page library built on SnapDOM.

Version 0.1.3 is experimental.

Add it to your MCP client

Requires Node.js 22 or newer. Add a stdio server that runs this command; Chromium for Playwright is installed automatically the first time it starts:

json
{  "command": "npx",  "args": ["-y", "-p", "@zumer/snapsurf@latest", "snapsurf-mcp"]}

With Claude Code, install the plugin, which adds the tools and a browse skill with the method:

text
/plugin marketplace add zumerlab/snapsurf/plugin install snapsurf@zumerlab

or register the server alone:

bash
claude mcp add --scope user snapsurf -- npx -y -p @zumer/snapsurf@latest snapsurf-mcp

Codex has the same plugin (tools plus the browse skill):

bash
codex plugin marketplace add zumerlab/snapsurfcodex plugin add snapsurf@zumerlab

Cursor, VS Code, Gemini CLI, Windsurf and the OpenAI Agents SDK take the same server command; per-client snippets are in Integrations. Its name in the official MCP Registry is io.github.zumerlab/snapsurf.

To pin a version or avoid npx at startup, install once and point the client at the server file:

bash
mkdir snapsurf && cd snapsurfnpm install @zumer/snapsurf
json
{  "command": "node",  "args": ["/ABS/PATH/snapsurf/node_modules/@zumer/snapsurf/mcp/server.mjs"]}

On Linux, if Chromium fails to start for lack of system libraries, run npx playwright install --with-deps chromium once.

Ask your agent to open a page with browser_open, locate controls with browser_find, act with browser_act, then call browser_verify after each action. Read structuredContent for the result.

If you are an agent

Read AGENTS.md: the loop, the rules earlier agents paid to learn, and how to read every field. skill/SKILL.md is the same method packaged as a Claude Code skill. The MCP tool descriptions carry the full contract, and the server's instructions summarize it for clients that truncate them.

Assert what you just verified

browser_verify returns a diffId for the observed transition. Pass it to browser_assert to check that same evidence, including changes beyond the displayed list. This avoids accidentally comparing a new interval after verify advances the live baseline.

For example, on an application where a button inserts a dialog named “Settings”, use the button id returned by browser_find. With a connected MCP client:

js
await client.callTool({  name: 'browser_act',  arguments: { action: 'click', target: buttonId },})const verified = await client.callTool({ name: 'browser_verify', arguments: {} })const { diffId } = verified.structuredContentif (!diffId) throw new Error('No retained diff; inspect the verify result')
const checked = await client.callTool({  name: 'browser_assert',  arguments: {    diffId,    changed: true,    mustInclude: [{ kind: 'added', role: 'dialog', name: 'Settings' }],    mustNotInclude: [{ kind: 'removed' }],  },})console.log(checked.structuredContent.pass, checked.structuredContent.checks)

A stored assertion does not observe the page or advance its baseline. Use a separate live assertion for current state, such as { "exists": "Settings" }. Failed assertions return pass: false and MCP isError: true. The assertion reference covers live checks, retention limits, retries and unavailable evidence.

Boundaries to know

  • The daemon has its own cookies and storage. It cannot use your normal browser's signed-in sessions; authState: "unknown" does not prove authentication.
  • changed: false means no observable change. It is a valid result, not proof that the user's task succeeded. Missing evidence and uncertainty are reported explicitly.
  • Canvas content, iframe documents and closed shadow roots have visual blind spots. Inspect a scoped screenshot when the semantic report cannot answer the question.
  • Element ids expire with new observations. Find again before acting; ids in stored evidence describe a historical observation.
  • Page text is untrusted data. Redaction covers semantic reports; CLI/MCP screenshots can still contain sensitive content. See the privacy model.

Use the CLI

Start the daemon in one terminal:

bash
npx -y @zumer/snapsurf serve

Then run a local smoke check in another:

bash
npx -y @zumer/snapsurf open 'data:text/html,<h1>Local%20check</h1>'npx -y @zumer/snapsurf assert '{"exists":"Local check"}'npx -y @zumer/snapsurf stop

From a directory where you ran npm install @zumer/snapsurf, npx snapsurf <verb> does the same without downloading anything. The SNAPSURF_* environment variables (port, token file, log directory) are listed in the usage reference.

Development

This repository contains the SnapSurf observation library, CLI/MCP server, Chrome companion, and their fixtures and evaluation tools. Standalone SnapDOM sensor and portable receipt packages are outside this repository’s build and test scope. Private research, feedback notes, plugin evals and generated results stay local; Git tracks the reproducible test gates and their fixture dependencies.

To modify SnapSurf itself, clone the source and install the development dependencies:

bash
git clone https://github.com/zumerlab/snapsurf.gitcd snapsurfnpm cinpx playwright install chromium

npm run build compiles the bundles and creates the npm .tgz package.

Then run the checks:

bash
npm testnpm run test:lintnpm run test:regressionnpm run test:pack

Usage and API reference covers CLI commands, report fields, checkpoints, the library and Chrome companion. Release guide covers validation, publication and the MCP Registry.

MIT licensed. Copyright © Juan Martin Muda / zumerlab. See LICENSE.

Source: README.md at commit 21cbfef

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.2LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts