Skip to main content
Glama
eurogas-bbl

whatsapp-mcp

by eurogas-bbl
README.md
# whatsapp-mcp

MCP-сервер к WhatsApp через шлюз [GREEN-API](https://green-api.com). Даёт агенту
чтение переписки (история чата, журналы входящих и исходящих, контакты, группы)
и отправку сообщений и файлов.

Работает с обычным личным номером: номер один раз привязывается к инстансу
GREEN-API по QR-коду в консоли шлюза, дальше никакого локального процесса
и никакого повторного сканирования не нужно.

## Зачем шлюз

Официальный WhatsApp Business Cloud API от Meta не даёт доступа к личной
переписке и истории — только к диалогам, начатым после подключения бизнес-номера.
Локальные мосты (whatsmeow, Baileys) требуют постоянно работающего процесса
на машине пользователя. GREEN-API закрывает обе проблемы ценой платного тарифа
и того, что под капотом у него неофициальный протокол.

> Репозиторий пока лежит в личном пространстве `eurogas-bbl`, а не в
> `brain-boost-academy`: прав на создание репозиториев в организации нет.
> После переноса GitHub оставит редирект, и ссылки ниже продолжат работать.

## Установка

Зависимостей, кроме `uv`, нет:

```bash
uvx --from git+https://github.com/eurogas-bbl/whatsapp-mcp whatsapp-mcp
```

Как запись в `.mcp.json`:

```json
{
  "mcpServers": {
    "whatsapp": {
      "command": "uvx",
      "args": [
        "--env-file", "/путь/к/whatsapp-mcp.env",
        "--from", "git+https://github.com/eurogas-bbl/whatsapp-mcp",
        "whatsapp-mcp"
      ]
    }
  }
}
```

## Переменные окружения

| Переменная | Обязательна | Описание |
| --- | --- | --- |
| `GREENAPI_ID_INSTANCE` | да | `idInstance` из консоли GREEN-API |
| `GREENAPI_API_TOKEN_INSTANCE` | да | `apiTokenInstance` оттуда же |
| `GREENAPI_API_URL` | нет | Личный хост инстанса, например `https://7105.api.greenapi.com`. По умолчанию `https://api.green-api.com` |
| `GREENAPI_MEDIA_URL` | нет | По умолчанию `https://media.green-api.com`; используется только при отправке локального файла |
| `WHATSAPP_READONLY` | нет | `true` — инструменты отправки не регистрируются вовсе |

Токен не попадает в текст ошибок: он лежит в URL, а URL — в сообщениях httpx,
поэтому перед выдачей модели он заменяется на `***`.

## Инструменты

Чтение — всегда:

`get_state`, `get_settings`, `list_chats`, `get_chat_history`,
`get_last_incoming_messages`, `get_last_outgoing_messages`, `get_contact_info`,
`get_group_data`, `check_whatsapp`, `get_file_link`, `receive_notification`,
`delete_notification`.

Запись — если не выставлен `WHATSAPP_READONLY`:

`send_message`, `send_file`, `send_file_by_url`, `mark_chat_read`, `set_settings`.

`delete_notification` доступен и в режиме чтения: он убирает обработанное
событие из очереди шлюза и ничего не меняет в самих чатах, а без него
`receive_notification` бесконечно возвращает одно и то же.

## Идентификаторы чатов

Личный чат — `79001234567@c.us`, группа — `120363043968066561@g.us`, скрытый
номер — `123456789012345@lid`. Голый номер телефона (`79001234567`,
`+7 (900) 123-45-67`) достраивается до `@c.us`; для групп и `@lid` идентификатор
нужно передавать целиком, потому что от номера они неотличимы.

## Ограничения

- История видна только за то время, пока номер привязан к инстансу: GREEN-API
  не выгружает переписку, накопленную до подключения.
- У `getChatHistory` нет постраничного обхода — только `count`.
- Журналы входящих и исходящих и отметка прочитанным работают лишь при
  включённых уведомлениях инстанса: `set_settings` с `incomingWebhook: yes`,
  `outgoingMessageWebhook: yes`, `outgoingAPIMessageWebhook: yes`.
- Ответы обрезаются на 256 КБ, чтобы длинная переписка не вытеснила контекст;
  обрезанный ответ помечен полем `truncated`.

## Разработка

```bash
uv sync
uv run pytest -q
uv run pyright
```

Тесты офлайн: HTTP замокан через `httpx.MockTransport`, инструменты вызываются
настоящим MCP-клиентом.

TDQS

A3.6/5.0

Scored across 17 tools

Disambiguation4/5

Most tools have clearly distinct purposes (sending, reading, settings, notifications, contacts/groups). The only mild overlap is between get_chat_history and get_last_incoming/outgoing_messages, but the descriptions clarify the scope: one is per-chat, the others are cross-chat time-based summaries.

Naming Consistency4/5

The tool names follow a fairly consistent verb_noun pattern (get_*, send_*, list_*, mark_*, set_*, delete_*, receive_*). Minor deviations like check_whatsapp and receive_notification are still readable and consistent with the general style, so there are no mixed conventions.

Tool Count4/5

17 tools is slightly on the heavier side but appropriate for a WhatsApp integration that covers messaging, files, groups, contacts, settings, and webhooks. Each tool maps to a distinct API operation, and none feel redundant.

Completeness4/5

The surface covers the main WhatsApp workflows: sending and receiving messages/files, reading history, managing chats read state, contact and group info, and instance settings. Missing operations like editing/deleting sent messages or more granular media handling are minor gaps, since the core lifecycle is present.

Maintenance

ActivityMaintained
ResponsivenessNo issues