Sviluppatori

Sonny MCP Beta

Collega al tuo spazio di lavoro gli assistenti AI compatibili con MCP (Claude e qualsiasi client che parli il Model Context Protocol), con gli stessi ambiti e limiti dell'API pubblica.

Leggi la guida all'API pubblica

Guida rapida

  1. 01

    Aggiungi Sonny a Claude

    In Claude o Cowork, aggiungi un connettore personalizzato con l'URL https://www.usesonny.com/api/mcp. Sonny supporta la registrazione automatica dei client, quindi non ci sono client ID o secret da copiare.

  2. 02

    Approva l'accesso allo spazio di lavoro

    Claude apre Sonny nel tuo browser. Accedi, controlla i permessi richiesti e scegli lo spazio di lavoro da collegare. OAuth 2.1 con PKCE mantiene i token di accesso e di aggiornamento limitati a quell'approvazione.

  3. 03

    Chiedi al tuo assistente di usare Sonny

    Gli strumenti si descrivono da soli, quindi basta un prompt come “Elenca le mie conversazioni aperte”. Gli assistenti vedono quali strumenti sono di sola lettura e quali distruttivi, così un buon client chiede conferma prima di modificare qualcosa.

Claude Code

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

Configurazione JSON del client

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

Compatibilità con le chiavi API

Se un client non riesce a completare OAuth, crea una chiave con ambiti in Impostazioni → Sviluppatori e inviala come intestazione Authorization Bearer. Le chiavi API restano pienamente supportate per i client server-to-server e meno recenti.

"Authorization": "Bearer sonny_your_key"

Come Sonny rende sicure le chiamate agli strumenti

Uno spazio di lavoro, ambiti scelti
Ogni chiamata viene eseguita nello spazio di lavoro scelto durante il consenso OAuth o in quello a cui appartiene la chiave API. Uno strumento funziona solo se la credenziale ha l'ambito richiesto.
Annotazioni degli strumenti trasparenti
Gli strumenti di sola lettura sono contrassegnati come tali; quelli che aggiornano ed eliminano sono contrassegnati come distruttivi, così il tuo client può chiedere conferma prima di agire.
Le stesse regole di business
Gli strumenti eseguono esattamente gli stessi flussi dell'API pubblica: cronologia di controllo, notifiche e webhook si comportano come se la modifica l'avesse fatta un collega.

Tieni un assistente dentro una sola posta in arrivo

I canali selezionati su una chiave API vengono applicati automaticamente a ogni chiamata agli strumenti. Le chiavi API e le connessioni OAuth seguono anche l'accesso ai canali attuale del collega collegato. Per le connessioni OAuth o le chiavi con accesso a tutti i canali, gli spazi di lavoro hanno spesso più sorgenti, una per prodotto o brand. Fai chiamare al tuo assistente list_sources una volta per scoprirle, poi passa sourceId a list_conversations, così le domande su un prodotto restituiscono solo le conversazioni di quel prodotto. Ogni conversazione riporta anche il proprio sourceId, quindi i risultati sono verificabili.

Gestisci un ciclo di assistenza a basso costo

  1. Rileva le modifiche: parti dal feed persistente sync, salva nextCursor dopo aver elaborato ogni pagina ed elimina gli ID evento duplicati. Per scegliere il lavoro, chiama list_conversations con sourceId, awaitingReply: true, snoozed: "false" e compact: true. Le note interne non nascondono i messaggi dei clienti senza risposta.
  2. Leggi solo il testo nuovo: per ogni conversazione modificata, chiama list_messages con l'ID dell'ultimo messaggio o un timestamp ISO in after e imposta includeHtml: false, a meno che non ti serva davvero l'HTML dell'email.
  3. Attendi immagini e video: quando list_messages restituisce readsInProgress, esegui la chiamata indicata in nextStep. Il suo waitSeconds trattiene la risposta finché le letture delle immagini e le trascrizioni dei video sono pronte, quindi non servono attese manuali.
  4. Carica il contesto del cliente: get_conversation restituisce identityVerified, i verifiedTraits firmati, la pagina di origine della conversazione e il contesto del client. Quando c'è un contact.id, passalo a list_conversations per caricare le conversazioni precedenti del cliente.
  5. Attivazione su richiesta: usa un webhook filtrato per sorgente su message.created per attivare subito l'agente, poi recupera gli aggiornamenti con sync. Il feed persistente funziona indipendentemente dalla consegna dei webhook. Usa una credenziale con accesso a tutti i canali per creare il webhook e limitarne gli ID sorgente; l'agente mantiene la sua credenziale di esecuzione limitata alla sorgente.

Catalogo degli strumenti

Ogni operazione dell'API pubblica è disponibile come strumento. L'ambito richiesto è indicato accanto a ciascuno.

get_connection_info
Read connection access
conversations:read
get_conversation_context
Read support context
conversations:read
list_conversation_checks
Read conversation checks
conversations:read
record_conversation_check
Record a conversation check
conversations:write
get_status
Check Sonny status
conversations:read
create_conversation
Create a conversation from a form
conversations:write
upload_attachment
Upload a message attachment
attachments:write
list_properties
List custom properties
contacts:read
get_contact_properties
Read contact properties
contacts:read
set_contact_property
Set a contact property
contacts:write
list_contact_memories
Read customer memories
contact-memory:read
create_contact_memory
Save a customer memory
contact-memory:write
delete_contact_memory
Remove a customer memory
contact-memory:write
get_report
Read a support report
reporting:read
sync
Read workspace changes
conversations:read
batch_update_conversations
Update conversations in a batch
conversations:write
list_members
List members
members:read
list_teams
List teams
members:read
list_tags
List tags
tags:read
create_tag
Create a tag
tags:write
get_tag
Get a tag
tags:read
update_tag
Update a tag
tags:write
delete_tag
Delete a tag
tags:write
add_conversation_tag
Add a conversation tag
conversations:write
remove_conversation_tag
Remove a conversation tag
conversations:write
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
erase_contact
Permanently erase 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
edit_message
Edit a sent reply
messages:send
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
list_kb_articles
List knowledge base articles
kb:read
create_kb_article
Create a knowledge base article
kb:write
get_kb_article
Get a knowledge base article
kb:read
update_kb_article
Update a knowledge base article
kb:write
delete_kb_article
Delete a knowledge base article
kb:write
list_kb_categories
List knowledge base categories
kb:read
create_kb_category
Create a knowledge base category
kb:write
update_kb_category
Update a knowledge base category
kb:write
delete_kb_category
Delete a knowledge base category
kb:write
get_csat_summary
Get CSAT scores
csat:read
list_csat_ratings
List CSAT ratings
csat:read
get_conversation_csat
Get a conversation's CSAT rating
csat:read
reorder_kb_articles
Reorder knowledge base articles
kb:write
upsert_kb_article
Sync a knowledge base article
kb:write
reorder_kb_categories
Reorder knowledge base categories
kb:write
upsert_kb_category
Sync a knowledge base category
kb:write
get_kb_category
Get a knowledge base category
kb:read
get_help_center
Get help center settings
kb:read
update_help_center
Update help center settings
kb:write
upload_kb_media
Upload a help center image
kb:write
list_kb_audiences
List audiences
kb:read
create_kb_audience
Create audience
kb:write
update_kb_audience
Update audience
kb:write
delete_kb_audience
Delete audience
kb:write

Flussi di lavoro degli agenti

Smista, agisci e resta sincronizzato

REST e MCP condividono gli stessi permessi e flussi di lavoro. Le credenziali possono solo restringere il tuo accesso attuale ai canali; rimuovere un canale dalla tua appartenenza lo rimuove anche dalle tue integrazioni.

Trova le conversazioni che richiedono attenzione

Filtra per awaitingReply, unread, unassigned, assigneeId, agentGroupId, snoozed, priority o tagIds. In attesa di risposta ignora le note interne; non letto è specifico del collega autenticato. Non assegnata significa senza assegnatario individuale, anche se è assegnato un team. Le etichette corrispondono a uno qualsiasi degli ID forniti.

list_conversations({ status: "open", awaitingReply: true, compact: true, sort: "waitingSince", direction: "asc" })

Ordina per waitingSince, lastMessageAt, createdAt o priorità di business con direction asc o desc. Gli ID risolvono i pareggi. I filtri omessi mantengono compact=false e snoozed=any. In REST tagIds accetta ID separati da virgola; MCP accetta anche un array. waitingSince parte dal primo messaggio in arrivo dopo l'ultima risposta; solleciti e note interne non lo azzerano. Esegui questa scansione della coda in attesa in modo programmato anche quando non arriva alcun webhook, così i thread vecchi riemergono.

Recupera gli aggiornamenti senza rileggere la posta in arrivo

Usa sync con conversations:read. Il feed persistente include modifiche alle conversazioni, etichette, messaggi, proprietà dei contatti, memorie e record delle eliminazioni. Ogni payload richiede anche il proprio ambito di lettura: i corpi dei messaggi richiedono messages:read e le memorie contact-memory:read. Le credenziali limitate ricevono solo i canali consentiti.

  1. Parti senza cursore, segui nextCursor finché hasMore non è false e salva quel cursore.
  2. Leggi gli elenchi attuali di conversazioni e contatti e la cronologia che ti serve per lo stato iniziale.
  3. Riparti dal cursore salvato per recuperare le modifiche avvenute durante quella lettura. Elabora ogni pagina, poi salva nextCursor.

Elimina i duplicati in base all'id dell'evento: la riproduzione avviene almeno una volta, quindi le azioni a valle devono avere una propria protezione dai duplicati. Una richiesta senza cursore copre l'ultima ora, non un'istantanea completa. Gli eventi vengono conservati per 30 giorni; HTTP 410 resync_required significa che devi ricaricare lo stato da capo. Fallo anche dopo aver ampliato ambiti o accesso ai canali. Usa limit fino a 100 e maxBodyChars fino a 10.000 (predefinito 500). Imposta compact=true per avere i campi del messaggio textPreview/textTruncated limitati a 200 caratteri invece di body/bodyTruncated. I webhook possono riattivare un agente; il feed resta disponibile anche senza iscrizioni ai webhook o quando la consegna dei webhook è in arretrato.

Registra i controlli una volta e condividi il risultato

Prima di ripetere un'indagine, leggi list_conversation_checks (GET /api/v1/conversations/{conversationId}/checks). Salva un risultato con record_conversation_check (PUT sullo stesso percorso), fornendo key, result, checkedBy e un reference facoltativo per l'ID o l'URL della scheda. Ad esempio: key=product-version, result=Shopstar Go verified, checkedBy=Engineer, reference=card-X. Sonny registra l'actorId autenticato e il timestamp checkedAt. Riutilizzare una key sostituisce solo quel controllo; è lo stato attuale, non uno storico. Le letture richiedono conversations:read e le scritture conversations:write, entrambe limitate al canale della conversazione. Queste chiamate non inviano una risposta e non segnano il venditore come risposto.

Assegna e aggiorna il lavoro in blocco

Trova colleghi e team attivi e assegnabili con list_members / list_teams (members:read). Le risposte includono la disponibilità e l'accesso effettivo ai canali, senza indirizzi email. Usa conversations:write per cambiare status, priority, assigneeId, agentGroupId, snoozedUntil, snoozedUntilReply, addTagIds o removeTagIds.

batch_update_conversations({
  conversationIds: ["conversation_1", "conversation_2"],
  updates: { agentGroupId: "team_1", assignment: "round_robin" }
})

L'assegnazione a rotazione sceglie un membro del team disponibile che può accedere al canale della conversazione. Se nessun membro è idoneo, un aggiornamento singolo restituisce 409 e l'elemento di un'operazione in blocco non riesce. Ogni operazione in blocco accetta fino a 100 ID univoci e applica una patch in modo atomico per ogni conversazione. Esamina ogni risultato { id, ok, error? }: alcuni elementi potrebbero non riuscire. Le operazioni in blocco usano l'attuale limite basato sulle richieste, senza addebiti ponderati in base al numero di elementi.

Condividi il contesto dei clienti con Sonny AI

Elenca, salva e rimuovi le memorie dei contatti con contact-memory:read/write. Fornisci sia contactId sia un sourceId accessibile; il contatto deve avere una conversazione su quella sorgente. I fatti salvati usano la stessa validazione, gestione dei duplicati e limiti dell'app e vengono registrati come memorie manuali.

Leggi le definizioni delle proprietà in /api/v1/properties e leggi o imposta i valori in /api/v1/contacts/{contactId}/properties. MCP espone list_properties, get_contact_properties e set_contact_property. Richiedono contacts:read/write e l'accesso a tutti i canali. Imposta esattamente uno tra propertyId e propertyName, con un valore stringa o null per cancellarlo. I valori di testo, numero, URL, data e selezione vengono validati in base alla definizione del campo.

set_contact_property({ contactId: "contact_1", propertyName: "Plan", value: "Pro" })
list_contacts({ property: { Plan: "Pro" } })

I filtri sulle proprietà corrispondono alle stringhe esatte salvate; più proprietà devono corrispondere tutte. I valori scritti tramite API sono etichettati come dati API in Co-Pilot e nel risponditore automatico. Restano valide le regole esistenti sui clienti verificati e sulle sorgenti. I normali valori interni inseriti a mano restano esclusi da questo contesto AI.

Leggi gli stessi report del tuo team

Con reporting:read, chiama get_report({ kind, filters }). I tipi sono overview, volume, response-times, agents, sources, tags, csat, ai, knowledge, leads e online-hours. Overview combina conteggi, tempi di risposta e CSAT. I filtri sono period (1–365 giorni, predefinito 30), date from/to abbinate (to è esclusa), granularity (day/month), source, assigneeId e tagId. Source accetta all, all-chat, all-email, website:{id} o email:{id}.

I report usano le stesse query della dashboard e gli attuali controlli di accesso. Knowledge usa le date e i canali consentiti, indipendentemente da sorgente, assegnatario o etichetta selezionati. Online hours misura la presenza nello spazio di lavoro dei colleghi accessibili; i conteggi delle conversazioni restano limitati ai canali. Gli endpoint /csat esistenti mantengono il loro ambito separato csat:read e possono descrivere un insieme diverso.

Invia file con risposte o note interne

Concedi attachments:write e carica un file fino a 25 MB per una conversazione. upload_attachment accetta conversationId, fileName, contentType e dataBase64. La risposta contiene un id ed expiresAt. Passa fino a 10 attachmentIds a una risposta o nota entro un'ora. Ogni file caricato è legato al tuo utente e alla conversazione e può essere usato una sola volta. I file non usati vengono eliminati dopo la scadenza.

send_message({ conversationId: "conversation_1", attachmentIds: ["upload_1"] })

Le risposte richiedono messages:send; le note interne richiedono messages:write e non arrivano mai ai clienti. Sono supportati messaggi con soli allegati. Le risposte via email includono i file entro il limite di dimensione dell'email e link per scaricare gli altri; le email delle chat offline includono link ai file. I link inviati via email restano utilizzabili finché l'allegato esiste, così i destinatari possono aprirli in seguito. Inoltrare l'email condivide l'accesso a quei file. Controlla emailDeliveryStatus per gli errori di consegna.

Le letture autorizzate dei messaggi includono downloadUrl, downloadExpiresAt, aiStatus, aiDescription e aiExtractedText, più videoTranscripts per i video collegati (Loom, Vimeo e altri). I link di download durano 15 minuti; rileggi il messaggio per ottenerne di nuovi. I nuovi caricamenti via API/MCP hanno un'archiviazione privata. Gli allegati più vecchi restano pubblici e sono contrassegnati con access=legacy_public: il loro URL originale non scade. Leggere un messaggio avvia la lettura delle sue immagini quando lo spazio di lavoro ha Sonny AI. Le letture delle immagini e le trascrizioni dei video si completano poco dopo l'arrivo di un messaggio: finché qualcuna è in corso, la risposta inizia con readsInProgress, il cui nextStep indica la chiamata esatta da fare. Passa waitSeconds (fino a 30) per attenderle in un'unica richiesta. I messaggi del widget per i clienti e quelli in tempo reale non includono mai estrazioni o trascrizioni.

Esplora i contratti completi di richieste e risposte

Base di conoscenza

Sincronizza da una fonte esterna

Sincronizza articoli e categorie con ID esterni stabili, importa Markdown o HTML, carica immagini, imposta l'ordinamento e gestisci i pubblici dei lettori. Ripetere un upsert aggiorna i contenuti esistenti.

  1. Scegli il sourceId del tuo canale e concedi kb:read e kb:write. Per il rilevamento facoltativo, list_sources richiede anche conversations:read.
  2. Crea la categoria, poi sincronizza un articolo come bozza. Controlla formattazione e accesso prima di pubblicare.
  3. Configura l'accesso al centro assistenza, pubblica e prova la vista del lettore. Usa la paginazione e ID esterni stabili per gli aggiornamenti successivi.
Segui la guida completa alla sincronizzazione via MCP

Gestisci i pubblici di clienti

Crea gruppi a partire dagli attributi dei clienti verificati e applicali a un centro assistenza, una categoria o un articolo. Tutte le restrizioni ereditate devono essere soddisfatte. Le credenziali API e MCP agiscono come staff entro i loro ambiti; visualizza l'anteprima e prova una sessione reale di un cliente per verificare l'accesso dei lettori.

Configura e prova i pubblici del centro assistenza

Guide correlate