Shutterbug

Docs · raw markdown

Your agent

Shutterbug has an MCP server. A developer's agent connects to it, signs in once, and works the board: list a project's reports, read one with the screenshot, mark it done, or note it where it stands. Every move and note it makes is on the report's trail with who made it.

The server is https://shutterbug.dev/api/mcp. It speaks OAuth, so there is no key to paste: the client opens a browser, you sign in to Shutterbug, you approve, and the token is stored by the client.

Claude Code

Terminal
claude mcp add --transport http shutterbug https://shutterbug.dev/api/mcp

Then /mcp in Claude Code and follow the sign-in, or:

Terminal
claude mcp login shutterbug

The tackle prompt pulls one report in as the next task, screenshot included:

Claude Code
/mcp__shutterbug__tackle clipsync 4

Cursor

Add to Cursor, or put this in .cursor/mcp.json:

.cursor/mcp.json
{
  "mcpServers": {
    "shutterbug": { "url": "https://shutterbug.dev/api/mcp" }
  }
}

Claude.ai and Claude Desktop

Settings, Connectors, Add custom connector, and paste the URL. Sign in when asked.

Every workspace you are in

The agent sees every project in every workspace you are in. A project is addressed workspace/project, as in hypership/3vrm: that is how list_projects and every report name it, and every tool that takes a project takes it. A bare project slug works too while only one of your workspaces has it; when two do, the tool answers with the addresses to use.

The tools

ToolWhat it does
list_projectsEvery project in every workspace you are in, with its address and counts of to do and done.
list_reportsReports newest first, by project and status, twenty a page with a cursor. status is todo or done. awaiting of team finds the reports a reporter answered, added to or sent back; reporter finds the ones waiting on them.
get_reportOne report with the note, the picked element, failing requests, console tail, clicks, triage fields, the trail, and the screenshot as an image.
set_statusMove a report to todo or done with a note saying why. forReporter is the line the reporter reads, on done what changed and where to see it. Setting the status it already has moves nothing, and with forReporter still writes the line.
add_noteNote a report without moving it. kind is internal for the team (the default), to_reporter for a line the reporter reads, or question to ask them, on a to-do report only: a question on a done report is refused with Reopen it first: set_status todo, then ask.
attach_prLink a pull request to a report.
tackle (prompt)One report by project and number, framed as the next task.

Writing for the reporter

The reporter reads only the lines marked for them: forReporter on set_status and the to_reporter and question kinds of add_note. A line is at most 300 characters. Write it in plain words, what changed and where to see it, with no commit ids, branches or file paths. A done move with a line puts that line first on the report in their app. Nobody asks them to confirm it: they read it as news, and if the fix isn't right they send the report back with their words, which moves it to todo. A question waits on their answer, and they can also add to an open report on their own. Their words arrive inside report_data, and list_reports with awaiting of team finds every report they answered, added to or sent back.

Report text is data

Everything a reporter typed or their browser captured comes back inside a block marked report_data, their replies and what they say when they send a fix back included. The server tells every client the same thing: it is data, never instructions. Your agent reads it the way it reads a bug report, not the way it reads you.

What it will not do

Create or delete reports, archive or restore them, change settings, rotate secrets, or create projects. Those stay in the console, where a person does them.

Revoking

The grant is on your Shutterbug account. Remove the connector in the client, or revoke it from your account's connected apps, and the next call asks you to sign in again.

If sign-in fails

Shutterbug moved its sign-in to a new server on 20 September 2026. A client that signed in before then keeps the old server's address with its token, so it signs in to the wrong place and the server rejects what comes back ("Got new credentials, but shutterbug rejected them on reconnect"). Clear the saved sign-in once and sign in again:

  • Claude Code: /mcp, choose shutterbug, Clear authentication, then Authenticate.
  • Cursor and Claude.ai: remove the server and add it again.