Skip to main content
Glama
BusinessNone

WhatsApp MCP Stream

by BusinessNone

WhatsApp MCP Stream

CI

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/admin

  • MCP エンドポイント: 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:ro

docker compose up はオーバーライドを自動的に適用します。

ランタイム設定

設定は管理 UI で編集でき、SETTINGS_PATH(デフォルトは MEDIA_DIR/settings.json)に永続化されます。

管理 UI

管理 UI ランタイム設定、QR リンク、チャット履歴ビューア、エクスポート、ステータスを備えた管理コンソール。

サポートされている設定:

  • media_public_base_url

  • upload_max_mb

  • upload_enabled

  • max_files_per_upload

  • require_upload_token

  • upload_token

  • auto_download_media

  • auto_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.pdf

URL ソースの場合は、media_url を send_media または stage_media に直接渡してください。サーバーが base64 を使わずにファイル自体をダウンロードします。

アップロード認証(オプション)

require_upload_token=true の場合、次のいずれかでトークンを指定します:

  • x-upload-token: <token>

  • Authorization: Bearer <token>

MCP トランスポート

サーバーは /mcp で Streamable HTTP を公開します。

一般的なフロー:

  1. POST /mcp で JSON-RPC の initialize を送信する

  2. その後のリクエストには、返された mcp-session-id ヘッダーを使用する

  3. ツール呼び出しには POST /mcp を使用する

注: クライアントは initialize の際に Accept: application/json, text/event-stream を送信する必要があります。

スモークテスト

MCP ツールの簡単な回帰スモークテスト:

npm run smoke:mcp

オプションのカスタムターゲット:

MCP_BASE_URL=http://localhost:3003 npm run smoke:mcp

MCP ツール

認証

ツール

説明

get_qr_code

認証用に最新の WhatsApp QR コードを画像として取得します。

check_auth_status

WhatsApp クライアントが認証済みで利用可能かどうかを確認します。

logout

WhatsApp からログアウトし、現在のセッションをクリアします。

連絡先

ツール

説明

search_contacts

名前または電話番号で連絡先を検索します。

resolve_contact

名前または電話番号から連絡先を解決します(最も一致するもの)。

get_contact_by_id

JID で連絡先の詳細を取得します。

get_profile_pic

JID のプロフィール画像 URL を取得します。

get_group_info

グループ JID でグループのメタデータと参加者を取得します。

チャット

ツール

説明

list_chats

メタデータとオプション付きの最終メッセージを含むチャットを一覧表示します。

get_chat_by_id

JID でチャットのメタデータを取得します。

list_groups

グループチャットのみを一覧表示します。

get_direct_chat_by_contact_number

電話番号からダイレクトチャットの JID を解決します。

get_chat_by_contact

名前または電話番号から連絡先を解決し、チャットのメタデータを返します。

analyze_group_overlaps

複数のグループにまたがって存在するメンバーを検出します。

find_members_without_direct_chat

ダイレクトチャットのないグループメンバーを検出します。

find_members_not_in_contacts

連絡先に存在しないグループメンバーを検出します。

run_group_audit

グループ監査をまとめて 1 つの定常操作として実行します。

メッセージ

ツール

説明

list_messages

特定のチャットからメッセージを取得します。

search_messages

テキストでメッセージを検索します(チャット単位に絞ることも可能)。

get_message_by_id

ID(jid:id)で特定のメッセージを取得します。

get_message_context

特定のメッセージの周辺にある最近のメッセージを取得します。

get_last_interaction

JID の直近のメッセージを取得します。

send_message

個人またはグループにテキストメッセージを送信します。オプションの idempotency_key をサポートします。

メディア

ツール

説明

send_media

メディア(画像/動画/ドキュメント/音声)を送信します。media_path、media_url、または media_content(base64)を受け付けます。オプションの idempotency_key をサポートします。

stage_media

ファイルをサーバーのメディアディレクトリに保存し、そのローカルパスを返します。返された saved_path を send_media の media_path に使用します。URL がソースの場合は base64 を回避でき(サーバーが直接ダウンロード)、再アップロードなしで同じファイルを複数の宛先に送信できます。

download_media

メッセージからメディアをダウンロードします。

ユーティリティ

ツール

説明

ping

ヘルスチェックツールです。

リカバリノート

このサービスには、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 データベースに永続化されます。

環境変数:

変数

デフォルト

説明

DB_PATH

<SESSION_DIR>/store.sqlite

チャット/メッセージの永続化に使用するSQLiteデータベースのパス。

WA_EVENT_LOG

0

詳細なWhatsAppイベントログを有効にします。

WA_EVENT_STREAM

0

詳細なデバッグのために、生のBaileysイベントストリームをファイルに書き出します。

WA_EVENT_STREAM_PATH

/app/logs/wa-events.log

イベントストリームログのファイルパス。

WA_RESYNC_RECONNECT

1

強制再同期後の再接続セーフティネットを有効にします。

WA_RESYNC_RECONNECT_DELAY_MS

15000

強制再同期後の再接続待機時間(ミリ秒)。

WA_SYNC_RECOVERY_COOLDOWN_MS

300000

自動アプリ状態リカバリの最小実行間隔。

WA_SYNC_RECOVERY_WINDOW_MS

900000

繰り返されるアプリ状態破損障害をカウントするための時間枠。

WA_SYNC_SOFT_RECOVERY_LIMIT

2

内部再起動にエスカレーションするまでのソフトリカバリの回数。

WA_READINESS_GRACE_MS

180000

リカバリ/切断中に/healthzが unhealthy になるまでの猶予期間。

WA_DISCONNECT_RECOVERY_DELAY_MS

30000

ソケットクローズ後に、切断ウォッチドッグが再接続/再起動を強制するまでの待機時間。

WA_DISCONNECT_RECOVERY_RESTART_CODES

428

内部の再起動ウォッチドッグに直接エスカレーションする切断ステータスコード(カンマ区切り)。

WA_SEND_DEDUP_WINDOW_MS

45000

このウィンドウ内では、同じJIDへの完全に重複したsend_messageリクエストを抑制します。

WA_IDEMPOTENCY_TTL_MS

86400000

完了した send_message の冪等性レコードを、安全なリトライのためにSQLiteに保持する期間。

WA_MESSAGE_INDEX_MAX

20000

メッセージインデックス(jid:id -> 生のメッセージ)のメモリ内最大エントリ数。

WA_MESSAGE_KEY_INDEX_MAX

20000

メッセージキーインデックス(id -> 生のメッセージ)のメモリ内最大エントリ数。

WA_INITIALIZE_TIMEOUT_MS

120000

WhatsAppクライアントの初期化をこの期限までに完了させるよう競わせます。0 に設定すると無効化されます。タイムアウト時は例外をスローするため、ハングせずにリカバリが再試行できます。

WA_AUTO_DOWNLOAD_CONCURRENCY

3

自動ダウンロードの最大並行数。自動ダウンロードはプロセス内の有界キューを介して実行されるため、受信メディアのバーストでI/Oを飽和させません。

WA_AUTO_DOWNLOAD_QUEUE_MAX

200

自動ダウンロードジョブの最大キュー数。超過分は警告ログ付きでFIFO(古い順)に破棄され、新しいメッセージが優先されます。

MCP_HTTP_ENABLE_JSON_RESPONSE

1

Streamable HTTPのPOSTリクエストに対して、デフォルトで直接JSONレスポンスを使用します。0 に設定すると、従来のSSE形式のPOSTレスポンス処理を強制します。

追加のトランスポート診断:

  • /mcp POSTリクエストは、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から不足メディアを取得することはありません。

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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