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
claude mcp add --transport http shutterbug https://shutterbug.dev/api/mcpThen /mcp in Claude Code and follow the sign-in, or:
claude mcp login shutterbugThe tackle prompt pulls one report in as the next task, screenshot
included:
/mcp__shutterbug__tackle clipsync 4Cursor
Add to Cursor,
or put this in .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
| Tool | What it does |
|---|---|
list_projects | Every project in every workspace you are in, with its address and counts of to do and done. |
list_reports | Reports 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_report | One report with the note, the picked element, failing requests, console tail, clicks, triage fields, the trail, and the screenshot as an image. |
set_status | Move 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_note | Note 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_pr | Link 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.