Pular para o conteúdo

Servidor MCP

O Turbo Notify expõe a própria API pública como um servidor MCP (Model Context Protocol) (abre em nova aba) . Seu agente de IA recebe 36 ferramentas (enviar mensagem, responder, marcar conversa como lida, consultar contato, ver cota, reconectar número) e escolhe qual usar a cada passo.

Cada ferramenta chama um endpoint documentado da API, com a sua credencial. Cotas, limites de plano, ritmo de envio e códigos de erro são os mesmos da API REST, e o MCP não tem cobrança à parte.

Quando usar

Você está construindoUse
Um agente de IA que decide o que fazer (atendente, assistente, triagem)Servidor MCP
Uma integração determinística (envio transacional, rotina agendada, ETL)API REST
Algo que precisa reagir a mensagens recebidasWebhook para receber, somado ao MCP ou à API para agir

Um agente de atendimento costuma combinar os dois lados: o webhook avisa a sua aplicação que chegou mensagem, e o agente responde pelas ferramentas MCP. O repositório de exemplo faz isso.

Conexão

Endereçohttps://mcp.turbonotify.com
TransporteStreamable HTTP
Entrar com a sua contaSó o endereço. O cliente abre a página de login do Turbo Notify, você entra e aprova o acesso
Chave de APICabeçalho Authorization: Bearer SUA_CHAVE em toda requisição

Prefira entrar com a sua conta. No Claude, no Claude Code e em outros clientes que permitem entrar em servidores remotos, adicione só o endereço. Você entra no Turbo Notify, escolhe o que o agente pode fazer e aprova. Não precisa copiar chave nem editar arquivo. Use uma chave de API em clientes sem essa opção e em agentes que rodam sozinhos, como um atendente que responde 24 horas por dia.

As duas formas diferem em quem é dono do acesso. Ao entrar, o acesso é de uma pessoa: o app age em nome de quem aprovou, na organização que ela escolheu, e para de funcionar se ela for removida da organização ou redefinir a senha. A chave é da organização: continua valendo mesmo que quem a criou seja removido. Se o agente precisa continuar funcionando depois de uma troca de equipe, use uma chave.

A tela Agentes de IA (MCP) (abre em nova aba) do dashboard traz as configurações abaixo prontas para copiar e mostra quais ferramentas cada uma das suas chaves alcança.

Entrando com a sua conta (recomendado). Pelo terminal, adicione o servidor sem chave:

Terminal window
claude mcp add --transport http turbo-notify https://mcp.turbonotify.com

Depois execute /mcp dentro do Claude Code, escolha turbo-notify e siga os passos no navegador: você entra no Turbo Notify e aprova o acesso.

Com uma chave de API. Adicione o cabeçalho e o Claude Code usa a chave em vez de pedir que você entre:

Terminal window
claude mcp add --transport http turbo-notify https://mcp.turbonotify.com --header "Authorization: Bearer SUA_CHAVE"

Ou, com chave, no arquivo .mcp.json do projeto. O campo "type": "http" é obrigatório para servidor remoto:

.mcp.json
{
"mcpServers": {
"turbo-notify": {
"type": "http",
"url": "https://mcp.turbonotify.com",
"headers": {
"Authorization": "Bearer SUA_CHAVE"
}
}
}
}

Gerenciar o acesso dos apps

Cada app que você conecta por login aparece em Apps conectados (abre em nova aba) , no dashboard, com a opção de desconectar. O app desconectado perde o acesso em alguns minutos. Depois disso, o app precisa pedir a sua aprovação de novo para voltar a funcionar.

Só proprietários e administradores da organização podem conectar um app.

O acesso de um app dura até 90 dias, ou 30 dias sem uso. Passado esse prazo, o app deixa de funcionar e precisa pedir a sua aprovação de novo.

Para um agente que roda sozinho, use uma chave de API: ela não exige nova aprovação a cada 90 dias.

Redefinir a sua senha desconecta todos os apps conectados à sua conta: cada um precisa pedir a sua aprovação de novo.

Se a pessoa que conectou um app for removida da organização, o app é desconectado e um proprietário ou administrador precisa conectá-lo de novo. As chaves de API não são afetadas.

Conectar o mesmo app outra vez, em outro dispositivo, mantém a conexão anterior. Cada app, pessoa e organização pode ter no máximo 10 conexões ativas. Ao passar disso, a que foi usada há mais tempo é desconectada (uma que nunca foi usada sai primeiro).

Na tela de aprovação, as seis permissões de leitura e de envio vêm marcadas. Gerenciar números (conectar um número) e Gerenciar contatos (atualizar o nome de um contato) só aparecem quando o app as pede e vêm desmarcadas. Elas alteram a sua conta, mas conectar e desconectar um número nunca geram cobrança. Marque só se o agente precisar.

Chave e escopos

Ao entrar com a sua conta, você escolhe as permissões na tela de aprovação. As que alteram a conta (reconectar número, atualizar contato) só aparecem se o app as pedir e começam desmarcadas. Com chave, use uma chave de API (abre em nova aba) comum. O template Acesso total alcança as 36 ferramentas, mas para um agente é melhor uma chave só com o necessário.

Ao criar a chave no dashboard, o template Agente de IA (MCP) já marca o conjunto recomendado para um atendente: messages:send, messages:read, contacts:read, groups:read, numbers:read e events:read. Ele deixa de fora:

  • numbers:write: reconectar e desconectar número é decisão de quem opera a conta e não gera cobrança.
  • contacts:write: atualizar um contato faz uma consulta real ao WhatsApp.

Cada ferramenta exige o escopo indicado no catálogo. Duas regras costumam surpreender: responder, editar, apagar, reagir e marcar como lida contam como envio (messages:send), e as ferramentas de cota e uso não exigem escopo, só uma chave válida.

Ferramentas

Toda ferramenta que atua sobre mensagens, contatos ou grupos aceita number_alias e assume "main" (o número principal) quando você não informa. No lugar do alias, vale também o id do número (num_…). Os limites de plano são os mesmos da API: reagir (react_to_message) e o indicador de digitação (send_typing_indicator) exigem o plano Lobo Solitário ou superior; o envio para grupos (inclusive o indicador de digitação em grupo), os recibos de leitura (get_message_receipts) e mark_as_read exigem o plano Empresarial ou superior. Receber mensagens por webhook exige o plano Lobo Solitário ou superior; no Gratuito, o agente acompanha as mensagens recebidas com list_events. Sem o plano necessário, a ferramenta responde payment_required: feature_not_available.

Ao responder, reagir, editar, apagar ou começar a digitar, o número abre a conversa como uma pessoa faria: aparece online, marca como lidas as mensagens não lidas daquela conversa e só então age. Você não precisa chamar mark_as_read antes. Abrir a conversa assim é automático e não consome cota própria (a resposta, a reação e o envio contam como antes). Veja Indicador de digitação e Marcar como lida.

Envio

FerramentaO que fazEscopo
send_textEnvia texto, com menções @número quando for grupomessages:send
send_mediaEnvia imagem, vídeo, áudio, documento ou figurinha a partir de uma URL (kind escolhe o tipo)messages:send
send_locationEnvia uma localizaçãomessages:send
send_contact_cardEnvia um cartão de contatomessages:send
send_calendar_eventEnvia um convite de evento de agendamessages:send
send_cta_buttonEnvia uma mensagem com botão de linkmessages:send

Responder e agir

FerramentaO que fazEscopo
reply_to_messageResponde citando uma mensagem anterior, para trazer contextomessages:send
edit_text_messageTroca o texto de uma mensagem de texto enviada, até 15 minutos depois do enviomessages:send
edit_media_captionTroca a legenda de uma imagem, vídeo ou documento enviado, até 15 minutos depois do enviomessages:send
edit_calendar_eventSubstitui um evento de agenda enviado pelo evento corrigidomessages:send
cancel_calendar_eventCancela um evento de agenda enviadomessages:send
delete_messageApaga uma mensagem enviadamessages:send
react_to_messageReage a uma mensagem (substitui a reação anterior)messages:send
send_typing_indicatorMostra “digitando…” na conversamessages:send
mark_as_readMarca como lidas as mensagens não lidas de uma conversa ou grupo, sem respondermessages:send

Cada ferramenta de edição recebe só os campos do próprio tipo, então o agente não consegue mandar o corpo errado. Só mensagens enviadas pelo Turbo Notify podem ser alteradas. Localização, cartão de contato, botão de link, figurinha e áudio não podem ser editados: para esses, delete_message é a única alteração. Veja Editar e apagar mensagens.

Leitura de mensagens

FerramentaO que fazEscopo
list_messagesLista mensagens do número, com filtro por grupo, contato e direçãomessages:read
get_messageConsulta uma mensagemmessages:read
get_message_statusConsulta o status de entregamessages:read
get_message_receiptsConsulta os recibos de entrega e leituramessages:read
get_message_reactionsConsulta as reações de uma mensagemmessages:read
get_message_responsesConsulta as respostas dos convidados a um evento de agendamessages:read
get_message_quotaConsulta a cota de mensagens do númeronenhum

Contatos

FerramentaO que fazEscopo
list_contactsLista contatos do númerocontacts:read
get_contactConsulta um contatocontacts:read
get_contact_profile_pictureConsulta a foto de perfilcontacts:read
refresh_contactAtualiza o nome do contato consultando o WhatsAppcontacts:write
get_contact_quotaConsulta a cota de contatos do númeronenhum

Grupos

FerramentaO que fazEscopo
list_groupsLista os grupos do númerogroups:read
get_groupConsulta um grupo: nome, descrição, foto, configurações e quantidade de participantesgroups:read
get_group_pictureConsulta a foto do grupogroups:read

Números

FerramentaO que fazEscopo
list_numbersLista o número principal e os extras, com o id de cada um (num_…, o identificador fixo que o Turbo Notify gera e que não muda se o alias for renomeado). Aceita o filtro status, como a listagemnumbers:read
get_numberConsulta o status de um número e o seu idnumbers:read
connect_numberReconecta um número desconectado, sem QR codenumbers:write
disconnect_numberDesconecta um número sem desfazer a vinculação com o celular. Não interrompe a cobrança: o número extra é cobrado a cada ciclo até ser removidonumbers:write

Uso e eventos

FerramentaO que fazEscopo
get_usageConsulta o uso agregado da conta no ciclonenhum
list_eventsLista eventos (os mesmos do webhook) por tipo, número, período ou request_id. É como o agente fica sabendo de mensagens recebidas sem ter webhookevents:read

As ferramentas de escrita devolvem um request_id quando a plataforma gera um. Guarde-o para localizar depois o resultado daquela operação com list_events.

Conectar e desconectar não cobram

connect_number e disconnect_number não geram cobrança. Em um número extra com exclusão agendada, os dois funcionam como em qualquer outro e não alteram a data da exclusão. Nenhuma ferramenta cancela uma exclusão agendada.

connect_number não recupera um número com status revoked (desvinculado pelo celular): esse precisa ser vinculado de novo por uma pessoa.

Repetir connect_number ou disconnect_number não muda nada. O número que já está no estado pedido responde conflict: already_connected, conflict: already_connecting ou conflict: already_disconnected, e isso quer dizer que o número já está como você pediu. A chamada não falhou.

O que não está disponível, e por quê

Nenhuma ferramenta inclui, renomeia, remove ou vincula número. O critério é: muda o que a sua conta paga, ou precisa de alguém com o celular na mão?

OperaçãoPor que não é ferramenta
Incluir número extraCobra o cartão antes de provisionar. Se o agente repetir a chamada, a cobrança se repete.
Remover númeroAgenda uma exclusão real e pode gerar estorno.
Renomear númeroMuda o alias que endereça um número já em uso.
Vincular número (pareamento)Precisa de uma pessoa com o celular na mão, lendo o QR code ou digitando o código de pareamento.
Cancelar exclusão agendadaPode cobrar o restante do período pago e mantém um número que alguém decidiu remover. connect_number não desfaz a exclusão.

Para essas operações, use o dashboard (abre em nova aba) ou a API REST. Um número extra é vinculado pelo dashboard ou pela API, nos dois casos com QR code ou código de pareamento.

Quando um número está em pairing, get_number informa só o status. O código ou o QR code da vinculação não passa pelo agente: pertence a quem está com o celular.

Envio sem duplicar

As ferramentas de envio e reply_to_message aceitam idempotency_key: qualquer texto ASCII imprimível de 1 a 255 caracteres, escolhido por você. Se a chamada falhar por tempo esgotado e o agente tentar de novo com a mesma chave, no mesmo número, a mensagem não é enviada duas vezes. Sem ela, repetir depois de um tempo esgotado pode entregar a mensagem em dobro, e o destinatário vê as duas.

Use uma chave nova para cada mensagem nova, derivada de algo estável do seu lado (por exemplo o id do evento que o agente está respondendo). Uma chave fora do formato é recusada com uma mensagem que nomeia o campo.

Limites

LimiteValorContado por
Requisições ao servidor MCP600 por minutoChave de API ou login do app
Conexões de streaming abertas ao mesmo tempo8Chave de API ou login do app
Requisições ao servidor MCP, limite compartilhado3000 por minutoEndereço de origem
Conexões de streaming abertas ao mesmo tempo, limite compartilhado64Endereço de origem

Requisições sem chave nem login são contadas só pelo endereço de origem. As demais passam pelos dois limites ao mesmo tempo, e a requisição é recusada quando qualquer um se esgota. O limite por endereço é maior para comportar várias chaves atrás da mesma saída de rede (por exemplo, uma plataforma que hospeda agentes de vários clientes), mas, somadas, elas não passam de 3000 requisições por minuto nem de 64 conexões de streaming. Os limites da própria API (ritmo de envio, cotas do plano) continuam valendo em cada ferramenta: veja Limites e Cota e uso.

Erros

Dentro do resultado da ferramenta

Quando uma ferramenta não consegue fazer o que foi pedido, o agente recebe o motivo no próprio resultado, com o código de erro da API intacto. É nele que o agente decide se corrige, espera ou desiste:

SituaçãoO agente recebeO que fazer
Argumento recusado antes de chegar à APIUma mensagem que nomeia o campoCorrija o argumento indicado.
Argumento inválidoinvalid_request: <código>Corrija os argumentos e tente de novo.
Número desconectadoconflict: number_not_connected, com a orientação para reconectarReconecte o número com connect_number (ou pelo dashboard, se o celular precisar ler um código de novo) e tente de novo.
Número já no estado pedidoconflict: already_connected, conflict: already_connecting ou conflict: already_disconnectedNada a fazer: numa repetição de connect_number ou disconnect_number, o número já está no estado pedido.
Chave com formato de chave, mas inválida, revogada ou expiradaunauthorized: not_authenticated, com a orientação para trocar a chaveGere uma nova chave no dashboard.
Chave ou login sem o escopo da ferramentaunauthorized: insufficient_scopeVeja o escopo na tabela de ferramentas. Com chave, use uma que o tenha. Se você entrou com a sua conta, desconecte o app em Apps conectados e conecte de novo, marcando essa permissão.
Cota, plano ou pagamentopayment_required: <código> e o objeto details completoVeja Cota e uso.
Não encontradonot_found: <código>Confira o identificador ou o number_alias.
Limite de velocidade da APIrate_limited: <código>, com o tempo de espera quando houverEspere o tempo indicado.
Falha temporáriaservice_unavailableTente de novo em instantes.

O details vai completo, sem resumo: é o que distingue uma cota que reseta no fim do ciclo de um recurso que o plano não inclui.

Na conexão

Estes são respondidos antes de qualquer ferramenta rodar, então quem os vê é o seu cliente MCP, não o agente:

RespostaO que aconteceuO que fazer
401 com o convite para entrarA chamada ou a conexão chegou sem login e sem chave, ou com um valor que não é nem um login nem uma chave.Num cliente com login, entre com a sua conta quando ele pedir. Nos demais, envie o cabeçalho Authorization: Bearer SUA_CHAVE em toda requisição, também na conexão de streaming, não só nas chamadas.
401 invalid_tokenO login do app venceu ou foi desconectado.O cliente entra de novo ou renova o acesso sozinho. Se o app foi desconectado, aprove o acesso outra vez.
503O login está indisponível por um momento.Tente de novo em instantes. Chaves de API continuam funcionando enquanto isso.
429 too_many_streamsEsta chave ou este login já mantém 8 conexões de streaming abertas, ou o endereço de origem já mantém 64.Feche as que não usa, ou reduza os processos conectados com a mesma chave ou o mesmo endereço.
429 rate_limit_exceededMais de 600 requisições em um minuto com esta chave ou este login, ou mais de 3000 em um minuto vindas do mesmo endereço.Respeite o Retry-After da resposta.

Exemplo completo

O repositório turbo-notify/examples (abre em nova aba) traz um atendente de WhatsApp funcional construído sobre este servidor: recebe a mensagem pelo webhook, decide com um modelo, que escreve a resposta, e o próprio programa a envia como mensagem normal com send_text. É código pequeno e comentado, feito para ser lido antes de ser rodado.

Para montar o seu próprio agente, passo a passo, veja o guia Construa um agente de IA.

Próximos passos