EntrarComeçar teste grátis
Meta Tech Provider

Crie um agente de WhatsApp com o Vercel AI SDK

As mensagens recebidas chegam a um manipulador de rota definido como destino do webhook do número. O manipulador chama generateText e envia a resposta pela Cloud API. Para ferramentas que agem sobre o número, createMCPClient de @ai-sdk/mcp conecta ao servidor MCP do EasyCoexistence por HTTP, entrando com OAuth por meio de um authProvider.

@ai-sdk/mcp

O pacote que fornece createMCPClient, o cliente MCP do AI SDK.

authProvider

O OAuth é compatível com o transporte HTTP de MCP do AI SDK por meio de um authProvider.

20 msg/s

Throughput fixo para um número usado ao mesmo tempo no app do WhatsApp Business e na Cloud API.

Como o manipulador de rota recebe as mensagens do WhatsApp?

Com dois métodos na mesma rota, definida como destino do webhook do número, com um segredo longo e aleatório no caminho.

O GET responde à verificação da Meta. Leia hub.mode, hub.verify_token e hub.challenge da query, compare o token e devolva o challenge como texto simples. Devolvê-lo por um helper de JSON é o erro clássico: o corpo chega com aspas ao redor e a Meta nunca começa a entregar.

O POST recebe os eventos. Devolva 200 rápido e chame o modelo depois, porque a Meta repete respostas lentas e uma inicialização a frio que executa o modelo na hora pode responder à mesma mensagem duas vezes. Em plataformas que encerram a função quando a resposta é enviada, passe o trabalho para uma fila ou para o mecanismo da plataforma para tarefas após a resposta.

O segredo no caminho é a autenticação. A Meta assina cada entrega com o segredo do app do Tech Provider, então o cabeçalho X-Hub-Signature-256 não pode ser verificado do seu lado.

Como o AI SDK carrega as ferramentas do WhatsApp?

Com createMCPClient de @ai-sdk/mcp e o transporte HTTP, que a documentação do AI SDK recomenda para produção. O transporte recebe a URL do servidor e um authProvider, e o OAuth por um authProvider é a forma de autorizar o servidor MCP do EasyCoexistence: ele publica os metadados de OAuth, aceita registro dinâmico de cliente e PKCE, e emite os próprios tokens após o login. Não há chave de API para colocar em um cabeçalho.

As ferramentas do cliente vão direto para generateText ou streamText. O modelo passa a ver list_numbers, send_message, send_template, get_number_health e as demais, com descrições que informam a janela de atendimento de 24 horas. Feche o cliente quando a chamada terminar, no callback onEnd em um stream ou em um bloco finally nos outros casos, como a documentação do AI SDK pede.

Use onde o modelo deve decidir. Para responder à mensagem que acabou de chegar, uma chamada direta à Cloud API a partir do manipulador é mais curta.

MCP client over HTTP with OAuth, as the AI SDK documents it
import { createMCPClient } from "@ai-sdk/mcp";

const mcp = await createMCPClient({
  transport: {
    type: "http",
    url: "https://easycoexistence.com/api/mcp",
    authProvider, // your OAuthClientProvider implementation
  },
});

try {
  const tools = await mcp.tools();
  // pass tools to generateText({ model, tools, prompt })
} finally {
  await mcp.close();
}

O que muda porque o número está na Coexistência?

Duas coisas que o código deve levar em conta. Primeiro, uma pessoa pode já estar na conversa. O app do WhatsApp Business continua funcionando no número, e cada resposta digitada no celular chega à rota como um evento de eco. Um manipulador que pausa o modelo para um contato depois de um eco evita responder por cima de uma pessoa.

Segundo, o envio tem um limite fixo de 20 mensagens por segundo para o número. Um agente conversacional nunca chega perto disso, mas um laço de envio em massa escrito com Promise.all sobre uma lista de contatos chega, então agrupe em lotes.

Todo o resto é a Cloud API comum. Dentro de 24 horas da última mensagem do cliente, texto livre é permitido. Depois disso, só passa um template aprovado, e o texto livre devolve o erro 131047 sem que o cliente veja nada.

Erros comuns

  • Devolver o challenge com um helper de resposta JSON. As aspas ao redor fazem a verificação da Meta falhar.
  • Executar generateText antes de responder à Meta. Em uma inicialização a frio, a repetição gera uma segunda resposta.
  • Esquecer de fechar o cliente MCP. Cada requisição deixa uma conexão aberta até a plataforma encerrá-la.
Fazendo isso com o EasyCoexistence

Conecte o número em easycoexistence.com, defina o destino do webhook como seu manipulador de rota e adicione o cliente MCP com um único login OAuth. A partir de US$ 9 por número conectado por mês, caindo até US$ 1 conforme você adiciona números, com os 3 primeiros dias grátis.

Perguntas frequentes

Isso só funciona na Vercel?

Não. O AI SDK é uma biblioteca TypeScript, e a rota pode rodar em qualquer host que sirva HTTPS e responda a um GET e a um POST.

Preciso mesmo do cliente MCP?

Não para responder. Um fetch ao endpoint de mensagens da Cloud API com o token do número resolve. O MCP vale a pena quando o modelo escolhe o que fazer.

Qual provedor o modelo pode ser?

Qualquer um que o AI SDK aceite. O lado do WhatsApp é independente do modelo, então trocar de provedor não mexe na rota nem na chamada à Cloud API.

O EasyCoexistence vê as mensagens?

Não. A Meta entrega direto na sua rota e o conteúdo das mensagens nunca é armazenado do nosso lado.

Continue lendo

Pronto para começar?

Configure o WhatsApp Coexistence em minutos, não em meses. O aplicativo continua funcionando no celular.

Começar teste grátis

Verificado em

Vercel AI SDK no WhatsApp com a Cloud API