Snapsurf

io.github.zumerlab由 GitHub 帳號 zumerlab 發布v0.1.2更新於 Oct 24, 2026

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

已驗證STDIO僅桌面瀏覽器自動化開發者工具

概覽

AI 產生的概覽

本機 MCP 伺服器與 CLI,讓 AI 代理瀏覽網頁,並透過型別化差異與斷言核實每一步操作究竟改變了什麼。

可以做什麼
  • 在自帶的 Chromium 工作階段中開啟頁面並定位控制項
  • 對元素執行操作(例如點擊),並取得頁面的精簡語意摘要
  • 核實每次操作後的型別化差異,涵蓋內容、狀態、版面與可點擊性
  • 依差異編號對已保留的差異做斷言,或對目前頁面狀態做即時檢查
  • 明確回報缺少的證據與不確定之處,而非隱藏
適用情境
適合需要讓代理操作網頁介面並證明上一步操作確實產生預期效果,而不只是查看目前頁面快照的情境。適用於腳本化瀏覽檢查與需要明確通過或失敗證據的驗證流程。
執行需求
以 npm 套件形式透過 stdio 在本機執行,需要 Node.js 22 或更新版本。首次啟動會自動下載 Playwright 的 Chromium;在 Linux 上若缺少系統函式庫,可能需要一次性安裝含相依項的 Playwright。未宣告帳號、API 金鑰或標頭;選用的 SNAPSURF_ 環境變數用於連接埠、權杖檔案與日誌目錄。
安裝前請注意
守護程序擁有獨立的 Cookie 與儲存空間,無法使用你日常瀏覽器的已登入工作階段,因此驗證狀態未知並不代表已通過驗證。頁面文字被視為不可信資料,語意報告會做去識別化,但截圖仍可能包含敏感內容。元素編號會隨新的觀測失效,無變化的結果也不能證明任務成功。0.1.3 版為實驗性。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Snapsurf,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

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.

來源:README.md,提交 21cbfef

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.2最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分