На GitHub опубликован whatsapp-mcp: ИИ-агент читает WhatsApp

На GitHub опубликован проект whatsapp-mcp (его показали на Hacker News как Show HN). Это небольшой сервер, который работает в вашем собственном аккаунте Cloudflare. Телефон нужно привязать к нему один раз, так же как привязывают WhatsApp Web, и после этого любой MCP-клиент (Claude Code, Claude Desktop или другой, понимающий MCP) может искать и читать ваши чаты. Сервер умеет читать и искать сообщения и запоминать имена, которые вы задаёте номерам телефонов. Отправлять ничего он не может.
В README приведены примеры запросов к агенту: «Что Дана говорила про перелёты?», «Найди все сообщения, где кто-то упоминал аренду, по всем моим чатам», «Перескажи, что я пропустил в семейной группе за эту неделю». Источником истины остаётся телефон, а сервер лишь связанное устройство, с которым общается агент.
Постоянного соединения с WhatsApp сервер не держит. Когда агент что-то запрашивает, а также раз в день (по расписанию cron в 04:00 UTC), он подключается, забирает всё, что WhatsApp накопил для него с прошлого раза, записывает это в свою базу и отключается. Телефон при этом работает как обычно и продолжает показывать уведомления. Каждый инструмент чтения сначала обновляет данные из WhatsApp, если сохранённая копия старше десяти минут. Сообщения хранятся в базе SQLite внутри Durable Object в вашем аккаунте Cloudflare, и, по словам автора README, больше нигде.
Для установки нужны аккаунт Cloudflare с тарифом Workers Paid, Node 20 или новее и телефон. Порядок такой: клонировать репозиторий, выполнить npm install, создать KV-пространство OAUTH_KV командой wrangler и вписать его идентификатор в wrangler.jsonc, задать секрет OWNER_PASSWORD (не короче 12 символов) для страницы привязки телефона и выполнить npm run deploy. Wrangler выведет адрес вида whatsapp-mcp.your-name.workers.dev. На нём два шага: привязать WhatsApp по QR-коду (Настройки, Связанные устройства) или по номеру телефона, если сканировать экран нечем, затем подключить агента. В Claude Code это команда claude mcp add --transport http whatsapp https://your-url/mcp и вход по паролю через /mcp. Первая привязка импортирует историю, страница показывает прогресс, её можно закрыть.
Тариф Workers Paid нужен потому, что импорт большой истории требует много вычислений за один заход, а стандартный лимит процессорного времени для Workers для этого слишком мал. wrangler.jsonc повышает лимит, а это доступно только на платном плане, который, по словам автора, стоит несколько долларов в месяц. Бесплатный план автор не пробовал; если вы на нём, нужно убрать блок limits и ожидать, что первый импорт будет нестабильным.
Автор перечисляет ограничения. Проект неофициальный: у WhatsApp нет API для чтения личных сообщений, а проект использует тот же протокол, что и WhatsApp Web, через открытую библиотеку Baileys, что противоречит условиям WhatsApp. Для связанного устройства, которое только читает, практический риск, по оценке автора, низкий, но не нулевой; использовать стоит только на своём аккаунте и не для отправки сообщений. Первая привязка импортирует ту историю, которую WhatsApp решит передать новому устройству, возможно не всю, и только один раз за привязку; чтобы импортировать снова, нужно привязать заново (сохранённые сообщения остаются, повторный импорт дополняет недостающее). Часть чатов показывается как номера телефонов, потому что WhatsApp отдаёт связанному устройству не все имена. Для этого есть инструменты unnamed_chats и set_contact_names: агент получает список безымянных чатов, ищет номера в ваших контактах через уже доступный ему инструмент (например, коннектор Google Contacts или Gmail) и сохраняет имена. Сам сервер к сервисам контактов не подключается. Найдутся не все: большинство безымянных чатов состоят из одного сообщения от незнакомца. Медиа не скачивается: фото, голосовые и документы отображаются метками вроде [image] или [voice note 12s] с подписью, если она была, и ничего не расшифровывается. Один экземпляр рассчитан на один аккаунт WhatsApp и одного владельца, это сделано намеренно, потому что каждый экземпляр хранит полную историю и действующий вход в аккаунт.
Вторая половина README адресована тем, кто меняет код. В архитектуре один Worker принимает запросы MCP по OAuth, а всё остальное держит один Durable Object с именем owner: его SQLite служит и хранилищем ключей авторизации Baileys, и хранилищем сообщений, чатов, контактов и полнотекстового индекса FTS5. Описаны разные подводные камни: для запуска Baileys в среде workerd нужны три прослойки (для ws, для whatsapp-rust-bridge и для таймеров); автоочистка в lru-cache упирается в лимит workerd в 10 000 отложенных таймеров на объект и ломает первый импорт; после сканирования QR WhatsApp закрывает сокет с кодом 515 и требует перезапуска; история приходит один раз за привязку, поэтому сбой первого импорта посреди пути означает потерю этой истории до новой привязки; Baileys нужно закреплять на точной версии, так как это пререлиз, чей API меняется между релиз-кандидатами. Флаг markOnlineOnConnect намеренно выключен: если отметить связанное устройство «в сети», телефон перестаёт показывать уведомления. Текст README в доступной части обрывается на разделе о смене способа входа.
Ключевые факты
- whatsapp-mcp, открытый сервер для вашего собственного аккаунта Cloudflare: подключается к WhatsApp как связанное устройство, и любой MCP-клиент (Claude Code, Claude Desktop и др.) может искать и читать чаты; отправлять сообщения он не может.
- Сообщения лежат в SQLite внутри Durable Object в вашем аккаунте Cloudflare; сервер подключается к WhatsApp по запросу агента и раз в день (cron в 04:00 UTC), а между сессиями отключён, телефон работает как обычно.
- Нужен тариф Cloudflare Workers Paid (по словам автора, несколько долларов в месяц) из-за лимита процессорного времени при импорте большой истории; бесплатный план автор не проверял и ожидает нестабильного первого импорта.
- Проект неофициальный: он использует протокол WhatsApp Web через библиотеку Baileys, что противоречит условиям WhatsApp; риск для аккаунта при чтении автор называет низким, но не нулевым.
- Ограничения: история импортируется один раз за привязку и может быть неполной, медиа не скачивается (только метки), один экземпляр рассчитан на один аккаунт и одного владельца.
Почему это важно
Проект даёт ИИ-агентам доступ к личной переписке в WhatsApp, для которой, как пишет автор README, официального API чтения нет. Идея в том, чтобы не отдавать историю чужому сервису: данные остаются в вашем аккаунте Cloudflare, а агент через MCP получает только чтение и поиск. Это конкретный пример того, как MCP превращает закрытый мессенджер в источник данных для агента: вопросы вроде «что Дана говорила про перелёты» решаются поиском по всем чатам сразу.
Кому это важно
Тем, кто уже работает с MCP-клиентами вроде Claude Code или Claude Desktop и хочет, чтобы агент искал и пересказывал их личную переписку. Подходит и тем, кто следит за практикой запуска Baileys на Cloudflare Workers: вторая половина README описывает прослойки, лимиты workerd и особенности истории WhatsApp. Проект рассчитан на одного владельца и один аккаунт.
Как это применить
Нужны аккаунт Cloudflare на тарифе Workers Paid, Node 20 или новее и телефон. Клонируйте репозиторий, выполните npm install, создайте KV-пространство командой npx wrangler kv namespace create OAUTH_KV и впишите идентификатор в wrangler.jsonc, задайте секрет OWNER_PASSWORD (12 и более символов) и выполните npm run deploy. Затем откройте выданный адрес, привяжите WhatsApp по QR-коду или по номеру телефона и подключите агента, например командой claude mcp add --transport http whatsapp https://your-url/mcp с последующим входом через /mcp. Чтобы имена вместо номеров появились в чатах, попросите агента найти имена для безымянных чатов: он использует unnamed_chats и set_contact_names. Платный тариф автор оценивает как несколько долларов в месяц; точная цена в README не указана.
Можно ли доверять
Источник, README самого проекта, поэтому все утверждения (данные нигде, кроме вашего аккаунта, сервер ничего не отправляет) принадлежат автору и независимо не проверены; в доступном тексте нет упоминаний аудита безопасности, версии, лицензии или числа звёзд. Имя автора в тексте не названо, есть только аккаунт finereli в адресе репозитория. README предписывает платный тариф Workers Paid и прямо оговаривает, что бесплатный план не проверялся. Текст источника обрывается в конце раздела для разработчиков. Автор сам честно перечисляет ограничения проекта.
Риски и подводные камни
Главный риск, нарушение условий WhatsApp: проект неофициальный и использует протокол WhatsApp Web через библиотеку Baileys. Для связанного устройства, которое только читает, автор называет практический риск низким, но не нулевым, и советует использовать его только на своём аккаунте. Развёрнутый экземпляр хранит полную историю сообщений и живой вход в аккаунт, поэтому пароль владельца и аккаунт Cloudflare нужно беречь. История приходит один раз за привязку и может быть неполной; на бесплатном плане первый импорт, по ожиданиям автора, хрупкий. Baileys, пререлиз с меняющимся API, поэтому версию нужно закреплять. После деплоя занятый Durable Object может продолжать работать на старом коде: автор советует прекратить запросы и подождать три, пять минут. Медиа не скачивается и не расшифровывается, а часть чатов остаётся без имён.
«Что Дана говорила про перелёты?»
— Пример запроса к агенту из README проекта whatsapp-mcp
Компания Meta Platforms признана экстремистской организацией, её деятельность на территории РФ запрещена.