LeaderboardBack to leaderboard — loading return destination
Opening report…
Loading report overview
M
MCP server
server.example.com/mcp
Tools and resources for your MCP client, with a public quality report and detailed checks.
Protocol
MCP 2025-11-25
Server version
1.0.0
Website
server.example.com
Supports
Tools · Resources
Overall score
90 /100
How is this score calculated?
Server metadata
Loading server metadata
Reviewed90/100
Discoverability
Loading discoverability
Reviewed90/100
Protocol
Loading protocol
Reviewed90/100
Tools
Loading tools
Reviewed90/100
MCP Apps
Loading mcp apps
Reviewed90/100
Tool documentation quality
Loading tool documentation quality
Reviewed90/100
LeaderboardBack to leaderboard — loading return destination
Q
Quo
mcp.quo.com/mcp
Quo is a next-generation business phone system that helps teams engage customers, collaborate internally, and scale communication with AI — without losing the personal touch. Connecting Quo gives Claude access to your customer conversations across calls, text messages, and contacts. You can ask questions about those interactions to uncover patterns in what customers are saying and where opportunities may be lost. Claude can search, analyze, and summarize conversations to surface insights like Why are we losing deals? What do customers love about our service? What complaints show up most often?
Quo returns every phone number in E.164 form (e.g. +15555555555), which is already a valid `tel:` URI body.
When you show the user a phone number they might want to call — a contact, a missed caller, one of their inboxes — render it as a click-to-call markdown link, e.g. [(555) 555-5555](tel:+15555555555). Use a human-readable label and keep the raw E.164 string inside the tel: URI (no spaces, punctuation, or extensions). If a client doesn't render tel: links, the label still reads as a normal phone number, so prefer the link.
Never put a tel: URI into a Quo tool parameter. Parameters that take a phone number (`inboxPhoneNumber`, `participantPhoneNumber`, `to`, `from`, `phoneNumber`) always take the bare E.164 string.
Discoverability
3/6 passed3 of 6 passed50/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
How to fix: Set the top-level tool.title to a short human-readable label (for example, "Search catalog"). Claude directory submission requires tool titles; annotations.title remains accepted only as a legacy fallback.
Add a human-readable title so users do not have to interpret the tool identifier.
Description97/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxResults
Maximum users to return per page (1–50, default 10).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pageToken
Optional: token from a previous response to fetch the next page.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-users",
"description": "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).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"pageToken": {
"type": "string",
"description": "Optional: token from a previous response to fetch the next page."
},
"maxResults": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum users to return per page (1–50, default 10)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description92/100
Send one SMS text, exactly as written, from a Quo inbox to a single recipient, right now. Use it when the user wants a specific message sent (they wrote or dictated it, or asked you to draft one) or a one-way notice such as a reminder, an address or a confirmation. It does not watch for or answer replies. To have Sona, Quo's AI agent, text someone and handle the back-and-forth until a goal is reached (confirm or reschedule an appointment, collect details, answer their questions), use start-agent-conversation instead. 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).
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
from
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.
Clear enough to supply this argument.
to
The recipient's phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content
The message content
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "send-message",
"description": "Send one SMS text, exactly as written, from a Quo inbox to a single recipient, right now. Use it when the user wants a specific message sent (they wrote or dictated it, or asked you to draft one) or a one-way notice such as a reminder, an address or a confirmation. It does not watch for or answer replies. To have Sona, Quo's AI agent, text someone and handle the back-and-forth until a goal is reached (confirm or reschedule an appointment, collect details, answer their questions), use start-agent-conversation instead. 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).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"from",
"to",
"content"
],
"properties": {
"to": {
"type": "string",
"description": "The recipient's phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported."
},
"from": {
"type": "string",
"description": "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."
},
"content": {
"type": "string",
"description": "The message content"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description93/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
from
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
to
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content
The message content
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "send-group-message",
"description": "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).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"from",
"to",
"content"
],
"properties": {
"to": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"minItems": 2,
"description": "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."
},
"from": {
"type": "string",
"description": "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."
},
"content": {
"type": "string",
"description": "The message content"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs76/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
from
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.
Clear enough to supply this argument.
to
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
messages › items › to
This recipient's phone number in E.164 format (e.g. '+15551234567').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
messages › items › content
The message text for this recipient only.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "send-bulk-messages",
"description": "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).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"from"
],
"properties": {
"to": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40,
"minItems": 2,
"description": "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."
},
"from": {
"type": "string",
"description": "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."
},
"content": {
"type": "string",
"description": "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."
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"to",
"content"
],
"properties": {
"to": {
"$ref": "#/properties/to/items",
"description": "This recipient's phone number in E.164 format (e.g. '+15551234567')."
},
"content": {
"type": "string",
"description": "The message text for this recipient only."
}
},
"additionalProperties": false
},
"maxItems": 40,
"minItems": 2,
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description99/100
Create a new contact in the Quo workspace, including workspace custom fields. Make the best custom-field key match from the user's wording; if Quo rejects the custom-field input as invalid, the error includes exact workspace keys, names, and types so you can retry. 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.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
firstName
Contact's first name (required)
Clear enough to supply this argument.
lastName
Contact's last name
Clear enough to supply this argument.
company
Contact's company name
Clear enough to supply this argument.
role
Contact's role or title
Clear enough to supply this argument.
email
Contact's email address, RFC-5322 format (e.g., '[email protected]')
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
phoneNumber
Contact's phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported.
Clear enough to supply this argument.
customFields › items › key
Best-known key for the custom field the user named. If Quo rejects it, the tool error includes the exact workspace field definitions for a retry.
Clear enough to supply this argument.
customFields › items › value
Value matching the field type: string/address/url/date use a string, number uses a number, boolean uses true/false, multi-select uses an array of strings, and null clears the value.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create-contact",
"description": "Create a new contact in the Quo workspace, including workspace custom fields. Make the best custom-field key match from the user's wording; if Quo rejects the custom-field input as invalid, the error includes exact workspace keys, names, and types so you can retry. 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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"firstName"
],
"properties": {
"role": {
"type": "string",
"description": "Contact's role or title"
},
"email": {
"type": "string",
"format": "email",
"description": "Contact's email address, RFC-5322 format (e.g., '[email protected]')"
},
"company": {
"type": "string",
"description": "Contact's company name"
},
"lastName": {
"type": "string",
"description": "Contact's last name"
},
"firstName": {
"type": "string",
"description": "Contact's first name (required)"
},
"phoneNumber": {
"type": "string",
"description": "Contact's phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported."
},
"customFields": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"minLength": 1,
"description": "Best-known key for the custom field the user named. If Quo rejects it, the tool error includes the exact workspace field definitions for a retry."
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Value matching the field type: string/address/url/date use a string, number uses a number, boolean uses true/false, multi-select uses an array of strings, and null clears the value."
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description92/100
Update fields on an existing Quo contact, including workspace custom fields. Make the best custom-field key match from the user's wording; if Quo rejects the custom-field input as invalid, the error includes exact workspace keys, names, and types so you can retry. Omit fields you want to leave unchanged; pass `null` for any default field or custom-field value you want to clear. Fields not included in the request are preserved through a full read-merge-write. Use `get-contact` first if you need to inspect current contact values.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactId
The Quo contact ID to update
Clear enough to supply this argument.
firstName
Updated first name. Set to null to remove.
Clear enough to supply this argument.
lastName
Updated last name. Set to null to remove.
Clear enough to supply this argument.
company
Updated company name. Set to null to remove.
Clear enough to supply this argument.
role
Updated role/title. Set to null to remove.
Clear enough to supply this argument.
email
Updated email address, RFC-5322 format (e.g., '[email protected]'). Set to null to remove.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
phoneNumber
Updated phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported. Set to null to remove.
Clear enough to supply this argument.
customFields › items › key
Best-known key for the custom field the user named. If Quo rejects it, the tool error includes the exact workspace field definitions for a retry.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
customFields › items › value
Value matching the field type: string/address/url/date use a string, number uses a number, boolean uses true/false, multi-select uses an array of strings, and null clears the value.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update-contact",
"description": "Update fields on an existing Quo contact, including workspace custom fields. Make the best custom-field key match from the user's wording; if Quo rejects the custom-field input as invalid, the error includes exact workspace keys, names, and types so you can retry. Omit fields you want to leave unchanged; pass `null` for any default field or custom-field value you want to clear. Fields not included in the request are preserved through a full read-merge-write. Use `get-contact` first if you need to inspect current contact values.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"contactId"
],
"properties": {
"role": {
"type": [
"string",
"null"
],
"description": "Updated role/title. Set to null to remove."
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email"
},
{
"type": "null"
}
],
"description": "Updated email address, RFC-5322 format (e.g., '[email protected]'). Set to null to remove."
},
"company": {
"type": [
"string",
"null"
],
"description": "Updated company name. Set to null to remove."
},
"lastName": {
"type": [
"string",
"null"
],
"description": "Updated last name. Set to null to remove."
},
"contactId": {
"type": "string",
"description": "The Quo contact ID to update"
},
"firstName": {
"type": [
"string",
"null"
],
"description": "Updated first name. Set to null to remove."
},
"phoneNumber": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Updated phone number. Format as E.164 before sending (e.g. '+15551234567', '+447911123456'). International numbers are supported. Set to null to remove."
},
"customFields": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"minLength": 1,
"description": "Best-known key for the custom field the user named. If Quo rejects it, the tool error includes the exact workspace field definitions for a retry."
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Value matching the field type: string/address/url/date use a string, number uses a number, boolean uses true/false, multi-select uses an array of strings, and null clears the value."
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description90/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
userId
Optional: filter inboxes by a specific Quo user ID (US... format).
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-inboxes",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"userId": {
"type": "string",
"description": "Optional: filter inboxes by a specific Quo user ID (US... format)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description93/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
inbox
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.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get-inbox-settings",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"inbox"
],
"properties": {
"inbox": {
"type": "string",
"minLength": 1,
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description95/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inbox
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.
Clear enough to supply this argument.
name
A new display name for the inbox (1–500 characters).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
autoRecord
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
callDisclosure › inbound
How callers who call this inbox are told the call may be recorded.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
callDisclosure › outbound
How people this inbox calls are told the call may be recorded.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
businessHours › enabled
true to enforce business hours, false to stop. Has no effect until the inbox has a schedule.
Clear enough to supply this argument.
businessHours › timezone
IANA timezone the schedule is read in, e.g. 'America/New_York'. Left out, the current timezone is kept.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
When the inbox opens that day. 24-hour HHMM (e.g. 0900, 1730). 9am and 5:30pm are also accepted. A time without am/pm is read as 24-hour, so write 5:30pm, not 5:30.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
When it closes; it must be after start, and 0000 to 0000 means open all day. 24-hour HHMM (e.g. 0900, 1730). 9am and 5:30pm are also accepted. A time without am/pm is read as 24-hour, so write 5:30pm, not 5:30.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userConfirmed
Set true only after the user explicitly confirmed these exact changes to this inbox in the conversation. Never infer it.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update-inbox-settings",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"inbox"
],
"properties": {
"name": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "A new display name for the inbox (1–500 characters)."
},
"inbox": {
"type": "string",
"minLength": 1,
"description": "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."
},
"autoRecord": {
"type": "boolean",
"description": "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."
},
"businessHours": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "true to enforce business hours, false to stop. Has no effect until the inbox has a schedule."
},
"schedule": {
"anyOf": [
{
"type": "object",
"properties": {
"friday": {
"$ref": "#/properties/businessHours/properties/schedule/anyOf/0/properties/monday",
"description": "The day's open window, or null to make the inbox closed (unavailable) that day."
},
"monday": {
"anyOf": [
{
"type": "object",
"required": [
"start",
"end"
],
"properties": {
"end": {
"$ref": "#/properties/businessHours/properties/schedule/anyOf/0/properties/monday/anyOf/0/properties/start",
"description": "When it closes; it must be after start, and 0000 to 0000 means open all day. 24-hour HHMM (e.g. 0900, 1730). 9am and 5:30pm are also accepted. A time without am/pm is read as 24-hour, so write 5:30pm, not 5:30."
},
"start": {
"type": "string",
"description": "When the inbox opens that day. 24-hour HHMM (e.g. 0900, 1730). 9am and 5:30pm are also accepted. A time without am/pm is read as 24-hour, so write 5:30pm, not 5:30."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The day's open window, or null to make the inbox closed (unavailable) that day."
},
"sunday": {
"$ref": "#/properties/businessHours/properties/schedule/anyOf/0/properties/monday",
"description": "The day's open window, or null to make the inbox closed (unavailable) that day."
},
"tuesday": {
"$ref": "#/properties/businessHours/properties/schedule/anyOf/0/properties/monday",
"description": "The day's open window, or null to make the inbox closed (unavailable) that day."
},
"saturday": {
"$ref": "#/properties/businessHours/properties/schedule/anyOf/0/properties/monday",
"description": "The day's open window, or null to make the inbox closed (unavailable) that day."
},
"thursday": {
"$ref": "#/properties/businessHours/properties/schedule/anyOf/0/properties/monday",
"description": "The day's open window, or null to make the inbox closed (unavailable) that day."
},
"wednesday": {
"$ref": "#/properties/businessHours/properties/schedule/anyOf/0/properties/monday",
"description": "The day's open window, or null to make the inbox closed (unavailable) that day."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The days to change, at least one, each an open window or null for closed. Days left out keep their window. null instead of an object removes the whole schedule."
},
"timezone": {
"type": "string",
"minLength": 1,
"description": "IANA timezone the schedule is read in, e.g. 'America/New_York'. Left out, the current timezone is kept."
}
},
"description": "Business hours to change. A field left out keeps its value.",
"additionalProperties": false
},
"userConfirmed": {
"type": "boolean",
"description": "Set true only after the user explicitly confirmed these exact changes to this inbox in the conversation. Never infer it."
},
"callDisclosure": {
"type": "object",
"properties": {
"inbound": {
"enum": [
"voice",
"audioTone",
"disabled"
],
"type": "string",
"description": "How callers who call this inbox are told the call may be recorded."
},
"outbound": {
"$ref": "#/properties/callDisclosure/properties/inbound",
"description": "How people this inbox calls are told the call may be recorded."
}
},
"description": "Recording-disclosure notices to change. A direction left out keeps its value.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description96/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
externalIds
Optional: filter by a list of external identifiers from an external system.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
sources
Optional: filter by contact source (origin/creation method).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxResults
Maximum contacts to return per page (1-50, default 10).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pageToken
Optional: token from a previous response to fetch the next page.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-contacts",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional: filter by contact source (origin/creation method)."
},
"pageToken": {
"type": "string",
"description": "Optional: token from a previous response to fetch the next page."
},
"maxResults": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum contacts to return per page (1-50, default 10)."
},
"externalIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional: filter by a list of external identifiers from an external system."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description98/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Input documentation gives an agent enough context to populate the arguments.
contactId
The Quo contact ID to retrieve.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get-contact",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"contactId"
],
"properties": {
"contactId": {
"type": "string",
"description": "The Quo contact ID to retrieve."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description97/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
contactId
The Quo contact ID whose notes to list.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
maxResults
Maximum notes to return per page (1-50, default 10).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pageToken
Optional: token from a previous response to fetch the next page.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-contact-notes",
"description": "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).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"contactId"
],
"properties": {
"contactId": {
"type": "string",
"minLength": 1,
"description": "The Quo contact ID whose notes to list."
},
"pageToken": {
"type": "string",
"description": "Optional: token from a previous response to fetch the next page."
},
"maxResults": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum notes to return per page (1-50, default 10)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description99/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs77/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contactId
The Quo contact ID to add the note to.
Clear enough to supply this argument.
text
The note text (1-2000 characters).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create-contact-note",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"contactId",
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "The note text (1-2000 characters)."
},
"contactId": {
"type": "string",
"minLength": 1,
"description": "The Quo contact ID to add the note to."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description87/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
contactId
The Quo contact ID the note belongs to.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
noteId
The note ID to update, as returned by list-contact-notes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
text
The note's new full text (1-2000 characters). Replaces the existing text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update-contact-note",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"contactId",
"noteId",
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "The note's new full text (1-2000 characters). Replaces the existing text."
},
"noteId": {
"type": "string",
"minLength": 1,
"description": "The note ID to update, as returned by list-contact-notes."
},
"contactId": {
"type": "string",
"minLength": 1,
"description": "The Quo contact ID the note belongs to."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description100/100
Get this Quo workspace's A2P 10DLC carrier registration — the one-per-workspace registration US carriers require before a business can text people from local numbers. Shows where it stands in plain words (draft and not yet billed; submitted and awaiting carrier review; approved; or rejected, with the carriers' reasons and whether it can be fixed here or must be resubmitted in the Quo app), every business and messaging detail carriers vet, and the exact next step. Use this first in any A2P conversation, and to check status after submitting. Read-only; does not submit or charge anything.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get-a2p-registration",
"description": "Get this Quo workspace's A2P 10DLC carrier registration — the one-per-workspace registration US carriers require before a business can text people from local numbers. Shows where it stands in plain words (draft and not yet billed; submitted and awaiting carrier review; approved; or rejected, with the carriers' reasons and whether it can be fixed here or must be resubmitted in the Quo app), every business and messaging detail carriers vet, and the exact next step. Use this first in any A2P conversation, and to check status after submitting. Read-only; does not submit or charge anything.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description94/100
Create this Quo workspace's A2P 10DLC carrier registration as a DRAFT. A workspace has one registration, covering its numbers. Creating the draft is free and sends nothing to carriers: nothing is billed until submit-a2p-registration. Every field is required (alternateName, address.line2, ticker and exchange may be null), so collect the real values from the user rather than guessing: carriers check the business against its tax registration, and mismatches get it rejected. Before asking for the fields one by one, offer to read them from a document: the user can share their business registration in the chat, such as the IRS EIN letter (CP 575 or 147C), articles of incorporation or organization, a state business registration, or a Canadian business number confirmation. It is optional, so ask for the details directly if they would rather not. From a document, take only what it shows: usually the legal name, legal structure (businessType), tax ID type and number, and registered address. Show the user what you read and have them confirm it, then ask for whatever the document does not cover, such as the website, industry, employee count, call volume, regions, contact person and message types. Never fill a field the document does not show and the user has not given. ticker and exchange are required for Public companies. After creation, Quo writes the messaging details carriers vet in the background; before submitting, review the business details with the user via get-a2p-registration. Quo writes the messaging details carriers review (the description, sample messages and opt-in flow) for the user, from the business details and messageTypes, in the form carriers look for, to improve the chance of approval. They are not returned by these tools, so there is nothing to review or edit; only the use case is shown. Present this as a feature that handles the hardest part of registration for them, not as a limitation. It works the same way in the Quo app, which does not take custom wording either, so never suggest the app as a way to use the user's own text. If the user has their own use case or sample messages, explain that Quo writes these for them. What the user controls is the business details and messageTypes: keep those accurate, and to change what Quo writes, correct them with update-a2p-registration (include messageTypes, plus one of the business fields that trigger it, such as name resent with its current value), and Quo writes the messaging again. Fails with a conflict if the workspace already has a registration. Requires a workspace owner or admin and an active paid subscription.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
The business's legal or registered name, exactly as on its tax registration.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
alternateName
Doing-business-as (DBA) name, or null if none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
businessType
Legal structure: one of Sole Proprietorship, Partnership, Corporation, Co-operative, Limited Liability Corporation, Non-profit Corporation.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyType
One of Private, Public, Non-profit, Government. ticker and exchange are required for Public.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
industry
Industry: one of Agriculture, Automotive, Banking, Consumer, Education, Electronics, Energy, Engineering, Fast moving consumer goods, Financial, Fintech, Food and beverage, Government, Healthcare, Hospitality, Insurance, Jewelry, Legal, Manufacturing, Media, Not for profit, Oil and gas, Online, Raw materials, Real estate, Religion, Retail, Technology, Telecommunications, Transportation, Travel.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
employeeCount
Number of employees (at least 1).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
avgDailyCallVolume
Average calls per day (at least 1).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
regionsOfOperation
Regions the business operates in: one or more of Africa, Asia, Europe, Latin America, USA and Canada, each listed once.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
websiteUrl
The business's website URL.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idType
Type of government tax ID: one of USA: Employer Identification Number (EIN); Canada: Canadian Business Number (BN-9); Great Britain: Company Number; Australia: Company Number from ASIC (ACN); India: Corporate Identity Number; Estonia: VAT Number; Romania: VAT Registration Number; Israel: Registration Number; Other.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idNumber
The tax ID number. A US EIN must have exactly nine digits (dashes are ignored); a Canadian BN-9 must be exactly nine digits with no separators.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ticker
Stock ticker if Public, otherwise null.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › line1
First line of the business's registered address.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › line2
Second line of the address, or null.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › city
City.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › region
State, province or region.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › postalCode
Postal or ZIP code.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › country
Country as a two-letter ISO 3166-1 alpha-2 code, e.g. US or CA. Never the country name ('United States') or a three-letter code ('USA'); convert it when the user or a document gives one.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › firstName
First name of the person submitting for the business.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › lastName
Last name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › jobTitle
Job title, e.g. 'Office Manager'.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › jobPosition
Job position: one of Other, Director, GM, VP, CEO, CFO, General Counsel.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › email
Email address.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › phoneNumber
Phone number in E.164 format, e.g. +14155550123.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
messageTypes
What the business will text people about; Quo uses these to auto-fill the use case, description, sample messages and opt-in flow. One or more of: appointments_scheduling, transactional_notifications, customer_support, verification_security, promotions_announcements. Not stored — send it again whenever a later update changes name, alternateName, businessType, websiteUrl, personOfContact.firstName, personOfContact.lastName.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create-a2p-registration",
"description": "Create this Quo workspace's A2P 10DLC carrier registration as a DRAFT. A workspace has one registration, covering its numbers. Creating the draft is free and sends nothing to carriers: nothing is billed until submit-a2p-registration. Every field is required (alternateName, address.line2, ticker and exchange may be null), so collect the real values from the user rather than guessing: carriers check the business against its tax registration, and mismatches get it rejected. Before asking for the fields one by one, offer to read them from a document: the user can share their business registration in the chat, such as the IRS EIN letter (CP 575 or 147C), articles of incorporation or organization, a state business registration, or a Canadian business number confirmation. It is optional, so ask for the details directly if they would rather not. From a document, take only what it shows: usually the legal name, legal structure (businessType), tax ID type and number, and registered address. Show the user what you read and have them confirm it, then ask for whatever the document does not cover, such as the website, industry, employee count, call volume, regions, contact person and message types. Never fill a field the document does not show and the user has not given. ticker and exchange are required for Public companies. After creation, Quo writes the messaging details carriers vet in the background; before submitting, review the business details with the user via get-a2p-registration. Quo writes the messaging details carriers review (the description, sample messages and opt-in flow) for the user, from the business details and messageTypes, in the form carriers look for, to improve the chance of approval. They are not returned by these tools, so there is nothing to review or edit; only the use case is shown. Present this as a feature that handles the hardest part of registration for them, not as a limitation. It works the same way in the Quo app, which does not take custom wording either, so never suggest the app as a way to use the user's own text. If the user has their own use case or sample messages, explain that Quo writes these for them. What the user controls is the business details and messageTypes: keep those accurate, and to change what Quo writes, correct them with update-a2p-registration (include messageTypes, plus one of the business fields that trigger it, such as name resent with its current value), and Quo writes the messaging again. Fails with a conflict if the workspace already has a registration. Requires a workspace owner or admin and an active paid subscription.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"alternateName",
"businessType",
"companyType",
"industry",
"employeeCount",
"avgDailyCallVolume",
"regionsOfOperation",
"websiteUrl",
"idType",
"idNumber",
"ticker",
"exchange",
"address",
"personOfContact",
"messageTypes"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "The business's legal or registered name, exactly as on its tax registration."
},
"idType": {
"enum": [
"USA: Employer Identification Number (EIN)",
"Canada: Canadian Business Number (BN-9)",
"Great Britain: Company Number",
"Australia: Company Number from ASIC (ACN)",
"India: Corporate Identity Number",
"Estonia: VAT Number",
"Romania: VAT Registration Number",
"Israel: Registration Number",
"Other"
],
"type": "string",
"description": "Type of government tax ID: one of USA: Employer Identification Number (EIN); Canada: Canadian Business Number (BN-9); Great Britain: Company Number; Australia: Company Number from ASIC (ACN); India: Corporate Identity Number; Estonia: VAT Number; Romania: VAT Registration Number; Israel: Registration Number; Other."
},
"ticker": {
"anyOf": [
{
"type": "string",
"maxLength": 255,
"minLength": 1
},
{
"type": "null"
}
],
"description": "Stock ticker if Public, otherwise null."
},
"address": {
"type": "object",
"required": [
"line1",
"line2",
"city",
"region",
"postalCode",
"country"
],
"properties": {
"city": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "City."
},
"line1": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "First line of the business's registered address."
},
"line2": {
"anyOf": [
{
"type": "string",
"maxLength": 255,
"minLength": 1
},
{
"type": "null"
}
],
"description": "Second line of the address, or null."
},
"region": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "State, province or region."
},
"country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "Country as a two-letter ISO 3166-1 alpha-2 code, e.g. US or CA. Never the country name ('United States') or a three-letter code ('USA'); convert it when the user or a document gives one."
},
"postalCode": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Postal or ZIP code."
}
},
"description": "The business's registered address.",
"additionalProperties": false
},
"exchange": {
"anyOf": [
{
"enum": [
"NASDAQ",
"NYSE",
"AMEX",
"AMX",
"ASX",
"B3",
"BME",
"BSE",
"FRA",
"ICEX",
"JPX",
"JSE",
"KRX",
"LON",
"NSE",
"OMX",
"SEHK",
"SGX",
"SSE",
"STO",
"SWX",
"SZSE",
"TSX",
"TWSE",
"VSE",
"Other"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Stock exchange if Public (one of NASDAQ, NYSE, AMEX, AMX, ASX, B3, BME, BSE, FRA, ICEX, JPX, JSE, KRX, LON, NSE, OMX, SEHK, SGX, SSE, STO, SWX, SZSE, TSX, TWSE, VSE, Other), otherwise null."
},
"idNumber": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "The tax ID number. A US EIN must have exactly nine digits (dashes are ignored); a Canadian BN-9 must be exactly nine digits with no separators."
},
"industry": {
"enum": [
"Agriculture",
"Automotive",
"Banking",
"Consumer",
"Education",
"Electronics",
"Energy",
"Engineering",
"Fast moving consumer goods",
"Financial",
"Fintech",
"Food and beverage",
"Government",
"Healthcare",
"Hospitality",
"Insurance",
"Jewelry",
"Legal",
"Manufacturing",
"Media",
"Not for profit",
"Oil and gas",
"Online",
"Raw materials",
"Real estate",
"Religion",
"Retail",
"Technology",
"Telecommunications",
"Transportation",
"Travel"
],
"type": "string",
"description": "Industry: one of Agriculture, Automotive, Banking, Consumer, Education, Electronics, Energy, Engineering, Fast moving consumer goods, Financial, Fintech, Food and beverage, Government, Healthcare, Hospitality, Insurance, Jewelry, Legal, Manufacturing, Media, Not for profit, Oil and gas, Online, Raw materials, Real estate, Religion, Retail, Technology, Telecommunications, Transportation, Travel."
},
"websiteUrl": {
"type": "string",
"format": "uri",
"maxLength": 255,
"description": "The business's website URL."
},
"companyType": {
"enum": [
"Private",
"Public",
"Non-profit",
"Government"
],
"type": "string",
"description": "One of Private, Public, Non-profit, Government. ticker and exchange are required for Public."
},
"businessType": {
"enum": [
"Sole Proprietorship",
"Partnership",
"Corporation",
"Co-operative",
"Limited Liability Corporation",
"Non-profit Corporation"
],
"type": "string",
"description": "Legal structure: one of Sole Proprietorship, Partnership, Corporation, Co-operative, Limited Liability Corporation, Non-profit Corporation."
},
"messageTypes": {
"type": "array",
"items": {
"enum": [
"appointments_scheduling",
"transactional_notifications",
"customer_support",
"verification_security",
"promotions_announcements"
],
"type": "string"
},
"minItems": 1,
"description": "What the business will text people about; Quo uses these to auto-fill the use case, description, sample messages and opt-in flow. One or more of: appointments_scheduling, transactional_notifications, customer_support, verification_security, promotions_announcements. Not stored — send it again whenever a later update changes name, alternateName, businessType, websiteUrl, personOfContact.firstName, personOfContact.lastName."
},
"alternateName": {
"anyOf": [
{
"type": "string",
"maxLength": 255,
"minLength": 1
},
{
"type": "null"
}
],
"description": "Doing-business-as (DBA) name, or null if none."
},
"employeeCount": {
"type": "integer",
"minimum": 1,
"description": "Number of employees (at least 1)."
},
"personOfContact": {
"type": "object",
"required": [
"firstName",
"lastName",
"jobTitle",
"jobPosition",
"email",
"phoneNumber"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"maxLength": 255,
"description": "Email address."
},
"jobTitle": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Job title, e.g. 'Office Manager'."
},
"lastName": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Last name."
},
"firstName": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "First name of the person submitting for the business."
},
"jobPosition": {
"enum": [
"Other",
"Director",
"GM",
"VP",
"CEO",
"CFO",
"General Counsel"
],
"type": "string",
"description": "Job position: one of Other, Director, GM, VP, CEO, CFO, General Counsel."
},
"phoneNumber": {
"type": "string",
"pattern": "^\\+[1-9]\\d{1,14}$",
"description": "Phone number in E.164 format, e.g. +14155550123."
}
},
"description": "The person submitting the registration on the business's behalf.",
"additionalProperties": false
},
"avgDailyCallVolume": {
"type": "integer",
"minimum": 1,
"description": "Average calls per day (at least 1)."
},
"regionsOfOperation": {
"type": "array",
"items": {
"enum": [
"Africa",
"Asia",
"Europe",
"Latin America",
"USA and Canada"
],
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"description": "Regions the business operates in: one or more of Africa, Asia, Europe, Latin America, USA and Canada, each listed once."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description97/100
Change fields on this Quo workspace's DRAFT A2P 10DLC registration. Only the fields you pass change; everything else stays as it is (address and personOfContact merge field by field). Changing name, alternateName, businessType, websiteUrl, personOfContact.firstName, personOfContact.lastName has Quo write the messaging details again, so those changes must include `messageTypes`. Quo writes the messaging details carriers review (the description, sample messages and opt-in flow) for the user, from the business details and messageTypes, in the form carriers look for, to improve the chance of approval. They are not returned by these tools, so there is nothing to review or edit; only the use case is shown. Present this as a feature that handles the hardest part of registration for them, not as a limitation. It works the same way in the Quo app, which does not take custom wording either, so never suggest the app as a way to use the user's own text. If the user has their own use case or sample messages, explain that Quo writes these for them. What the user controls is the business details and messageTypes: keep those accurate, and to change what Quo writes, correct them with update-a2p-registration (include messageTypes, plus one of the business fields that trigger it, such as name resent with its current value), and Quo writes the messaging again. Editing is free and sends nothing to carriers. Only drafts can be edited: a registration awaiting carrier review cannot be changed, and one whose campaign carriers rejected must be corrected in the Quo app. Any change invalidates an earlier submit review, so run submit-a2p-registration's review again afterwards. Requires a workspace owner or admin.
Describe the returned information so the agent knows whether it will answer the request.
Inputs77/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
The business's legal or registered name, exactly as on its tax registration.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
alternateName
Doing-business-as (DBA) name, or null if none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
businessType
Legal structure: one of Sole Proprietorship, Partnership, Corporation, Co-operative, Limited Liability Corporation, Non-profit Corporation.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyType
One of Private, Public, Non-profit, Government. ticker and exchange are required for Public.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
industry
Industry: one of Agriculture, Automotive, Banking, Consumer, Education, Electronics, Energy, Engineering, Fast moving consumer goods, Financial, Fintech, Food and beverage, Government, Healthcare, Hospitality, Insurance, Jewelry, Legal, Manufacturing, Media, Not for profit, Oil and gas, Online, Raw materials, Real estate, Religion, Retail, Technology, Telecommunications, Transportation, Travel.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
employeeCount
Number of employees (at least 1).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
avgDailyCallVolume
Average calls per day (at least 1).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
regionsOfOperation
Regions the business operates in: one or more of Africa, Asia, Europe, Latin America, USA and Canada, each listed once.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
websiteUrl
The business's website URL.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idType
Type of government tax ID: one of USA: Employer Identification Number (EIN); Canada: Canadian Business Number (BN-9); Great Britain: Company Number; Australia: Company Number from ASIC (ACN); India: Corporate Identity Number; Estonia: VAT Number; Romania: VAT Registration Number; Israel: Registration Number; Other.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
idNumber
The tax ID number. A US EIN must have exactly nine digits (dashes are ignored); a Canadian BN-9 must be exactly nine digits with no separators.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ticker
Stock ticker if Public, otherwise null.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › line1
First line of the business's registered address.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › line2
Second line of the address, or null.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › city
City.
Clear enough to supply this argument.
address › region
State, province or region.
Clear enough to supply this argument.
address › postalCode
Postal or ZIP code.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address › country
Country as a two-letter ISO 3166-1 alpha-2 code, e.g. US or CA. Never the country name ('United States') or a three-letter code ('USA'); convert it when the user or a document gives one.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › firstName
First name of the person submitting for the business.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › lastName
Last name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › jobTitle
Job title, e.g. 'Office Manager'.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › jobPosition
Job position: one of Other, Director, GM, VP, CEO, CFO, General Counsel.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › email
Email address.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personOfContact › phoneNumber
Phone number in E.164 format, e.g. +14155550123.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
messageTypes
What the business will text people about; Quo uses these to auto-fill the use case, description, sample messages and opt-in flow. One or more of: appointments_scheduling, transactional_notifications, customer_support, verification_security, promotions_announcements. Not stored — send it again whenever a later update changes name, alternateName, businessType, websiteUrl, personOfContact.firstName, personOfContact.lastName.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update-a2p-registration",
"description": "Change fields on this Quo workspace's DRAFT A2P 10DLC registration. Only the fields you pass change; everything else stays as it is (address and personOfContact merge field by field). Changing name, alternateName, businessType, websiteUrl, personOfContact.firstName, personOfContact.lastName has Quo write the messaging details again, so those changes must include `messageTypes`. Quo writes the messaging details carriers review (the description, sample messages and opt-in flow) for the user, from the business details and messageTypes, in the form carriers look for, to improve the chance of approval. They are not returned by these tools, so there is nothing to review or edit; only the use case is shown. Present this as a feature that handles the hardest part of registration for them, not as a limitation. It works the same way in the Quo app, which does not take custom wording either, so never suggest the app as a way to use the user's own text. If the user has their own use case or sample messages, explain that Quo writes these for them. What the user controls is the business details and messageTypes: keep those accurate, and to change what Quo writes, correct them with update-a2p-registration (include messageTypes, plus one of the business fields that trigger it, such as name resent with its current value), and Quo writes the messaging again. Editing is free and sends nothing to carriers. Only drafts can be edited: a registration awaiting carrier review cannot be changed, and one whose campaign carriers rejected must be corrected in the Quo app. Any change invalidates an earlier submit review, so run submit-a2p-registration's review again afterwards. Requires a workspace owner or admin.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "The business's legal or registered name, exactly as on its tax registration."
},
"idType": {
"enum": [
"USA: Employer Identification Number (EIN)",
"Canada: Canadian Business Number (BN-9)",
"Great Britain: Company Number",
"Australia: Company Number from ASIC (ACN)",
"India: Corporate Identity Number",
"Estonia: VAT Number",
"Romania: VAT Registration Number",
"Israel: Registration Number",
"Other"
],
"type": "string",
"description": "Type of government tax ID: one of USA: Employer Identification Number (EIN); Canada: Canadian Business Number (BN-9); Great Britain: Company Number; Australia: Company Number from ASIC (ACN); India: Corporate Identity Number; Estonia: VAT Number; Romania: VAT Registration Number; Israel: Registration Number; Other."
},
"ticker": {
"anyOf": [
{
"type": "string",
"maxLength": 255,
"minLength": 1
},
{
"type": "null"
}
],
"description": "Stock ticker if Public, otherwise null."
},
"address": {
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "City."
},
"line1": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "First line of the business's registered address."
},
"line2": {
"anyOf": [
{
"type": "string",
"maxLength": 255,
"minLength": 1
},
{
"type": "null"
}
],
"description": "Second line of the address, or null."
},
"region": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "State, province or region."
},
"country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "Country as a two-letter ISO 3166-1 alpha-2 code, e.g. US or CA. Never the country name ('United States') or a three-letter code ('USA'); convert it when the user or a document gives one."
},
"postalCode": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Postal or ZIP code."
}
},
"description": "Address fields to change; omitted fields stay as they are.",
"additionalProperties": false
},
"exchange": {
"anyOf": [
{
"enum": [
"NASDAQ",
"NYSE",
"AMEX",
"AMX",
"ASX",
"B3",
"BME",
"BSE",
"FRA",
"ICEX",
"JPX",
"JSE",
"KRX",
"LON",
"NSE",
"OMX",
"SEHK",
"SGX",
"SSE",
"STO",
"SWX",
"SZSE",
"TSX",
"TWSE",
"VSE",
"Other"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Stock exchange if Public (one of NASDAQ, NYSE, AMEX, AMX, ASX, B3, BME, BSE, FRA, ICEX, JPX, JSE, KRX, LON, NSE, OMX, SEHK, SGX, SSE, STO, SWX, SZSE, TSX, TWSE, VSE, Other), otherwise null."
},
"idNumber": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "The tax ID number. A US EIN must have exactly nine digits (dashes are ignored); a Canadian BN-9 must be exactly nine digits with no separators."
},
"industry": {
"enum": [
"Agriculture",
"Automotive",
"Banking",
"Consumer",
"Education",
"Electronics",
"Energy",
"Engineering",
"Fast moving consumer goods",
"Financial",
"Fintech",
"Food and beverage",
"Government",
"Healthcare",
"Hospitality",
"Insurance",
"Jewelry",
"Legal",
"Manufacturing",
"Media",
"Not for profit",
"Oil and gas",
"Online",
"Raw materials",
"Real estate",
"Religion",
"Retail",
"Technology",
"Telecommunications",
"Transportation",
"Travel"
],
"type": "string",
"description": "Industry: one of Agriculture, Automotive, Banking, Consumer, Education, Electronics, Energy, Engineering, Fast moving consumer goods, Financial, Fintech, Food and beverage, Government, Healthcare, Hospitality, Insurance, Jewelry, Legal, Manufacturing, Media, Not for profit, Oil and gas, Online, Raw materials, Real estate, Religion, Retail, Technology, Telecommunications, Transportation, Travel."
},
"websiteUrl": {
"type": "string",
"format": "uri",
"maxLength": 255,
"description": "The business's website URL."
},
"companyType": {
"enum": [
"Private",
"Public",
"Non-profit",
"Government"
],
"type": "string",
"description": "One of Private, Public, Non-profit, Government. ticker and exchange are required for Public."
},
"businessType": {
"enum": [
"Sole Proprietorship",
"Partnership",
"Corporation",
"Co-operative",
"Limited Liability Corporation",
"Non-profit Corporation"
],
"type": "string",
"description": "Legal structure: one of Sole Proprietorship, Partnership, Corporation, Co-operative, Limited Liability Corporation, Non-profit Corporation."
},
"messageTypes": {
"type": "array",
"items": {
"enum": [
"appointments_scheduling",
"transactional_notifications",
"customer_support",
"verification_security",
"promotions_announcements"
],
"type": "string"
},
"minItems": 1,
"description": "What the business will text people about; Quo uses these to auto-fill the use case, description, sample messages and opt-in flow. One or more of: appointments_scheduling, transactional_notifications, customer_support, verification_security, promotions_announcements. Not stored — send it again whenever a later update changes name, alternateName, businessType, websiteUrl, personOfContact.firstName, personOfContact.lastName."
},
"alternateName": {
"anyOf": [
{
"type": "string",
"maxLength": 255,
"minLength": 1
},
{
"type": "null"
}
],
"description": "Doing-business-as (DBA) name, or null if none."
},
"employeeCount": {
"type": "integer",
"minimum": 1,
"description": "Number of employees (at least 1)."
},
"personOfContact": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"maxLength": 255,
"description": "Email address."
},
"jobTitle": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Job title, e.g. 'Office Manager'."
},
"lastName": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Last name."
},
"firstName": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "First name of the person submitting for the business."
},
"jobPosition": {
"enum": [
"Other",
"Director",
"GM",
"VP",
"CEO",
"CFO",
"General Counsel"
],
"type": "string",
"description": "Job position: one of Other, Director, GM, VP, CEO, CFO, General Counsel."
},
"phoneNumber": {
"type": "string",
"pattern": "^\\+[1-9]\\d{1,14}$",
"description": "Phone number in E.164 format, e.g. +14155550123."
}
},
"description": "Contact fields to change; omitted fields stay as they are.",
"additionalProperties": false
},
"avgDailyCallVolume": {
"type": "integer",
"minimum": 1,
"description": "Average calls per day (at least 1)."
},
"regionsOfOperation": {
"type": "array",
"items": {
"enum": [
"Africa",
"Asia",
"Europe",
"Latin America",
"USA and Canada"
],
"type": "string"
},
"maxItems": 5,
"minItems": 1,
"description": "Regions the business operates in: one or more of Africa, Asia, Europe, Latin America, USA and Canada, each listed once."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description99/100
Submit this Quo workspace's draft A2P 10DLC registration to carriers. SUBMITTING IS BILLED AND IS A COMPLIANCE COMMITMENT: it charges the workspace a one-time $19.50 registration fee (paid to the Carrier Registry on the workspace's behalf; not a Quo fee), then a monthly fee of $1.50 ($3 for non-profits), and $15 for each resubmission after a rejection; the user attests the workspace will not send messages about forbidden topics (policy and fees: https://support.quo.com/getting-started/carrier-registration/carrier-registration#registration-process); and it cannot be undone through the API. It always takes TWO calls. (1) Call it with no confirmationToken: nothing is submitted or charged; it returns the registration for review, the disclosures the user must see, and a confirmationToken. Show the user every disclosure and the details, and get their explicit confirmation. (2) Only then call it again with that confirmationToken, billingAcknowledged: true and forbiddenMessageTopicsAcknowledged: true. Never set those acknowledgments without the user's explicit confirmation in this conversation. The token expires if the registration changes. If submit reports that auto-fill is still running, wait a minute and repeat step 2. Requires a workspace owner or admin and an active paid subscription.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmationToken
Omit on the first call to get the review. On the second call, pass the [confirmation_token: …] value from the review, after the user has confirmed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
billingAcknowledged
Second call only: true once the user has been told the fees (a one-time $19.50 registration fee (paid to the Carrier Registry on the workspace's behalf; not a Quo fee); a monthly fee of $1.50 ($3 for non-profits); $15 per resubmission) and has explicitly agreed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
forbiddenMessageTopicsAcknowledged
Second call only: true once the user has been shown the forbidden-topics policy (https://support.quo.com/getting-started/carrier-registration/carrier-registration#registration-process) and has explicitly confirmed the workspace will not send messages about forbidden topics.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "submit-a2p-registration",
"description": "Submit this Quo workspace's draft A2P 10DLC registration to carriers. SUBMITTING IS BILLED AND IS A COMPLIANCE COMMITMENT: it charges the workspace a one-time $19.50 registration fee (paid to the Carrier Registry on the workspace's behalf; not a Quo fee), then a monthly fee of $1.50 ($3 for non-profits), and $15 for each resubmission after a rejection; the user attests the workspace will not send messages about forbidden topics (policy and fees: https://support.quo.com/getting-started/carrier-registration/carrier-registration#registration-process); and it cannot be undone through the API. It always takes TWO calls. (1) Call it with no confirmationToken: nothing is submitted or charged; it returns the registration for review, the disclosures the user must see, and a confirmationToken. Show the user every disclosure and the details, and get their explicit confirmation. (2) Only then call it again with that confirmationToken, billingAcknowledged: true and forbiddenMessageTopicsAcknowledged: true. Never set those acknowledgments without the user's explicit confirmation in this conversation. The token expires if the registration changes. If submit reports that auto-fill is still running, wait a minute and repeat step 2. Requires a workspace owner or admin and an active paid subscription.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"confirmationToken": {
"type": "string",
"minLength": 1,
"description": "Omit on the first call to get the review. On the second call, pass the [confirmation_token: …] value from the review, after the user has confirmed."
},
"billingAcknowledged": {
"type": "boolean",
"description": "Second call only: true once the user has been told the fees (a one-time $19.50 registration fee (paid to the Carrier Registry on the workspace's behalf; not a Quo fee); a monthly fee of $1.50 ($3 for non-profits); $15 per resubmission) and has explicitly agreed."
},
"forbiddenMessageTopicsAcknowledged": {
"type": "boolean",
"description": "Second call only: true once the user has been shown the forbidden-topics policy (https://support.quo.com/getting-started/carrier-registration/carrier-registration#registration-process) and has explicitly confirmed the workspace will not send messages about forbidden topics."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description94/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxResults
Maximum tasks to return per page (1-100, default 50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pageToken
Optional: token from a previous response to fetch the next page.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs79/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
The task title.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
The task description.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dueDate
Optional due date as ISO 8601 datetime with timezone (e.g. '2024-01-01T00:00:00Z').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assignedTo
Optional Quo user ID to assign the task to (US... format).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inboxPhoneNumber
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.
Clear enough to supply this argument.
conversationId
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
activityId
Create the task linked to a Quo activity ID (AC... format). Provide exactly one of inboxPhoneNumber, conversationId, or activityId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create-task",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"title",
"description"
],
"properties": {
"title": {
"type": "string",
"minLength": 1,
"description": "The task title."
},
"dueDate": {
"type": "string",
"format": "date-time",
"description": "Optional due date as ISO 8601 datetime with timezone (e.g. '2024-01-01T00:00:00Z')."
},
"activityId": {
"type": "string",
"pattern": "^AC.+",
"description": "Create the task linked to a Quo activity ID (AC... format). Provide exactly one of inboxPhoneNumber, conversationId, or activityId."
},
"assignedTo": {
"type": "string",
"pattern": "^US.+",
"description": "Optional Quo user ID to assign the task to (US... format)."
},
"description": {
"type": "string",
"minLength": 1,
"description": "The task description."
},
"conversationId": {
"type": "string",
"pattern": "^CN.+",
"description": "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."
},
"inboxPhoneNumber": {
"type": "string",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
taskId
The Quo task ID to update (TK... format).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
Optional new task title.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
Optional new task description.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assignToUserId
Optional Quo user ID (US... format) to assign to the task.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
unassignUserId
Optional Quo user ID (US... format) to unassign from the task.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dueDate
Optional due date as ISO 8601 datetime with timezone (e.g. '2024-01-01T00:00:00Z').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
removeDueDate
Set to true to clear the task due date.
Clear enough to supply this argument.
completed
Set to true to mark the task as completed, or false to reopen a completed task.
Clear enough to supply this argument.
linkConversationId
Optional conversation ID (CN... format) to link to the task, as returned by fetch-messages / fetch-call-transcripts / fetch-missed-calls.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
unlinkConversationId
Optional conversation ID (CN... format) to unlink from the task.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update-task",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"taskId"
],
"properties": {
"title": {
"type": "string",
"minLength": 1,
"description": "Optional new task title."
},
"taskId": {
"type": "string",
"pattern": "^TK.+",
"description": "The Quo task ID to update (TK... format)."
},
"dueDate": {
"type": "string",
"format": "date-time",
"description": "Optional due date as ISO 8601 datetime with timezone (e.g. '2024-01-01T00:00:00Z')."
},
"completed": {
"type": "boolean",
"description": "Set to true to mark the task as completed, or false to reopen a completed task."
},
"description": {
"type": "string",
"minLength": 1,
"description": "Optional new task description."
},
"removeDueDate": {
"type": "boolean",
"default": false,
"description": "Set to true to clear the task due date."
},
"assignToUserId": {
"type": "string",
"pattern": "^US.+",
"description": "Optional Quo user ID (US... format) to assign to the task."
},
"unassignUserId": {
"$ref": "#/properties/assignToUserId",
"description": "Optional Quo user ID (US... format) to unassign from the task."
},
"linkConversationId": {
"type": "string",
"pattern": "^CN.+",
"description": "Optional conversation ID (CN... format) to link to the task, as returned by fetch-messages / fetch-call-transcripts / fetch-missed-calls."
},
"unlinkConversationId": {
"$ref": "#/properties/linkConversationId",
"description": "Optional conversation ID (CN... format) to unlink from the task."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
conversationIds
1–50 conversation IDs (CN…), from the conversationId column of fetch-messages, fetch-call-transcripts or fetch-missed-calls. Duplicates are marked once.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
markAs
read: clear the unread indicator. done: take the conversations out of the inbox. open: return done conversations to the inbox.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "mark-conversations",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"conversationIds",
"markAs"
],
"properties": {
"markAs": {
"enum": [
"read",
"done",
"open"
],
"type": "string",
"description": "read: clear the unread indicator. done: take the conversations out of the inbox. open: return done conversations to the inbox."
},
"conversationIds": {
"type": "array",
"items": {
"type": "string",
"pattern": "^CN\\S+$"
},
"maxItems": 50,
"minItems": 1,
"description": "1–50 conversation IDs (CN…), from the conversationId column of fetch-messages, fetch-call-transcripts or fetch-missed-calls. Duplicates are marked once."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description82/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
content
The user's feedback for the Quo product team. Preserve their main point and relevant context; do not invent details.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "submit-feedback",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"content"
],
"properties": {
"content": {
"type": "string",
"minLength": 1,
"description": "The user's feedback for the Quo product team. Preserve their main point and relevant context; do not invent details."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description99/100
Have Sona, Quo's AI agent, place a real phone call from a user's Quo number to carry out a task. Use this tool when the user asks Sona to make a call. Before using this tool, ensure the intended outcome and the details needed to achieve it are clear from the conversation. If they are ambiguous or missing, ask targeted questions; do not guess or call yet. For example, 'schedule an appointment' needs acceptable dates, times and timezone. Restate your understanding of what the agent will do and confirm the from number, destination and specific task with the user. The call is real and cannot be undone. Each call uses 50 of the workspace's automation credits (a call that ends within 15 seconds is free), so mention the cost when you confirm the call with the user; if the workspace is out of credits, the call fails without dialing. Quo may also ask the user to confirm directly. Every call needs an idempotencyKey; reuse it for every retry of the same call to avoid duplicates. This returns an agent call ID immediately while the call runs in the background. Poll get-agent-call about every 10 seconds until its status is final. Use cancel-agent-call to stop it. 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.
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
from
The user's Quo number to call 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.
Clear enough to supply this argument.
to
The number the AI agent calls, in E.164 format (e.g. '+15551234567').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
task
A specific instruction stating the intended outcome, relevant context and constraints the AI agent needs to act on. Resolve missing or ambiguous details with the user before calling; do not invent them. For scheduling, include acceptable dates, times and timezone (e.g. 'Book a 30-minute consultation next Friday between 2pm and 4pm America/Toronto; if unavailable, collect alternatives without booking').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
voicemail
What to do if voicemail answers. Defaults to hang-up.
Clear enough to supply this argument.
voicemailMessage
What the AI agent says after the beep. Implies voicemail: 'leave-message'; a short call-back request when omitted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxDurationSeconds
The longest the call may last once answered, in seconds. Defaults to 300.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userConfirmed
Set true only after the user explicitly confirmed this call (from number, number to call and task) in the conversation. Never infer it.
Clear enough to supply this argument.
idempotencyKey
Identifies this one phone call so it is never placed twice. Make one up the first time you try to place the call: a short description plus the number being called and a few random characters (e.g. 'confirm-friday-appt-15555555555-x7k2'). Then send exactly the same key every time you call this tool for that same call: after the userConfirmed prompt, after an error or timeout, or whenever you are unsure whether the call went through. Use a new key only when the user wants a different call or another call to the same number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "start-agent-call",
"description": "Have Sona, Quo's AI agent, place a real phone call from a user's Quo number to carry out a task. Use this tool when the user asks Sona to make a call. Before using this tool, ensure the intended outcome and the details needed to achieve it are clear from the conversation. If they are ambiguous or missing, ask targeted questions; do not guess or call yet. For example, 'schedule an appointment' needs acceptable dates, times and timezone. Restate your understanding of what the agent will do and confirm the from number, destination and specific task with the user. The call is real and cannot be undone. Each call uses 50 of the workspace's automation credits (a call that ends within 15 seconds is free), so mention the cost when you confirm the call with the user; if the workspace is out of credits, the call fails without dialing. Quo may also ask the user to confirm directly. Every call needs an idempotencyKey; reuse it for every retry of the same call to avoid duplicates. This returns an agent call ID immediately while the call runs in the background. Poll get-agent-call about every 10 seconds until its status is final. Use cancel-agent-call to stop it. 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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"from",
"to",
"task",
"idempotencyKey"
],
"properties": {
"to": {
"type": "string",
"description": "The number the AI agent calls, in E.164 format (e.g. '+15551234567')."
},
"from": {
"type": "string",
"description": "The user's Quo number to call 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."
},
"task": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "A specific instruction stating the intended outcome, relevant context and constraints the AI agent needs to act on. Resolve missing or ambiguous details with the user before calling; do not invent them. For scheduling, include acceptable dates, times and timezone (e.g. 'Book a 30-minute consultation next Friday between 2pm and 4pm America/Toronto; if unavailable, collect alternatives without booking')."
},
"voicemail": {
"enum": [
"hang-up",
"leave-message"
],
"type": "string",
"description": "What to do if voicemail answers. Defaults to hang-up."
},
"userConfirmed": {
"type": "boolean",
"description": "Set true only after the user explicitly confirmed this call (from number, number to call and task) in the conversation. Never infer it."
},
"idempotencyKey": {
"type": "string",
"maxLength": 128,
"minLength": 8,
"description": "Identifies this one phone call so it is never placed twice. Make one up the first time you try to place the call: a short description plus the number being called and a few random characters (e.g. 'confirm-friday-appt-15555555555-x7k2'). Then send exactly the same key every time you call this tool for that same call: after the userConfirmed prompt, after an error or timeout, or whenever you are unsure whether the call went through. Use a new key only when the user wants a different call or another call to the same number."
},
"voicemailMessage": {
"type": "string",
"maxLength": 1000,
"minLength": 1,
"description": "What the AI agent says after the beep. Implies voicemail: 'leave-message'; a short call-back request when omitted."
},
"maxDurationSeconds": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "The longest the call may last once answered, in seconds. Defaults to 300."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description83/100
Get a Sona call started with start-agent-call: its status and, once it has ended, its title, summary and collected data. A call typically takes 30–90 seconds, so poll about every 10 seconds until the status is final (completed, failed, no-answer, busy, voicemail, voicemail-left or canceled). `completed` does not mean a person answered or that the task succeeded; voicemail or an automated system can also end as completed, so read the summary.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
agentCallId
The agent call ID returned by start-agent-call (starts with AR).
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get-agent-call",
"description": "Get a Sona call started with start-agent-call: its status and, once it has ended, its title, summary and collected data. A call typically takes 30–90 seconds, so poll about every 10 seconds until the status is final (completed, failed, no-answer, busy, voicemail, voicemail-left or canceled). `completed` does not mean a person answered or that the task succeeded; voicemail or an automated system can also end as completed, so read the summary.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agentCallId"
],
"properties": {
"agentCallId": {
"type": "string",
"minLength": 1,
"description": "The agent call ID returned by start-agent-call (starts with AR)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "cancel-agent-call",
"description": "Cancel a Sona call started with start-agent-call, hanging up if it is in progress. A call that already ended is returned unchanged.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agentCallId"
],
"properties": {
"agentCallId": {
"type": "string",
"minLength": 1,
"description": "The agent call ID returned by start-agent-call (starts with AR)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description100/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
from
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.
Clear enough to supply this argument.
to
The number the AI agent texts, in E.164 format (e.g. '+15551234567').
Clear enough to supply this argument.
task
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.'
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userConfirmed
Set true only after the user explicitly confirmed this conversation (from number, number to text and task) in the chat. Never infer it.
Explain what happens when this optional value is omitted.
idempotencyKey
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "start-agent-conversation",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"from",
"to",
"task",
"idempotencyKey"
],
"properties": {
"to": {
"type": "string",
"description": "The number the AI agent texts, in E.164 format (e.g. '+15551234567')."
},
"from": {
"type": "string",
"description": "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."
},
"task": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "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.'"
},
"userConfirmed": {
"type": "boolean",
"description": "Set true only after the user explicitly confirmed this conversation (from number, number to text and task) in the chat. Never infer it."
},
"idempotencyKey": {
"type": "string",
"maxLength": 128,
"minLength": 8,
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description86/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
agentConversationId
The agent conversation ID returned by start-agent-conversation (starts with AR).
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get-agent-conversation",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agentConversationId"
],
"properties": {
"agentConversationId": {
"type": "string",
"minLength": 1,
"description": "The agent conversation ID returned by start-agent-conversation (starts with AR)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description95/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
agentConversationId
The agent conversation ID returned by start-agent-conversation (starts with AR).
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "cancel-agent-conversation",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"agentConversationId"
],
"properties": {
"agentConversationId": {
"type": "string",
"minLength": 1,
"description": "The agent conversation ID returned by start-agent-conversation (starts with AR)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description98/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
interviewId
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.
Clear enough to supply this argument.
messageId
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.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "ask-knowledge-agent",
"description": "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.\n\nOne conversation spans several calls, and each call does exactly one of these:\n- Start: message, and no interviewId. Opens a NEW conversation and returns its interviewId. Start once per topic.\n- 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.\n- 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.\nNever make up an interviewId or messageId: copy them from this tool's responses.\n\nSona 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.\n\nSona'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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"message": {
"type": "string",
"maxLength": 5000,
"description": "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."
},
"messageId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$",
"description": "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."
},
"interviewId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$",
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description89/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
interviewId
The conversation's interviewId, from ask-knowledge-agent.
Clear enough to supply this argument.
toolCallId
The draft's toolCallId, from the interview turn that proposed it.
Clear enough to supply this argument.
approved
true to publish the draft, false to decline it.
Clear enough to supply this argument.
userConfirmed
Set true only after the user saw the draft and explicitly approved publishing it in the chat. Never infer it.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "decide-knowledge-save",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"interviewId",
"toolCallId",
"approved"
],
"properties": {
"approved": {
"type": "boolean",
"description": "true to publish the draft, false to decline it."
},
"toolCallId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "The draft's toolCallId, from the interview turn that proposed it."
},
"interviewId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$",
"description": "The conversation's interviewId, from ask-knowledge-agent."
},
"userConfirmed": {
"type": "boolean",
"description": "Set true only after the user saw the draft and explicitly approved publishing it in the chat. Never infer it."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
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 `excludeDoneConversations` to true when the user wants only conversations that are still active in the inbox; omit it to include done conversations. 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 always return that contact's transcript history even when its conversation is marked done, and 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. This tool makes many API requests per call. Run it sequentially — let one call finish before starting another, including for a different inbox — since several running at once can hit rate limits and return incomplete results. 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.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inboxPhoneNumber
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.
Clear enough to supply this argument.
participantPhoneNumber
Optional: specific participant phone number to filter conversations (E.164 format). REQUIRED when using pageToken for pagination.
Clear enough to supply this argument.
excludeDoneConversations
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.
Clear enough to supply this argument.
maxResults
Maximum number of calls to fetch transcripts for (default: 100, max: 100 when using pagination)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAfter
Optional: filter calls created after this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdBefore
Optional: filter calls created before this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userId
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.
Clear enough to supply this argument.
pageToken
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.
Clear enough to supply this argument.
conversationPageToken
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.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "fetch-call-transcripts",
"description": "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 `excludeDoneConversations` to true when the user wants only conversations that are still active in the inbox; omit it to include done conversations. 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 always return that contact's transcript history even when its conversation is marked done, and 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. This tool makes many API requests per call. Run it sequentially — let one call finish before starting another, including for a different inbox — since several running at once can hit rate limits and return incomplete results. 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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"inboxPhoneNumber"
],
"properties": {
"userId": {
"type": "string",
"description": "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."
},
"pageToken": {
"type": "string",
"description": "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."
},
"maxResults": {
"type": "number",
"default": 100,
"description": "Maximum number of calls to fetch transcripts for (default: 100, max: 100 when using pagination)"
},
"createdAfter": {
"type": "string",
"format": "date-time",
"description": "Optional: filter calls created after this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z')."
},
"createdBefore": {
"type": "string",
"format": "date-time",
"description": "Optional: filter calls created before this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z')."
},
"inboxPhoneNumber": {
"type": "string",
"description": "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."
},
"conversationPageToken": {
"type": "string",
"description": "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."
},
"participantPhoneNumber": {
"type": "string",
"description": "Optional: specific participant phone number to filter conversations (E.164 format). REQUIRED when using pageToken for pagination."
},
"excludeDoneConversations": {
"type": "boolean",
"default": false,
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Fetch missed incoming calls for a Quo inbox, each enriched with the voicemail the caller left (transcript + recording URL) when there is one. Returns calls with an explicit unanswered status ('missed', 'no-answer', or 'abandoned') and calls Quo reports as 'completed' even though they have zero call duration and no human or AI answer signal. This fixed classification is not configurable. 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. This tool makes many API requests per call. Run it sequentially — let one call finish before starting another, including for a different inbox — since several running at once can hit rate limits and return incomplete results. 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.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inboxPhoneNumber
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.
Clear enough to supply this argument.
participantPhoneNumber
Optional: specific other-party phone number to filter calls (E.164 format). REQUIRED when using pageToken for pagination.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxResults
Maximum number of calls to return after filtering (default: 100, max: 100 when using pagination).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAfter
Optional: filter calls created after this ISO 8601 datetime with offset (e.g. '2026-05-19T00:00:00Z').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdBefore
Optional: filter calls created before this ISO 8601 datetime with offset (e.g. '2026-05-20T00:00:00Z').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pageToken
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.
Clear enough to supply this argument.
conversationPageToken
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.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "fetch-missed-calls",
"description": "Fetch missed incoming calls for a Quo inbox, each enriched with the voicemail the caller left (transcript + recording URL) when there is one. Returns calls with an explicit unanswered status ('missed', 'no-answer', or 'abandoned') and calls Quo reports as 'completed' even though they have zero call duration and no human or AI answer signal. This fixed classification is not configurable. 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. This tool makes many API requests per call. Run it sequentially — let one call finish before starting another, including for a different inbox — since several running at once can hit rate limits and return incomplete results. 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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"inboxPhoneNumber"
],
"properties": {
"pageToken": {
"type": "string",
"description": "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."
},
"maxResults": {
"type": "number",
"default": 100,
"description": "Maximum number of calls to return after filtering (default: 100, max: 100 when using pagination)."
},
"createdAfter": {
"type": "string",
"format": "date-time",
"description": "Optional: filter calls created after this ISO 8601 datetime with offset (e.g. '2026-05-19T00:00:00Z')."
},
"createdBefore": {
"type": "string",
"format": "date-time",
"description": "Optional: filter calls created before this ISO 8601 datetime with offset (e.g. '2026-05-20T00:00:00Z')."
},
"inboxPhoneNumber": {
"type": "string",
"description": "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."
},
"conversationPageToken": {
"type": "string",
"description": "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."
},
"participantPhoneNumber": {
"type": "string",
"description": "Optional: specific other-party phone number to filter calls (E.164 format). REQUIRED when using pageToken for pagination."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description99/100
Fetch message history for a Quo inbox. Two modes:
• Single thread (`participantPhoneNumber` for one contact, or `participantPhoneNumbers` for a group thread) — DEPTH: returns that thread'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; in a GROUP thread the `participant` column is the message's sender — the external number for an incoming message, or the Quo user ID (US…) of the teammate who sent an outgoing one (resolve US… IDs with `list-users`). A group thread is matched by its EXACT participant set, so pass every other member — whole-inbox results list each group's members on its header. 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. Single-thread queries always return the thread's history even when its conversation is marked done.
• Whole inbox (no participant filter) — BREADTH: returns the most-recent messages for EVERY conversation with messages in the window, grouped by conversation (up to 10 messages each), so a daily-summary query never silently drops a contact. Set `createdAfter` to the start of the period the user asked about: the tool then reads every message in that window and represents every conversation in it. Without `createdAfter` it reads only the inbox's 1,000 most recent messages. A group thread is its own conversation, headed `Group: <members>`, and its rows carry an extra sender column (`id | sender | direction | timestamp | text`). Set `excludeDoneConversations` to true when the user wants only conversations that are still active in the inbox; omit it to include done conversations. Each conversation ID (CN…) is on its header for `create-task` linking. A conversation with more than 10 in-window messages is flagged (`[more than 10 …]`) with the exact parameter to fetch its full thread. If the read stops early — no `createdAfter`, or a window too large to read in one call — an `[incomplete: …]` line says where it stopped and a `[next_conversations: …]` token continues it via `conversationPageToken`. `maxResults` is ignored in this mode. 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. This tool makes many API requests per call. Run it sequentially — let one call finish before starting another, including for a different inbox — since several running at once can hit rate limits and return incomplete results. 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.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inboxPhoneNumber
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.
Clear enough to supply this argument.
participantPhoneNumber
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
participantPhoneNumbers
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
excludeDoneConversations
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.
Clear enough to supply this argument.
maxResults
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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdAfter
Optional: filter messages created after this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
createdBefore
Optional: filter messages created before this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z').
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userId
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.
Clear enough to supply this argument.
pageToken
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.
Clear enough to supply this argument.
conversationPageToken
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.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "fetch-messages",
"description": "Fetch message history for a Quo inbox. Two modes:\n\n• Single thread (`participantPhoneNumber` for one contact, or `participantPhoneNumbers` for a group thread) — DEPTH: returns that thread'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; in a GROUP thread the `participant` column is the message's sender — the external number for an incoming message, or the Quo user ID (US…) of the teammate who sent an outgoing one (resolve US… IDs with `list-users`). A group thread is matched by its EXACT participant set, so pass every other member — whole-inbox results list each group's members on its header. 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. Single-thread queries always return the thread's history even when its conversation is marked done.\n\n• Whole inbox (no participant filter) — BREADTH: returns the most-recent messages for EVERY conversation with messages in the window, grouped by conversation (up to 10 messages each), so a daily-summary query never silently drops a contact. Set `createdAfter` to the start of the period the user asked about: the tool then reads every message in that window and represents every conversation in it. Without `createdAfter` it reads only the inbox's 1,000 most recent messages. A group thread is its own conversation, headed `Group: <members>`, and its rows carry an extra sender column (`id | sender | direction | timestamp | text`). Set `excludeDoneConversations` to true when the user wants only conversations that are still active in the inbox; omit it to include done conversations. Each conversation ID (CN…) is on its header for `create-task` linking. A conversation with more than 10 in-window messages is flagged (`[more than 10 …]`) with the exact parameter to fetch its full thread. If the read stops early — no `createdAfter`, or a window too large to read in one call — an `[incomplete: …]` line says where it stopped and a `[next_conversations: …]` token continues it via `conversationPageToken`. `maxResults` is ignored in this mode. 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. This tool makes many API requests per call. Run it sequentially — let one call finish before starting another, including for a different inbox — since several running at once can hit rate limits and return incomplete results. 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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"inboxPhoneNumber"
],
"properties": {
"userId": {
"type": "string",
"description": "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."
},
"pageToken": {
"type": "string",
"description": "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."
},
"maxResults": {
"type": "number",
"default": 100,
"description": "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."
},
"createdAfter": {
"type": "string",
"format": "date-time",
"description": "Optional: filter messages created after this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z')."
},
"createdBefore": {
"type": "string",
"format": "date-time",
"description": "Optional: filter messages created before this ISO 8601 datetime with offset (e.g. '2024-01-01T00:00:00Z')."
},
"inboxPhoneNumber": {
"type": "string",
"description": "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."
},
"conversationPageToken": {
"type": "string",
"description": "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."
},
"participantPhoneNumber": {
"type": "string",
"description": "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."
},
"participantPhoneNumbers": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 10,
"minItems": 1,
"description": "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."
},
"excludeDoneConversations": {
"type": "boolean",
"default": false,
"description": "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."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01List tasks in the Quo workspace
02List contactsList contacts in the Quo workspace, optionally filtered by `externalIds` or `sources`.
03List the users (members) in the Quo workspace
04Fetch message history for a Quo inbox
05Get contactFetch a single Quo contact by ID, including its default fields (name, company, role, email, phone) and any custom fields configured on the workspace.
Want to run these tasks against your MCP server with us?
Quo setup, tools, quality score, publishing readiness, and alternatives.
How do I add Quo to Claude, ChatGPT, or Cursor?
Add Quo to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.quo.com/mcp. This server requires OAuth, so complete the login prompt after you connect.
Is Quo MCP ready for ChatGPT and Claude?
As of November 7, 2026, Quo scores 90/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and does not yet meet Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Quo's MCP tool documentation?
As of November 7, 2026, Quo scores 68/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 34 of 34 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What tools does the Quo MCP server provide?
Quo provides these MCP tools: send-message, create-contact, update-contact, fetch-call-transcripts, fetch-messages, list-users, list-inboxes, list-contacts, and get-contact.
What are the best alternatives to Quo?
As of November 10, 2026, alternatives to Quo in communication on the Manufact MCP leaderboard include Granola, Cooper Email, Dial, Primitive Email, and Salvy.
Does Quo MCP require authentication?
Quo requires authentication. Connect it in Claude, ChatGPT, or Cursor and complete the OAuth login prompt.
How can Quo improve its MCP documentation?
list-inboxes is the lowest-scoring reviewed tool at 58/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Who develops Quo?
Quo is developed by Quo. It is listed as partner on the Claude connector directory.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.