The Quo MCP connector routes your AI agent's tool calls to Quo's own MCP server through Scalekit. Each user signs in to Quo once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 27 tools.
- Tools
- 27
- What they doRead · write · destructive
- 11 · 11 · 511 read11 write5 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Quo MCP connection
In AgentKit > Connections, create a Quo MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Quo MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'quomcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Quo MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'quomcp_list_contacts',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "quomcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Quo MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="quomcp_list_contacts",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolquomcp_fetch_call_transcriptsFetch call transcripts for a Quo inbox.Read-onlyFetch Call Transcripts
Fetch call transcripts for a Quo inbox. Requires the Quo Business plan and calls where transcription was enabled. Optionally filter by `userId` to return only calls handled by a specific team member (use `list-users` to look up user IDs). Each result row is `id | participant | direction | status | createdAt | duration | conversationId`; the leading `id` is the call's activity ID (AC…) — pass it to `create-task` as `activityId` to link a follow-up task to that specific call. When `participantPhoneNumber` is omitted, the tool aggregates across participants discovered from conversations, and the trailing `conversationId` (CN…) is populated for thread-level task linking. Set `createdAfter` to bound the window — the tool filters conversation discovery by that time server-side, so a call whose conversation is old but had recent activity is still found. Single-participant queries leave the `conversationId` column blank since the per-call `activityId` is already a precise link target. To page through additional results, use `participantPhoneNumber` + `pageToken` for a single participant, or `conversationPageToken` if you hit the conversation-discovery safety cap. Timezone: `createdAfter`/`createdBefore` are treated as UTC — pass ISO 8601 with a 'Z' suffix or an explicit offset — and every timestamp in results is UTC. When the user asks in relative terms (e.g. 'yesterday', 'this week'), scope the window to THEIR local timezone and convert to the matching UTC instants before calling; if you don't know their timezone, ask. Present returned times in the user's local timezone. When showing a phone number to the user, render it as a click-to-call link, e.g. [(555) 555-5555](tel:+15555555555). Pass the bare E.164 value (not a tel: URI) into tool parameters.
Inputs
inboxPhoneNumberstringrequired- Your Quo inbox number or phone-number ID to find transcripts for (E.164 like '+15555555555', or a PN... ID). Use list-inboxes to discover available numbers.
conversationPageTokenstring- Optional: token to fetch older conversations when doing multi-participant discovery. Use this if the response shows 'More conversations available'. Only used when participantPhoneNumber is NOT specified.
createdAfterstring- Optional: filter calls created after this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z').
createdBeforestring- Optional: filter calls created before this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z').
excludeDoneConversationsboolean- Optional, whole-inbox queries only: set true to exclude conversations currently marked done or snoozed. Leave false or omit it to include all conversations. Specific-contact queries always return that contact's full transcript history regardless of this value. If the user asks for open, active, outstanding, or inbox conversations and it is unclear whether done conversations should be included, ask before setting this.default
false maxResultsnumber- Maximum number of calls to fetch transcripts for (default: 100, max: 100 when using pagination)default
100 pageTokenstring- Optional: token from previous response to fetch the next page of results. Can only be used with participantPhoneNumber (single-participant queries). Not supported when fetching across all participants.
participantPhoneNumberstring- Optional: specific participant phone number to filter conversations (E.164 format). REQUIRED when using pageToken for pagination.
userIdstring- Optional: filter calls by a specific team member's user ID (US⦠format). Matches the user who answered an incoming call or placed an outgoing one; calls handled by an AI agent match no user. Note this covers transcribed calls only, so it is not a complete record of a team member's call activity â use Quo Analytics for reporting on call volume or answer rates. Use `list-users` to look up user IDs.
quomcp_fetch_messagesFetch message history for a Quo inbox.Read-onlyFetch Messages
Fetch message history for a Quo inbox. Two modes: • Single contact (`participantPhoneNumber` set) — DEPTH: returns that contact's full message history, most-recent-first, with pagination via `pageToken` (up to 100 per page). Each message is `id | participant | direction | timestamp` followed by the text; the leading `id` is the message's activity ID (AC…) — pass it to `create-task` as `activityId`. A message with MMS attachments is followed by one indented `media: <mime-type> <url>` line per attachment; text-only messages have none. A message may carry both text and attachments — when it does, the body is the text and the media lines follow it. ALWAYS pass the attachment URL through to the user as a clickable markdown link (e.g. [image/png](https://example.com/image.png)); stating that an attachment exists without giving its URL is not useful, since the user cannot open a link they were not shown. Never shorten, truncate, or omit the URL. When an attachment arrives with no accompanying text the body shows `(no text)`; describe that to the user as a photo or file, not as an empty message. • Whole inbox (`participantPhoneNumber` omitted) — BREADTH: returns the most-recent messages for EVERY contact active in the window, grouped by contact (up to 10 messages each, up to 50 contacts), so a daily-summary query never silently drops a contact. Each contact's conversation ID (CN…) is on its header for `create-task` linking. A contact with more than 10 in-window messages is flagged (`[more than 10 …]`) — re-query that contact with `participantPhoneNumber` for the full thread. If more than 50 contacts were active, an `[incomplete: …]` line reports how many were left out; narrow the date range or query specific contacts. `maxResults` is ignored in this mode. Set `createdAfter` to bound the window — the tool filters conversation discovery by that time server-side, so a contact with a recent message is found even when their conversation is old. Without `createdAfter`, discovery falls back to the most recent conversations. Timezone: `createdAfter`/`createdBefore` are treated as UTC — pass ISO 8601 with a 'Z' suffix or an explicit offset — and every timestamp in results is UTC. When the user asks in relative terms (e.g. 'yesterday', 'this week'), scope the window to THEIR local timezone and convert to the matching UTC instants before calling; if you don't know their timezone, ask. Present returned times in the user's local timezone. When showing a phone number to the user, render it as a click-to-call link, e.g. [(555) 555-5555](tel:+15555555555). Pass the bare E.164 value (not a tel: URI) into tool parameters.
Inputs
inboxPhoneNumberstringrequired- Your Quo inbox number or phone-number ID to fetch messages for (E.164 like '+15555555555', or a PN... ID). Use list-inboxes to discover available numbers.
conversationPageTokenstring- Optional, whole-inbox queries only: the `[next_conversations: â¦]` token from a previous whole-inbox response, to continue where it stopped. Pass the same other parameters as that call.
createdAfterstring- Optional: filter messages created after this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z').
createdBeforestring- Optional: filter messages created before this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z').
excludeDoneConversationsboolean- Optional, whole-inbox queries only: set true to exclude conversations currently marked done or snoozed. Leave false or omit it to include all conversations. Single-thread queries always return the thread's full history regardless of this value. If the user asks for open, active, outstanding, or inbox conversations and it is unclear whether done conversations should be included, ask before setting this.default
false maxResultsnumber- Maximum number of messages to fetch (default: 100, max: 100). Only applies to single-thread queries (participantPhoneNumber or participantPhoneNumbers set). Ignored for whole-inbox queries, which return up to 10 messages per conversation.default
100 pageTokenstring- Optional: token from previous response to fetch the next page of results. Can only be used with participantPhoneNumber or participantPhoneNumbers (single-thread queries). Whole-inbox queries continue with conversationPageToken instead.
participantPhoneNumberstring- Optional: one contact's phone number (E.164), returning your 1:1 thread with them. For a group thread use participantPhoneNumbers instead. One of the two is REQUIRED when using pageToken.
participantPhoneNumbersarray- Optional: the COMPLETE member list of a group thread (E.164, up to 10), excluding the inbox you are querying. Quo matches a thread by its exact participant set, so include every other member â omitting or adding one returns a different thread or none. Whole-inbox results list each group's members on its header. Do not combine with participantPhoneNumber.
userIdstring- Optional: filter to messages sent by a specific team member's user ID (US⦠format). Incoming messages are excluded when this filter is set, since the API does not associate them with a sender user ID. Use `list-users` to look up user IDs.
quomcp_fetch_missed_callsFetch missed incoming calls for a Quo inbox, each enriched with the voicemail the caller left (transcript + recording URL) when there is one.Read-onlyFetch Missed Calls
Fetch missed incoming calls for a Quo inbox, each enriched with the voicemail the caller left (transcript + recording URL) when there is one. Only returns incoming calls whose status is 'missed', 'no-answer', or 'abandoned' — this filter is fixed and cannot be changed or broadened. Use it for questions like 'what calls did I miss yesterday?' or 'any voicemails this week?'. Each result is a row `id | status | direction | participants | createdAt | duration | conversationId`; the leading `id` is the call's activity ID (AC…) — pass it to `create-task` as `activityId` to link a follow-up task to that specific call. The trailing `conversationId` (CN…) is for thread-level task linking and is populated only when discovering across multiple participants (single-participant queries leave it blank since the per-call `activityId` is already precise). Rows whose call has a voicemail are followed by an indented voicemail block (status, duration, recordingUrl, transcript). Voicemails are processed asynchronously — a voicemail with status 'in-progress' has null duration/transcript/recordingUrl, so retry in a few seconds. Missed calls where the caller hung up without leaving a message are still listed, just marked '(no voicemail)'. When `participantPhoneNumber` is omitted, the tool aggregates calls across all participants active in your `createdAfter` window — the tool filters conversation discovery by that time server-side, so a missed call whose conversation is old but had recent activity is still found. Without `createdAfter`, discovery falls back to the most recent conversations. For exhaustive single-contact pulls, use `participantPhoneNumber` + `pageToken`; if you hit the conversation-discovery safety cap, use `conversationPageToken` to continue. Timezone: `createdAfter`/`createdBefore` are treated as UTC — pass ISO 8601 with a 'Z' suffix or an explicit offset — and every timestamp in results is UTC. When the user asks in relative terms (e.g. 'yesterday', 'this week'), scope the window to THEIR local timezone and convert to the matching UTC instants before calling; if you don't know their timezone, ask. Present returned times in the user's local timezone. When showing a phone number to the user, render it as a click-to-call link, e.g. [(555) 555-5555](tel:+15555555555). Pass the bare E.164 value (not a tel: URI) into tool parameters.
Inputs
inboxPhoneNumberstringrequired- Your Quo inbox number or phone-number ID to list calls for (E.164 like '+15555555555', or a PN... ID). Use list-inboxes to discover available numbers.
conversationPageTokenstring- Optional: token to fetch older conversations when doing multi-participant discovery. Use this if the response shows 'More conversations available'. Only used when participantPhoneNumber is NOT specified.
createdAfterstring- Optional: filter calls created after this ISO 8601 datetime with offset (e.g. '2026-05-19T00:00:00Z').
createdBeforestring- Optional: filter calls created before this ISO 8601 datetime with offset (e.g. '2026-05-20T00:00:00Z').
maxResultsnumber- Maximum number of calls to return after filtering (default: 100, max: 100 when using pagination).default
100 pageTokenstring- Optional: token from previous response to fetch the next page of results. Can only be used with participantPhoneNumber (single-participant queries). Not supported when fetching across all participants.
participantPhoneNumberstring- Optional: specific other-party phone number to filter calls (E.164 format). REQUIRED when using pageToken for pagination.
quomcp_get_agent_conversationGet a Sona SMS conversation started with start-agent-conversation: its status, why it failed or ended, and, once the agent has summarized it, its title, summary and collected data.Read-onlyGet Agent Conversation
Get a Sona SMS conversation started with start-agent-conversation: its status, why it failed or ended, and, once the agent has summarized it, its title, summary and collected data. It can run for minutes or hours, so check back every few minutes rather than polling rapidly, until the status is final (completed, failed or canceled). A failed one sent no texts; its failure reason says why. `completed` does not mean the task succeeded, so read the summary. Use fetch-messages to read the texts themselves.
Inputs
agentConversationIdstringrequired- The agent conversation ID returned by start-agent-conversation (starts with AR).
quomcp_get_contactFetch a single Quo contact by ID, including its default fields (name, company, role, email, phone) and any custom fields configured on the workspace.Read-onlyGet Contact
Fetch a single Quo contact by ID, including its default fields (name, company, role, email, phone) and any custom fields configured on the workspace. Use `list-contacts` first if you need to discover contact IDs. When showing a phone number to the user, render it as a click-to-call link, e.g. [(555) 555-5555](tel:+15555555555). Pass the bare E.164 value (not a tel: URI) into tool parameters.
Inputs
contactIdstringrequired- The Quo contact ID to retrieve.
quomcp_get_inbox_settingsGet a Quo inbox's settings: its name, its business hours (whether they are enforced, the timezone, and each day's open window) and its call recording (whether calls are recorded automatically, and how callers are told a call may be recorded, for inbound and outbound calls).Read-onlyGet Inbox Settings
Get a Quo inbox's settings: its name, its business hours (whether they are enforced, the timezone, and each day's open window) and its call recording (whether calls are recorded automatically, and how callers are told a call may be recorded, for inbound and outbound calls). Read these before changing anything with update-inbox-settings, so you can tell the user what will change. Use list-inboxes to find the inbox. When showing a phone number to the user, render it as a click-to-call link, e.g. [(555) 555-5555](tel:+15555555555). Pass the bare E.164 value (not a tel: URI) into tool parameters.
Inputs
inboxstringrequired- The inbox: its number in E.164 (e.g. '+15555555555'), its phone-number ID (PNâ¦), or a recognizable local format. Use list-inboxes to discover inboxes.
quomcp_list_contact_notesList the notes on a Quo contact.Read-onlyList Contact Notes
List the notes on a Quo contact. Each note is a row `id | createdAt | updatedAt | authorId` followed by its text, indented; a note with attachments is followed by one indented `media: <mime-type> <url>` line per attachment. `authorId` is the Quo user (USâ¦) who wrote the note â use `list-users` to show their name. Pass a note's `id` to `update-contact-note` to change it. Use `list-contacts` or `get-contact` to find the contact ID. Supports pagination via `pageToken` (1â50 results per page).
Inputs
contactIdstringrequired- The Quo contact ID whose notes to list.
maxResultsinteger- Maximum notes to return per page (1-50, default 10).default
10 pageTokenstring- Optional: token from a previous response to fetch the next page.
quomcp_list_contactsList contacts in the Quo workspace, optionally filtered by `externalIds` or `sources`.Read-onlyList Contacts
List contacts in the Quo workspace, optionally filtered by `externalIds` or `sources`. Returns a compact pipe-separated table (id | name | company | role | email | phone) and supports pagination via `pageToken` (1–50 results per page). When showing a phone number to the user, render it as a click-to-call link, e.g. [(555) 555-5555](tel:+15555555555). Pass the bare E.164 value (not a tel: URI) into tool parameters.
Inputs
externalIdsarray- Optional: filter by a list of external identifiers from an external system.
maxResultsinteger- Maximum contacts to return per page (1-50, default 10).default
10 pageTokenstring- Optional: token from a previous response to fetch the next page.
sourcesarray- Optional: filter by contact source (origin/creation method).
quomcp_list_inboxesList the phone numbers (inboxes) available in the Quo workspace, including assigned users.Read-onlyList Inboxes
List the phone numbers (inboxes) available in the Quo workspace, including assigned users. Use this first to discover the correct `from` number for `send-message` or the `inboxPhoneNumber` for `fetch-messages` / `fetch-call-transcripts`. When showing a phone number to the user, render it as a click-to-call link, e.g. [(555) 555-5555](tel:+15555555555). Pass the bare E.164 value (not a tel: URI) into tool parameters.
Inputs
userIdstring- Optional: filter inboxes by a specific Quo user ID (US... format).
quomcp_list_tasksList tasks in the Quo workspace.Read-onlyList Tasks
List tasks in the Quo workspace. Returns compact rows with task ID, status, title, due date, assignee, linked phone number/conversation/activity, creation time, and revision. Supports pagination via `pageToken` (1-100 results per page).
Inputs
maxResultsinteger- Maximum tasks to return per page (1-100, default 50).default
50 pageTokenstring- Optional: token from a previous response to fetch the next page.
quomcp_list_usersList the users (members) in the Quo workspace.Read-onlyList Users
List the users (members) in the Quo workspace. Returns each user's ID, name, email, and role. Use the returned `id` (US… format) to filter other tools like `list-inboxes` by user. Supports pagination via `pageToken` (1–50 results per page, max 50).
Inputs
maxResultsinteger- Maximum users to return per page (1–50, default 10).default
10 pageTokenstring- Optional: token from a previous response to fetch the next page.
quomcp_ask_knowledge_agentTalk to Sona, your Quo agent that knows your business.WriteAsk Knowledge Agent
Talk to Sona, your Quo agent that knows your business. Sona keeps the workspace's business knowledge: the one document every Quo AI agent in the workspace, including the one that answers new leads, reads to know what the business does, its services and prices, hours, service area, policies and FAQs. Use this tool whenever the user wants to check or change what Quo's AI agents know about their business, or gives feedback on how an agent described it (e.g. "we don't open on Sundays anymore", "the agent quoted the wrong price for a haircut", "add our new gift cards"). Sona asks follow-up questions and keeps the knowledge to business information only, about one business, in the standard sections, with no invented prices or policies. It saves nothing until the user approves its draft. Only workspace admins and owners can use it. One conversation spans several calls, and each call does exactly one of these: - Start: message, and no interviewId. Opens a NEW conversation and returns its interviewId. Start once per topic. - Send: interviewId and message. Sends the user's next message in that conversation. Pass the same interviewId on every follow-up; leaving it out starts a second conversation. - Get: interviewId, and no message. With the messageId from a response that said Sona is still working, gets that turn (never resend the message instead); without one, gets the conversation's latest turn. Never make up an interviewId or messageId: copy them from this tool's responses. Sona leads the conversation. Relay Sona's messages to the user verbatim, pass on only what the user actually said, and never answer Sona's questions or invent business details yourself. When Sona proposes a draft, Quo shows the user the draft and its new or changed prices and policies and saves only if they approve; where Quo cannot ask them directly, this returns the draft and a toolCallId for decide-knowledge-save. Sona's tools are in beta: tell the user so if they ask, or when a result falls short of what they expected. When the user comments on how Sona or this tool performed (for example, Sona misunderstood, missed the goal or sounded unnatural), offer to send it to the Quo team with submit-feedback, including the ID of the Sona run or knowledge interview so the team can find it. Corrections to the business's own details, such as a wrong price or outdated hours, go to ask-knowledge-agent instead.
Inputs
interviewIdstring- The conversation's ID, returned when it started. Omit it only to start a NEW conversation. On every later call in the same conversation, pass exactly this value.
messagestring- What the user said, passed on verbatim, at most 5,000 characters: their opening request when starting (e.g. 'Update our hours: we now open at 8am'), or their answer to Sona when sending. Omit it only to get a turn.
messageIdstring- Only when a response said Sona is still working: the messageId from that response. Pass it with interviewId and no message to get that turn.
quomcp_cancel_agent_conversationStop a Sona SMS conversation started with start-agent-conversation.WriteCancel Agent Conversation
Stop a Sona SMS conversation started with start-agent-conversation. Sona stops texting; texts already sent stay sent. One that already ended is returned unchanged.
Inputs
agentConversationIdstringrequired- The agent conversation ID returned by start-agent-conversation (starts with AR).
quomcp_create_contactCreate a new contact in the Quo workspace.WriteCreate Contact
Create a new contact in the Quo workspace. Returns the new contact ID and a compact pipe-separated row that can be chained into `update-contact` or `get-contact`. Only `firstName` is required; all other fields are optional.
Inputs
firstNamestringrequired- Contact's first name (required)
companystring- Contact's company name
customFieldsarray- Custom fields to set. Make the best key match from the user's request; an invalid custom-field response returns exact keys, names, and types for a retry.
emailstring- Contact's email address, RFC-5322 format (e.g., 'jane@example.com')
lastNamestring- Contact's last name
phoneNumberstring- Contact's phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported.
rolestring- Contact's role or title
quomcp_create_contact_noteAdd a note to a Quo contact â for example a call summary, a follow-up reminder, or context for teammates.WriteCreate Contact Note
Add a note to a Quo contact â for example a call summary, a follow-up reminder, or context for teammates. Adding a note does not send anything to the contact. Text is 1â2000 characters. To mention a teammate, write `@` followed by their user ID from `list-users` (e.g. `@USabc123 can you follow up?`); Quo turns it into a mention. Returns the new note ID, which `update-contact-note` takes. Use `list-contacts` or `get-contact` to find the contact ID.
Inputs
contactIdstringrequired- The Quo contact ID to add the note to.
textstringrequired- The note text (1-2000 characters).
quomcp_create_taskCreate a task in Quo linked to exactly one inbox, conversation, or conversation activity.WriteCreate Task
Create a task in Quo linked to exactly one inbox, conversation, or conversation activity. Pick the most specific link target available: if a fetch result row gives you an AC… activity ID (a specific call or message), prefer `activityId` — it ties the task to exactly what the user is referring to. Use `conversationId` (CN…) when the user means the whole thread with a contact (also from fetch-* results). Use `inboxPhoneNumber` (E.164 or PN… ID, from list-inboxes) only when the task isn't about any specific call/message/thread.
Inputs
descriptionstringrequired- The task description.
titlestringrequired- The task title.
activityIdstring- Create the task linked to a Quo activity ID (AC... format). Provide exactly one of inboxPhoneNumber, conversationId, or activityId.
assignedTostring- Optional Quo user ID to assign the task to (US... format).
conversationIdstring- Create the task linked to a Quo conversation ID (CN... format), as returned by fetch-messages / fetch-call-transcripts / fetch-missed-calls. Provide exactly one of inboxPhoneNumber, conversationId, or activityId.
dueDatestring- Optional due date as ISO 8601 datetime with timezone (e.g. '2024-01-01T00:00:00Z').
inboxPhoneNumberstring- Create the task under a Quo inbox: E.164 number (e.g. '+15555555555') or PN... ID. Use list-inboxes to discover available numbers. Provide exactly one of inboxPhoneNumber, conversationId, or activityId.
quomcp_decide_knowledge_saveApprove or decline the knowledge draft Sona proposed in an ask-knowledge-agent conversation.WriteDecide Knowledge Save
Approve or decline the knowledge draft Sona proposed in an ask-knowledge-agent conversation. Before approving, show the user the full draft and its new or changed prices and policies, and get their explicit go-ahead. Sona leads the conversation. Relay Sona's messages to the user verbatim, pass on only what the user actually said, and never answer Sona's questions or invent business details yourself. Declining saves nothing, and the conversation continues.
Inputs
approvedbooleanrequired- true to publish the draft, false to decline it.
interviewIdstringrequired- The conversation's interviewId, from ask-knowledge-agent.
toolCallIdstringrequired- The draft's toolCallId, from the interview turn that proposed it.
userConfirmedboolean- Set true only after the user saw the draft and explicitly approved publishing it in the chat. Never infer it.
quomcp_mark_conversationsMark one or more Quo conversations as read, done or open, the same as in the Quo app, without sending a message.WriteMark Conversations
Mark one or more Quo conversations as read, done or open, the same as in the Quo app, without sending a message. `read` clears the unread indicator. `done` takes a conversation out of the inbox (it stays searchable, and fetch tools can exclude done conversations with `excludeDoneConversations`). `open` returns a done conversation to the inbox. Pass up to 50 conversation IDs per call; all get the same `markAs`. Each conversation succeeds or fails on its own, and the result lists both. Marking is safe to repeat, so retry failed IDs by calling again with just those. Conversation IDs (CNâ¦) come from the `conversationId` column of fetch-messages (whole-inbox results), fetch-call-transcripts or fetch-missed-calls. Only mark the conversations the user asked about; don't sweep an inbox on your own initiative.
Inputs
conversationIdsarrayrequired- 1â50 conversation IDs (CNâ¦), from the conversationId column of fetch-messages, fetch-call-transcripts or fetch-missed-calls. Duplicates are marked once.
markAsstringrequired- read: clear the unread indicator. done: take the conversations out of the inbox. open: return done conversations to the inbox.one of
readdoneopen
quomcp_start_agent_conversationHand an SMS conversation to Sona, Quo's AI agent, to get something done with one real person through back-and-forth texting.WriteStart Agent Conversation
Hand an SMS conversation to Sona, Quo's AI agent, to get something done with one real person through back-and-forth texting. Sona texts as the user's business: it writes the first text itself, reads each reply, and keeps replying on its own until the goal is reached, the person replies STOP, someone on the user's team replies in the conversation (which takes over from Sona straight away), or it is canceled. Use this when the user wants Sona to handle a conversation, not just send a text, e.g. 'have Sona confirm Jane's appointment', 'get Mike to pick a delivery day', 'follow up with this lead and answer their questions'. To send one text the user wrote or dictated, or a one-way notice that needs no handling of replies, use send-message instead. Sona already knows the business (its services, prices, hours and policies), so the task only needs what is specific to this conversation. Before starting, make sure the goal and the details it needs are clear; if not, ask targeted questions rather than guessing. Restate what Sona will do and confirm the from number, the person to text and the task with the user: texts cannot be unsent, and Quo may also ask the user to confirm. Every request needs an idempotencyKey; reuse it for every retry of the same task. This returns an agent conversation ID straight away: check it with get-agent-conversation in a few minutes, read the texts with fetch-messages, and stop it with cancel-agent-conversation. Sona's tools are in beta: tell the user so if they ask, or when a result falls short of what they expected. When the user comments on how Sona or this tool performed (for example, Sona misunderstood, missed the goal or sounded unnatural), offer to send it to the Quo team with submit-feedback, including the ID of the Sona run or knowledge interview so the team can find it. Corrections to the business's own details, such as a wrong price or outdated hours, go to ask-knowledge-agent instead.
Inputs
fromstringrequired- The user's Quo number to text from. Accepts E.164 (e.g. '+15551234567'), a phone-number ID, or a recognizable local format. The user must be a member of it â use list-inboxes to discover available numbers.
idempotencyKeystringrequired- Identifies this one agent conversation so it is never started twice. Make one up the first time you try to start it: a short description plus the number being texted and a few random characters (e.g. 'delivery-day-15555555555-x7k2'). Then send exactly the same key every time you call this tool for that same conversation: after the userConfirmed prompt, after an error or timeout, or whenever you are unsure whether it started. Use a new key only when the user wants a different task or another conversation with the same number.
taskstringrequired- What Sona should get done in this conversation, written as an instruction to Sona: the goal, what counts as done, and anything specific to this person or situation (who they are, what was already agreed, dates, times and timezone, and what to do if the plan doesn't work for them). Sona already knows the business (services, prices, hours, policies), so don't repeat that. Do include what it can't know, such as what was said in an earlier call or text; fetch-messages and fetch-call-transcripts can help. Resolve missing or ambiguous details with the user first; never invent them. E.g. 'Jane can't make her Saturday 11am appointment. Offer Tuesday 2pm, Thursday 10am or Friday 4pm (America/Toronto), confirm the one she picks and answer her questions; if none work, ask which days suit her and don't book anything.'
tostringrequired- The number the AI agent texts, in E.164 format (e.g. '+15551234567').
userConfirmedboolean- Set true only after the user explicitly confirmed this conversation (from number, number to text and task) in the chat. Never infer it.
quomcp_submit_feedbackSubmit feedback from the user to the Quo product team about what would make Quo or their experience better.WriteSubmit Feedback
Submit feedback from the user to the Quo product team about what would make Quo or their experience better. Ask for more details before use if the feedback is ambiguous or unclear. Proactively offer to submit feedback only when the user is trying to do something with their Quo phone line or communications that is not supported, or comments on how one of Sona's beta tools performed; do not solicit feedback otherwise. Only share what the user shared, preserving their main point and relevant context.
Inputs
contentstringrequired- The user's feedback for the Quo product team. Preserve their main point and relevant context; do not invent details.
quomcp_update_contact_noteReplace the text of an existing note on a Quo contact.WriteUpdate Contact Note
Replace the text of an existing note on a Quo contact. The new `text` replaces the note's entire text, so to add to a note, pass its current text plus the addition â use `list-contact-notes` to read the current text and find the note ID. Text is 1â2000 characters. To mention a teammate, write `@` followed by their user ID from `list-users` (e.g. `@USabc123 can you follow up?`); Quo turns it into a mention.
Inputs
contactIdstringrequired- The Quo contact ID the note belongs to.
noteIdstringrequired- The note ID to update, as returned by list-contact-notes.
textstringrequired- The note's new full text (1-2000 characters). Replaces the existing text.
quomcp_update_inbox_settingsChange a Quo inbox's settings: its name, its business hours, and its call recording.WriteUpdate Inbox Settings
Change a Quo inbox's settings: its name, its business hours, and its call recording. Pass only what should change; everything left out keeps its current value. Only the inbox's owners and the workspace's admins can change these. Business hours: `enabled` turns enforcement on or off (it has no effect until the inbox has a schedule), `timezone` is the IANA timezone the schedule is read in, and `schedule` sets the open window for the days you name, in local time as 24-hour HHMM (9am and 5:30pm are also accepted, but a time without am/pm is read as 24-hour, so write 5:30pm, not 5:30); a day set to null is closed, a day you leave out keeps its window, `{ start: '0000', end: '0000' }` is open all day, and `schedule: null` removes the schedule so business hours stop being enforced. Call recording: `autoRecord` records every call on the inbox (the workspace's plan must include it), and `callDisclosure` sets how inbound and outbound callers are told the call may be recorded. Recording disclosure can be a legal requirement where the user operates, so never turn it off unless the user asks. These changes take effect on live calls right away: call get-inbox-settings first, tell the user exactly what will change, and confirm it with them. Quo may also ask the user to confirm directly. Use list-inboxes to find the inbox. When showing a phone number to the user, render it as a click-to-call link, e.g. [(555) 555-5555](tel:+15555555555). Pass the bare E.164 value (not a tel: URI) into tool parameters.
Inputs
inboxstringrequired- The inbox to change: its number in E.164 (e.g. '+15555555555'), its phone-number ID (PNâ¦), or a recognizable local format. Use list-inboxes to discover inboxes.
autoRecordboolean- true to record every call on this inbox automatically, false to stop. Turning it on fails when the workspace's plan does not include automatic call recording.
businessHoursobject- Business hours to change. A field left out keeps its value.
callDisclosureobject- Recording-disclosure notices to change. A direction left out keeps its value.
namestring- A new display name for the inbox (1â500 characters).
userConfirmedboolean- Set true only after the user explicitly confirmed these exact changes to this inbox in the conversation. Never infer it.
quomcp_send_bulk_messagesSend SMS to up to 40 recipients as SEPARATE individual (1:1) messages — a broadcast.DestructiveSend Bulk Messages
Send SMS to up to 40 recipients as SEPARATE individual (1:1) messages — a broadcast. Two modes: for the SAME text to everyone, pass `to` (2–40 numbers) + `content`; to personalize per recipient, pass `messages` as [{to, content}] instead. Provide one mode or the other, never both. Prefer `to` + `content` when the text is identical — it guarantees everyone receives exactly the same message. Each recipient gets their own private thread and does NOT see the other recipients; replies come back individually. Use this for announcements or blasts. This is different from send-group-message, which puts everyone in ONE shared thread that exposes their numbers to each other — use that only when recipients should see one another. For a single recipient use send-message. Sends cannot be undone. The `from` number must belong to the user's Quo workspace — use `list-inboxes` to discover available numbers. Recipients must be valid phone numbers in E.164 format (international supported).
Inputs
fromstringrequired- Your Quo number to send from. Accepts E.164 (e.g. '+15551234567'), a phone-number ID, or a recognizable local format. Must belong to your Quo workspace — use list-inboxes to discover available numbers.
contentstring- SAME-MESSAGE mode. The single message body, sent identically to every recipient in `to`. REQUIRED together with `to`, unless you are using `messages` instead. Omit this entirely when using `messages` — supplying both modes is an error.
messagesarray- PERSONALIZED mode. One entry per recipient (2–40), each with its own `to` and `content` — e.g. [{"to": "+15551234567", "content": "Hi John, you're confirmed for 2pm"}, {"to": "+15559876543", "content": "Hi Sarah, you're confirmed for 3pm"}]. REQUIRED unless you are using `to` + `content` instead. Use this ONLY when the text differs per recipient; if everyone gets the same text, use `to` + `content`, which guarantees an identical message. Each recipient still receives a SEPARATE private message and cannot see the others. A phone number may appear only once. Omit this entirely when using `to` + `content` — supplying both modes is an error.
toarray- SAME-MESSAGE mode. The recipients' phone numbers (2–40), each in E.164 format (e.g. '+15551234567'). REQUIRED together with `content`, unless you are using `messages` instead. Each recipient receives a SEPARATE private message and cannot see the others. Omit this entirely when using `messages` — supplying both modes is an error. For one shared group thread, use send-group-message instead.
quomcp_send_group_messageSend a single SMS group message from a Quo inbox to 2–10 recipients in one shared thread.DestructiveSend Group Message
Send a single SMS group message from a Quo inbox to 2–10 recipients in one shared thread. IMPORTANT: this creates a group conversation — every recipient can see all the other recipients' phone numbers and all replies, and it cannot be undone once sent. Use `send-message` instead when you want to text one person, or to text several people privately without exposing them to each other (call `send-message` once per recipient). The `from` number must belong to the user's Quo workspace — use `list-inboxes` to discover available numbers. Recipients must be valid phone numbers in E.164 format (international supported).
Inputs
contentstringrequired- The message content
fromstringrequired- Your Quo number to send from. Accepts E.164 (e.g. '+15551234567'), a phone-number ID, or a recognizable local format. Must belong to your Quo workspace — use list-inboxes to discover available numbers.
toarrayrequired- The recipients' phone numbers (2–10), each in E.164 format (e.g. '+15551234567'). All recipients share one thread and can see each other. For a single recipient, use send-message instead.
quomcp_send_messageSend an SMS text message from a Quo inbox to a single recipient.DestructiveSend Message
Send an SMS text message from a Quo inbox to a single recipient. The `from` number must belong to the user's Quo workspace — use `list-inboxes` to discover available numbers. Recipient must be a valid phone number in E.164 format (international supported).
Inputs
contentstringrequired- The message content
fromstringrequired- Your Quo number to send from. Accepts E.164 (e.g. '+15551234567'), a phone-number ID, or a recognizable local format. Must belong to your Quo workspace — use list-inboxes to discover available numbers.
tostringrequired- The recipient's phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported.
quomcp_update_contactUpdate fields on an existing Quo contact.DestructiveUpdate Contact
Update fields on an existing Quo contact. Omit fields you want to leave unchanged; pass `null` for any field you want to clear. Use `get-contact` first if you need to inspect current values before updating.
- Idempotent
Inputs
contactIdstringrequired- The Quo contact ID to update
companystring- Updated company name. Set to null to remove.
customFieldsarray- Custom fields to set. Make the best key match from the user's request; an invalid custom-field response returns exact keys, names, and types for a retry.
emailstring- Updated email address, RFC-5322 format (e.g., 'jane@example.com'). Set to null to remove.
firstNamestring- Updated first name. Set to null to remove.
lastNamestring- Updated last name. Set to null to remove.
phoneNumberstring- Updated phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported. Set to null to remove.
rolestring- Updated role/title. Set to null to remove.
quomcp_update_taskUpdate a Quo task.DestructiveUpdate Task
Update a Quo task. Performs exactly one change per call, selected by which parameter is provided: title/description (counted as one change), assignToUserId, unassignUserId, dueDate, removeDueDate, completed (true marks the task done, false reopens it), linkConversationId, or unlinkConversationId. To make several changes, call this tool once per change.
- Idempotent
Inputs
taskIdstringrequired- The Quo task ID to update (TK... format).
assignToUserIdstring- Optional Quo user ID (US... format) to assign to the task.
completedboolean- Set to true to mark the task as completed, or false to reopen a completed task.
descriptionstring- Optional new task description.
dueDatestring- Optional due date as ISO 8601 datetime with timezone (e.g. '2024-01-01T00:00:00Z').
linkConversationIdstring- Optional conversation ID (CN... format) to link to the task, as returned by fetch-messages / fetch-call-transcripts / fetch-missed-calls.
removeDueDateboolean- Set to true to clear the task due date.default
false titlestring- Optional new task title.
unassignUserIdstring- Optional Quo user ID (US... format) to unassign from the task.
unlinkConversationIdstring- Optional conversation ID (CN... format) to unlink from the task.
No tools match.