Bouw een WhatsApp-agent met de Vercel AI SDK
Binnenkomende berichten komen aan bij een route handler die als webhook-bestemming van het nummer is ingesteld. De handler roept generateText aan en stuurt het antwoord via de Cloud API. Voor tools die op het nummer werken, verbindt createMCPClient uit @ai-sdk/mcp via HTTP met de EasyCoexistence MCP-server en logt in met OAuth via een authProvider.
Het pakket dat createMCPClient levert, de MCP-client van de AI SDK.
OAuth wordt ondersteund op het MCP HTTP-transport van de AI SDK door een authProvider mee te geven.
Vaste doorvoer voor een nummer dat zowel met de WhatsApp Business-app als met de Cloud API wordt gebruikt.
Hoe ontvangt de route handler WhatsApp-berichten?
Met twee methoden op één route, ingesteld als webhook-bestemming van het nummer, met een lang willekeurig geheim in het pad.
De GET beantwoordt de verificatie van Meta. Lees hub.mode, hub.verify_token en hub.challenge uit de query, vergelijk het token en geef de challenge terug als platte tekst. Die teruggeven via een JSON-helper is de klassieke fout: de body komt aan met aanhalingstekens eromheen en Meta begint nooit met bezorgen.
De POST ontvangt events. Geef snel 200 terug en doe de modelaanroep daarna, want Meta probeert trage antwoorden opnieuw en een cold start die het model inline draait, kan hetzelfde bericht twee keer beantwoorden. Op platforms die de functie beëindigen zodra het antwoord is verstuurd, geef je het werk door aan een queue of aan het mechanisme van het platform voor werk na het antwoord.
Het geheim in het pad is de authenticatie. Meta ondertekent elke bezorging met het app secret van de Tech Provider, dus de header X-Hub-Signature-256 kun je aan jouw kant niet controleren.
Hoe laadt de AI SDK de WhatsApp-tools?
Met createMCPClient uit @ai-sdk/mcp en het HTTP-transport, dat de documentatie van de AI SDK aanbeveelt voor productie. Het transport krijgt de server-URL en een authProvider, en OAuth via een authProvider is hoe de EasyCoexistence MCP-server wordt geautoriseerd: de server publiceert OAuth-metadata, ondersteunt dynamic client registration en PKCE en geeft na het inloggen eigen tokens uit. Er is geen API-sleutel om in een header te zetten.
De tools van de client gaan rechtstreeks in generateText of streamText. Het model ziet dan list_numbers, send_message, send_template, get_number_health en de rest, met beschrijvingen die het venster van 24 uur vermelden. Sluit de client als de aanroep klaar is: in de onEnd-callback bij een stream, anders in een finally-blok, zoals de documentatie van de AI SDK vraagt.
Gebruik het waar het model moet beslissen. Om te antwoorden op het bericht dat net binnenkwam, is een directe Cloud API-aanroep vanuit de handler korter.
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();
}Wat verandert er doordat het nummer op Coexistence zit?
Twee dingen die de code moet weten. Ten eerste kan er al een mens in het gesprek zitten. De WhatsApp Business-app blijft werken op het nummer, en elk antwoord dat op de telefoon wordt getypt, komt als echo-event bij de route aan. Een handler die het model voor een contact pauzeert na een echo, voorkomt dat het over een persoon heen antwoordt.
Ten tweede is verzenden begrensd op vaste 20 berichten per seconde voor het nummer. Een conversationele agent komt daar nooit in de buurt, maar een broadcast-lus met Promise.all over een contactlijst wel, dus verwerk die in batches.
Alles andere is de gewone Cloud API. Binnen 24 uur na het laatste bericht van de klant is vrije tekst toegestaan. Daarna gaat alleen een goedgekeurd template door, en vrije tekst geeft foutcode 131047 terug zonder dat de klant iets ziet.
Veelgemaakte fouten
- De challenge teruggeven met een JSON-antwoordhelper. De aanhalingstekens eromheen laten de controle van Meta mislukken.
- generateText draaien voordat je Meta antwoordt. Bij een cold start levert de nieuwe poging een tweede antwoord op.
- Vergeten de MCP-client te sluiten. Elk verzoek laat een verbinding openstaan tot het platform die afbreekt.
Verbind het nummer op easycoexistence.com, stel de webhook-bestemming in op je route handler en voeg de MCP-client toe met één OAuth-login. Vanaf US$ 9 per nummer per maand, dalend naar US$ 1 naarmate er nummers bijkomen, met de eerste 3 dagen gratis.
Veelgestelde vragen
Werkt dit alleen op Vercel?
Nee. De AI SDK is een TypeScript-bibliotheek en de route kan draaien op elke host die HTTPS serveert en een GET en een POST beantwoordt.
Heb ik de MCP-client wel nodig?
Niet om te antwoorden. Een fetch naar het messages-endpoint van de Cloud API met het token van het nummer doet dat. MCP verdient zijn plek wanneer het model kiest wat het doet.
Welke provider kan het model zijn?
Elke die de AI SDK ondersteunt. De WhatsApp-kant staat los van het model, dus van provider wisselen raakt de route en de Cloud API-aanroep niet.
Ziet EasyCoexistence de berichten?
Nee. Meta bezorgt rechtstreeks aan je route en de inhoud van berichten wordt bij ons nooit opgeslagen.
Lees verder
Klaar om te beginnen?
Stel WhatsApp Coexistence in enkele minuten in, niet maanden. De app blijft op je telefoon werken.
Start je gratis proefperiodeGeverifieerd op