CommSyncdocs
Open app
Developers

MCP server

Connect AI apps and agents to CommSync over the Model Context Protocol — every inbox, contact, label, and channel action available as a tool. Sign in with OAuth, or use an API key.

For developers

CommSync speaks the Model Context Protocol. Point an MCP-capable app or agent at the endpoint. It can then read threads, send messages, manage contacts and labels, and more.

There are two ways to authenticate, and both reach the same tools:

  • OAuth 2.1 is the primary way. The app signs you in with no shared secret. See Connect AI apps.
  • An API key is the alternative for scripts and servers. Send it as a Bearer token. See API keys.

OAuth is how Claude, ChatGPT, Codex, Cursor, and VS Code connect.

The signed-in user and their org role scope every operation.

Agent access follows your role

Looking for the machine-readable version?

Agents can fetch /docs/mcp.txt for the same catalog as plain text with full parameter details — one request, no scraping.

Connect

The server is a single stateless HTTP endpoint. To connect an AI app, paste the endpoint URL into the app and sign in. The Connect AI apps page has a guide for each app.

To call the endpoint from your own code with an API key:

Mint an API key

In CommSync, open Settings → API Keys and create a key. CommSync shows it once — store it securely. See API keys.

Call the endpoint

POST JSON-RPC to the /api/mcp route on your CommSync API origin.

curl -X POST "$COMMSYNC_API/api/mcp" \
  -H "Authorization: Bearer csk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Call a tool

Use tools/call with the tool name and its arguments.

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": { "name": "list_threads", "arguments": { "limit": 20 } }
}
EndpointPOST /api/mcp (on your CommSync API origin)
TransportHTTP, stateless — one request per call
AuthOAuth 2.1 access token, or Authorization: Bearer csk_…

Authentication

OAuth 2.1

CommSync is its own authorization server. A client needs only the endpoint URL, because it discovers everything else:

  1. A request with no token gets 401 and a WWW-Authenticate header. The header names the protected-resource metadata (/.well-known/oauth-protected-resource/api/mcp, RFC 9728).
  2. That document names the authorization server. Its metadata is at /.well-known/oauth-authorization-server (RFC 8414).
  3. The client registers, sends you to the consent screen, and exchanges the code for tokens.
GrantAuthorization code with PKCE (S256 only)
Client registrationDynamic registration at POST /oauth/register (RFC 7591), or a Client ID Metadata Document: an https URL as the client_id
Client authenticationnone (public clients), client_secret_post, client_secret_basic
Scopemcp (the default when you omit scope)
ResourceThe endpoint URL (RFC 8707). CommSync binds each token to it
Access tokencsat_…, valid for one hour
Refresh tokencsrt_…, valid for 90 days. It rotates on every use. For 30 seconds after a use, the same token gets the same new pair again, for a client that refreshes twice at once. After that, a used token revokes its token family
RevocationPOST /oauth/revoke (RFC 7009)

The authorization response carries iss (RFC 9207). A loopback redirect (http://127.0.0.1, http://localhost, http://[::1]) can use any port.

A code is single-use. A second exchange that passes the PKCE check revokes the tokens that the first exchange issued. CommSync refuses a second exchange without the right verifier, and that exchange changes nothing.

API key

Send Authorization: Bearer csk_…. A key does not expire, and you revoke it under Settings, in API keys. A key suits a script or a server-side agent.

Authorization model

Every request resolves your credential (an OAuth token or an API key) to (userId, orgId, role, accessibleChannels). Each tool sits behind one of five gates. The server rejects a call that exceeds your access before anything happens.

any member any user in the org   channel access needs access to the relevant channel   agents access   owner / admin   owner only

  • any member — any user with org membership.
  • channel access — you must have access to the channel involved.
  • agents access — owners and admins, and members when the workspace lets members use Agents.
  • owner / admin — reserved for org owners and admins.
  • owner only — the single workspace owner (for example, billing).

Owners and admins have channel access implicitly; members get it per channel — see Roles & permissions.

CommSync also tags tools by effect: read (no change), write (mutates), or destructive (removes data — use with care).

Channel-scoped keys and apps

An API key or a connected app can be fine-tuned to specific lines instead of your full channel access. For a key, choose Specific lines when you create or edit it under Settings, in API keys. For an app, choose it on the consent screen. You can change it later under Settings, in Connect AI apps. Pick the email addresses and phone numbers it can touch.

The server then intersects your live channel access with the allowlist on every request. A scoped key or app can only read, send, and act on the chosen lines. Threads on other channels are invisible to it, and CommSync refuses sends from other channels. Channel listings only show what is in scope.

  • The default is All channels: the key follows your live access.
  • This includes lines you connect later; CommSync migrated pre-existing keys this way.
  • A scoped key never out-privileges you.
  • If you lose access, or someone deletes the line, it drops from the key's scope too.
  • Per-user surfaces (contacts, labels, AI, webhooks, profile) do not belong to a channel, so scope does not affect them.
  • The agent tools show only the agents, turns, and threads on the chosen lines.
  • They pause or activate only an agent with every line in scope. They do not return the agent stats.

Security details

Each key and each app has one more setting: Security details. It decides how much of your account security mail the key or app reads. You set it on the consent screen. To change it later, click the key under API keys or the app under Connect AI apps.

SettingSecurity eventsOne-time codeBody of a security message
Full (default)The event, the service, the time, and the device and place the mail statesAs you see itAs you see it
RedactedThe event and the time only. The service reads "an account", and no sender showsNot returnedReads "[security message withheld]". The sender and the text of a file on that message read the same, and a download is refused

Choose Redacted for a key that a script or a shared tool holds. No setting ever returns a link, a token, or a code from a security event, because CommSync never stores one.

Tool catalog

Threads

Reads follow your channel access and return a compact shape for an AI app. A message carries its plain-text body, the sender, the attachments, the call details, and your read and star state. It also carries the identityId of the other party, which send_sms and send_email take. CommSync cuts a body longer than maxBodyChars (default 4,000 characters) and sets truncated: true. The HTML body of an email comes back only when you set includeHtml: true.

Every action changes only your own view of the thread, and your open web and iPhone apps show the change at once. An action works on every thread that list_threads shows you, also a thread on a line that an owner removed. On a line that you connected with Google sign-in, the read, archive, spam, Trash, restore, and star actions also change Gmail. Only a key or app with access to all channels does this.

ToolAccessKindDescription
list_threadschannel accessreadList threads visible to you, as compact rows
get_thread_summarychannel accessreadOne thread in the compact row shape
get_thread_messageschannel accessreadPaginated messages for a thread, in the compact shape
get_messagechannel accessreadOne message by id, in the compact shape
get_unread_countschannel accessreadThe count of unread threads in each folder
mark_thread_readchannel accesswriteClear your unread count on the thread and the other chains of the contact
mark_thread_unreadchannel accesswriteForce a thread unread for you
archive_threadchannel accesswriteArchive (per-user)
unarchive_threadchannel accesswriteUnarchive (per-user)
mark_thread_spamchannel accesswriteMove to Spam (per-user)
mark_thread_promotionschannel accesswriteMove to Promotions (per-user)
mark_thread_automatedchannel accesswriteMove to Automated Messages — non-human mail (per-user)
move_thread_to_inboxchannel accesswriteClear bucket flags (per-user)
snooze_threadchannel accesswriteSnooze until a timestamp (per-user)
unsnooze_threadchannel accesswriteClear a snooze (per-user)
mute_threadchannel accesswriteMute: new messages no longer raise your unread count
unmute_threadchannel accesswriteUnmute
delete_threadchannel accessdestructiveMove the thread to your Trash; teammates keep it
restore_threadchannel accesswriteRestore a thread from your Trash
hard_delete_threadchannel accessdestructiveDelete a thread permanently from your Trash. While a teammate still has it, only your view goes. Otherwise CommSync deletes the thread and removes the email from the mail server
bulk_update_threadschannel accessdestructiveOne action on up to 100 threads: read, unread, archive, unarchive, trash, restore, inbox, spam, promotions, or automated
mark_message_readchannel accesswriteMark one message read for you
mark_message_unreadchannel accesswriteMark one message unread for you
star_messagechannel accesswriteStar one message for you
unstar_messagechannel accesswriteRemove the star from one message
delete_messagechannel accessdestructiveHide a message from you

Outbound sends

CommSync enforces channel access before any send. Compose and forward also need at least one accessible channel of the right kind.

ToolAccessKindDescription
send_smschannel accesswriteReply on a current SMS thread, with optional pictures (MMS)
send_emailchannel accesswriteReply on a current email thread, with optional Cc, Bcc, files, and reply-all
compose_smschannel accesswriteStart a new SMS conversation
compose_emailchannel accesswriteStart a new email conversation, with optional Cc, Bcc, and files
forward_messagechannel accesswriteForward a message to a new recipient
resend_failed_messagechannel accesswriteRetry a failed outbound message
list_scheduled_messageschannel accessreadYour scheduled sends that have not gone out
reschedule_messagechannel accesswriteMove a scheduled send to a new time
cancel_scheduled_messagechannel accessdestructiveStop a scheduled send before it goes out
get_send_optionschannel accessreadThe lines that can reply on a thread, and whether a group reply works
upload_attachmentany memberwriteStore one file and get an id for a send or a draft
get_send_capacitychannel accessreadSustainable send rate per line, plus any active rate-limit pause

Group threads and reply-all

A group thread has more than one other person in it. On a group thread, leave identityId out.

SMS. send_sms sends one text to every member, from the line of the group. Some phone platforms cannot send a text to a group. On those lines the tool answers GROUP_SEND_UNSUPPORTED with the app to reply in, and sends nothing. It never sends a private text to one member.

Email. send_email answers the latest inbound sender and copies everyone else. On a 1:1 thread, set replyMode to REPLY_ALL to do the same. CommSync then reads To and Cc from the message you answer, and leaves out your own mailbox. inReplyToMessageId picks that message.

Call get_send_options first to see the lines that can reply and whether a group reply can reach every member.

Files and scheduled sends

upload_attachment takes one file as base64 text and returns an id. Pass the ids in attachmentIds of send_email, compose_email, forward_message, send_sms, or compose_sms. A text takes images only, at most 10 files and 5 MB in total. The limit of 25 MB for a request applies to the base64 text, so one file can be about 18 MB. CommSync deletes a file that no send or draft uses within 24 hours. A file type that can run a program, such as .exe, .js, or .sh, gets the error FILE_TYPE_BLOCKED.

send_sms, send_email, compose_sms, and compose_email take scheduledFor, a future time with a UTC offset, such as 2026-10-05T09:00:00-04:00. The message waits with the status SCHEDULED. list_scheduled_messages lists your scheduled sends. reschedule_message moves one, and cancel_scheduled_message stops one. A stopped send stays on the thread as failed, so resend_failed_message can still send it.

Email bodies

send_email and compose_email take two body fields: bodyText and bodyHtml. Give one of them or both. A call with neither fails before CommSync sends anything.

Plain text alone is fine. CommSync builds the HTML part from bodyText. It escapes the text, keeps the line breaks, and turns each http:// or https:// link into a clickable link. When you give bodyHtml, CommSync sends your HTML unchanged. When you give only bodyHtml, CommSync makes the plain-text part from it. The account signature and the "Sent from CommSync" footer, when they are on, go after your text in both parts.

Rate limits never reach you

CommSync accepts every authorised send and owns delivery from that point on — this covers carrier and mail-host rate limits too. Send tools do not return 429 and never ask you to retry. When a provider throttles us the message stays queued, backs off, and goes out on its own.

Every send tool returns a receipt that describes where the message actually is:

{
  "accepted": true,
  "messageId": "cm9x…",
  "threadId": "cm7a…",
  "state": "waiting_on_line",
  "estimatedSendAt": "2026-07-29T18:41:12.000Z",
  "pacing": {
    "provider": "<platform name>",
    "sustainedPerMinute": 54,
    "rateLimited": true,
    "reason": "<platform name> rate limit — waiting 45s"
  }
}

state is one of dispatching, waiting_on_line, scheduled, sent, or failed. Never call a send tool twice for the same message — CommSync has already queued a waiting_on_line message and will deliver it.

Before a bulk run, call get_send_capacity for the sustainable rate on each line you can send from. If you exceed it, that is safe — messages queue rather than fail; they simply take longer to go out.

Retry safely with an idempotency key

A call can time out, or the connection can drop, after CommSync has already accepted the message. A plain retry then sends a second copy. To prevent that, give each message an idempotencyKey. The key is a string of 1 to 200 characters that you choose. A UUID works well.

send_sms, send_email, compose_sms, compose_email, and forward_message all take the key. When you call a tool again with a key that you already used, CommSync sends nothing. It returns the receipt of the first message, with "deduplicated": true.

{
  "to": "maya.chen@northwind.example",
  "subject": "Your lab results",
  "bodyText": "Hi Maya, your report is ready.",
  "idempotencyKey": "6f1c2a9e-3b7d-4e2a-9c55-0d8e41b7a3f2"
}
  • Use a new key for each new message. A reused key returns the old message, even with new text.
  • Your keys are private to your account. A teammate who picks the same key gets their own message, never yours.
  • Without a key, each call sends a new message.

Channel management

ToolAccessKindDescription
list_email_accountschannel accessreadList email-account channels you can see, with how each signs in and its history import
add_email_accountany memberwriteLink an IMAP/SMTP mailbox to the org with a password and start its sync. Set importHistoryDays to also import older mail. A Microsoft mailbox connects only in Settings
delete_email_accountowner / admindestructiveRemove an email account. CommSync also revokes a Google sign-in grant at Google
test_email_accountchannel accessreadTest stored IMAP/SMTP credentials
list_phone_numberschannel accessreadList phone-number channels you can see
add_phone_numberany memberwriteLink a number that you already have at an SMS provider, on a connected provider account, and classify its past senders. CommSync does not sell numbers
delete_phone_numberowner / admindestructiveRemove a phone number. Its messages and conversations stay. The page of each platform says what CommSync clears at that platform

Billing

ToolAccessKindDescription
get_billing_stateany memberreadThe state of the Plan & billing page: tier, provider, seats, trial, caps, usage, credits
change_tierowner onlywriteChange the tier of a card-billed plan (prorates)
set_seatsowner onlywriteSet the paid seat count of a card-billed plan (prorates). A new member adds a seat by itself
seats_previewowner onlyreadDry-run a prorated seat change

Contacts

The contact graph is private per user — these never leak across users. A contact that a teammate shares with you opens with get_contact and list_contact_threads, without its owner’s notes.

ToolAccessKindDescription
list_contactsany memberreadList your contacts, one page at a time
get_contactany memberreadA contact, with its channels and your permissions. Your own contact also lists its labels and details
list_contact_threadsany memberreadEvery conversation with a contact: 1:1 and group, SMS and email
create_contactany memberwriteCreate a new contact
update_contactany memberwriteRename a contact or change its notes. A rename becomes the title of its conversations
delete_contactany memberdestructiveDelete your contact; its channels become unnamed contacts again
merge_contactsany memberdestructiveMerge whole contacts into one survivor; CommSync deletes the sources
merge_identitiesany memberwriteMerge two identities under one contact
split_identityany memberwriteDetach an identity into an orphan
attach_identity_to_contactany memberwriteAttach an orphan to a contact
promote_identity_to_contactany memberwritePromote an orphan into a new contact

Identities

ToolAccessKindDescription
get_identityany memberreadAn identity and its contact
update_identity_notesany memberwriteEdit per-channel notes
list_orphaned_identitiesany memberreadIdentities not yet attached to a contact
list_all_identitiesany memberreadEvery identity you own

Labels

ToolAccessKindDescription
list_labelsany memberreadList labels with usage counts
create_labelany memberwriteCreate a label (name and hex color)
update_labelany memberwriteUpdate the name, color, or AI prompt
delete_labelany memberdestructiveDelete a label everywhere
assign_labelany memberwriteApply a label to a contact or identity
unassign_labelany memberwriteRemove a label

AI

ToolAccessKindDescription
get_ai_settingsany memberreadRead your AI settings and the workspace spend cap
update_ai_settingsany memberwriteChange your AI settings. It takes the fields of the AI page in Settings
get_todays_digestany memberreadThe newest Daily Brief, or the brief of a date
list_digestsany memberreadThe Daily Brief archive, one page at a time
dismiss_digestany memberwriteMark a digest dismissed
trigger_digest_runany memberwriteRun a digest now. At most 10 runs an hour, counted together with the runs you start in the app
list_ai_runsany memberreadRecent AI activity entries
trigger_inbox_backfillany memberwriteClassify historical senders into Promotions or Spam

Attachments

These tools read the files on messages you can read. A key or app limited to some lines reads only the files on those lines.

ToolAccessKindDescription
get_attachmentchannel accessreadFile details and one page of its text (PDF text, image text, document contents)
download_attachmentchannel accessreadThe file as base64, for a file of 5 MB or less
search_attachmentschannel accessreadSearch files by name, by their text, or by document kind
semantic_searchchannel accessreadSearch messages and file text by meaning. Each call uses a small amount of AI credits

Message entities

The bills, invoices, receipts, subscriptions, shipments, reservations, deadlines, phone numbers, addresses, people, and security events that CommSync read out of your messages. get_message and get_thread_messages also return them on each message. The security details setting applies.

ToolAccessKindDescription
search_entitieschannel accessreadFind items by kind, sender, date, and paid status, with totals per kind and currency

Mailing lists

The mailing lists and marketing text senders that mail your lines. An unsubscribe applies to the whole line and needs send authority on it. CommSync never unsubscribes from a message with a caution strip or a spam verdict, and these tools never send a STOP text. See Unsubscribe from mailing lists.

ToolAccessKindDescription
list_mailing_listschannel accessreadThe lists that mail your lines, sorted by mail in 30 days, with weekly counts and the unsubscribe state
unsubscribe_mailing_listchannel accesswriteUnsubscribe the line of one message: one-click, else an email from the line, else the web page for a person to finish

Search, account & webhooks

ToolAccessKindDescription
searchany memberreadSearch contacts, identities, messages
search_threadsany memberreadFull thread-centric search: every conversation that matches a query, ranked and paginated, with match snippets
get_profileany memberreadYour profile (id, email, name)
update_profileany memberwriteUpdate your display name
list_webhooksany memberreadList your webhook endpoints
get_webhookany memberreadA single endpoint
register_webhookany memberwriteCreate an endpoint (returns secret once)
update_webhookany memberwritePatch url / events / mode / status
rotate_webhook_secretany memberwriteRotate the signing secret. For 24 h the old secret also signs, as an extra v1= part (Webhooks)
delete_webhookany memberdestructiveDelete an endpoint + its history
list_webhook_deliveriesany memberreadPaginated delivery log
resend_webhook_deliveryany memberwriteRetry a delivery

Drafts

A draft is your own unsent email or SMS. A draft never sends. You send it from the app, or the AI app sends the message with a send tool and then deletes the draft. A key or app limited to some lines sees only the drafts on those lines.

ToolAccessKindDescription
list_draftsany memberreadYour drafts, newest first, with a short preview
get_draftany memberreadOne draft: recipients, subject, plain-text body, line, attachments
get_thread_draftchannel accessreadYour reply draft on one conversation
save_draftany memberwriteCreate or update a draft of a new message or a reply. Sends nothing
delete_draftany memberdestructiveDelete one draft

Notes

Your private note and checklist on one conversation. Teammates never see it.

ToolAccessKindDescription
get_thread_notechannel accessreadThe note text, color, and checklist
update_thread_notechannel accesswriteSet the note text or color
add_note_itemchannel accesswriteAdd a checklist item
update_note_itemchannel accesswriteEdit an item, or mark it done
delete_note_itemchannel accessdestructiveDelete a checklist item

Home

Your to-dos and the two reply lists of Home, as Home shows them.

ToolAccessKindDescription
list_todosany memberreadYour to-dos by status (open by default)
create_todoany memberwriteAdd a to-do, on a conversation or on its own
update_todoany memberwriteMark a to-do done, dismiss it, reopen it, or edit it
list_waitingany memberreadThe two reply lists: Waiting on you and Waiting on them
dismiss_waitingchannel accesswriteTake a conversation off the two reply lists until a newer message

Team comments

Team comments on one conversation. The customer never sees them. The rules are the rules of the app: any share permit reads, and VIEW or above writes, except a shared-contact VIEW permit, which only reads. An @mention must name a teammate who can read the conversation, and that teammate gets the same email as from the app.

ToolAccessKindDescription
list_thread_commentschannel accessreadDiscussions, the teammates you can @mention, and your permit
post_thread_commentchannel accesswriteStart a discussion
reply_to_commentchannel accesswriteReply in a discussion
edit_commentchannel accesswriteEdit your own comment
delete_commentchannel accessdestructiveDelete your own comment, or any comment as a manager
resolve_commentchannel accesswriteResolve or reopen a discussion
pin_commentchannel accesswritePin or unpin a comment
react_to_commentchannel accesswriteAdd or remove your emoji reaction

Teams and shared contacts

These tools only read. A team or a shared contact can give teammates access to conversations, so members, permits, transfers, and coverage decisions stay in the app. A team never shows a conversation that you cannot already read.

ToolAccessKindDescription
list_teamsany memberreadTeams you hold a permit on
get_teamany memberreadOne team: contacts, lines, members, permits
list_team_threadschannel accessreadThe team's conversations that you can read
list_shared_contactsany memberreadShared contacts you hold a permit on
get_shared_contactany memberreadOne shared contact: addresses, members, permits
list_shared_contact_threadschannel accessreadThe conversations you can read through one shared contact

Agents

Agents are the AI teammates that answer inbound texts and email. An AI app can do everything that the Agents pages do: build an agent, give it knowledge and tools, test it, and supervise it. The tables below split the tools by job.

The permission rules are the rules of the app:

  • Every agent tool needs agents access. Owners and admins always have it.
  • Members have agents access when the workspace lets members use agents.
  • A member sees only the activity on the lines they hold.
  • To change, test, pause, or activate an agent, a member needs every line of that agent.
  • A key or an app limited to some lines follows the same line rule.
  • A key or an app limited to some lines can read knowledge, webhook tools, and MCP connections. It cannot change them.
  • A key or an app limited to some lines cannot create or delete an agent.
  • The approval queue is for owners and admins.
  • Anyone who can see a conversation can take it over.
  • No tool returns a secret or a credential.
  • The one exception is the signing secret of a webhook tool.
  • You get the signing secret once, when you create or rotate it.

The first table is for supervision.

ToolAccessKindDescription
list_agentsagents accessreadYour agents, with status, mode, safety level, and lines
get_agentagents accessreadThe setup of one agent, with no secrets
list_agent_turnsagents accessreadThe activity of one agent, newest first
get_agent_statsagents accessreadOutcome counts and AI spend for each agent
get_thread_agent_statuschannel accessreadThe agent of a conversation, and whether a person took it over
list_pending_agent_repliesowner / adminreadDrafts that wait for approval
approve_agent_replyowner / admindestructiveSend a draft as written or edited. Takes an idempotencyKey
reject_agent_replyowner / adminwriteReject a draft. CommSync sends nothing
list_agent_escalationsowner / adminreadConversations an agent handed to a person
resolve_agent_escalationowner / adminwriteTake an escalation out of the queue
take_over_threadchannel accesswriteNo agent on the line replies in this conversation until you hand it back
hand_thread_back_to_agentschannel accesswriteEnd a takeover
pause_agentagents accesswritePause an agent on all of its lines
activate_agentagents accessdestructiveTurn an agent on. In Supervised or Automatic mode it then sends by itself

Agent setup

ToolAccessKindDescription
create_agentagents accesswriteCreate an agent in Draft status with no lines. templateKey picks the starter goals for its kind. Not for a key or an app limited to some lines
update_agentagents accesswriteChange the persona, rules, reply style, mode, safety level, limits, quiet hours, group email, or footer of an agent
delete_agentagents accessdestructiveDelete an agent with its activity, memories, and opt-outs. You cannot undo it
set_agent_lineschannel accesswriteReplace the full list of lines that one agent answers on
update_agent_lineagents accesswriteSet the work that an agent does, and never does, on one of its lines
draft_agent_instructionsagents accesswriteWrite first-draft instructions from a name, a role, and a brief. Uses AI credits
draft_agentagents accesswriteDraft a whole agent from a description: the name, the instructions, the kind, tests, and goals. Saves nothing. Uses AI credits
list_line_routingagents accessreadEach line with agents: tasks, default agent, no-match policy, and never-reply policy
set_line_routingchannel accesswriteSave the default agent, the no-match policy, the never-reply policy, and the agent tasks of one line
list_agent_versionsagents accessreadThe History of an agent: one version per save, newest first, with who, when, and what changed
get_agent_versionagents accessreadOne version of an agent, with its snapshot of the setup, settings, lines, tools, tests, and goals
restore_agent_versionagents accessdestructiveBring back the setup, the rules, the reply style, and the settings of an older version. Lines, tools, tests, and goals stay as they are
set_members_can_use_agentsowner / adminwriteTurn on or off the workspace setting that lets members use agents

Agent inspection

ToolAccessKindDescription
get_agent_turnagents accessreadOne turn with its step trace, route decision, safety reasons, and cost
list_agent_memoriesagents accessreadWhat one agent remembers about each contact
delete_agent_memoryagents accessdestructiveDelete what an agent remembers about one contact
list_agent_opt_outsagents accessreadThe phone numbers and addresses that one agent never answers
add_agent_opt_outagents accesswriteAdd a phone number or an email address that the agent never answers
remove_agent_opt_outagents accessdestructiveRemove a manual opt-out. An opt-out that the contact sent stays
list_conversation_variablesagents accessreadThe values that webhook tools stored on one conversation you can see

Agent test runs

A test run shows what an agent would do with a message, on a real conversation or one you type. It uses the same instructions, tools, and safety check as a real reply. CommSync sends nothing and writes nothing to the conversation. Each run uses AI credits like a real reply.

A saved test keeps a conversation and what passes, so you can run it again after each change to the agent. A test checks the next reply, a tool call, or a whole conversation with a simulated contact.

ToolAccessKindDescription
run_agent_test_turnagents accesswriteDo a dry run of an agent on a real or typed conversation. CommSync sends nothing
evaluate_agentagents accesswriteRun up to 10 test cases against one agent and report each pass or fail
list_agent_testsagents accessreadThe saved tests of one agent, each with its last result
create_agent_testagents accesswriteSave a test from a typed conversation or a copy of a real one
update_agent_testagents accesswriteChange the name, conversation, expectation, or stand-in results of a saved test
delete_agent_testagents accessdestructiveDelete one saved test
run_agent_testsagents accesswriteRun all or some saved tests 1, 3, or 5 times. Waits up to 45 seconds for the result
get_agent_test_runagents accessreadOne run of saved tests, or the newest, with each result and the failure groups

Agent analysis

After an agent conversation ends, a model judges the goals of the agent ("Did it book a visit?") and captures its fields ("Visit date", "Budget"). Set the goals and fields, try drafts on past conversations, and read each conversation with its outcome and results. Search the conversations of every agent with the filters of the Conversations view. Read a transcript, rate a conversation, or correct a result. Analyze again, or export a CSV file.

Set the alerts of an agent, and read or build its topics.

A key or an app limited to some lines sees only the conversations whose every thread is on its lines. It never sees a field marked sensitive. Only an owner or admin on a key or app with every line can export sensitive fields.

ToolAccessKindDescription
get_agent_analysisagents accessreadThe analysis settings, goals with their 30-day counts, and fields of one agent
update_agent_analysis_settingsagents accesswriteTurn analysis on or off, and set the depth, end windows, sample rate, and switches
create_agent_goalagents accesswriteAdd a goal: a question a model answers after each conversation
update_agent_goalagents accesswriteChange a goal. A change the judge reads starts a new version
delete_agent_goalagents accessdestructiveDelete a goal and its results
create_agent_fieldagents accesswriteAdd a field: a detail to capture from each conversation
update_agent_fieldagents accesswriteChange a field. A change the model reads starts a new version
delete_agent_fieldagents accessdestructiveDelete a field and its values
apply_agent_analysis_templateagents accesswriteAdd the goals and fields of a starter template
try_agent_analysisagents accesswriteTry draft goals or fields on up to 5 ended conversations. Saves nothing. Uses AI credits
list_agent_conversationsagents accessreadThe conversations of one agent, newest first, with the outcome, counts, and analysis
get_agent_conversationagents accessreadOne agent conversation with its goal results and captured fields
rerun_agent_analysisagents accesswriteAnalyze one ended conversation again. Uses AI credits
search_agent_conversationsagents accessreadSearch the conversations of every agent you can reach, with every filter of the Conversations view
get_agent_analysis_overviewagents accessreadThe numbers of the Analysis Overview for a range: totals against the period before, a time series, goals with judge agreement, fields, breakdowns, and tools
get_agent_conversation_transcriptagents accessreadThe messages of one conversation, with the agent steps between them
correct_agent_goal_resultagents accesswriteOverturn the judge for one goal of one conversation
correct_agent_field_valueagents accesswriteFix the captured value of one field of one conversation
rate_agent_conversationagents accesswriteYour rating, note, and thumbs on each agent reply
mark_agent_conversation_reviewedagents accesswriteMark one conversation reviewed, or take the mark away
rerun_agent_conversationsagents accesswriteAnalyze again every ended conversation that matches a filter. A dry run by default. Uses AI credits
export_agent_conversationsagents accessreadThe matching conversations as CSV text, at most 1,000 rows
list_agent_alertsagents accessreadThe alerts of one agent, with what each one watches and when it last fired
create_agent_alertagents accesswriteAdd an alert: a critical goal not met, a goal rate below a percent, or a detail that matches. It notifies owners and admins, never a contact
update_agent_alertagents accesswriteChange an alert, or turn it off
delete_agent_alertagents accessdestructiveDelete an alert
list_agent_topicsagents accessreadThe nightly topics of one agent, with the count, moods, and success rate of each
rebuild_agent_topicsowner / adminwriteBuild the topics of one agent now. Needs 10 analyzed conversations in the last 30 days. Uses AI credits

Knowledge

ToolAccessKindDescription
list_knowledge_sourcesagents accessreadThe documents and websites that agents and Ask answer from
search_knowledgeagents accessreadFind the passages of the knowledge base that answer a question. Each search uses a little of your AI credits
add_knowledge_websiteagents accesswriteAdd a public website. CommSync reads up to 30 pages for agents and Ask
add_knowledge_fileagents accesswriteAdd one document. Readable text only, at most 15 MB
add_knowledge_textagents accesswriteAdd plain text. CommSync stores it as a .txt document
delete_knowledge_sourceagents accessdestructiveDelete one knowledge source and its index for good
refresh_knowledge_sourceagents accesswriteRead a ready or failed source again. A website gets a new crawl
list_knowledge_pagesagents accessreadThe pages that CommSync read from one source, with passage counts
set_agent_knowledgeagents accesswriteReplace the knowledge sources that one agent answers from

Agent webhook tools

Webhook tools are the HTTP endpoints that an agent calls while it works on a reply.

ToolAccessKindDescription
list_webhook_toolsagents accessreadThe webhook tools of the workspace, with settings and health. No secret values
get_webhook_toolagents accessreadOne webhook tool, with settings and health. No secret values
create_webhook_toolagents accesswriteCreate a webhook tool. You get the signing secret one time
update_webhook_toolagents accesswriteChange one webhook tool, or turn it on or off
delete_webhook_toolagents accessdestructiveDelete one webhook tool and its secrets for good
test_webhook_toolagents accesswriteSend one real test request, or do a dry run. Shows the request and the response
rotate_webhook_tool_secretagents accesswriteMake a new signing secret. The old secret stops at once
set_agent_webhook_toolsagents accesswriteReplace the webhook tools that one agent can call

Agent MCP connections

These tools connect the external MCP servers that agents and Ask use.

ToolAccessKindDescription
search_mcp_catalogagents accessreadSearch the verified catalog of MCP servers. Shows the servers you already connected
list_mcp_connectionsagents accessreadThe external MCP connections of the workspace, or of one agent. No credentials
add_mcp_connectionagents accesswriteConnect a catalog server or a custom https server, with an optional bearer token
update_mcp_connectionagents accesswriteChange the name, the tool allowlist, the bearer token, or the status of a connection
test_mcp_connectionagents accesswriteConnect to the external server and list the tools it offers
start_mcp_sign_inagents accesswriteStart the OAuth sign-in. A person must open the returned link in a browser
sign_out_mcp_connectionagents accesswriteDelete the OAuth tokens of a connection. The connection and its allowlist stay
delete_mcp_connectionagents accessdestructiveDelete a connection and its credentials. Every agent loses its tools
set_agent_mcp_connectionsagents accesswriteReplace the connections that one agent uses, at most 10 for each agent

Resources

Beyond tools, the server exposes MCP resources for direct reads:

commsync://threads/{threadId}/messages   — the newest 200 messages, compact
commsync://contacts/{personId}            — a contact's detail
commsync://digests/{localDate}            — the AI digest for a date

Common workflows

Triage the inbox

list_threads → get_thread_messages(threadId) to read the latest.

Reply

get_thread_messages(threadId) to find the identity a message came in on → send_sms or send_email with that identityId. On a group thread, leave identityId out.

Merge a duplicate contact

list_orphaned_identities (or search) to find the stray identity → merge_identities(identityAId, identityBId) or attach_identity_to_contact(personId, identityId). For two whole contact records of the same human, confirm both with get_contact and call merge_contacts(survivorPersonId, sourcePersonIds) instead.

Work the agent approval queue

list_pending_agent_replies → read the draft → approve_agent_reply(turnId, body?, idempotencyKey) or reject_agent_reply(turnId). For a handover, call list_agent_escalations, reply in the thread yourself, then call resolve_agent_escalation(turnId).

React in real time

You do not have to call list_threads again and again. Register a webhook and call back into MCP only when an event fires.

Next

Connect an app in Connect AI apps, or create a key in API keys. Then wire up webhooks, so your agent reacts to messages and does not have to ask again and again. Full parameter reference: /docs/mcp.txt.