You can connect Upfirst to AI assistants like Claude, ChatGPT, Cursor, Codex, and others. Once it's connected, you can ask your assistant for information about your calls, or ask it to make changes to your account, without opening the Upfirst dashboard.
Using Claude or ChatGPT? Just add Upfirst from the directory, then sign in to Upfirst and approve access:
Claude: add the Upfirst connector
ChatGPT: add the Upfirst plugin
Using Cursor, VS Code, Codex, or another assistant? Connect it using our MCP server. The steps for each one are under How to connect below.
MCP stands for Model Context Protocol. It's an open standard that lets AI assistants connect to outside tools. You don't need to know anything about it to use Upfirst with your assistant. Your assistant handles the technical part.
There is nothing to install and no API key to create. The first time your assistant connects, it opens the Upfirst sign-in page. You approve access once, and the connection stays bound to your organization from then on.
What you can do with it
Your assistant gets 25 tools. Some read your account and some change it. Together they cover six areas:
Calls. Read your call history, the details of a single call, and full transcripts.
Account and receptionists. See an overview of your whole account, and read or change a receptionist's greeting, goodbye, voice tone, speech rate, hold music, and spam blocking.
Scheduled greetings. Read, add, edit, and delete greetings that play only at certain hours or on certain dates, like an after-hours or holiday greeting.
Skills. Create, edit, and switch off the actions a receptionist takes on a call: texting a caller, texting a scheduling link, and transferring the call.
Knowledge. Read, add, edit, and delete the training your receptionist answers callers from.
Custom actions. Read, add, edit, and delete the calls your receptionist makes to other apps and services.
Examples of what to ask
What you want | What to ask |
Call volume | "How many calls did we get this week?" |
Common questions | "What are the most common questions people ask on calls?" |
Read a call | "Read me the transcript of the call from Tuesday afternoon." |
Find specific calls | "Show me every call last month where someone asked about pricing." |
Update training | "Update my receptionist's knowledge about our pricing." |
Change transfer rules | "Adjust my call transfer rules so I don't get transfers on weekends." |
Change the greeting | "Change my greeting to mention that we're closed for the holidays." |
Add a text message | "Text callers our address when they ask where we're located." |
After-hours greeting | "Use a different greeting after 5pm and on weekends." |
Set up from scratch | "Set up a receptionist for a two-person plumbing company in Miami." |
You don't need to know the tool names. Ask in plain language and your assistant picks the right tool.
How to connect
The setup is different for each assistant. Pick yours below. Whichever you use, the first call opens Upfirst's sign-in page, and you approve access once.
1. Claude (desktop app and claude.ai)
Upfirst is in Claude's connector directory. Open the Upfirst connector in the Claude directory, add Upfirst, then sign in to Upfirst and approve access.
On Claude Team and Enterprise plans, an owner adds the connector once under Organization settings. Everyone else just clicks Connect.
2. ChatGPT
Upfirst is in ChatGPT's plugin directory. Open the Upfirst plugin page in ChatGPT, add it, then sign in to Upfirst and approve access.
3. Claude Code
Run claude mcp add --transport http upfirst https://mcp.upfirst.ai in your terminal. That adds it to the current project. Add --scope user to make it available everywhere. Then run /mcp inside Claude Code and sign in.
4. Cursor
Add this to ~/.cursor/mcp.json:
{ "mcpServers": { "upfirst": { "url": "https://mcp.upfirst.ai" } }}
Use .cursor/mcp.json inside a project instead to scope it to that project. Cursor prompts you to sign in the first time it calls the server.
5. VS Code
Add this to .vscode/mcp.json:
{ "servers": { "upfirst": { "type": "http", "url": "https://mcp.upfirst.ai" } }}
Start the server from the play button in the config file, then use it from Copilot's agent mode. Sign in when prompted.
6. Codex
Add this to ~/.codex/config.toml:
[mcp_servers.upfirst]url = "https://mcp.upfirst.ai"
Then run codex mcp login upfirst to authorize.
7. Any other assistant
Any client that supports remote MCP servers over HTTP will work. Point it at https://mcp.upfirst.ai as a streamable HTTP server. It handles the sign-in on the first call.
The full list of tools
Every tool carries a tag for what it does to your data. Read fetches data and never changes anything. Write creates or updates a record. Delete permanently removes a record, with no undo.
Account and receptionists
Tool | Type | What it does |
get_account_overview | Read | A snapshot of the whole account: business name, every receptionist with its timezone, greeting, phone numbers, skills and knowledge, and how many calls were handled in the last 30 days. Test and archived calls aren't counted. |
list_agents | Read | Lists your receptionists with their ids. |
get_agent_by_id | Read | One receptionist's full settings: greeting and goodbye messages, voice tone, speech rate, hold music, timezone, spam and toll-free blocking, and attached phone numbers. |
update_agent | Write | Changes a receptionist's greeting, goodbye, voice tone (friendly or professional), speech rate (0.7 to 1.2), hold music (ring tone, gentle guitar, marimba, or soft keys), spam blocking, and toll-free blocking. Only the fields you send change. |
Voice, timezone, and language are managed on the dashboard and can't be changed here. Spam blocking and toll-free blocking apply to your whole organization. Changing either one changes it for every active receptionist, the same as the dashboard.
Scheduled greetings
A scheduled greeting is what your receptionist says first on calls that come in during certain hours or on certain dates. When no scheduled greeting matches the time of the call, the receptionist uses its default greeting. The default greeting is changed with update_agent.
Tool | Type | What it does |
list_agent_greetings | Read | Lists a receptionist's scheduled greetings with their text, hours, dates, and on/off state. Switched-off greetings are included. |
create_agent_greeting | Write | Adds a greeting for certain hours or dates. You give the words to say, or an instruction for how to greet, and when it applies. |
update_agent_greeting | Write | Changes a scheduled greeting's text, schedule, or on/off state. |
delete_agent_greeting | Delete | Permanently deletes a scheduled greeting. Calls in its time slot go back to another matching greeting, or to the default greeting. |
A schedule has weekly hours and optional exact dates. A date wins over the weekly hours for that day, which is how you set a holiday greeting. Times use the receptionist's timezone.
Two active greetings can't cover the same time. If a new schedule overlaps another active greeting on the same receptionist, the change is rejected and nothing is saved.
Changing a schedule replaces it whole. Your assistant reads the greeting first and sends back the full schedule you want it to have.
Skills
A skill is an action a receptionist can take on a call. Each kind has its own tools, so the settings you pass are always the ones that kind uses.
Tool | Type | What it does |
list_agent_skills | Read | Lists the skills set up for a receptionist, including switched-off ones. Can be filtered to one kind: sendSms, sendScheduleSms, transferCall, scheduleSlot, or customWebhook. |
create_sms_skill | Write | Adds a texting skill. sendSms texts your message as written. sendScheduleSms texts it along with your scheduling link. You set the message (up to 306 characters) and an instruction for when to send it. |
update_sms_skill | Write | Changes a texting skill's name, message, instruction, kind, or on/off state. |
delete_sms_skill | Delete | Permanently deletes a texting skill from every receptionist that has it. They stop sending that message within minutes. |
create_transfer_call_skill | Write | Adds a call transfer rule. You set the condition for when to transfer, what the receptionist says first, and one or more destination numbers tried in order. |
update_transfer_call_skill | Write | Changes a transfer rule, including its destinations and its schedule. |
Transfer rule options. When you create or edit a transfer rule, your assistant can also set:
Ring time per destination, from 5 to 60 seconds. Default is 30.
What happens on no answer: end the call (default) or return the caller to the receptionist.
Transfer method: cold (default) hands the caller over directly, warm briefs the person first.
Caller ID the destination sees: your Upfirst number (default) or the caller's number.
Recording: stop recording at the transfer (default) or keep recording the full call.
Schedule: the weekly hours the transfer is offered. This is how you stop weekend transfers.
Every destination number must be in the same country as one of the Upfirst numbers of the receptionists that have the rule, and must be in full international format, like +12025550123. Options you don't set use the same defaults as the dashboard, so a rule created through your assistant behaves exactly like one built in the UI.
There is no tool for deleting a transfer rule. That's done on the Upfirst dashboard. Through your assistant you can switch one off instead, which stops the transfer while keeping the rule set up.
Scheduling skills are read-only here, because they depend on calendar setup that lives on the dashboard. Webhook skills are custom actions, so your assistant changes them with the custom action tools below.
Knowledge
Your receptionist's knowledge is what it answers callers from. In the Upfirst dashboard these entries live under Training.
Tool | Type | What it does |
get_agent_knowledge | Read | Reads a receptionist's training. Every entry comes back whole with its full content, never a preview. Can return one entry by id. |
create_agent_knowledge | Write | Adds a text entry, up to 250,000 characters, to one or more receptionists. New entries go to the top of the list. |
update_agent_knowledge | Write | Changes an entry's name, content, on/off state, schedule, or which receptionists use it. |
delete_agent_knowledge | Delete | Permanently deletes an entry. |
Editing replaces the whole entry. Content is never appended. Your assistant reads the entry first and sends back the full text you want it to have, including the parts you're keeping. If you ask it to add one line to your pricing entry, it will rewrite the entry with that line included.
One entry can serve several receptionists. Editing or deleting it changes what every receptionist that uses it says.
Changes retrain the receptionist automatically and take effect within minutes. There is no publish step.
Importing knowledge by scanning a website URL is dashboard-only. New entries created through your assistant are always plain text.
Custom actions
A custom action lets your receptionist reach another app or service over the web. It can run before a call starts, during the conversation, or after the call ends. For example, it can look something up in your system while the caller is on the line, or send the call details somewhere once the call is over.
Tool | Type | What it does |
list_custom_actions | Read | Every custom action a receptionist can use, with its full setup: the web address it calls, when it runs, how it signs in, and what it reads back. Passwords and keys in headers come back hidden. |
create_custom_action | Write | Adds a custom action and chooses which receptionists get it. You describe what it does, when it runs, and the address it calls. |
update_custom_action | Write | Changes a custom action, including which receptionists get it. |
delete_custom_action | Delete | Permanently deletes a custom action. Every receptionist that had it stops calling that service. |
It runs when you tell it to. A before action runs as the call starts. A during action is offered to the receptionist, which calls it when the caller needs what it does. An after action runs once the call ends, every time or only when a rule you write in plain language is true.
Editing replaces lists whole. Your assistant reads the action first, so the settings you are keeping stay in place.
Signing in to another app (an OAuth connection) is set up on the dashboard. Once a connection exists, your assistant can use it in a custom action.
Calls
Tool | Type | What it does |
list_calls | Read | Lists and filters your call history, newest first. Returns compact rows: caller, time, duration, outcome, tags, linked contact, and the number of turns in the transcript. |
get_call_by_id | Read | Full details of one call: timing, outcome, caller and receptionist numbers, the AI-written summary, information collected from the caller, which skills the receptionist used and when each fired, tags, and your team's comments. |
get_call_transcript | Read | The conversation text of one call, as ordered turns stamped with an [mm:ss] offset and the speaker. |
How you can filter calls:
Outcome. Every call has exactly one: test, blocked, spam, hung up, or completed.
Free-text search across call summaries and transcripts.
Tags. Match calls carrying any of the tags you name.
Date range. A plain date like 2026-08-28 means that calendar day in your business timezone.
Archived calls. Archived calls are excluded unless you ask for them specifically.
Transcript speakers are Agent (your AI receptionist), Caller (the person who dialed), and Transferee (a person the call was handed to).
Business hours schedules
A schedule restricts a knowledge entry or a transfer rule to certain hours, using each receptionist's own timezone. Each weekday is switched on or off, with one or more time windows.
Outside its windows, a scheduled knowledge entry behaves as if it doesn't exist, so your receptionist never answers from it at the wrong time. This makes schedules a dependable way to handle facts that change with the clock. To make open and closed hours foolproof, add one entry restricted to your open hours that says "We are currently open," and a second restricted to your closed hours that says "We are currently closed." Only one is ever active, so the receptionist can't mix them up.
Schedules are honored on calls for transfer skills and knowledge entries. Other skill kinds can store one but ignore it.
Rules that apply to everything
Ids come from list tools. Your assistant looks these up on its own. You never need to find an id yourself.
Skills, knowledge, and custom actions can belong to several receptionists. When your assistant creates one, it chooses which receptionists get it. It can also give it to every receptionist you add later. Editing or deleting it changes it for all of them.
Long lists come back in pages. Knowledge, call history, and transcripts return a total count, so your assistant knows how much more there is.
Dates use your business timezone unless a precise timestamp is given.
Deletes are permanent. There is no restore over this connection. A deleted greeting, skill, knowledge entry, or custom action is gone from every receptionist that had it, and they stop using it within minutes. Getting it back means creating it again from scratch.
Only finished calls appear. A call shows up shortly after it ends.
What you can't do over MCP
These stay in the Upfirst dashboard:
Changing a receptionist's voice, timezone, or language
Creating or editing scheduling skills
Setting up OAuth connections for custom actions
Deleting a call transfer rule (you can switch it off instead)
Importing knowledge by scanning a website URL
Billing, phone numbers, team members, and notification settings
Security and access
There are no API keys. Authorization is a standard OAuth 2.1 sign-in. Nothing to copy, paste, or store.
Your assistant reaches only the organization you signed in as. Every tool is scoped to that organization, and records from any other one are never accessible.
It can read and change things. Within your organization, your assistant can read calls and transcripts and change receptionist settings, skills, training, and custom actions, and choose which receptionists each one applies to. Treat the connection the way you would treat being signed in to the dashboard.
Call recordings are not sent. Your assistant can read summaries and transcripts, not the audio.
You can disconnect the server in your assistant's settings at any time.
Troubleshooting
A call I just took isn't showing up. Only finished calls appear, and a call shows up shortly after it ends. Calls in progress aren't available until they hang up. If a call is still missing, check whether it was archived, since archived calls are excluded by default.
My assistant says a skill wasn't found. A skill's kind is fixed when it's created. Asking to edit a scheduling or webhook skill with the texting or transfer tools reads as not found. Scheduling skills are dashboard-only, and webhook skills are edited with the custom action tools.
My text message was rejected. SMS messages pass a content filter that rejects promotional or otherwise restricted wording. Rewrite it as a plain informational message.
A transfer destination was rejected. Every destination must be in the same country as one of the Upfirst numbers of the receptionists that have the rule, and must be written in full international format, like +12025550123.
My knowledge edit removed something. Editing replaces an entry's content entirely. Ask your assistant to read the entry first, then make the change, so nothing is dropped.
I want to start answering calls with Upfirst. We give you a phone number. You can hand that number out directly, but most businesses forward calls to it from the line they already use. You choose how much to forward: every call, only the ones you miss, or, depending on your phone or carrier, only during certain hours. See our call forwarding guide for your provider.
Full technical reference
Every tool, every setting, and every option is documented at upfirst.ai/docs/mcp.
