MCP server
rollout has an MCP server, so AI assistants can work with your announcements: look them up, file backlog snippets for the changes you shipped, draft announcements and, if you allow it, publish them.
The server is at https://api.rollout.so/mcp. It speaks MCP’s Streamable HTTP transport with the
2026-07-28 protocol, which Claude Code, Codex and Claude.ai support. Clients that only know the
older 2025 protocol get an error naming the version they need.
Connect
Section titled “Connect”There are two ways in:
- An API key, for Claude Code, Codex and scripts. A key works in one project.
- Signing in, for connectors such as Claude.ai. You sign in with your rollout account, pick the workspace, and the assistant can do what your role allows, in every project.
With an API key
Section titled “With an API key”-
In the dashboard, open the project’s Settings → API access and create a key. Choose what it may do (read only; read and draft; or read, draft and publish) and when it expires (30 days, 90 days, 1 year or never). Only admins can create keys.
-
Add the server to your assistant, with the key as a Bearer token:
claude mcp add --transport http rollout https://api.rollout.so/mcp \ --header "Authorization: Bearer YOUR_API_KEY"In
~/.codex/config.toml, with the key in an environment variable:[mcp_servers.rollout] url = "https://api.rollout.so/mcp" bearer_token_env_var = "ROLLOUT_API_KEY" -
Ask for something, for example “Add backlog snippets for the pull requests I merged this week” or “Draft the October update from the backlog”.
Anything from another project answers “not found”. Revoking a key cuts off access within a minute; an expired key stops working on its expiry date.
By signing in (Claude.ai)
Section titled “By signing in (Claude.ai)”In Claude.ai, open Settings → Connectors → Add custom connector and enter
https://api.rollout.so/mcp. Claude opens rollout’s sign-in: sign in, pick the workspace, and allow
access. Viewers get the read tools; editors and admins can also draft and publish.
With an API key, tools work in the key’s project. Signed in, list_projects shows the projects
and the project tools take a projectId.
| Tool | Needs | What it does |
|---|---|---|
get_project / list_projects |
Read | The key’s project, or the workspace’s projects, with backlog size and announcement counts. |
list_announcements |
Read | Search and filter announcements (q, status, channel, audience, sort, order, limit). |
get_announcement |
Read | One announcement as Markdown: title, summary, intro, snippets with ids, channels, audience, status. |
list_backlog |
Read | Snippets waiting in the backlog, optionally by tag. |
preview_announcement |
Read | The rendered draft as Markdown and plain text, and the email subject and preview text. |
create_snippet |
Draft | Adds a snippet to the backlog, or to an announcement. |
update_snippet |
Draft | Changes a snippet’s title, tag or Markdown body. |
create_announcement |
Draft | Starts a draft with title, summary and intro. |
set_announcement_snippets |
Draft | Chooses and orders an announcement’s snippets; left-out ones return to the backlog. |
update_announcement |
Draft | Title, summary, intro, channels, email subject, preview text and list, audience rules. |
publish_announcement |
Publish | Publishes now, or schedules with publishAt. |
unpublish_announcement |
Publish | Takes an announcement out of the feed and changelog. |
sync_email |
Publish | Writes the announcement into its Loops draft now. Nothing is sent. |
send_test_email |
Publish | Sends a test of the Loops draft to up to 5 addresses. |
create_snippet and create_announcement take an optional idempotencyKey: a retried call with
the same key (for 7 days) returns the first result instead of creating a duplicate. Use a pull
request or commit id.
Publishing
Section titled “Publishing”Assistants can only publish in projects where an admin has turned on Let assistants publish (Settings → API access), and only with a key that has publish access or as an editor or admin.
Publishing always takes two calls. Without confirm, publish_announcement and
unpublish_announcement change nothing and describe what would happen: the channels, the audience,
the email. The assistant shows that to you and calls again with confirm: true once you agree.
Email is never sent by rollout: it updates the campaign draft in Loops, and a person sends it
there.
Resources and prompts
Section titled “Resources and prompts”- Resources:
rollout://announcements/{id}androllout://snippets/{id}as Markdown, for assistants that attach documents as context. - Prompt
release-notes-from-changes: give it a list of merged pull requests or commits; it files one snippet per user-facing change, skips internal ones, and uses each change’s id as the idempotency key. - Prompt
polish-announcement: proposes clearer wording for an announcement and applies it once you agree.
Example: a snippet for every merged pull request
Section titled “Example: a snippet for every merged pull request”This GitHub Actions workflow runs Claude Code
when a pull request is merged and files a backlog snippet if the change is user-facing. Add a
Read and draft key as the ROLLOUT_API_KEY secret, and your ANTHROPIC_API_KEY.
name: Release noteson: pull_request: types: [closed]
jobs: snippet: if: github.event.pull_request.merged runs-on: ubuntu-latest steps: - name: Configure rollout MCP run: | cat > /tmp/rollout-mcp.json << EOF {"mcpServers": {"rollout": {"type": "http", "url": "https://api.rollout.so/mcp", "headers": {"Authorization": "Bearer ${{ secrets.ROLLOUT_API_KEY }}"}}}} EOF - uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} claude_args: | --mcp-config /tmp/rollout-mcp.json --allowedTools mcp__rollout__list_backlog,mcp__rollout__create_snippet prompt: | Pull request #${{ github.event.pull_request.number }} was merged: "${{ github.event.pull_request.title }}"
${{ github.event.pull_request.body }}
If customers would notice this change, file one rollout backlog snippet for it with create_snippet: a short plain-language title, tag new, improved or fixed, a 1–3 sentence Markdown body, and idempotencyKey "pr-${{ github.event.pull_request.number }}". Check list_backlog first. If it is an internal change, do nothing.Limits
Section titled “Limits”Requests share the public API’s rate limit (300 a minute per key or person). Everything an assistant changes is recorded in the workspace’s audit log under its key or the signed-in person.