Sonny MCP
BetaGive AI tools a safe way to work in Sonny
Model Context Protocol is an open standard that lets compatible assistants discover and use Sonny actions with clear, machine-readable inputs. Claude and Cowork can connect with OAuth 2.1 and PKCE, then triage your inbox, share customer context, read reports, and send replies with files.
Remote MCP configuration
JSON{
"mcpServers": {
"sonny": {
"url": "https://www.usesonny.com/api/mcp"
}
}
}Configuration formats vary by client. Add the remote Streamable HTTP endpoint; compatible clients discover Sonny's OAuth setup automatically. Scoped API keys remain available for clients that cannot use OAuth.
Why MCP
The same Sonny, through your AI tools
Every MCP tool uses the same workflows as Sonny's public API, so your automation and your team get consistent results.
- Tools discover themselves
- Your assistant can see available Sonny actions, their required inputs, and whether an action reads, writes, or deletes data.
- Complete API coverage
- Triage unanswered work, sync changes, assign teams, share customer context, read reports, and send files. Every public API operation has an MCP tool.
- The same safety boundary
- MCP uses the same scopes, workspace boundaries, and business rules as every direct API request.
Tool catalog
Clear actions with narrow inputs
Read-only tools are marked for assistants. Destructive tools are identified separately, so your client can ask for confirmation before it acts.
- create_conversation
- Creates an inbound email conversation with a contact summary and the first incoming message. Requires both conversations:write and contacts:write. Resolves the contact by email, preserves an existing name, creates missing text fields and validates existing typed fields atomically. Fields are included in text and HTML. Applies existing tag IDs, source routing, notifications and webhooks. Replies deliver by email. Channel-restricted keys can create only on their selected sources; standalone contact endpoints still require all channels. externalId is scoped to workspace + source; concurrent retries return the original IDs with deduplicated=true (200), ignoring changed content. Without externalId every call creates a separate conversation. No attachments or AI auto-response.
- upload_attachment
- Stages a private file up to 25MB for one conversation and the current sender. REST takes multipart file and conversationId; MCP takes fileName, contentType and dataBase64. Attach the returned ID once within one hour using attachmentIds on a reply or note. Replies still require messages:send. Message reads include agent-only extraction and new 15-minute download URLs. Older files are explicitly marked legacy_public and remain public.
- list_properties
- Lists workspace property definitions and their allowed types/options. Requires access to all channels.
- get_contact_properties
- Returns stored strings with property definitions, last-write provenance and update times. Requires access to all channels.
- set_contact_property
- Sets a typed value by property ID or name; null clears it. API-authored values are labelled and shared with AI under its verified-customer rules. Manual internal values stay excluded. Requires access to all channels.
- list_contact_memories
- Reads saved customer context for one contact and accessible source, including manual and learned facts used by Sonny AI.
- create_contact_memory
- Saves a manual memory through the shared validation, deduplication and per-contact/source limits. Available to Co-Pilot and to the auto-responder under its verified identity rules.
- delete_contact_memory
- Removes one memory belonging to the supplied contact and source.
- get_report
- Uses the dashboard's reporting queries and date/source/assignee/tag filters. Kinds: overview (counts, response times and CSAT), volume, response-times, agents, sources, tags, csat, ai, knowledge, leads, online-hours. Knowledge uses the date range and permitted sources, independent of source/assignee/tag selections. Online hours describes workspace presence for accessible teammates; conversation counts remain channel-scoped. Responses are not cached. Existing CSAT endpoints retain their separate scope and populations.
- sync
- Returns a bounded durable change feed. Without a cursor, starts with the last hour. Retains events for 30 days; expired cursors return 410 resync_required. Deduplicate by event ID. Payloads require their own read scopes; messages and memories are opt-in. To bootstrap, drain and save a cursor, read current lists, then replay from that cursor.
- batch_update_conversations
- Applies one patch to up to 100 unique conversations, with independent atomic results for each ID. Supports team round-robin, snooze and tag changes. Uses the existing request-based rate limit.
- list_members
- Lists active assignable teammates with current availability and effective channel access. Omits email and teammates outside accessible channels.
- list_teams
- Lists workspace teams and their accessible active members. Channel-restricted callers see only teams with an accessible member.
- list_tags
- Returns all workspace tags, ordered by name. Requires access to all channels.
- create_tag
- Creates a workspace tag with a unique name and optional hex color. Requires access to all channels.
- get_tag
- Returns one workspace tag. Requires access to all channels.
- update_tag
- Updates a workspace tag's name or color. Omitted fields are preserved. Requires access to all channels.
- delete_tag
- Permanently deletes a workspace tag and removes it from all contacts and conversations. Requires access to all channels.
- add_conversation_tag
- Applies an existing workspace tag to an accessible conversation. Existing assignments are preserved. Read assigned tags with get_conversation.
- remove_conversation_tag
- Removes a tag from an accessible conversation without deleting the workspace tag. Read assigned tags with get_conversation.
- list_contacts
- Returns workspace contacts with tags and conversation counts. Filter by exact stored property values; multiple property filters must all match.
- create_contact
- Creates a contact. Email addresses are unique within a workspace.
- get_contact
- Returns one workspace contact.
- update_contact
- Updates supplied contact fields.
- archive_contact
- Archives the contact without deleting conversation history.
- list_channels
- Returns the stable channel values accepted by conversation filters.
- list_sources
- Returns configured workspace sources and the conversation channels each source supports.
- list_conversations
- Returns non-trash, non-spam conversations with attention, assignment, snooze, priority and tag filters. Awaiting reply ignores notes; unread is specific to the current teammate. Tags match any supplied ID. Defaults remain compact=false and snoozed=any. Use sync for durable message and state changes.
- get_conversation
- Returns one conversation with contact, assignee, group, and tags.
- update_conversation
- Changes status, priority, assignee, team, snooze or tags. Request assignment=round_robin with a team to select an available member (409 if none). Preserves audit, CSAT, notification, search, realtime, and webhook side effects.
- list_messages
- Returns chronological messages. Use before for older history or after for newer messages. Attachments include fresh 15-minute download URLs, storage access guarantees and agent-only AI extraction.
- create_internal_note
- Adds an internal note with optional attachmentIds from uploads owned by the current sender and conversation. Attachment-only notes are supported. This endpoint never sends a customer-facing message.
- send_message
- Sends a customer-facing reply as the authenticated teammate. Accepts attachmentIds from uploads owned by that sender and conversation, including attachment-only replies. Delivery follows the conversation's channel: realtime chat (with an email copy when the visitor is offline) or email from the source's sending identity. Check emailDeliveryStatus for email delivery: failed means the reply was saved but the email was not sent; retry it from the inbox. Requires the messages:send scope, granted separately from messages:write.
- list_webhooks
- Returns endpoints and recent delivery status. Secrets are never returned.
- create_webhook
- Creates an HTTPS endpoint. The signing secret is returned once.
- list_webhook_events
- Returns the canonical subscription catalog.
- update_webhook
- Changes endpoint configuration or enabled state.
- delete_webhook
- Deletes the endpoint and its delivery history.
- test_webhook
- Queues webhook.test for this enabled endpoint even when it is not subscribed to that event. Disabled endpoints return 409.
- list_webhook_deliveries
- Returns the 50 most recent delivery attempts.
- retry_webhook_delivery
- Resets a terminal failed delivery and queues it immediately. Disabled endpoints return 409.
- list_kb_articles
- Returns the help center articles for a source, ordered by position. Use status to filter drafts or published articles.
- create_kb_article
- Creates an article in the source's help center and indexes it into the AI knowledge base when published. Slugs are auto-derived from the title when omitted and deconflicted automatically.
- get_kb_article
- Returns one article including its sanitised HTML body.
- update_kb_article
- Updates supplied article fields and re-syncs the AI knowledge index. Publishing stamps publishedAt the first time only.
- delete_kb_article
- Permanently deletes the article and withdraws it from the AI knowledge index.
- list_kb_categories
- Returns the help center categories for a source, ordered by position.
- create_kb_category
- Creates a category in the source's help center. Slugs are auto-derived from the name when omitted.
- update_kb_category
- Updates supplied category fields. Articles keep their category unless it is deleted.
- delete_kb_category
- Deletes the category. Its articles become uncategorised, they are not lost.
- get_csat_summary
- Returns customer satisfaction scores on the 1–3 scale (1 bad, 2 okay, 3 great) for the whole workspace, per channel type (chat, email), and per source (channel), with the rating distribution, satisfaction rate (share rated great), and response rate against conversations closed in the same window. Omit every filter for the all-time global score.
- list_csat_ratings
- Returns individual customer ratings with comments, newest first. Filter by rating value (for example rating=1 for every bad rating, or rating=1,2), source, channel type, assignee, contact, comment presence, and time window.
- get_conversation_csat
- Returns the customer's rating and comment for one conversation, or null data when the customer has not rated it yet.
- reorder_kb_articles
- Supply the complete ordered list of IDs. Rejects stale or foreign IDs transactionally.
- upsert_kb_article
- Creates or updates using a stable external ID unique to this help center. Returns 201 on create or 200 on update. Omitted update fields are preserved. New articles default to draft and uncategorised.
- reorder_kb_categories
- Supply the complete ordered list of IDs. Rejects stale or foreign IDs transactionally.
- upsert_kb_category
- Creates or updates using a stable external ID unique to this help center. Returns 201 on create or 200 on update. Omitted update fields are preserved. New articles default to draft and uncategorised.
- get_kb_category
- Returns one category in the accessible help center.
- get_help_center
- Returns branding, publishing, discovery settings and the current public URL. Domain connection remains available in the dashboard.
- update_help_center
- Updates the supplied publishing and appearance settings. First create an article or category to initialise the help center.
- upload_kb_media
- Uploads JPEG, PNG, GIF or WebP up to 25MB. Returns a public URL for article bodies. REST accepts multipart file; MCP accepts base64 bytes.
- list_kb_audiences
- Manage named audiences using verified customer trait rules. Audience deletion leaves linked content verified-only.
- create_kb_audience
- Manage named audiences using verified customer trait rules. Audience deletion leaves linked content verified-only.
- update_kb_audience
- Manage named audiences using verified customer trait rules. Audience deletion leaves linked content verified-only.
- delete_kb_audience
- Manage named audiences using verified customer trait rules. Audience deletion leaves linked content verified-only.
Connect securely
One connection, only the access you choose
- Connect with OAuth
- Sign in, review the requested scopes, and choose a workspace.
- Add the MCP server
- Add the remote URL. OAuth-capable clients discover the rest.
- Stay in one workspace
- Sonny scopes every tool call to the workspace you approved.