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
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.
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: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 theAuthorization 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 athttps://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 A redirect URI is an
client_id and client_secret form fields.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
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 IDsgetContextlists. 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,assignedUserandusertake 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,-3moor-1y. - Pages. Searches and the timeline return
nextCursor. Pass it back ascursorfor the next page. Searches also returntotalon the first page, exact up to 10,000, andlimit: 0returns the total alone. - Results. Every tool returns text for the model.
getContext, the searches,getTimelineandcreatePersonalso returnstructuredContentfor code that reads the result. - Sync. Reads cover only the entities an account syncs.
getContextshows which, and itslastInboundSyncCompletedAtis 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 CRMcreatePerson
Create a Person (Contact) in a CRM Create a person (contact) in a CRM, optionally with a first note. Search withsearchPeople first: when the CRM already has the person, it returns that person instead of creating another.
stageandassignedUsertake 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:
getContextshows each account’srequirements.people.create, whoseunsupportedlists the fields the account refuses. A create that sends one gets an error. noteis 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 CRMgetContext
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.lastInboundSyncCompletedAtis 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: everyrequiredfield, at least one field of eachanyOfgroup, a field invaluesonly from its list, and no field inunsupported.requirements.<entity>.updateholds an update’s.users: the account’s CRM users, for the tools that take one.usersListedisallup to 50 users; past that it isowners, only those who own the account’s people, out ofuserCount. 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, forsearchPeople’sstage. 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, forsearchPeople’ssource.transactionStagesandtransactionSources: the same for the account’s transactions, forsearchTransactions. 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(fromsearchPeople),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. WithoutpersonIdorfrom, 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-specificdetails. A done task is placed when it was done, an open one when it is due. - Use
order: ascwithfromset to now for what is coming up, such as tasks due and appointments. - When
hasMoreis true, passnextCursorascursorfor 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,emailorphone: 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: 0returns the total alone; to count people by stage, call once per stage, taking the stages fromgetContext. - Each person comes with the
credentialIdit was found in. Pass its ID and credential ID to other tools, such ascreateNoteandcreateTask. - Each comes with its
assignedUserand itssource, where it came from. - Each comes with its
pond, if it waits in one.unassigned: truekeeps the people assigned to no user; the pond then tells a lead nobody holds from one waiting in a pond. - Each also comes with
lastHeardFromandlastContacted, whichnotContactedSinceandawaitingReplySincefilter by, andfirstContacted, whose time after the person was added is theirspeedToLeadSeconds. 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: truekeeps 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: 0returns the total alone; to count transactions by stage, call once per stage. - Each transaction comes with the
credentialIdit was found in, itsusers(the CRM users on it, such as its agents) and itspeople(the contacts on it, such as the buyer or seller), each with their roles where the app names them. stageandsourceare the transaction’s own, whichgetContextlists astransactionStagesandtransactionSources: not the stages people are in.- Accounts that don’t read transactions aren’t searched, and the answer names them.
Returns
structuredContent with: