Knowledge base

Reading captures from a coding assistant (MCP)

SnapBuddy ships a small program that lets Claude Code, Claude Desktop, Cursor or any other MCP client read the captures you have already saved to a folder - so instead of pasting a bug report into a chat, you ask the assistant and it looks.

Connecting it

Copy the configuration out of SnapBuddy rather than typing one. Open Settings → AI agents and copy the Client configuration block. It is generated with your real access token already in it, and that is the point of it: a snippet assembled by hand out of the address field and the token field can leave SNAPBUDDY_MCP_TOKEN out, and a server started that way reads captures perfectly well while refusing every request for a new picture, for ever, with nothing anywhere to say the configuration is what is wrong. The block also pins the port the app is actually on, so it is right whether or not you have moved it. Cite: apps/desktop/src/settings.html, paintMcpConfig; the generated token and its refresh are pinned by a harness check in apps/desktop/test/checks.js.

One part is yours to fill in. The block contains <PATH-TO-SNAPBUDDY>; replace it with the folder you keep the SnapBuddy repository in. SnapBuddy cannot know that path, and the program is run out of a checkout today rather than installed alongside the app - apps/mcp is a private package, is not published to npm, and the installer does not ship it (tauri.conf.json bundles ffmpeg and two resource files). Anything you read elsewhere offering a one-word npx command is describing a future version.

And run pnpm install in that folder once. The server loads its libraries from the node_modules folder that command creates, so a copy of the repository nobody has installed stops before it starts - and your assistant will report that only as the server failing to start, without saying why. Installing once is enough; you do not repeat it per client.

Claude Code

One line, and the token goes in as an environment variable:

claude mcp add snapbuddy \
  --env SNAPBUDDY_MCP_TOKEN=the-token-from-Settings \
  -- node "<PATH-TO-SNAPBUDDY>/apps/mcp/src/index.mjs"

Claude Code also reads an mcpServers object from a .mcp.json file at the root of a project, which is the same shape the generated block already is, so pasting the block into that file is the same connection and travels with the project.

Claude Desktop

Claude Desktop keeps its servers in claude_desktop_config.json - on Windows in the Claude folder under %APPDATA%, on macOS under ~/Library/Application Support/Claude/. Add the snapbuddy entry from the generated block to it. If the file already lists other servers, keep them and add this one alongside - the block is a whole mcpServers object, so pasting over the file drops the others without an error, because what is left is still valid JSON. Written out:

{
  "mcpServers": {
    "snapbuddy": {
      "command": "node",
      "args": ["<PATH-TO-SNAPBUDDY>/apps/mcp/src/index.mjs"],
      "env": {
        "SNAPBUDDY_MCP_TOKEN": "the-token-from-Settings"
      }
    }
  }
}

Restart Claude Desktop afterwards. It reads that file when it starts.

Cursor

Cursor takes the same mcpServers object, in .cursor/mcp.json for one project or ~/.cursor/mcp.json for all of them. Check the filename against Cursor's own documentation before relying on it. The shape of the object is the one every client above uses and is not in doubt; where Cursor reads it from is Cursor's decision and has changed before, and this article would rather say so than send you to edit a file that is no longer read.

The rest of the environment

SNAPBUDDY_MCP_PORT only matters if you have moved the desktop app off its default port. The generated block carries whichever port SnapBuddy reports; a configuration written by hand needs the line only once the port has moved, and then it must match what Settings → AI agents → Address shows.

The server finds your capture folders by reading the desktop app's settings.json, so it needs no arguments and works with SnapBuddy closed. If you only use the extension, or keep captures elsewhere, set SNAPBUDDY_SAVE_DIR and SNAPBUDDY_VIDEO_DIR in the same env block.

It is not running unless you have added it yourself.

What it can answer

ToolAnswers
list_capturesWhat is on this machine, newest first, and what each one carries
get_captureOne capture as fields: status, note, the page, the environment, the dev log
get_console_errorsThe console errors captured from the page, as data
get_failed_requestsThe requests that errored or came back 400 or worse
get_repro_stepsThe numbered steps reconstructed from what the recorder recorded
get_frameOne frame out of a recording, as an image
get_documentThe markdown, exactly as SnapBuddy wrote it
capture_regionA NEW picture: the picker opens and you drag the box
capture_screenA NEW picture of the whole screen, refused until you allow it

Six of the nine answer in text. get_frame costs vision budget, and the two capture_ tools cost that plus your attention - they are worth spending only when the pixels are the point, or when what you need to show the assistant is on your screen now and was never captured. Everything else about a capture is cheaper and more exact as text, which is the whole argument for this server over pasting a bundle in.

The two capture_ tools are listed even when nothing is set up, so an assistant that tries one gets a refusal telling it what to switch on rather than concluding the feature does not exist. They need SnapBuddy running with Settings → AI agents → Let agents reach SnapBuddy turned on, and the access token shown there set as SNAPBUDDY_MCP_TOKEN in this server's entry in your client config - which is what the generated Client configuration block above already does for you. Reading needs none of that.

Two things that are easy to read wrong

captured: false is not "nothing went wrong". Console and network capture is off until a tester switches it on for a site, and a recording has no card data at all - so an empty get_console_errors can mean nobody was looking. The answer says which, in a note. An agent that reports "there were no console errors" about a capture that never looked is worse than one that says nothing.

get_frame needs ffmpeg, and it looks in this order: SNAPBUDDY_FFMPEG if you set it, then the one the desktop app ships (its release build, its debug build, then the fetched sidecar), then ffmpeg on PATH. If none is there it says so and names every place it looked - pnpm ffmpeg in the repo fetches the pinned one. The frame returned is the nearest keyframe at or before the time asked for, and the answer says which second it landed on rather than echoing the request.

What it can and cannot see

Only what you have saved to a folder. Cards live in the app until you press Save files, so a board full of work can leave this empty. That is not a fault; save the card and it appears.

Not the apps' own storage. A separate program cannot open the desktop's or the browser's internal database, which is why the folder is the boundary.

Older captures work with less detail. Cards saved before SnapBuddy started writing a small data file beside the picture are recovered from their Markdown instead. get_capture says from: "document" when that happened, and marks the developer log partial if the document had shortened it - a log that looks complete and is not is worse than no log.

The thing worth understanding before you connect it

Nothing it does leaves your computer. It opens files and hands back what it finds, and it never writes to them, uploads anything or phones home. The one connection it makes at all is to SnapBuddy itself on this machine's loopback address, to pass on a request for a new picture. Both of those are checked by the build (scripts/check-promises.mjs), not just claimed here - a host that is not loopback fails it.

But what it answers with goes to the assistant that asked. Your note, the page you were testing, and the console messages and request addresses captured from that page all reach that assistant - and most of them run in the cloud. The file never leaves your disk; the contents do. It is the same trade as pasting a bug report into a chat window, and it is worth knowing it is the trade.

If a capture contains something you would not paste into a chat, do not point an assistant at it.

Support answer, ready to paste

The MCP server reads captures you have saved to a folder, and it sends nothing off your computer. It can also ask SnapBuddy for a new screenshot, but only while you have that switched on in Settings, and a region capture opens the picker so the drag is yours. Whatever it answers with goes to the assistant you connected it to, which usually runs in the cloud - so treat it like pasting the capture into that assistant's chat window.