Skip to main content
A OctaSend tem um servidor MCP (Model Context Protocol) remoto. Com ele, assistentes de IA como o Claude Code chamam a API de mensagens diretamente: listam as comunicações, enviam mensagens, consultam estatísticas e verificam canais — tudo a partir de uma conversa, durante o desenvolvimento. No painel, a página Configurações → MCP Server reúne o passo a passo e um prompt pronto para o Claude Code.

Como funciona

O servidor fica hospedado pela OctaSend — não há pacote para instalar nem processo local para rodar. Você aponta o seu cliente MCP para a URL abaixo e se autentica com um OAuth Client:
O servidor troca o client_id:client_secret por um access token de 1 hora (o mesmo fluxo de Autenticação) e reaproveita esse token até perto de ele vencer, quando pede outro sozinho — você não precisa cuidar de renovação. A credencial é conferida já na conexão: se ela não vale, o servidor responde antes de liberar as tools. Também dá para colocar no header um access token (at_...) já emitido. Nesse caso o servidor não tem como renová-lo: depois de 1 hora as tools passam a responder 401 e é preciso trocar o token no header. Por isso, prefira o par client_id:client_secret.
Não configure o servidor como "type": "stdio" com npx octasend-mcp: esse pacote não é distribuído. Use sempre "type": "http" com a URL acima.

Configuração no seu projeto

1

Crie as credenciais

Em Configurações → OAuth Clients, crie um client e guarde o client_id e o client_secret — o secret aparece uma única vez. Prefira um client só para o MCP, separado do usado em produção.
2

Registre o servidor MCP

Pela CLI do Claude Code, que cria o .mcp.json por você:
Ou crie o arquivo .mcp.json na raiz do projeto:
Cole os valores exatamente como aparecem no painel — o client_id já começa com client_ e o client_secret com secret_ — separados por dois-pontos, sem espaços.
3

Proteja as credenciais

O .mcp.json guarda o segredo no header. Tire o arquivo do versionamento:
4

Ative

Abra (ou reinicie) o Claude Code na pasta do projeto. Rode /mcp e confirme que o servidor octasend aparece conectado, com as tools listadas acima.
Outros clientes MCP funcionam da mesma forma, desde que suportem transporte HTTP e permitam enviar o header Authorization.

Referência das tools

A mesma credencial libera todas as tools — não existe permissão por tool. Quando a API responde com erro (por exemplo, 401 ou 404), a tool devolve o erro com o código HTTP e a mensagem, como API /send-message retornou 404: Communication not found.

list_communications

Lista as comunicações da conta, ativas e inativas, em ordem alfabética. Use antes de send_message para descobrir os slugs. Não recebe parâmetros.
Só comunicações com is_active: true aceitam envio. Uma lista vazia significa que a credencial funciona, mas a conta ainda não tem comunicações — crie a comunicação no painel antes de enviar.

send_message

Envia uma mensagem para um destinatário. Equivale ao endpoint send-message e segue as mesmas regras de canais, idioma, variáveis e limite por minuto.
Uma falha num canal não gera erro na tool: a resposta vem com success: true e o resultado de cada canal em results[].status (sent, queued, failed ou skipped). Confira sempre esse campo. Quando a conta atinge o limite diário de mensagens, o canal volta failed com error_code: "daily_limit_reached".

send_messages_batch

Envia de 1 a 100 mensagens numa única chamada. Cada item aceita communication_slug, recipient (com os mesmos campos do send_message, inclusive push_token), variables, language, channels e tag. Um slug inexistente ou inativo não derruba o lote: aquele item volta com error. Para listas maiores, divida em lotes. Veja Envio em lote.

get_message_stats

Devolve um resumo dos envios do período.
O resumo considera todos os envios do período. sent conta os envios enviados, entregues e lidos (status sent, delivered e read); failed e skipped contam os envios com exatamente esse status; envios queued ou processing entram só em total e by_channel. As datas de by_day estão em UTC.
Para relatórios completos e paginados, use o endpoint Consultar logs.

get_channel_config

Mostra se um canal está configurado, sem expor credenciais. Útil para conferir um canal antes de enviar.
channel aceita email, whatsapp, telegram, slack, web_push, push ou in_app.
config traz só dados não sensíveis (provedor, remetente, região); configured_fields lista os nomes dos campos preenchidos, sem os valores. Quando não há configuração salva para o canal, a resposta é {"config": null}.
Sem a configuração principal do canal, a consulta olha as conexões ativas da aba Conexões (a conexão padrão primeiro). Assim, um WhatsApp conectado só pela aba Conexões aparece como configurado.

create_communication

Cria uma comunicação nova, já publicada, com canais e conteúdo por idioma. Em seguida, o send_message com esse slug já funciona. Equivale a POST /create-communication.
O slug aceita a-z, 0-9, - e _ e não muda depois. Cada canal precisa estar habilitado na conta. A resposta traz a comunicação, no formato de get_communication, e changes. Campos de cada template por canal: No e-mail, o body_html deve ter estilos inline: o <head> é descartado.

update_communication

Altera uma comunicação existente pelo slug. Equivale a POST /update-communication.
  • Aceita name, description (null limpa), is_active e channels. Só os campos enviados mudam.
  • Cada idioma alterado vira uma versão nova publicada na hora (Versão N (API)). A anterior fica guardada no painel e pode ser reativada. Conteúdo igual ao publicado não cria versão (unchanged).
  • Canal ou idioma que ainda não existe é criado. Nada é excluído pela API.

get_communication

Lê o conteúdo de uma comunicação: os canais e, por idioma, o template com as {{variáveis}} ainda não preenchidas. Equivale a GET /get-communication?slug=<slug>. Só slug é obrigatório.
Sem version nem status, cada idioma traz só a versão publicada, a que é enviada. Com qualquer um dos dois, cada idioma lista todas as versões que casam, cada uma com published true ou false. versions_count é sempre o total de versões do idioma. Canal ou idioma sem conteúdo devolve channels vazio.
Com version ou status, um idioma pode aparecer várias vezes. Essa saída é só para leitura: não a reenvie para editar a comunicação.

get_message

Devolve uma mensagem enviada pelo id (o message_id do send_message), com o conteúdo final em sent_content. Equivale a GET /query-message-logs?id=<id>.
O formato de sent_content por canal está em Consultar logs. Um id inexistente devolve 404.

list_messages

Lista as mensagens enviadas, da mais recente para a mais antiga, com paginação e sent_content em cada item. Todos os parâmetros são opcionais: channel, status, communication_slug, tag, from, to (ISO 8601), page e limit (até 100). Têm o mesmo significado dos parâmetros de Consultar logs.

Documentando as comunicações no CLAUDE.md

Para o Claude saber qual comunicação usar em cada evento do seu produto, adicione uma seção ao CLAUDE.md do projeto:

Prompt pronto para o Claude Code

Em Configurações → MCP Server, o botão Copiar prompt copia um roteiro completo para colar no Claude Code. Ele instrui a IA a conectar o MCP remoto, proteger as credenciais, listar as comunicações, mapear os eventos do seu projeto, implementar os envios, documentar tudo no CLAUDE.md e testar a integração.

Solução de problemas

Quase sempre é a configuração antiga com "type": "stdio" e npx octasend-mcp. Troque para "type": "http" com a URL https://octasend.com.br/mcp.
Não é falta de permissão: a mesma credencial libera todas as tools. Um 401 significa credencial inválida ou revogada. Confira se o header está no formato exato Bearer client_id:client_secret (dois-pontos, sem espaços) e se o OAuth Client continua Ativo em Configurações → OAuth Clients. Se você colocou um access token (at_...) no header, ele vale só 1 hora: troque pelo par client_id:client_secret.
Um 429 não indica credencial inválida: o limite de pedidos de token foi atingido. Espere os segundos indicados no header Retry-After e tente de novo. Um 503 significa que o serviço de autenticação não respondeu; tente de novo em instantes.
A credencial está funcionando — a conta é que ainda não tem comunicações. Crie a comunicação no painel antes de enviar.
O slug não existe ou a comunicação está inativa. Use list_communications para conferir o slug e o is_active.
Veja results[].status de cada canal: failed ou skipped trazem o motivo em error. Confira também se o canal está configurado com get_channel_config e acompanhe o envio em Consultar logs.