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.
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 Ou crie o arquivo Cole os valores exatamente como aparecem no painel — o
.mcp.json por você:.mcp.json na raiz do projeto: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.
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.
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.
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.
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.
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(nulllimpa),is_activeechannels. 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.
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>.
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 noCLAUDE.md e testar a integração.
Solução de problemas
O servidor não aparece em /mcp, ou aparece com falha
O servidor não aparece em /mcp, ou aparece com falha
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.Alguma tool devolve 401
Alguma tool devolve 401
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.A conexão responde 429 ou 503
A conexão responde 429 ou 503
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.list_communications devolve uma lista vazia
list_communications devolve uma lista vazia
A credencial está funcionando — a conta é que ainda não tem comunicações. Crie a comunicação no painel antes de enviar.
send_message devolve 404 Communication not found
send_message devolve 404 Communication not found
O slug não existe ou a comunicação está inativa. Use
list_communications para conferir o slug e o is_active.O envio responde, mas a mensagem não chega
O envio responde, mas a mensagem não chega
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.