CommSyncdocs
Open app
Developers

MCP server

Connect AI agents to CommSync over the Model Context Protocol — every inbox, contact, label, and channel action available as a tool, scoped to your API key.

For developers

CommSync speaks the Model Context Protocol. Point an MCP-capable agent (Claude Desktop, a custom client, or your own integration) at the endpoint with an API key. It can then read threads, send messages, manage contacts and labels, and more. The key owner's user and org role scope every operation it performs.

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. Authenticate with a csk_… key as a bearer token.

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
AuthAuthorization: Bearer csk_…

Authorization model

Every request resolves your key to (userId, orgId, role, accessibleChannels). Each tool sits behind one of four 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   owner / admin   owner only

  • any member — any user with org membership.
  • channel access — you must have access to the channel involved.
  • 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

An API key can be fine-tuned to specific lines instead of your full channel access. When you create (or edit) a key in Settings, then API Keys, choose Specific lines. Pick the email addresses and phone numbers it can touch.

The server then intersects your live channel access with the key's allowlist on every request. A scoped key 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.

Tool catalog

Threads

Org-scoped reads (filtered by channel access); mutations write only your own per-user view state.

ToolAccessKindDescription
list_threadschannel accessreadList threads visible to you
get_thread_summarychannel accessreadSingle-thread summary in list-row shape
get_thread_messageschannel accessreadPaginated messages for a thread
mark_thread_readchannel accesswriteClear your unread count
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)
delete_threadchannel accessdestructiveHide the thread from your view; the org keeps its copy
restore_threadchannel accesswriteRestore a soft-deleted thread
delete_messagechannel accessdestructiveHide a message from you
hard_delete_threadowner / admindestructivePermanently delete the shared thread and messages

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
send_emailchannel accesswriteReply on a current email thread
compose_smschannel accesswriteStart a new SMS conversation
compose_emailchannel accesswriteStart a new email conversation
forward_messagechannel accesswriteForward a message to a new recipient
resend_failed_messagechannel accesswriteRetry a failed outbound message
get_send_capacitychannel accessreadSustainable send rate per line, plus any active rate-limit pause

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": "JustCall",
    "sustainedPerMinute": 54,
    "rateLimited": true,
    "reason": "JustCall 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.

Channel management

ToolAccessKindDescription
list_email_accountschannel accessreadList email-account channels you can see
add_email_accountany memberwriteLink an IMAP/SMTP mailbox to the org
delete_email_accountowner / admindestructiveRemove an email account
test_email_accountchannel accessreadTest stored IMAP/SMTP credentials
list_phone_numberschannel accessreadList phone-number channels you can see
add_phone_numberany memberwriteLink a phone number to the org
delete_phone_numberowner / admindestructiveRemove a phone number

Billing

ToolAccessKindDescription
get_billing_stateany memberreadTier, status, seats, caps, usage
change_tierowner onlywriteSwap subscription tier (prorates)
set_seatsowner onlywriteSet the paid seat quantity (prorates)
seats_previewowner onlyreadDry-run a prorated seat change

Contacts

The contact graph is private per user — these never leak across users.

ToolAccessKindDescription
list_contactsany memberreadList your contacts
get_contactany memberreadA contact, with identities and labels
create_contactany memberwriteCreate a new contact
update_contactany memberwriteUpdate the display name or notes
delete_contactany memberdestructiveDelete a contact; identities orphan
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 AI configuration
update_ai_settingsany memberwriteUpdate AI configuration
get_todays_digestany memberreadToday's daily digest (or a date)
list_digestsany memberreadRecent daily digests
dismiss_digestany memberwriteMark a digest dismissed
trigger_digest_runany memberwriteRun a digest now
list_ai_runsany memberreadRecent AI activity entries
test_ai_connectivityany memberreadCheck that CommSync has AI configured
trigger_inbox_backfillany memberwriteClassify historical senders into Promotions or Spam

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 (old valid 24h)
delete_webhookany memberdestructiveDelete an endpoint + its history
list_webhook_deliveriesany memberreadPaginated delivery log
resend_webhook_deliveryany memberwriteRetry a delivery

Where CommSync Agents fit in

CommSync Agents are the AI teammates that answer inbound texts and email. You configure and manage them through the app or the REST admin API, not through this MCP tool catalog. See Agents for details.

There is deliberately no MCP tool that lets an external agent create, reconfigure, or approve turns for a CommSync Agent. Use send_sms or send_email above to have your own integration reply directly instead.

Resources

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

commsync://threads/{threadId}/messages   — messages in a thread
commsync://contacts/{personId}            — a contact's detail
commsync://digests/{localDate}            — the AI digest for a date

Common workflows

Triage the inbox

list_threadsget_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.

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.

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

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.