ログイン無料トライアルを開始
Meta Tech Provider

Vercel AI SDK で WhatsApp エージェントを作る

受信したメッセージは、番号の Webhook 送信先に設定したルートハンドラーに届きます。ハンドラーは generateText を呼び出し、その回答を Cloud API で送信します。番号を操作するツールが必要な場合は、@ai-sdk/mcp の createMCPClient が HTTP 経由で EasyCoexistence の MCP サーバーに接続し、authProvider を通じて OAuth でサインインします。

@ai-sdk/mcp

createMCPClient を提供するパッケージです。AI SDK の MCP クライアントにあたります。

authProvider

AI SDK の MCP HTTP トランスポートでは、authProvider を指定することで OAuth を利用できます。

20 msg/s

WhatsApp Business アプリと Cloud API の両方で使う番号のスループットは固定です。

ルートハンドラーはどのように WhatsApp のメッセージを受信しますか?

1 つのルートに 2 つのメソッドを用意し、パスに長いランダムなシークレットを含めた URL を番号の Webhook 送信先に設定します。

GET は Meta の検証に応答します。クエリから hub.mode、hub.verify_token、hub.challenge を読み取り、トークンを照合して、challenge をプレーンテキストで返します。JSON 用のヘルパーで返してしまうのが典型的な失敗です。本文が引用符で囲まれた状態で届くため、Meta は配信を開始しません。

POST はイベントを受け取ります。まず 200 をすぐに返し、モデルの呼び出しはその後に行ってください。Meta は応答が遅いと再試行するため、コールドスタート中にモデルを同期的に実行すると、同じメッセージに 2 回回答してしまうことがあります。レスポンスの送信時に関数が終了するプラットフォームでは、処理をキューに渡すか、レスポンス後に処理を続けるためのプラットフォームの仕組みを使ってください。

パスのシークレットが認証の役割を果たします。Meta は各配信を Tech Provider のアプリシークレットで署名するため、X-Hub-Signature-256 ヘッダーをお客様側で検証することはできません。

AI SDK は WhatsApp のツールをどのように読み込みますか?

@ai-sdk/mcp の createMCPClient と HTTP トランスポートを使います。AI SDK のドキュメントでも、本番環境ではこの方法が推奨されています。トランスポートにはサーバーの URL と authProvider を渡します。EasyCoexistence の MCP サーバーは OAuth と authProvider の組み合わせで認可されます。サーバーは OAuth メタデータを公開し、動的クライアント登録と PKCE に対応しており、サインイン後に独自のトークンを発行します。ヘッダーに入れる API キーはありません。

クライアントのツールは、そのまま generateText や streamText に渡せます。モデルからは list_numbers、send_message、send_template、get_number_health などが見え、説明文には 24 時間ウィンドウの条件が明記されています。呼び出しが終わったらクライアントを閉じてください。ストリームでは onEnd コールバックで、それ以外では finally ブロックで閉じます。これは AI SDK のドキュメントにも記載されています。

モデルに判断させたい場面で使います。届いたばかりのメッセージに返信するだけなら、ハンドラーから Cloud API を直接呼ぶ方が簡潔です。

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();
}

番号が Coexistence で動いていると、何が変わりますか?

コードで把握しておくべき点が 2 つあります。1 つ目は、すでに担当者が会話に加わっている可能性があることです。番号では WhatsApp Business アプリが引き続き使え、スマートフォンで入力した返信はすべてエコーイベントとしてルートに届きます。エコーを受け取った連絡先についてモデルを一時停止するハンドラーにすれば、担当者の返信に重ねて回答することを防げます。

2 つ目は、番号ごとの送信が毎秒 20 メッセージで固定されていることです。会話型のエージェントがこの上限に達することはありませんが、連絡先リストに Promise.all を使った一斉送信のループを書くと上限に達します。まとめて少しずつ送信してください。

それ以外は通常の Cloud API と同じです。お客様の最後のメッセージから 24 時間以内であれば、フリーテキストを送信できます。それを過ぎると承認済みのメッセージテンプレートしか送れず、フリーテキストはエラー 131047 を返し、お客様には何も表示されません。

よくある間違い

  • challenge を JSON のレスポンスヘルパーで返してしまうこと。引用符が付くため、Meta の検証に失敗します。
  • Meta に応答する前に generateText を実行すること。コールドスタート時は再試行により、2 回目の回答が送られます。
  • MCP クライアントを閉じ忘れること。リクエストのたびに接続が開いたままになり、プラットフォームに強制終了されるまで残ります。
EasyCoexistence で実現する

easycoexistence.com で番号を接続し、Webhook の送信先をルートハンドラーに設定して、OAuth のサインインを 1 回行うだけで MCP クライアントを追加できます。料金は番号 1 件あたり月額 US$ 9 から、番号を追加するにつれて US$ 1 までで、最初の 3 日間は無料です。

よくある質問

Vercel でしか動作しませんか?

いいえ。AI SDK は TypeScript のライブラリです。ルートは HTTPS で公開でき、GET と POST に応答できるホスティング環境であればどこでも動作します。

MCP クライアントは必ず必要ですか?

返信だけなら不要です。番号のトークンを使って Cloud API のメッセージ用エンドポイントに fetch すれば送信できます。MCP が役立つのは、モデルが何をするかを自分で選ぶ場面です。

モデルはどのプロバイダーのものを使えますか?

AI SDK が対応しているものであれば何でも使えます。WhatsApp 側はモデルに依存しないため、プロバイダーを切り替えてもルートや Cloud API の呼び出しを変更する必要はありません。

EasyCoexistence はメッセージを見ることができますか?

いいえ。Meta はお客様のルートに直接配信し、メッセージの内容が当社側に保存されることはありません。

続きを読む

始める準備はできましたか?

WhatsApp Coexistence の設定は数分で完了し、数か月もかかりません。スマートフォン上のアプリも引き続き使えます。

無料トライアルを始める

確認日

Vercel AI SDK と WhatsApp Cloud API の連携