WhatsApp MCP Stream
WhatsApp MCP Stream
Streamable HTTP トランスポートを中心に構築された WhatsApp MCP サーバーです。WhatsApp への接続には Baileys を使用し、Web 管理 UI と双方向メディアフロー(アップロード + ダウンロード)を備えています。
主な特徴:
トランスポート:
/mcpにおける Streamable HTTPエンジン: Baileys
管理 UI: QR、ステータス、ログアウト、ランタイム設定、チャット履歴ビューア
メディア: アップロード用エンドポイント +
/mediaホスティング + MCP ダウンロードツール
クイックスタート(Docker)
# build and run
docker compose build
docker compose up -dサーバーには以下でアクセスできます:
管理 UI:
http://localhost:3003/adminMCP エンドポイント:
http://localhost:3003/mcpメディアファイル:
http://localhost:3003/media/<filename>
Related MCP server: WhatsApp Business API MCP Server
--iptables=false を使用するホストの DNS
一部の NAS / 堅牢化されたホスト(例: dockerd --iptables=false の Synology)では、Docker の組込み DNS プロキシ(127.0.0.11)に iptables の DNAT ルールがなく、コンテナ内からの接続が拒否されます。
修正: resolv.conf.example を resolv.conf にコピーし、ボリュームオーバーライドを追加します:
cp resolv.conf.example resolv.conf次に、ローカルの docker-compose.override.yml(コミット対象外)に追加します:
services:
mcp-whatsapp:
volumes:
- ./resolv.conf:/etc/resolv.conf:rodocker compose up はオーバーライドを自動的に適用します。
ランタイム設定
設定は管理 UI で編集でき、SETTINGS_PATH(デフォルトは MEDIA_DIR/settings.json)に永続化されます。
管理 UI
ランタイム設定、QR リンク、チャット履歴ビューア、エクスポート、ステータスを備えた管理コンソール。
サポートされている設定:
media_public_base_urlupload_max_mbupload_enabledmax_files_per_uploadrequire_upload_tokenupload_tokenauto_download_mediaauto_download_max_mb
認証
組み込みの認証はまだ実装されていません。本番環境では、認証を強制するゲートウェイを使用してください。このプロジェクトは authmcp-gateway の背後で問題なく動作します:
https://github.com/loglux/authmcp-gatewayメディアアップロード API
Base64 JSON:
curl -X POST http://localhost:3003/api/upload \
-H "Content-Type: application/json" \
-d {filename:photo.jpg,mime_type:image/jpeg,data:<base64>}Multipart(大きなファイルに推奨):
curl -X POST http://localhost:3003/api/upload-multipart \
-F "file=@/path/to/file.jpg"どちらも url と(設定されている場合)publicUrl を返します。
ローカルファイルを send_media で送信する
プロジェクトルートの ./files/ ディレクトリは、コンテナ内の /app/files にバインドマウントされています。そこにファイルを置くと、すぐに参照できます。コンテナの再起動は不要です:
# On host:
cp report.pdf /path/to/whatsapp-mcp-stream/files/
# In send_media:
media_path: /app/files/report.pdfURL ソースの場合は、media_url を send_media または stage_media に直接渡してください。サーバーが base64 を使わずにファイル自体をダウンロードします。
アップロード認証(オプション)
require_upload_token=true の場合、次のいずれかでトークンを指定します:
x-upload-token: <token>Authorization: Bearer <token>
MCP トランスポート
サーバーは /mcp で Streamable HTTP を公開します。
一般的なフロー:
POST /mcpで JSON-RPC のinitializeを送信するその後のリクエストには、返された
mcp-session-idヘッダーを使用するツール呼び出しには
POST /mcpを使用する
注: クライアントは initialize の際に Accept: application/json, text/event-stream を送信する必要があります。
スモークテスト
MCP ツールの簡単な回帰スモークテスト:
npm run smoke:mcpオプションのカスタムターゲット:
MCP_BASE_URL=http://localhost:3003 npm run smoke:mcpMCP ツール
認証
ツール | 説明 |
| 認証用に最新の WhatsApp QR コードを画像として取得します。 |
| WhatsApp クライアントが認証済みで利用可能かどうかを確認します。 |
| WhatsApp からログアウトし、現在のセッションをクリアします。 |
連絡先
ツール | 説明 |
| 名前または電話番号で連絡先を検索します。 |
| 名前または電話番号から連絡先を解決します(最も一致するもの)。 |
| JID で連絡先の詳細を取得します。 |
| JID のプロフィール画像 URL を取得します。 |
| グループ JID でグループのメタデータと参加者を取得します。 |
チャット
ツール | 説明 |
| メタデータとオプション付きの最終メッセージを含むチャットを一覧表示します。 |
| JID でチャットのメタデータを取得します。 |
| グループチャットのみを一覧表示します。 |
| 電話番号からダイレクトチャットの JID を解決します。 |
| 名前または電話番号から連絡先を解決し、チャットのメタデータを返します。 |
| 複数のグループにまたがって存在するメンバーを検出します。 |
| ダイレクトチャットのないグループメンバーを検出します。 |
| 連絡先に存在しないグループメンバーを検出します。 |
| グループ監査をまとめて 1 つの定常操作として実行します。 |
メッセージ
ツール | 説明 |
| 特定のチャットからメッセージを取得します。 |
| テキストでメッセージを検索します(チャット単位に絞ることも可能)。 |
| ID( |
| 特定のメッセージの周辺にある最近のメッセージを取得します。 |
| JID の直近のメッセージを取得します。 |
| 個人またはグループにテキストメッセージを送信します。オプションの |
メディア
ツール | 説明 |
| メディア(画像/動画/ドキュメント/音声)を送信します。 |
| ファイルをサーバーのメディアディレクトリに保存し、そのローカルパスを返します。返された |
| メッセージからメディアをダウンロードします。 |
ユーティリティ
ツール | 説明 |
| ヘルスチェックツールです。 |
リカバリノート
このサービスには、Baileys/WhatsApp のセッション状態破損に対する意図的なリカバリ回避策が含まれています。
存在理由:
本番環境で、コンテナは生き残って MCP も応答するものの、WhatsApp セッションが機能しないケースが観測されました。
最も一般的な兆候は、
failed to find key ... to decode mutationやfailed to sync state from versionといった Baileys エラーでした。この状態では、手動でコンテナを再起動するとサービスが復旧することがよくありました。
現在の動作:
アプリ状態の破損シグナルを受けると、サービスはまず
forceResync()によるソフトリカバリを試みます。同じ種類の障害が時間帯内に繰り返される場合は、内部の WhatsApp クライアント再起動にエスカレートされます。
Connection Terminatedなどの切断が発生すると、サービスは切断ウォッチドッグをスケジュールし、ソケットが時間内にopenに戻らない場合は内部再起動にエスカレートされます。再接続のライフサイクルはネストしたロックデッドロックから保護されているため、手動でのコンテナ再起動を必要とせずに切断からの復旧を完了できます。
最近の本番環境の観測では、繰り返されるソケット切断(
428 Connection Terminated、503 Stream Errored)が自動的にopenに復旧しています。専用の
/healthzエンドポイントは、サービスが許容される復旧ウィンドウ外で本当に停止した場合にのみ503を返します。Docker のヘルスチェックは
/healthzを使用するため、コンテナはプロセス内リカバリが動作する機会を持った後にのみ再起動されます。
これらのリカバリメカニズムにより、オペレーターの介入が減り、一般的な WhatsApp/Baileys セッション障害に対する耐性が向上します。
ライセンス
MIT
永続化
チャットとメッセージは、セッションボリュームに保存されるローカル SQLite データベースに永続化されます。
環境変数:
変数 | デフォルト | 説明 |
|
| チャット/メッセージの永続化に使用するSQLiteデータベースのパス。 |
|
| 詳細なWhatsAppイベントログを有効にします。 |
|
| 詳細なデバッグのために、生のBaileysイベントストリームをファイルに書き出します。 |
|
| イベントストリームログのファイルパス。 |
|
| 強制再同期後の再接続セーフティネットを有効にします。 |
|
| 強制再同期後の再接続待機時間(ミリ秒)。 |
|
| 自動アプリ状態リカバリの最小実行間隔。 |
|
| 繰り返されるアプリ状態破損障害をカウントするための時間枠。 |
|
| 内部再起動にエスカレーションするまでのソフトリカバリの回数。 |
|
| リカバリ/切断中に |
|
| ソケットクローズ後に、切断ウォッチドッグが再接続/再起動を強制するまでの待機時間。 |
|
| 内部の再起動ウォッチドッグに直接エスカレーションする切断ステータスコード(カンマ区切り)。 |
|
| このウィンドウ内では、同じJIDへの完全に重複した |
|
| 完了した |
|
| メッセージインデックス( |
|
| メッセージキーインデックス( |
|
| WhatsAppクライアントの初期化をこの期限までに完了させるよう競わせます。 |
|
| 自動ダウンロードの最大並行数。自動ダウンロードはプロセス内の有界キューを介して実行されるため、受信メディアのバーストでI/Oを飽和させません。 |
|
| 自動ダウンロードジョブの最大キュー数。超過分は警告ログ付きでFIFO(古い順)に破棄され、新しいメッセージが優先されます。 |
|
| Streamable HTTPのPOSTリクエストに対して、デフォルトで直接JSONレスポンスを使用します。 |
追加のトランスポート診断:
/mcpPOSTリクエストは、logs/mcp-whatsapp.logにリクエストライフサイクルのイベントを記録するようになりました。これには、リクエストエントリ、トランスポートのディスパッチ、
transport.handleRequestの完了、HTTP のfinish/closeが含まれます。これらのログを使用して、レイテンシ発生がどの段階かを判断します。つまり、レスポンスが
whatsapp-mcp-streamを出る前なのか、それともその後にゲートウェイ/クライアント側で発生しているのかを確認できます。
Chat History API
保存済みのチャットとメッセージを参照する方法:
GET /api/chats?limit=50&offset=0&q=<search> — ページングされたチャット一覧(名前によるフィルタリング任意)。
GET /api/chats/:jid/messages?limit=50&offset=0 — チャットのページングされたメッセージ一覧(新しい順)。
どちらのエンドポイントも、管理画面の チャット タブで使用されます。
Export
チャットをエクスポートします(JSON+任意のダウンロード済みメディア):
GET /api/export/chat/:jid?include_media=true
include_media=true の場合、ZIPには download_media で既にダウンロード済みのファイルが含まれます。WhatsAppから不足メディアを取得することはありません。
This server cannot be deployed
Maintenance
Related MCP Connectors
WhatsApp (Web + Business API), SMS, contacts, and call records via 2Chat's MCP server.
Drive WhatsApp from any MCP client: pair devices, send text and media, manage contacts and groups.
Send and read WhatsApp messages, templates, chats and campaigns through the official Business API.
WhatsMCP connects Claude and other MCP-compatible AI agents directly to WhatsApp. Send and receive text, images, documents, and voice notes; manage groups (create, add/remove members, promote admins); look up contacts and profiles; follow channels; and read call and message history — all through a standard MCP interface. For voice use cases, WhatsMCP offers SIP-based calling plans (inbound-only, or full inbound/outbound) so AI voice agents can answer and place WhatsApp calls, plus low-latency WebSocket integrations with voice agent providers like ElevenLabs. Multiple WhatsApp accounts can be paired and managed per workspace, with webhook support for real-time inbound message delivery to your own infrastructure.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables WhatsApp automation through MCP protocol, allowing users to manage sessions, send messages, handle groups/communities, and access contacts through natural language interactions with AI agents.7 npm-
- AlicenseNot gradedqualityDmaintenanceEnables sending messages, managing templates, uploading media, and configuring webhooks for WhatsApp Business via the MCP protocol.8 npm5MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to send and receive WhatsApp messages, search chats, share media, manage approvals, and get activity summaries through MCP.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables connecting a personal or business WhatsApp account via QR pairing and then sending/reading messages, managing chats, contacts, groups, and searching message history through MCP tools.MIT