MCP server
Rivets is an MCP server. Anything you can do with tasks in the app, an agent can do over MCP: list repositories, start a task, read what the agent did, commit, open a pull request, and merge. Every call acts as you, in one organization, with your repository access.
Endpoint
https://app.rivets.dev/api/mcp
- Transport: Streamable HTTP, stateless. Send one JSON-RPC request per
POST. There are no sessions. - Protocol version:
2025-06-18. Clients that still speak2025-03-26are also accepted. - Authentication: a bearer token on every request. There is no OAuth flow.
Create a token
- Open Settings › API tokens and choose Create token.
- Give it a name, for example
Claude Code on my laptop. - Choose its scopes.
- Choose when it expires: Never, In 30 days, In 90 days, or In a year. In the Mac and iOS apps, enter a number of days up to 365, or leave it empty for no expiry.
- Choose Create token.
The token starts with rvp_. It is shown once and stored hashed, so copy it immediately. The list shows each token as Active or Expired, with when it was last used. Revoke a token from the same list; it stops working immediately and leaves the list.
Members see and revoke only their own tokens. Organization owners see every member’s tokens and can revoke any of them.
A token is bound to one user and one organization. It cannot reach any other organization.
Scopes
| Scope | Label | Grants |
|---|---|---|
tasks:read |
Read tasks | List repositories, workers, and tasks; read task state, transcripts, changes, and files. |
tasks:write |
Run tasks | Create tasks and conversations, send messages, cancel, archive, and restore. |
git:write |
Git actions | Commit, push, open and merge pull requests, and discard changes. |
linear:read |
Read Linear | Search the organization’s Linear teams, projects, and issues, and link a task to an issue. |
linear:write |
Write to Linear | Create and update Linear issues, and comment on them. |
New tokens start with Read tasks and Run tasks selected. An agent only sees the tools its token’s scopes allow.
Connect a client
Claude Code
The token dialog prints this command, filled in with your token:
claude mcp add --transport http rivets https://app.rivets.dev/api/mcp --header "Authorization: Bearer rvp_..."
Codex
Put the token in an environment variable and point Codex at the endpoint:
export RIVETS_MCP_TOKEN=rvp_...
codex exec \
-c mcp_servers.rivets.url="https://app.rivets.dev/api/mcp" \
-c mcp_servers.rivets.bearer_token_env_var=RIVETS_MCP_TOKEN \
-- "list my Rivets tasks"
This keeps the token out of the command line, where other users on the machine could see it.
MCP Inspector
npx @modelcontextprotocol/inspector
Choose Streamable HTTP, enter the endpoint URL, and add an Authorization: Bearer rvp_... header.
Other clients
Any client that speaks Streamable HTTP works. Send the bearer header on every request.
Tools
Rivets has 30 tools. Personal tokens can reach 28 of them; the other two are reserved for Rivets’ own use. None take an organization argument: the token decides it. IDs are prefixed: repo_ for repositories, wt_ for tasks, chat_ for conversations. A ? marks an optional argument.
Tasks
| Tool | Scope | Arguments | What it does |
|---|---|---|---|
rivets_whoami |
none | none | The account, organization, and token in use, with the token’s scopes. |
rivets_list_repos |
tasks:read |
none | Repositories you can use in the organization, and whether each is connected through the GitHub App. |
rivets_list_workers |
tasks:read |
none | Workers, whether they are online, whether you can use them, and which agents each has ready. |
rivets_list_tasks |
tasks:read |
repoId?, status?, includeArchived?, limit? |
Tasks, newest first. Up to 100, 25 by default. |
rivets_get_task |
tasks:read |
worktreeId |
One task’s branch, status, conversations, and pull request. |
rivets_get_task_output |
tasks:read |
worktreeId? or chatId?, afterSeq?, limit? |
A condensed transcript. Pass the returned lastSeq back as afterSeq to read only what is new. |
rivets_list_changes |
tasks:read |
worktreeId, includeDiff?, paths? |
Changed files with line counts, optionally with diffs. Diffs are capped at 40 KB in total. |
rivets_read_file |
tasks:read |
worktreeId, path |
One file from a task’s checkout. Truncated past 40,000 characters. |
rivets_create_task |
tasks:write |
repoId, prompt, clientRequestId, provider?, baseBranch?, routing?, linearIssue? |
Start a task: worktree, branch, first conversation, and agent run in one call. |
rivets_create_chat |
tasks:write |
worktreeId, prompt, clientRequestId, title?, provider? |
Start another conversation in an existing task. It uses the task’s agent unless you name one. |
rivets_send_message |
tasks:write |
chatId, text |
Steer a running agent, or resume a finished one. |
rivets_cancel_task |
tasks:write |
chatId |
Stop the running agent. Work already written is kept. |
rivets_archive_task |
tasks:write |
worktreeId |
Archive a finished task. |
rivets_restore_task |
tasks:write |
worktreeId |
Restore an archived task while the worker still has its checkout. |
clientRequestId must be a new unique string for each real request. Sending the same one again returns the original task or conversation instead of creating a second one, so retries are safe.
Without provider, a new task runs on your agent defaults. Pass linearIssue: { id }, with an identifier such as ENG-123 or the issue’s ID, to link the task to a Linear issue. This needs the linear:read scope. The task shows the issue as its source, its Team discussion is connected to the issue, and the agent’s prompt starts with one line naming the issue. The issue’s description is not added, so put what the agent needs in your prompt.
Tasks that came from Linear can wait in awaiting_approval until a member approves them in Rivets. An agent cannot approve them or send them messages. See Linear.
Git and pull requests
| Tool | Scope | Arguments | What it does |
|---|---|---|---|
rivets_pr_workspace |
tasks:read |
worktreeId |
The saved pull request draft, git state, the linked pull request, and its checks and reviews. |
rivets_prepare_pr |
git:write |
worktreeId, baseBranch, generate, paths?, refresh?, providerId?, model?, templatePath?, inferCommitConvention? |
Capture exactly what will be published. With generate: true, also write a candidate title, description, and commit message. paths: [] prepares only what is already committed. |
rivets_save_pr_draft |
git:write |
worktreeId, expectedRevision, the draft’s title, body, base, draft state, and commit message |
Save the Rivets draft. Does not update GitHub. |
rivets_run_pr_action |
git:write |
worktreeId, operationId, action, preparationId, draftRevision |
Run commit, commit-push, push, create, sync-base, sync-upstream, continue-sync, or abort-sync. Retry with the same operationId and inputs. |
rivets_update_pr |
git:write |
worktreeId, operationId, draftRevision, expectedMetadataRevision |
Publish the saved draft’s title, description, base, and draft state to the existing pull request on GitHub. |
rivets_merge_pull_request |
git:write |
worktreeId, expectedHeadSha, method? |
Merge the revision you reviewed. Fails if new commits were pushed since. |
rivets_discard_changes |
git:write |
worktreeId, paths, confirm: true |
Permanently discard uncommitted changes to the named files. |
Unlike people in the app, agents have no Merge anyway: rivets_merge_pull_request always requires passing checks and a fully published task.
Linear
These use your organization’s existing Linear connection. If Linear is not connected, they return an error saying so.
| Tool | Scope | Arguments | What it does |
|---|---|---|---|
rivets_linear_list_teams |
linear:read |
cursor? |
Teams with their keys and workflow states. |
rivets_linear_list_projects |
linear:read |
query?, teamKey?, includeCompleted?, limit?, cursor? |
Find a project by name. |
rivets_linear_list_issues |
linear:read |
query?, teamKey?, project?, state?, stateType?, assignee?, label?, priority?, includeArchived?, limit?, cursor? |
Search issues. Only open issues unless you name a state. assignee: "me" resolves to your linked Linear account. |
rivets_linear_get_issue |
linear:read |
id |
One issue in full, with comments, attachments, parent, and sub-issues. |
rivets_linear_create_issue |
linear:write |
teamKey, title, description?, projectId?, priority?, labelIds?, assigneeId?, parentId? |
File a new issue. |
rivets_linear_update_issue |
linear:write |
id, title?, description?, stateName? or stateId?, assigneeId?, priority?, projectId?, labelIds? |
Change an issue’s title, description, state, assignee, priority, project, or labels. |
rivets_linear_create_comment |
linear:write |
issueId, body |
Comment on an issue as the Rivets app. |
Issue IDs accept an identifier such as ENG-123 or Linear’s ID. List tools return nextCursor when there are more results; pass it back as cursor.
Reserved tools
rivets_watch_task and rivets_unwatch_task are used internally by Rivets to be woken when a task finishes. They need a scope that personal tokens cannot carry, so they never appear in your token’s tool list.
Rate limits
| Limit | Applies to | When exceeded |
|---|---|---|
| 120 calls per minute | Each token | HTTP 429 with Retry-After |
| 20 task creations per hour | Each person’s MCP tokens in an organization | rivets_create_task returns a create_rate_limited error |
Errors
Authentication problems are HTTP errors: 401 for a missing, revoked, or expired token, 403 for a suspended account or removed membership. Tool failures, such as an offline worker or a missing scope, come back as tool results marked as errors, with a code and a readable message, so an agent can explain them and recover. Useful codes include worker_offline, worktree_archived, awaiting_approval, insufficient_scope, not_found, create_rate_limited, and linear_not_connected. A result over 60 KB comes back as result_too_large, asking the agent to narrow the request.
What MCP cannot do
MCP cannot manage API tokens, invite members, change organization settings, register workers, or open terminals. Those require signing in to Rivets. A leaked token can run and read tasks in one organization, but it cannot escalate beyond that.