Skip to main content

What is MCP?

The Model Context Protocol (MCP) is an open standard that lets AI assistants connect to external systems in a structured and secure way. A service exposes its data and operations as tools, which define the queries and actions an assistant can perform. With tools, an assistant can look up a user’s data and act in the business applications they use, which makes it possible to surface insights and automate multi-step workflows.

Rollout’s MCP server

Rollout’s MCP server gives an AI agent the data Rollout syncs from a user’s connected accounts, and lets it write back. The tools work on the same normalized model as the Universal API, so an agent reads and writes people, notes, tasks, transactions and activities the same way whichever CRM the user connected.
  • Server URL: https://mcp.rollout.com/mcp
  • Transport: Streamable HTTP
  • Authentication: OAuth 2.1, which any MCP client that supports remote servers can complete on its own, or a Rollout auth token sent as a Bearer token
Every request runs as one consumer: a user of a Rollout customer’s app, or a person’s own Rollout account. The tools see the accounts that consumer has connected. Read tools search every connected account at once; write tools act on one. The tool list itself is the same for everyone, so tools/list needs no token and answers with a public cache scope.

Tools

The tool reference below describes each tool’s inputs and results.

Use it from an MCP client

Anyone can connect Rollout’s MCP server to an MCP client that supports remote servers, such as Claude, ChatGPT, Cursor, VS Code or Claude Code. No Rollout account is needed up front.
1

Add the server

Add https://mcp.rollout.com/mcp as a remote MCP server (a “custom connector” or “integration” in most clients). The client discovers Rollout’s authorization server and registers itself. There is no client ID or secret to paste.
2

Sign in to Rollout

The client opens Rollout’s sign-in page. Enter your email address and the one-time code Rollout emails you. Signing in with a new address creates your Rollout account.
3

Connect your CRM

Pick the CRM accounts the client should work with and sign in to each one. At least one is needed to continue. The accounts stay in your Rollout account, and you can add more later.
4

Allow access

Review the accounts the client will work with, then allow access. Rollout sends you back to the client, which can now read and write those accounts on your behalf.
Manage what you have allowed at mcp.rollout.com: the apps linked to your account and their connections, and the clients with active access, each of which you can revoke. A client keeps its access until you revoke it, or until it has gone 30 days without using it.
Accounts connected this way live in your own Rollout account and aren’t visible to any Rollout customer’s app. Customers whose users should see the same accounts in the agent and in the app pass a consumer token when their users authorize the agent.

Build with Rollout’s MCP server

The rest of this guide is for Rollout customers building an agent. It assumes you have a Client ID and Client Secret. There are two ways to authenticate, depending on where your agent runs.

Call it from your backend with an auth token

Send the same auth token you send the Universal API, as a Bearer token on every request:
The server acts as the consumer the token’s sub names. The tools see the accounts that user connected through your app, and their writes go through that user’s credentials. There is nothing to register and nobody to sign in, which makes this the simplest option for an agent inside your product. Mint a fresh token per session or request, as you do for API calls.

Example with Claude

Claude’s Messages API connects to a remote MCP server for you. Pass the server and the token, and Claude calls Rollout’s tools as it answers.

Example with the MCP SDK

Any model that supports tool calling can use the tools through an MCP client. With the official TypeScript SDK, connect with the token in the Authorization header, hand the tool list to your model, and call the tools it picks:

Users without a connected account

A tool called for a user with no connected account answers with an error that says so and names your app, which the model relays. Have your users connect their accounts in your app with Rollout Link before the agent runs. The tools see a new connection right away.

Let users authorize your agent with OAuth

When your agent runs outside your backend’s session, users authorize it themselves on Rollout’s pages, and your agent gets tokens scoped to that user. Your Client ID is already an OAuth client of Rollout’s authorization server, and your Client Secret authenticates the token exchange. The authorization server follows OAuth 2.1: the authorization code grant with PKCE (S256), refresh tokens that rotate, and discovery documents at https://mcp.rollout.com/.well-known/oauth-authorization-server and https://mcp.rollout.com/.well-known/oauth-protected-resource. An MCP client library that implements the MCP authorization flow reads those and handles the redirect, the PKCE exchange and refreshes for you. You supply your Client ID and Client Secret, a registered redirect URI and, to tie the grant to your user, the consumer_token parameter described below.
1

Register your redirect URIs

Once, tell Rollout where to send users back. Authenticate with your Client ID and Client Secret, with HTTP Basic auth or as client_id and client_secret form fields.
A redirect URI is an https URL, a native app’s private scheme such as myagent://oauth/callback, or plain http on localhost. The call replaces the whole list. GET /oauth/client with the same credentials shows it.
2

Send the user to authorize

Open the authorization URL in the user’s browser:
consumer_token is optional, but it is what ties the grant to your app’s user: an auth token you mint for them, valid for at most an hour and usable once. With it, the agent works with the accounts the user already connected in your app, and anything they connect during authorization appears in your app too. Without it, the grant is for the user’s own Rollout account, separate from your app.The user signs in to Rollout with an emailed one-time code, connects or confirms the accounts the agent may use, and allows access. Rollout redirects to your redirect_uri with code and state, or with error=access_denied if they declined.
3

Exchange the code for tokens

Call the MCP server with Authorization: Bearer <access_token>. Access tokens last an hour. To refresh, post grant_type=refresh_token and refresh_token=... to the same endpoint with the same client authentication. Each refresh returns a new refresh token and retires the old one, and reusing a retired one revokes the whole grant. A refresh token expires 30 days after it was issued.
4

Revoke when done

Post token=... to https://mcp.rollout.com/oauth/revoke with your client authentication to revoke a token and everything issued with it. Users can also revoke any client from mcp.rollout.com.
A client under your Client ID always authenticates with your Client Secret, so run the token exchange from a backend you control. An agent that can’t keep a secret, such as a desktop app, can instead register itself at POST /oauth/register like any other MCP client. It then runs under Rollout’s own tenant rather than yours, and can’t take a consumer_token.

Tool reference

A few conventions apply to every tool:
  • Accounts. Every tool takes an optional credentialId, one of the IDs getContext lists. Read tools cover every connected account when it is left out. Write tools need it when the user has more than one, and the error lists them.
  • Names or IDs. stage, source, assignedUser and user take an ID or a name, and for users also an email, matched exactly ignoring case. When none or several match, the error lists the candidates.
  • Times. An ISO 8601 date or date-time, read in UTC unless it has an offset or ends in a time zone, such as 2026-10-15[America/New_York], or a time relative to now, such as -30m, -24h, -7d, +2w, -3mo or -1y.
  • Pages. Searches and the timeline return nextCursor. Pass it back as cursor for the next page. Searches also return total on the first page, exact up to 10,000, and limit: 0 returns the total alone.
  • Results. Every tool returns text for the model. getContext, the searches, getTimeline and createPerson also return structuredContent for code that reads the result.
  • Sync. Reads cover only the entities an account syncs. getContext shows which, and its lastInboundSyncCompletedAt is null until the first sync finishes.
  • Errors. A tool that can’t do what was asked answers with an error the model can act on: an account that can’t create notes, a stage that doesn’t exist, a field the CRM requires.

createNote

Create Note in a CRM Create a new note in a CRM

createPerson

Create a Person (Contact) in a CRM Create a person (contact) in a CRM, optionally with a first note. Search with searchPeople first: when the CRM already has the person, it returns that person instead of creating another.
  • stage and assignedUser take an ID or a name (a user also an email), matched exactly ignoring case. When none or several match, the error lists the candidates.
  • Some CRMs need more than a name, such as an email or a stage from a fixed list, and some refuse a field this tool takes: getContext shows each account’s requirements.people.create, whose unsupported lists the fields the account refuses. A create that sends one gets an error.
  • note is added to the person once it exists, also when the CRM returns one it already had.
Returns structuredContent with:

createTask

Create Task in a CRM Create a new task in a CRM

getContext

Get Context Read-only. Describe the connected accounts (credentials): each one’s app, sync state, what it can do and what its writes need. Call this before searching or writing.
  • lastInboundSyncCompletedAt is null until the first sync finishes; reads find little before then.
  • entitiesToSync.<entity>.enabled: reads cover only the entities that sync.
  • permissions.<entity>: whether the account can list, create, update and delete that entity (people also addTag and deleteTag).
  • requirements.<entity>.create: what a create needs beyond the tool’s own schema: every required field, at least one field of each anyOf group, a field in values only from its list, and no field in unsupported. requirements.<entity>.update holds an update’s.
  • users: the account’s CRM users, for the tools that take one. usersListed is all up to 50 users; past that it is owners, only those who own the account’s people, out of userCount. A tool takes any user by ID, full name or email, listed or not.
  • stages: the stages the account’s people are in, up to 100, in the CRM’s order where it has one, for searchPeople’s stage. Tags aren’t listed, as an account can have thousands; a tag no one has gets an error listing the closest ones.
  • sources: the sources the account’s people came from, such as lead portals and ad campaigns, up to 100 by name, for searchPeople’s source.
  • transactionStages and transactionSources: the same for the account’s transactions, for searchTransactions. Empty when the account can’t read transactions.
  • you: when a person is signed in, the account’s users with their email, listed or not, usually one: the user “me”, “my” and “I” mean. Empty when no user has it: ask the person which user they are.
Returns structuredContent with:

getTimeline

Get People’s or Users’ Timeline in a CRM Read-only. Read what happened with people, or what CRM users did, from the synced CRM data: notes, tasks, calls, text messages, emails, appointments and website events, in one list across types, people, users and accounts, newest first.
  • Pass personId (from searchPeople), user, or both. Each takes one, or a list of up to 25 whose items are read together: one call instead of one per person. Without personId or from, only the last 30 days up to now are read, except open or overdue tasks, which are read whenever they are due.
  • Each item has its time (occurredAt), the person and the user it belongs to, a title, a plain-text body cut to 1,000 characters, and type-specific details. A done task is placed when it was done, an open one when it is due.
  • Use order: asc with from set to now for what is coming up, such as tasks due and appointments.
  • When hasMore is true, pass nextCursor as cursor for the next page.
  • Types an account doesn’t sync can’t be read; the answer names them.
Returns structuredContent with:

logActivity

Log an Activity on a Person in a CRM Record something that already happened with a person in a CRM: a note, task, call, text message, email or event. This only records it. It never sends a text or email and never places a call. A CRM that can’t record a kind of activity returns an error.

searchPeople

Search People (Contacts) in a CRM Read-only. Find people (contacts) in the connected CRMs. A person has to match every filter given. Trashed or archived people are left out.
  • With name, email or phone: the best matches first, each with a relevance score from 0 to 1.
  • Without them: the matching people newest first, then those the CRM gives no creation time. With no filter at all, everyone.
  • The first page also has total: how many people match, exact up to 10,000. limit: 0 returns the total alone; to count people by stage, call once per stage, taking the stages from getContext.
  • Each person comes with the credentialId it was found in. Pass its ID and credential ID to other tools, such as createNote and createTask.
  • Each comes with its assignedUser and its source, where it came from.
  • Each comes with its pond, if it waits in one. unassigned: true keeps the people assigned to no user; the pond then tells a lead nobody holds from one waiting in a pond.
  • Each also comes with lastHeardFrom and lastContacted, which notContactedSince and awaitingReplySince filter by, and firstContacted, whose time after the person was added is their speedToLeadSeconds. Only the calls, texts and emails an account syncs count.
  • Each also comes with overdueTasks: how many of its tasks aren’t done and are past due, when the oldest was due and the users they are assigned to. hasOverdueTasks: true keeps the people with any.
Returns structuredContent with:

searchTransactions

Search Transactions (Deals) Read-only. Find transactions (deals, loops, opportunities) in the connected accounts: the matching ones newest first. A transaction has to match every filter given. With no filter at all, every one.
  • The first page also has total: how many transactions match, exact up to 10,000. limit: 0 returns the total alone; to count transactions by stage, call once per stage.
  • Each transaction comes with the credentialId it was found in, its users (the CRM users on it, such as its agents) and its people (the contacts on it, such as the buyer or seller), each with their roles where the app names them.
  • stage and source are the transaction’s own, which getContext lists as transactionStages and transactionSources: not the stages people are in.
  • Accounts that don’t read transactions aren’t searched, and the answer names them.
Returns structuredContent with: