Labsco
bgaze logo

SnapStack

from bgaze

Capture any browser tab in one click and feed it to your MCP client โ€” 100% local, no account, no telemetry.

๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅโœ“ VerifiedFreeQuick setup
<p align="center"> <img src="assets/logo.png" alt="SnapStack" width="440"> </p> <p align="center"> <a href="https://github.com/bgaze/snapstack-server/actions/workflows/ci.yml"><img src="https://github.com/bgaze/snapstack-server/actions/workflows/ci.yml/badge.svg" alt="CI"></a> <a href="LICENSE"><img src="https://img.shields.io/github/license/bgaze/snapstack-server?color=blue" alt="License: MIT"></a> <img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node >= 18"> <a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-compatible-blueviolet" alt="MCP compatible"></a> <img src="https://img.shields.io/badge/100%25-local-success" alt="100% local"> <a href="https://www.npmjs.com/package/snapstack-server"><img src="https://img.shields.io/npm/v/snapstack-server?label=npm" alt="npm version"></a> <a href="https://www.npmjs.com/package/snapstack-server"><img src="https://img.shields.io/npm/dm/snapstack-server?label=downloads" alt="npm downloads"></a> <a href="https://glama.ai/mcp/servers/bgaze/snapstack-server"><img src="https://glama.ai/mcp/servers/bgaze/snapstack-server/badges/score.svg" alt="Glama score"></a> </p> <p align="center"> <img src="assets/demo.gif" alt="SnapStack demo โ€” capture a browser tab, your AI reads the screenshots over MCP" width="900"> </p>

The SnapStack server is a single always-on Node process: it receives browser captures from the extension, stacks them on disk, and serves them to any MCP-capable LLM client over Streamable HTTP. It listens only on 127.0.0.1 โ€” nothing ever leaves your machine.

New here? The full install + usage guide lives in the extension README: snapstack-extension. This page is the technical reference.

Architecture

One always-on process serves both the extension (capture) and your MCP client, decoupled by a folder on disk.

[MV3 extension]  --POST /push (bytes) โ”
                                      โ–ผ
                              [SnapStack server - 127.0.0.1:4123]   
                                 โ”œโ”€ writes           โ†’  stack on disk
                                 โ””โ”€ MCP /mcp (HTTP)  โ†  MCP client
  • Capture โ€” the extension encodes the shot as WebP (PNG fallback), downscales it, and POSTs it here.
  • Stack โ€” one image file (.webp/.png) plus a twin .json (url, title, timestamp, dimensions) per capture, named NN <timestamp>: a stable two-digit number (assigned in capture order, restarts at 01 when the stack empties) plus a timestamp, under ~/.snapstack/.
  • Retrieval โ€” get_screenshots returns a JSON manifest (number, absolute path, dimensions, metadata โ€” no image bytes); the client reads only the files it needs, by path. Deletion is a separate, explicit clear_screenshots step. Retrieval never deletes.

MCP

SnapStack speaks two MCP transports over the same on-disk stack โ€” pick whichever your client supports:

// HTTP (server already running) โ€” register http://127.0.0.1:4123/mcp; copy deploy/mcp.json
{ "type": "http", "url": "http://127.0.0.1:4123/mcp" }
// stdio (the client spawns the process)
{ "command": "npx", "args": ["-y", "-p", "snapstack-server", "snapstack", "mcp"] }

The HTTP /mcp endpoint is stateless (a fresh server + transport per request); the stdio front-end (snapstack mcp) is spawned on demand and reads the same ~/.snapstack stack.
Capture intake (/push) always stays in the running server, independent of either MCP front-end.

Exposed tools

ToolDescription
get_screenshotsLists pending captures as a JSON manifest (stable number, absolute path, dimensions, metadata) โ€” no image bytes, no deletion. Pass numbers (e.g. [1,3]) to list only those.
clear_screenshotsDeletes captures. Pass numbers to delete specific ones; omit to clear the whole stack. Numbering restarts at 01 once empty.
count_screenshotsNumber of pending captures, without retrieving them.

get_screenshots and count_screenshots are read-only; only clear_screenshots is destructive.

Support

License

MIT โ€” see LICENSE.