LangChain エージェントに WhatsApp 番号を持たせる
LangChain エージェントで WhatsApp を使うには、受信と操作の 2 つを用意します。受信メッセージは、番号の Webhook を通じてお客様側の Web ルートに届き、そのルートがエージェントを呼び出します。エージェントが操作するときは、LangChain の MCPAdapter と OAuth で EasyCoexistence の MCP ツールを読み込むか、番号のアクセストークンと phone_number_id を使って Cloud API を直接呼び出します。
langchain.mcp 名前空間(ベータ版)を使うために必要な langchain[mcp] の最小バージョンです。
探索、動的クライアント登録、ブラウザへのリダイレクト、トークン交換まで、OAuth 2.1 のフロー全体を実行します。
受信者が最後に返信してから 24 時間以上経過している場合に、Meta が返すエラーです。
LangChain エージェントは WhatsApp のツールをどう読み込みますか?
LangChain の MCP クライアントである MCPAdapter を使います。MCP サーバーのツールが、通常の LangChain ツールとして create_agent に渡されます。langchain[mcp] のバージョン 1.4.0 以降が必要で、現在はベータ版です。
認証は FastMCP に任せます。クライアントで auth="oauth" を指定すると、探索、動的クライアント登録、ブラウザへのリダイレクト、トークン交換まで、OAuth 2.1 のフロー全体が実行されます。EasyCoexistence の MCP サーバーが求めるのはこの方式なので、キーを作成して貼り付ける手間はありません。既定ではトークンはメモリ上にのみ保持され、実行のたびにブラウザでの手順が繰り返されます。トークンストアを備えた FastMCP の OAuth プロバイダーを使うと、実行をまたいで保持できます。
読み込みが終わると、エージェントは各ツールを説明付きで認識します。最初に使うのは list_numbers です。ほかのすべてのツールが、これで得た connection_id を必要とするためです。そのあとに send_message、send_template、list_templates、get_number_health などが続きます。
from fastmcp.client import Client
from langchain.agents import create_agent
from langchain.mcp import MCPAdapter
URL = "https://easycoexistence.com/api/mcp"
async def build_agent(model: str):
async with MCPAdapter(Client(URL, auth="oauth")) as adapter:
tools = await adapter.list_tools()
return create_agent(model, tools)WhatsApp の受信メッセージは、どうやってエージェントに届きますか?
Webhook を使います。MCP では実現できないためです。MCP はリクエストとレスポンスのプロトコルなので、お客様が書き込んだときにサーバーからクライアントを起動する仕組みがありません。
番号の Webhook の送信先を、お客様自身のアプリケーション内のルートに設定します。URL パスには長いランダムなシークレットを含めてください。このルートは、Meta の検証用 GET にチャレンジ値をそのまま返し、各 POST を受け付けて、すぐに 200 を返したうえで処理をキューに入れます。その後ワーカーがペイロードから送信者とテキストを取り出し、エージェントを呼び出します。このとき送信者の電話番号をスレッド ID にすると、メモリがお客様ごとに分かれます。
検証には X-Hub-Signature-256 ヘッダーではなく、URL 内のシークレットを使ってください。Meta は Tech Provider のアプリシークレットで署名しますが、これは共有されないため、お客様側ではこのヘッダーを検証できません。
エージェントは MCP と Cloud API のどちらで送信すべきですか?
どちらでも動作します。違いは、ルールをどこで管理するかです。MCP ツールは、WhatsApp のルールを説明文に含んでいます。たとえば send_message は 24 時間ウィンドウ内でのみ使え、まだ書き込んでいない相手に連絡するには send_template を使う、といった内容です。モデルはこの説明を読んで、多くの場合は正しいツールを選びます。エージェントが自由に判断する場面では、これが役立ちます。
エージェントの役割が限られている場合は、番号のアクセストークンで Cloud API の messages エンドポイントに送信する自作のシンプルなツールのほうが簡単です。たとえば、いま書き込んだ相手にだけ返信する場合です。その場合、ウィンドウの確認はお客様のコード側に置くことになります。絶対に破ってはならないルールは、そこに置くべきです。ウィンドウ外でフリーテキストを送るとエラー 131047 が返り、お客様には何も届きません。
よくある間違い
- MCP が受信メッセージを届けてくれると期待すること。Webhook のルートがなければ、エージェントはお客様の発言を受け取れません。
- OAuth のトークンをサーバーのメモリ上に置いたままにすること。再起動のたびにブラウザでのサインインが必要になります。トークンストアで永続化してください。
- 全員のお客様で 1 つのスレッドを使うこと。エージェントのメモリは、送信者の電話番号をキーにしてください。
easycoexistence.com で番号を接続し、Webhook の送信先を自分のルートに設定すれば、1 回の OAuth サインインでエージェントに MCP ツールを読み込めます。料金は接続済みの番号 1 件あたり月額 US$ 9 から、番号を追加するほど US$ 1 までです。最初の 3 日間は無料です。
よくある質問
Python だけで使えますか?
MCPAdapter の例は Python です。Webhook と Cloud API は通常の HTTP なので、LangChain が動作する言語であれば、どれでも受信と送信ができます。
エージェントは毎回 list_numbers を呼ぶ必要がありますか?
connection_id が必要で、それを得られるのは list_numbers だけです。番号が 1 つの場合、エージェントは最初に 1 回呼び出せば十分です。
チームはこれまでどおり携帯電話から返信できますか?
はい。Coexistence により WhatsApp Business アプリは引き続き使えます。携帯電話からの返信は echo イベントとしてお客様のルートに届くため、エージェントが内容を考慮できます。
EasyCoexistence は会話の内容を読みますか?
いいえ。Meta はお客様のルートに直接配信し、メッセージの内容が当社側に保存されることはありません。MCP ツールが読み取るのは、アカウントと番号の状態です。
続きを読む
始める準備はできましたか?
WhatsApp Coexistence の設定は数分で完了し、数か月もかかりません。スマートフォン上のアプリも引き続き使えます。
無料トライアルを始める確認日