Desenvolvedores
Sonny MCP Beta
Conecte assistentes de IA compatíveis com MCP — o Claude e qualquer cliente que fale o Model Context Protocol — ao seu espaço de trabalho, com os mesmos escopos e limites da API pública.
Leia o guia da API públicaInício rápido
- 01
Adicione o Sonny ao Claude
No Claude ou no Cowork, adicione um conector personalizado com a URL
https://www.usesonny.com/api/mcp. O Sonny aceita registro automático de clientes, então não há client ID nem secret para copiar. - 02
Aprove o acesso ao espaço de trabalho
O Claude abre o Sonny no seu navegador. Faça login, revise as permissões solicitadas e escolha o espaço de trabalho a conectar. O OAuth 2.1 com PKCE mantém os tokens de acesso e de atualização gerados limitados a essa aprovação.
- 03
Peça ao seu assistente para usar o Sonny
As ferramentas se descrevem sozinhas, então um pedido como “Liste minhas conversas abertas” é suficiente. Os assistentes veem quais ferramentas são somente leitura e quais são destrutivas, então um bom cliente pergunta antes de alterar qualquer coisa.
Claude Code
claude mcp add --transport http sonny https://www.usesonny.com/api/mcpConfiguração do cliente em JSON
{
"mcpServers": {
"sonny": {
"url": "https://www.usesonny.com/api/mcp"
}
}
}Compatibilidade com chaves de API
Se um cliente não conseguir concluir o OAuth, crie uma chave com escopo em Configurações → Desenvolvedor e envie-a em um cabeçalho Authorization Bearer. As chaves de API continuam totalmente suportadas para integrações servidor a servidor e clientes legados.
"Authorization": "Bearer sonny_your_key"Como o Sonny mantém as chamadas de ferramentas seguras
- Um espaço de trabalho, escopos escolhidos
- Cada chamada é executada dentro do espaço de trabalho escolhido no consentimento do OAuth ou do espaço de trabalho dono da chave de API. Uma ferramenta só funciona quando a credencial tem o escopo exigido.
- Anotações de ferramentas transparentes
- Ferramentas somente leitura são marcadas como somente leitura; ferramentas que atualizam e excluem são marcadas como destrutivas, para que o seu cliente possa confirmar antes de agir.
- As mesmas regras de negócio
- As ferramentas executam exatamente os mesmos fluxos da API pública — histórico de auditoria, notificações e webhooks se comportam como se um colega tivesse feito a alteração.
Mantenha um assistente dentro de uma caixa de entrada
Os canais selecionados em uma chave de API valem automaticamente em todas as chamadas de ferramentas. Chaves de API e conexões OAuth também seguem o acesso atual aos canais do colega conectado. Em conexões OAuth ou chaves com acesso a todos os canais, os espaços de trabalho costumam ter várias origens — uma por produto ou marca. Peça ao seu assistente para chamar list_sources uma vez para descobri-las e depois passar sourceId para list_conversations, assim perguntas sobre um produto só retornam conversas daquele produto. Cada conversa também traz o próprio sourceId, então os resultados podem ser conferidos.
Rode um ciclo de suporte de baixo custo
- Descubra as mudanças: comece com o feed persistente
sync, salve nextCursor depois de processar cada página e elimine IDs de eventos duplicados. Para escolher o que fazer, chamelist_conversationscom sourceId, awaitingReply: true, snoozed: "false" e compact: true. Notas internas não escondem mensagens de clientes sem resposta. - Leia só o texto novo: para cada conversa alterada, chame
list_messagescom o ID da sua última mensagem ou um timestamp ISO emaftere definaincludeHtml: false, a menos que o HTML do e-mail seja realmente necessário. - Espere por imagens e vídeos: quando
list_messagesretornarreadsInProgress, faça a chamada indicada emnextStep. OwaitSecondsdela segura a resposta até as leituras de imagens e as transcrições de vídeos ficarem prontas, então não é preciso esperar por conta própria. - Carregue o contexto do cliente:
get_conversationretornaidentityVerified, osverifiedTraitsassinados e a página de origem e o contexto do cliente da conversa. Quando houver umcontact.id, passe esse ID paralist_conversationspara carregar as conversas anteriores do cliente. - Acorde sob demanda: use um webhook filtrado por origem para
message.createdpara acordar o agente na hora e depois fique em dia com o sync. O feed persistente funciona independentemente da entrega de webhooks. Use uma credencial com todos os canais para criar o webhook e restringir os IDs de origem; o agente mantém a própria credencial de execução limitada à origem.
Catálogo de ferramentas
Cada operação da API pública está disponível como uma ferramenta. O escopo exigido aparece ao lado de cada uma.
- 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
Fluxos de agentes
Faça a triagem, aja e fique sincronizado
REST e MCP compartilham as mesmas permissões e fluxos. As credenciais só podem restringir o seu acesso atual aos canais; remover um canal da sua associação também o remove das suas integrações.
Encontre conversas que precisam de atenção
Filtre por awaitingReply, unread, unassigned, assigneeId, agentGroupId, snoozed, priority ou tagIds. Aguardando resposta ignora notas internas; não lidas é específico do colega autenticado. Sem responsável significa nenhum responsável individual, mesmo que uma equipe esteja atribuída. As tags correspondem a qualquer ID informado.
list_conversations({ status: "open", awaitingReply: true, compact: true, sort: "waitingSince", direction: "asc" })Ordene por waitingSince, lastMessageAt, createdAt ou prioridade de negócio, com direção asc ou desc. Os IDs desempatam. Filtros omitidos mantêm compact=false e snoozed=any. Na REST, tagIds aceita IDs separados por vírgula; o MCP também aceita uma lista. waitingSince começa na primeira mensagem recebida depois da última resposta; mensagens de acompanhamento e notas internas não o reiniciam. Rode essa varredura da fila de espera de forma agendada, mesmo quando nenhum webhook chegar, para que conversas antigas voltem a aparecer.
Fique em dia sem reler a caixa de entrada
Use sync com conversations:read. O feed persistente inclui mudanças em conversas, tags, mensagens, propriedades de contatos, memórias e registros de exclusão. Cada payload também exige o próprio escopo de leitura: corpos de mensagens precisam de messages:read e memórias precisam de contact-memory:read. Credenciais restritas recebem apenas os canais permitidos.
- Comece sem cursor, siga nextCursor até hasMore ser false e salve esse cursor.
- Leia as listas atuais de conversas e contatos e todo o histórico de que precisar para o seu estado inicial.
- Reproduza a partir do cursor salvo para capturar as mudanças ocorridas durante essa leitura. Processe cada página e depois salve nextCursor.
Elimine duplicatas pelo id do evento: a reprodução entrega pelo menos uma vez, então as ações seguintes precisam de proteção própria contra duplicatas. Uma requisição sem cursor cobre a última hora, não um retrato completo. Os eventos ficam guardados por 30 dias; HTTP 410 resync_required significa carregar o estado de novo. Carregue de novo também depois de ampliar escopos ou acesso a canais. Use limit até 100 e maxBodyChars até 10.000 (padrão 500). Defina compact=true para receber os campos textPreview/textTruncated das mensagens, limitados a 200 caracteres, em vez de body/bodyTruncated. Webhooks podem acordar um agente; o feed continua disponível sem assinaturas de webhook ou quando a entrega de webhooks está atrasada.
Registre verificações uma vez e compartilhe o resultado
Antes de repetir uma investigação, leia list_conversation_checks (GET /api/v1/conversations/{conversationId}/checks). Salve um resultado com record_conversation_check (PUT no mesmo caminho), informando key, result, checkedBy e uma reference opcional para o ID ou a URL do card. Por exemplo: key=product-version, result=Shopstar Go verified, checkedBy=Engineer, reference=card-X. O Sonny registra o actorId autenticado e o timestamp checkedAt. Reutilizar uma key substitui só aquela verificação; isto é o estado atual, não um histórico. Leituras precisam de conversations:read e gravações de conversations:write, ambos limitados ao canal da conversa. Essas chamadas não enviam resposta nem marcam o vendedor como respondido.
Atribua e atualize o trabalho em lotes
Descubra colegas e equipes ativos que podem receber atribuições com list_members / list_teams (members:read). As respostas incluem disponibilidade e acesso efetivo aos canais, sem endereços de e-mail. Use conversations:write para alterar status, priority, assigneeId, agentGroupId, snoozedUntil, snoozedUntilReply, addTagIds ou removeTagIds.
batch_update_conversations({
conversationIds: ["conversation_1", "conversation_2"],
updates: { agentGroupId: "team_1", assignment: "round_robin" }
})O rodízio escolhe um membro disponível da equipe que tenha acesso ao canal da conversa. Sem nenhum membro elegível, uma atualização individual retorna 409 e um item do lote falha. Cada lote aceita até 100 IDs únicos e aplica uma alteração atômica por conversa. Confira cada resultado { id, ok, error? }; alguns itens podem falhar. Os lotes usam o limite atual por requisição, sem cobrança ponderada pela quantidade de itens.
Compartilhe o contexto do cliente com o Sonny AI
Liste, salve e remova memórias de contatos com contact-memory:read/write. Informe tanto contactId quanto um sourceId acessível; o contato precisa ter uma conversa nessa origem. Os fatos salvos usam a mesma validação, o mesmo tratamento de duplicatas e os mesmos limites do app e são registrados como memórias manuais.
Leia as definições de propriedades em /api/v1/properties e leia ou defina valores em /api/v1/contacts/{contactId}/properties. O MCP disponibiliza list_properties, get_contact_properties e set_contact_property. Eles exigem contacts:read/write e acesso a todos os canais. Defina exatamente um propertyId ou propertyName, com um valor de texto ou null para limpá-lo. Valores de texto, número, URL, data e seleção são validados de acordo com a definição do campo.
set_contact_property({ contactId: "contact_1", propertyName: "Plan", value: "Pro" })
list_contacts({ property: { Plan: "Pro" } })Os filtros de propriedades correspondem a textos armazenados exatos; várias propriedades precisam corresponder todas. Valores enviados pela API são identificados como dados da API no Co-Pilot e na resposta automática. As regras existentes de cliente verificado e de origem continuam valendo. Valores comuns de campos internos preenchidos manualmente continuam fora desse contexto de IA.
Leia os mesmos relatórios que sua equipe
Com reporting:read, chame get_report({ kind, filters }). Os tipos são overview, volume, response-times, agents, sources, tags, csat, ai, knowledge, leads e online-hours. Overview combina contagens, tempos de resposta e CSAT. Os filtros são period (1–365 dias, padrão 30), datas from/to em par (to é exclusivo), granularity (day/month), source, assigneeId e tagId. Source aceita all, all-chat, all-email, website:{id} ou email:{id}.
Os relatórios usam as consultas do painel e as verificações de acesso atuais. Knowledge usa as datas e os canais permitidos, independentemente da origem, do responsável ou da tag selecionados. Online-hours mede a presença dos colegas acessíveis no espaço de trabalho; as contagens de conversas continuam limitadas por canal. Os endpoints /csat existentes mantêm o próprio escopo csat:read e podem descrever um conjunto diferente.
Envie arquivos com respostas ou notas internas
Conceda attachments:write e envie um arquivo de até 25 MB para uma conversa. upload_attachment recebe conversationId, fileName, contentType e dataBase64. A resposta contém um id e expiresAt. Passe até 10 attachmentIds para uma resposta ou nota em até uma hora. Cada envio fica vinculado ao seu usuário e à conversa e só pode ser usado uma vez. Envios não usados são limpos após expirarem.
send_message({ conversationId: "conversation_1", attachmentIds: ["upload_1"] })Respostas exigem messages:send; notas internas exigem messages:write e nunca chegam aos clientes. Mensagens só com anexos são suportadas. Respostas por e-mail incluem os arquivos dentro do limite de tamanho do e-mail e links de download para o restante; e-mails de chat offline incluem links dos arquivos. Os links enviados por e-mail continuam funcionando enquanto o anexo existir, para que os destinatários possam abri-los depois. Encaminhar o e-mail compartilha o acesso a esses arquivos. Confira emailDeliveryStatus para ver falhas de entrega.
Leituras de mensagens autorizadas incluem downloadUrl, downloadExpiresAt, aiStatus, aiDescription e aiExtractedText, além de videoTranscripts para vídeos com link (Loom, Vimeo e outros). Os links de download duram 15 minutos; leia a mensagem de novo para obter links novos. Novos envios pela API/MCP ficam em armazenamento privado. Anexos mais antigos continuam públicos e são marcados como access=legacy_public: a URL original deles não expira. Ler uma mensagem inicia a leitura das imagens dela quando o espaço de trabalho tem o Sonny AI. Leituras de imagens e transcrições de vídeos terminam pouco depois da chegada da mensagem: enquanto alguma ainda estiver em andamento, a resposta começa com readsInProgress, cujo nextStep indica a chamada exata a fazer. Passe waitSeconds (até 30) para esperar por elas em uma única requisição. Mensagens do widget e em tempo real exibidas aos clientes nunca incluem extrações nem transcrições.
Base de conhecimento
Sincronize a partir de uma fonte externa
Sincronize artigos e categorias usando IDs externos estáveis, importe Markdown ou HTML, envie imagens, defina a ordem e gerencie os públicos de leitores. Repetir um upsert atualiza o conteúdo existente.
- Escolha o sourceId do seu canal e conceda kb:read e kb:write. Para a descoberta opcional,
list_sourcestambém precisa de conversations:read. - Crie a categoria e depois sincronize um artigo como rascunho. Revise a formatação e o acesso antes de publicar.
- Configure o acesso à central de ajuda, publique e teste a visão do leitor. Use paginação e IDs externos estáveis nas próximas atualizações.
Gerencie públicos de clientes
Crie grupos a partir de características de clientes verificados e aplique-os a uma central de ajuda, categoria ou artigo. Todas as restrições herdadas precisam ser atendidas. Credenciais de API e MCP agem como equipe dentro dos seus escopos; visualize e teste uma sessão real de cliente para conferir o acesso de leitura.
Configure e teste públicos da central de ajudaDocumentos relacionados
- API públicaBeta
Faça a triagem e sincronize conversas, compartilhe o contexto dos clientes, leia relatórios e envie arquivos com chaves de API de escopo limitado.
- WebhooksBeta
Receba eventos assinados do espaço de trabalho e inspecione as tentativas de entrega.
- Equipe e funções
Convide usuários, crie equipes e entenda os acessos de proprietário, administrador, agente e leitor.