MCP server
Projectrr runs a remote Model Context Protocol server at:
https://projectrr.work/mcp
Connect an assistant to it and it can read and write your boards — issues, projects, statuses, workflow rules, epics and their journals — acting as you, with your permissions. There is no API key to paste: the connection is authorised with OAuth in your browser.
Registering the server
Claude Code
claude mcp add --transport http projectrr https://projectrr.work/mcp
Run it once, then approve the sign-in when your browser opens. Add --scope user to make it available in every project rather than just the current one.
Claude Desktop, Cursor, and other mcp.json clients
Add the server to your client’s MCP config:
{
"mcpServers": {
"projectrr": {
"type": "http",
"url": "https://projectrr.work/mcp"
}
}
}
Restart the client, then approve the sign-in when it opens your browser.
Clients with a “custom connector” UI
Claude Desktop and Claude on the web can add a remote server from settings.
Choose Add custom connector, paste https://projectrr.work/mcp, and finish
the browser sign-in.
Checking it worked
Ask your assistant:
List my Projectrr organizations.
If it comes back with your organizations, the connection is live. You can also find these instructions, pre-filled for the server you’re signed in to, on your profile page.
How authorisation works
The server implements OAuth 2.1. When your client first connects:
- It discovers the authorisation server from
/.well-known/oauth-authorization-server. - It registers itself and sends you to Projectrr to sign in.
- You approve the connection on a consent screen that names the client.
- The client receives a token and uses it on every request.
The token is tied to your user account, so the assistant sees exactly the organizations you’re a member of and nothing more. Every action it takes goes through the same permission checks as the web app, and shows up in the activity log attributed to you.
To disconnect, remove the server from your client (claude mcp remove projectrr,
or delete it from the client’s MCP config). Revoking a token from Projectrr’s
side isn’t built yet — until it is, disconnecting the client is how you end the
connection. Tokens are per user, so nothing an assistant holds outlives your own
access to an organization.
What the assistant can do
Around 90 tools, mirroring the CLI:
| Group | Tools |
|---|---|
| Orgs | org_list, org_members, org_invite, org_assignees, … |
| Products | product_list, product_create, product_update, … |
| Projects | project_list, project_overview, project_create, … |
| Issues | issue_list, my_issues, issue_view, issue_create, issue_update, issue_spec_get, issue_watch, … |
| Comments | comment_list, comment_create, comment_resolve, comment_reopen, comment_update, comment_delete |
| Epics | epic_view, epic_list, epic_create, epic_add_issues, epic_note_add, epic_note_resolve, … |
| Statuses | status_list, status_create, status_template, status_reorder, … |
| Rules | rule_list, rule_create, rule_update, rule_toggle, rule_log, … |
| Integrations | repo_link, release_sync, trello_connect, trello_import, … |
| Reading | attention, search, activity, report, report_completed |
Start with org_list to discover slugs, then product_list and
project_list. Issues are addressed either by UUID or by number plus
productSlug and projectSlug. org_list also reports your role in each
organization, so an assistant can tell before it tries whether a write is one
you’re allowed to make.
Things worth knowing before an assistant starts calling them:
orgis optional. Slug-addressed tools take anorgargument, needed only when the same product or project slug exists in more than one of your organizations — the API refuses to guess and asks to be told which.- Finished work is hidden by default.
issue_listandmy_issuesleave out anything in adoneorclosedstatus unless you passincludeClosed, which is why an assistant’s counts can differ from a board that is showing its finished columns.issue_listalso takesassigneeIdandcreatedByIdfilters — who is doing the work, and who raised it. Those are different people, and both differ from the owner, the accountable lead. See Core concepts. my_issuesis how “what’s assigned to me” gets answered. No other tool knows which user the token belongs to. Itsrelationargument picks which sense of “mine”:assigned(the default),createdfor what you raised, oreither.rule_updatereplaces, it doesn’t merge. Theactionsandconditionsyou send become the rule’s whole set, so read it withrule_listfirst and re-send everything you want to keep. Same shape asrule_create.comment_createwrites a comment a person will see. It lands in the thread on the issue page in the web app, subscribes the author, emails the issue’s watchers, and posts a copy to the issue’s linked Trello card if it has one.comment_updatechecks permission but not authorship, so an assistant acting as a developer or member can edit anyone’s comment;comment_deleteneeds owner or admin. See Core concepts.- A comment has a kind, and
blockeris how an agent says it is stuck.comment_createtakes the same kinds an epic note does —comment(the default),update,decision,blocker,context,risk— andparentCommentIdto reply to an existing one. Ablockerorriskstays open untilcomment_resolvecloses it, which is what puts the issue on the organization dashboard’s Needs attention panel next to blocked epics.comment_listtakeskindandopenOnlyto read only what’s outstanding, and reportsopenBlockersandopenRisksfor the whole issue whatever the filter. blockedByrecords what a blocker is waiting on.comment_create,comment_update,epic_note_addandepic_note_updatetake ablockedByarray; each entry sets exactly one ofissueId,epicIdorurl(with an optionallabel). They come back on reads already resolved to the target’s title and current status, so an assistant can tell whether the thing in the way has since been finished. The array replaces the note’s existing list, so send every link you want to keep, and referenced issues and epics must be in the same organization. See Epics.attentionanswers “what is stuck”. One call, naming anorg, returns every epic and issue in that organization carrying an unresolved blocker or risk — the same list as the dashboard panel, so an assistant can read it instead of walking every project. Rows come back worst first (most open blockers, then most open risks) and each one says what it is, which product and project it’s in, and how many blockers and risks are open, so the follow-up is anissue_vieworepic_view. Each row also carriesblockers— what its open items are waiting on, already resolved to titles and statuses, deduped and capped at four with the remainder inmoreBlockers— so “what is holding this up” is answerable without a second call. It counts only unresolved, root-level blockers and risks, and leaves out finished work —doneorcancelledepics, and issues in adoneorclosedstatus.limitcaps the list (1–50, default 10), so treat a full page as “the worst ten”, not “all of them”.
Working with epics
This is the part worth setting up deliberately. Projectrr tells connected assistants to:
- Call
epic_viewbefore working on anything that belongs to an epic, so they start from the decisions already made instead of re-deriving them - Call
epic_note_addafterwards to record what they did or decided, so the next session — yours or theirs — picks up the same context - Resolve blockers with
epic_note_resolveand a body explaining how, rather than editing or deleting the original note
The result is a project journal that survives across sessions and across the line between you and your agents. See Epics.
The same applies one level down: comment_create with kind: "blocker" is how
an agent records that a single issue is stuck, and comment_resolve with a body
is how it comes back off the dashboard. The resolution is appended to the thread
as a reply, so the original still reads as what it was at the time.
attention is the other end of that loop: what agents record as blocked is what
comes back when you ask one “show me everything blocked in Greengage”.
Troubleshooting
The browser never opens, or sign-in loops. Check that your client supports remote HTTP MCP servers with OAuth. Older clients that only speak stdio need a bridge.
Tools are listed but every call fails with 401. The token expired or was revoked. Remove and re-add the server to trigger a fresh sign-in.
The assistant can’t see an organization. MCP identity is per user — you only see what your own account can see. Check your membership in the web app.
Scripting instead
If you want automation rather than a conversation, use the CLI. In CI,
set PRR_API_KEY and skip signing in altogether.