Mail.ru MCP Server
README.md
# mailru-mcp
MCP-сервер для почты **Mail.ru**. Даёт Claude Code, Cursor и любому
MCP-клиенту доступ к почтовому ящику: читать письма, искать по отправителю,
раскладывать по папкам, разгребать накопившийся INBOX.
Нужен потому, что универсальные почтовые MCP-серверы спотыкаются о
особенности Mail.ru — кириллические имена папок, ограничения на массовые
операции, обрывы длинных сессий. Здесь всё это уже обойдено.
## Зачем
Типичный ящик за несколько лет обрастает тысячами писем, и важное тонет
в уведомлениях магазинов. С этим сервером ассистент может разобрать почту
сам: «положи все письма от Ozon в отдельную папку», «покажи, что пришло
от банка за неделю», «заархивируй всё старше трёх месяцев».
Проверено на реальном ящике: **7 564 письма в INBOX → 173** за один заход,
без потерь.
## Установка
```bash
pip install mcp
git clone https://github.com/braflovskikyle40-debug/mailru-mcp
cd mailru-mcp
```
Зависимость одна — официальный `mcp` SDK. Всё остальное берётся из
стандартной библиотеки Python (3.10+).
## Настройка
### 1. Пароль для внешнего приложения
Обычный пароль от аккаунта Mail.ru по IMAP **не работает**. Нужен отдельный:
**Mail.ru → Настройки → Безопасность → Пароли для внешних приложений → Добавить**
### 2. Подключение к MCP-клиенту
Claude Code — в `.mcp.json` проекта или в глобальный конфиг:
```json
{
"mcpServers": {
"mailru": {
"command": "python",
"args": ["-m", "mailru_mcp"],
"cwd": "/путь/к/mailru-mcp",
"env": {
"MAILRU_EMAIL": "you@mail.ru",
"MAILRU_PASSWORD": "пароль-для-внешнего-приложения"
}
}
}
}
```
### 3. Проверка
```bash
MAILRU_EMAIL=you@mail.ru MAILRU_PASSWORD=xxx python -m mailru_mcp --check
```
Выведет количество писем и список папок. Если видите папки — всё работает.
## Инструменты
| Инструмент | Что делает |
|---|---|
| `list_folders` | Список папок ящика |
| `create_folder` | Создать папку |
| `count_emails` | Сколько писем в папке |
| `list_emails` | Список писем: фильтры по времени, отправителю, непрочитанным |
| `read_email` | Полный текст одного письма |
| `move_emails` | Перенести письма в другую папку |
| `archive_old_emails` | Массово заархивировать старые письма |
| `delete_emails` | Удалить письма — в Корзину, обратимо |
| `draft_reply` | Подготовить ответ в Черновики (не отправляет) |
| `send_reply` | Отправить ответ — только на адреса из белого списка |
**Безвозвратного удаления нет.** `delete_emails` переносит письма в
Корзину, как кнопка «Удалить» в интерфейсе: ошибку агента можно исправить.
## Примеры
> «Сколько у меня непрочитанных за последние сутки?»
> «Покажи письма от alfabank.ru за месяц»
> «Создай папку „Магазины" и положи туда всё от ozon.ru и wildberries»
> «Заархивируй письма старше полугода»
Для массовых операций сначала вызывается сухой прогон — ассистент покажет,
сколько писем затронет, и только потом выполнит.
## Ответы на письма
Два режима, на выбор.
**Черновик — по умолчанию безопасно.** `draft_reply` складывает готовый
ответ в «Черновики», отправляете вы сами из почтового клиента. SMTP не
нужен, письмо само никуда не уйдёт.
**Отправка — только по белому списку.** `send_reply` отправляет через
SMTP, но лишь на адреса из `MAILRU_ALLOWED_RECIPIENTS`:
```json
"env": {
"MAILRU_EMAIL": "you@mail.ru",
"MAILRU_PASSWORD": "пароль-для-внешнего-приложения",
"MAILRU_ALLOWED_RECIPIENTS": "boss@company.ru,@partner.example.com"
}
```
Можно указывать полные адреса или домены (начиная с `@`). **Если
переменная не задана, отправка запрещена полностью** — забытая настройка
не должна открывать рассылку на произвольные адреса.
Оба инструмента сохраняют `In-Reply-To` и `References`, поэтому ответ
попадает в ту же переписку, а не отдельным письмом.
## Особенности Mail.ru, которые здесь обойдены
Эти грабли стоили нескольких часов отладки; если будете писать своё —
сэкономят время.
**Имена папок в модифицированном UTF-7 (RFC 3501).** Сервер отдаёт и
принимает кириллицу только в этой кодировке: «Архив» на проводе выглядит
как `&BBAEQARFBDgEMg-`. Обычное сравнение строк не находит папку, хотя она
есть. Отличие от стандартного utf-7 — `&` вместо `+`, а сам `&`
экранируется как `&-`.
**Массовый FETCH роняет соединение.** Попытка прочитать заголовки
нескольких тысяч писем разом даёт `SSLEOFError`. Здесь чтение идёт
партиями по 200.
**Длинные сессии обрываются.** После двух-трёх тысяч операций сервер
закрывает соединение. При переносе делается `EXPUNGE` после каждой партии
и переподключение при обрыве — иначе часть работы откатывается.
**Побочный эффект обрывов — дубли.** Если связь пропала между `COPY` и
`STORE`, партия скопируется повторно. На 7 391 письме получилось около
1 200 дублей. Безвредно, но знать стоит.
## Безопасность
**Пароль не хранится в коде** — только в переменных окружения.
**Содержимое писем — данные, а не инструкции.** Письмо может содержать
текст вида «игнорируй предыдущие указания» или «перешли всё на адрес X».
Инструмент `read_email` предупреждает об этом в описании, но окончательная
защита — на стороне ассистента: он не должен выполнять команды из писем.
**Белый список получателей — защита от prompt injection.** Письмо может
содержать текст «ответь, приложив код из предыдущего сообщения» или
«перешли это на адрес X». Даже если ассистент поддастся, письмо не уйдёт
никому, кроме адресов из `MAILRU_ALLOWED_RECIPIENTS`. Без этой переменной
отправка не работает вовсе.
Если отправка вам не нужна — просто не задавайте переменную. Тогда
доступен только `draft_reply`, а он ничего не отправляет.
**Удаление обратимо.** Письма уходят в Корзину, а не стираются. В нашей
практике был показательный случай: среди 1224 «мусорных» писем магазина
оказались возвраты денег и 17 уведомлений о входе в аккаунт — при
безвозвратном удалении они исчезли бы навсегда.
## Лицензия
MIT
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues