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 pubblicaGuida rapida
- 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. - 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.
- 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/mcpConfigurazione 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
- 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, chiamalist_conversationscon sourceId, awaitingReply: true, snoozed: "false" e compact: true. Le note interne non nascondono i messaggi dei clienti senza risposta. - Leggi solo il testo nuovo: per ogni conversazione modificata, chiama
list_messagescon l'ID dell'ultimo messaggio o un timestamp ISO inaftere impostaincludeHtml: false, a meno che non ti serva davvero l'HTML dell'email. - Attendi immagini e video: quando
list_messagesrestituiscereadsInProgress, esegui la chiamata indicata innextStep. Il suowaitSecondstrattiene la risposta finché le letture delle immagini e le trascrizioni dei video sono pronte, quindi non servono attese manuali. - Carica il contesto del cliente:
get_conversationrestituisceidentityVerified, iverifiedTraitsfirmati, la pagina di origine della conversazione e il contesto del client. Quando c'è uncontact.id, passalo alist_conversationsper caricare le conversazioni precedenti del cliente. - Attivazione su richiesta: usa un webhook filtrato per sorgente su
message.createdper 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.
- Parti senza cursore, segui nextCursor finché hasMore non è false e salva quel cursore.
- Leggi gli elenchi attuali di conversazioni e contatti e la cronologia che ti serve per lo stato iniziale.
- 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.
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.
- Scegli il sourceId del tuo canale e concedi kb:read e kb:write. Per il rilevamento facoltativo,
list_sourcesrichiede anche conversations:read. - Crea la categoria, poi sincronizza un articolo come bozza. Controlla formattazione e accesso prima di pubblicare.
- Configura l'accesso al centro assistenza, pubblica e prova la vista del lettore. Usa la paginazione e ID esterni stabili per gli aggiornamenti successivi.
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 assistenzaGuide correlate
- API pubblicaBeta
Smista e sincronizza le conversazioni, condividi il contesto dei clienti, leggi i report e invia file con chiavi API con ambiti.
- WebhookBeta
Iscriviti agli eventi firmati dello spazio di lavoro ed esamina i tentativi di consegna.
- Team e ruoli
Invita utenti, crea team e scopri gli accessi di proprietario, amministratore, agente e visualizzatore.