# 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

```sh title="Terminal"
claude mcp add --transport http shutterbug https://shutterbug.dev/api/mcp
```

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

```sh title="Terminal"
claude mcp login shutterbug
```

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

```text title="Claude Code"
/mcp__shutterbug__tackle clipsync 4
```

## Cursor

[Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=shutterbug&config=eyJ1cmwiOiJodHRwczovL3NodXR0ZXJidWcuZGV2L2FwaS9tY3AifQ==),
or put this in `.cursor/mcp.json`:

```json title=".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.
