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 15 tools.
- Tools
- 15
- What they doRead · write · destructive
- 8 · 2 · 58 read2 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').
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). When provided, returns only calls handled by that user. 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: 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 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').
maxResultsnumber- Maximum number of messages to fetch (default: 100, max: 100). Only applies to single-contact queries (participantPhoneNumber set). Ignored for whole-inbox queries, which return up to 10 messages per contact across up to 50 contacts.default
100 pageTokenstring- Optional: token from previous response to fetch the next page of results. Can only be used with participantPhoneNumber (single-participant queries). For multi-participant aggregation, pagination is not supported.
participantPhoneNumberstring- Optional: specific participant phone number to filter conversations (E.164 format). REQUIRED when using pageToken for pagination.
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_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_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_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
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_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_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.
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.