WhatsApp MCP Stream
WhatsApp MCP Stack Stream
Сервер WhatsApp MCP, построенный на транспорте Streamable HTTP, с использованием Baileys для подключения к WhatsApp, с веб-интерфейсом администрирования и двунаправленным потоком медиа (загрузка и скачивание).
Ключевые особенности:
Транспорт: Streamable HTTP на
/mcpДвижок: Baileys
Админ-панель: QR, статус, выход, настройки времени выполнения, просмотр истории чатов
Медиа: эндпоинты загрузки + хостинг
/media+ MCP-инструмент скачивания
Быстрый старт (Docker)
# build and run
docker compose build
docker compose up -dСервер будет доступен по адресам:
Админ-панель:
http://localhost:3003/adminMCP-эндпоинт:
http://localhost:3003/mcpМедиа-файлы:
http://localhost:3003/media/<filename>
Related MCP server: WhatsApp Business API MCP Server
DNS на хостах с --iptables=false
На некоторых NAS и усиленных хостах (например, Synology с dockerd --iptables=false) встроенный DNS-прокси Docker (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 автоматически подхватит переопределение.
Настройки выполнения
Настройки можно изменять в админ-панели; они сохраняются в SETTINGS_PATH (по умолчанию — MEDIA_DIR/settings.json).
Админ-панель
Админ-консоль с настройками времени выполнения, привязкой по 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-gatewayAPI загрузки медиа
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-транспорт
Сервер представляет Streamable HTTP на /mcp.
Типовый поток:
POST /mcpс JSON-RPCinitializeИспользуйте возвращаемый заголовок
IDs-session-idдля последующих запросовPOST /mcpдля вызова инструментов
Примечание: клиенты должны отправлять Accept: application/json, text/event-stream при initialize.
Смоук-тест
Быстрый регрессионный смоук-тест MCP-инструментов:
npm run smoke:mcpНеобязательная целевая цель:
MCP_BASE_URL=http://localhost:3003 npm run smoke:mcpИнструменты MCP
Аутентификация
Инструмент | Описание |
| Получить последний QR-код WhatsApp в виде изображения для аутентификации. |
| Проверить, аутентифицирован ли WhatsApp-клиент и готов ли он к работе. |
| Выйти из WhatsApp и очистка текущей сессии. |
Контакты
Инструмент | Описание |
| Искать контакты по имени или номеру телефона. |
| Определить контакт по имени или номеру телефона (лучшие совпадения). |
| Получить данные о контакте по JID. |
| Получить URL фотографии профиля для JID. |
| Получить метаданные группы и список участников по JID. |
Чаты
Инструмент | Описание |
| Списал чаты с метаданными и, опционально, с последним сообщением. |
| Получить метаданные чата по JID. |
| Получить только групповые чаты. |
| Найти JID личного чата по номеру телефона. |
| Найти контакт по имени или номеру и вернуть метаданные чата. |
| Найти участников, встречающихся в нескольких группах. |
| Найти участников группы, у которых нет личного чата. |
| Найти участников группы, отсутствующих в контактах. |
| Выполнить комплексный аудит групп как одну операцию. |
Сообщения
Инструмент | Описание |
| Получить сообщения из конкретного чата. |
| Искать сообщения по тексту (опционально ограничиваясь одним чата). |
| Получить конкретное сообщение по ID ( |
| Получить сообщение вокруг конкретного сообщения. |
| Получить последнее сообщение для JID. |
| Отправить текстовое сообщение человеку или группе. Поддерживает опциональный |
Медиа
Инструмент | Описание |
| Отправить медиа (изображение/видео/документ/аудио). Принимает |
| Сохраника файл в медиакаталог сервера и возвращает его локальный путь. Используйте возвращаемый |
| Скачать медиа из сообщения. |
Дополнительно
Инструмент | Описание |
| Инструмент проверки здоровья. |
Заметки о восстановлении
В этом сервисе есть намеренный обходной механизм для восстановления состояния сессии Baileys/WhatsApp.
Почему он существует:
В продакшене мы наблюдали случаи, когда контейнер оставался живым, MCP продолжал отвечать, но сессия WhatsApp была фактически полностью уничтожена.
Самыми распространёнными индикаторами были ошибки Baileys:
failed to find key ... to decode mutationиfailed to sync state from version.В таком состоянии ручной перезапуск контейнера часто восстанавливал работоспособность.
Текущее поведение:
При сигнале повреждения состояния приложения, сервис сначала пробует мягкое восстановление через
forceResync().Если повторяется однотипный сбой в течение временного интервала, происходит эскалация до внутреннего перезапуска WhatsApp-клиента.
При отключениях, таких как
Connection Terminated, сервис запускает сторожевой таймер и, если сокет не вернулся в состояниеopen, эскалирует до внутреннего перезапуска.Цикл перезапуска защищён от вложенных блокировок, поэтому отключения могут быть автоматически восстановлены без ручного перезапуска и необходим.
Недавние наблюдения в проде показывают повторные отключения сокета (
428 Connection Terminated,503 Stream Errored) автоматически возвращаются в состояниеopen.Отдельный эндпоинт
/healthzвозвращает503только когда сервис по-настоящему застрял вне допустимого окна восстановления.Healthcheck Docker использует
/healthz, поэтому контейнер перезапускается только после того, как внутреннее восстановление получит шанс сработать.
Эти механизмы сокращают необходимость вмешательства оператора и повышают устойчивость к часто встречающимся сбоям сессий WhatsApp/Baileys.
Лицензия
MIT
Персистентность
Чаты и сообщения сохраняются в локальную базу данных SQLite, размещённую вместе с сессией.
Переменные окружения:
Переменная | По умолчанию | Описание |
|
| Путь к базе данных SQLite для хранения чатов и сообщений. |
|
| Включить подробные журналы событий WhatsApp. |
|
| Записывать необработанный поток событий Baileys в файл для глубокой отладки. |
|
| Путь к файлу журнала потока событий. |
|
| Включить страховочное переподключение после принудительной ресинхронизации. |
|
| Задержка перед переподключением после принудительной ресинхронизации (мс). |
|
| Минимальная задержка между автоматическими восстановлениями состояния приложения. |
|
| Временное окно для подсчёта повторяющихся сбоев повреждения состояния приложения. |
|
| Количество мягких восстановлений до перехода к внутреннему перезапуску. |
|
| Период отсрочки во время восстановления/отключения, прежде чем |
|
| Сколько ждать после закрытия сокета, прежде чем сторожевой механизм отключения принудительно выполнит переподключение/перезапуск. |
|
| Коды статусов отключения через запятую, которые должны немедленно передаваться внутреннему сторожевому механизму перезапуска. |
|
| Подавлять точные дубликаты запросов |
|
| Сколько времени записи идемпотентности завершённых |
|
| Макс. количество записей индекса сообщений в памяти ( |
|
| Макс. количество записей индекса ключей сообщений в памяти ( |
|
| Ограничить инициализацию клиента WhatsApp этим сроком; установите |
|
| Максимум параллельных автозагрузок. Автозагрузка выполняется через ограниченную внутрипроцессную очередь, поэтому всплеск входящих медиафайлов не может перегрузить ввод-вывод. |
|
| Максимум заданий автозагрузки в очереди. Излишки отбрасываются в порядке FIFO (сначала старые) с предупреждением в журнале; недавние сообщения остаются приоритетными. |
|
| Использовать прямые JSON-ответы для Streamable HTTP POST-запросов по умолчанию. Установите |
Дополнительная диагностика транспорта:
POST-запросы
/mcpтеперь записывают события жизненного цикла запроса вlogs/mcp-whatsapp.logсюда входят поступление запроса, диспетчеризация транспорта, завершение
transport.handleRequest, а также HTTPfinish/closeпо этим журналам можно определить, возникает ли задержка до того, как ответ покидает
whatsapp-mcp-stream, или уже после — на стороне шлюза/клиента
API истории чатов
Просматривайте сохранённые чаты и сообщения через:
GET /api/chats?limit=50&offset=0&q=<search> — постраничный список чатов, опционально фильтруется по имени.
GET /api/chats/:jid/messages?limit=50&offset=0 — постраничные сообщения чата (сначала новые).
Оба эндпоинта используются вкладкой Чаты в админ-интерфейсе.
Экспорт
Экспортируйте чат (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.
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.
Let Claude or ChatGPT search, read and send your WhatsApp messages over MCP. OAuth sign-in.
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.4 npm-
- AlicenseNot gradedqualityDmaintenanceEnables sending messages, managing templates, uploading media, and configuring webhooks for WhatsApp Business via the MCP protocol.6 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