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: lingtai-whatsapp
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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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.11

lingtai-whatsappofficial
AlicenseNot gradedqualityFmaintenanceMCP server for interacting with the official Meta WhatsApp Business Platform/Cloud API, enabling sending messages, managing contacts, templates, and handling webhook callbacks.Apache 2.0- AlicenseNot gradedqualityDmaintenanceEnables sending messages, managing templates, uploading media, and configuring webhooks for WhatsApp Business via the MCP protocol.105MIT
- AlicenseNot gradedqualityCmaintenanceIntegrates WhatsApp with AI agents, enabling message sending, chat search, media sharing, approval workflows, and activity summaries via any MCP client.1Apache 2.0
Related MCP Connectors
Search, document and execute authenticated API calls across 700+ apps via one MCP server
Give AI agents real phone numbers, messages, and voice calls via MCP.
Instagram, WhatsApp and Messenger DMs through official Meta Business APIs.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/BusinessNone/WhatsAppMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server