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ública

Início rápido

  1. 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.

  2. 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.

  3. 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/mcp

Configuraçã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

  1. 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, chame list_conversations com sourceId, awaitingReply: true, snoozed: "false" e compact: true. Notas internas não escondem mensagens de clientes sem resposta.
  2. Leia só o texto novo: para cada conversa alterada, chame list_messages com o ID da sua última mensagem ou um timestamp ISO em after e defina includeHtml: false, a menos que o HTML do e-mail seja realmente necessário.
  3. Espere por imagens e vídeos: quando list_messages retornar readsInProgress, faça a chamada indicada em nextStep. O waitSeconds dela 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.
  4. Carregue o contexto do cliente: get_conversation retorna identityVerified, os verifiedTraits assinados e a página de origem e o contexto do cliente da conversa. Quando houver um contact.id, passe esse ID para list_conversations para carregar as conversas anteriores do cliente.
  5. Acorde sob demanda: use um webhook filtrado por origem para message.created para 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.

  1. Comece sem cursor, siga nextCursor até hasMore ser false e salve esse cursor.
  2. Leia as listas atuais de conversas e contatos e todo o histórico de que precisar para o seu estado inicial.
  3. 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.

Explore os contratos completos de requisição e resposta

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.

  1. Escolha o sourceId do seu canal e conceda kb:read e kb:write. Para a descoberta opcional, list_sources também precisa de conversations:read.
  2. Crie a categoria e depois sincronize um artigo como rascunho. Revise a formatação e o acesso antes de publicar.
  3. 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.
Siga o passo a passo completo de sincronização via MCP

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 ajuda

Documentos relacionados