Developers

Sonny MCP Beta

Connect MCP-compatible AI assistants — Claude, and any client that speaks the Model Context Protocol — to your workspace, with the same scopes and boundaries as the public API.

Read the Public API guide

Quickstart

  1. 01

    Add Sonny to Claude

    In Claude or Cowork, add a custom connector with the URL https://www.usesonny.com/api/mcp. Sonny supports automatic client registration, so there is no client ID or secret to copy.

  2. 02

    Approve workspace access

    Claude opens Sonny in your browser. Sign in, review the requested permissions, and choose the workspace to connect. OAuth 2.1 with PKCE keeps the resulting access and refresh tokens scoped to that approval.

  3. 03

    Ask your assistant to use Sonny

    Tools describe themselves, so a prompt like “List my open conversations” is enough. Assistants see which tools are read-only and which are destructive, so a good client asks before it changes anything.

Claude Code

claude mcp add --transport http sonny https://www.usesonny.com/api/mcp

JSON client configuration

{
  "mcpServers": {
    "sonny": {
      "url": "https://www.usesonny.com/api/mcp"
    }
  }
}

API key compatibility

If a client cannot complete OAuth, create a scoped key in Settings → Developer and send it as an Authorization Bearer header. API keys remain fully supported for server-to-server and legacy clients.

"Authorization": "Bearer sonny_your_key"

How Sonny keeps tool calls safe

One workspace, chosen scopes
Every call runs inside the workspace chosen during OAuth consent or the workspace that owns the API key. A tool only works when its credential holds the required scope.
Honest tool annotations
Read-only tools are marked read-only; updating and deleting tools are marked destructive so your client can confirm before acting.
The same business rules
Tools run the exact workflows the public API runs — audit history, notifications, and webhooks all behave as if a teammate made the change.

Keep an assistant inside one inbox

Workspaces often hold several sources — one per product or brand. Have your assistant call list_sources once to discover them, then pass sourceId to list_conversations so questions about one product only ever return that product's conversations. Every conversation also carries its own sourceId, so results are verifiable.

Tool catalog

Every public API operation is available as a tool. The required scope is listed beside each one.

list_contacts
List contacts
contacts:read
create_contact
Create a contact
contacts:write
get_contact
Get a contact
contacts:read
update_contact
Update a contact
contacts:write
archive_contact
Archive a contact
contacts:write
list_channels
List conversation channels
conversations:read
list_sources
List sources
conversations:read
list_conversations
List conversations
conversations:read
get_conversation
Get a conversation
conversations:read
update_conversation
Update a conversation
conversations:write
list_messages
List messages
messages:read
create_internal_note
Create an internal note
messages:write
send_message
Send a reply to the customer
messages:send
list_webhooks
List webhook endpoints
webhooks:read
create_webhook
Create a webhook endpoint
webhooks:write
list_webhook_events
List webhook event types
webhooks:read
update_webhook
Update a webhook endpoint
webhooks:write
delete_webhook
Delete a webhook endpoint
webhooks:write
test_webhook
Queue a test event
webhooks:write
list_webhook_deliveries
List webhook deliveries
webhooks:read
retry_webhook_delivery
Retry a failed delivery
webhooks:write

Related docs