personal-mail-mcp
personal-mail-mcp
Локальный MCP-сервер для доступа Codex к личным почтовым ящикам и календарям.
Он подключает Codex к Microsoft Graph и Gmail, чтобы локальный помощник мог просматривать входящие письма, искать подтверждения встреч, создавать или обновлять записи в календаре, находить непрочитанные письма, которые могли быть пропущены вне папки «Входящие», и составлять безопасные планы архивации для малоценных сообщений. Проект также включает навыки Codex для повторяющихся рабочих процессов, таких как сбор встреч, сортировка входящих, проверка пропущенных писем и полный обзор почты.
Этот проект предоставляется «как есть». Он работает в моей собственной настройке, но не был широко протестирован с другими учетными записями, арендаторами, почтовыми провайдерами или конфигурациями Outlook/Gmail.
Текущие цели:
Почтовые ящики и календари Exchange, размещенные на GoDaddy, через Microsoft Graph.
Gmail через Google API.
Инструменты аудита/планирования только для чтения, а также инструменты для явной архивации и записи в календарь.
Не следует коммитить секреты OAuth или кэши токенов. Скопируйте config/accounts.example.toml в config/accounts.toml для локальных настроек. Скопируйте config/auth.example.toml в config/auth.toml для настроек приложения OAuth. Храните локальные файлы конфигурации в секрете от других пользователей вашей учетной записи.
Рекомендуемые права доступа для локальных файлов:
chmod 700 .private .tokens
chmod 600 config/accounts.toml config/auth.toml config/mail_rules.local.tomlНастройка локального проекта
Создайте и установите локальную среду:
cd <repo-path>
python3 -m venv .venv
.venv/bin/python -m pip install -e '.[providers]'Конфигурация Codex
Добавьте MCP-сервер в ~/.codex/config.toml:
[mcp_servers.personal_mail]
type = "stdio"
command = "<repo-path>/.venv/bin/python"
args = ["-m", "personal_mail_mcp.server"]
startup_timeout_sec = 30Перезапустите Codex после изменения конфигурации, чтобы MCP-сервер появился в списке активных инструментов.
Конфигурация учетной записи
Создайте config/accounts.toml:
[[accounts]]
id = "exchange_primary"
provider = "microsoft"
email = "primary@example.com"
calendar = true
[[accounts]]
id = "exchange_secondary"
provider = "microsoft"
email = "secondary@example.com"
calendar = false
[[accounts]]
id = "google_primary"
provider = "google"
email = "public-example@gmail.com"
calendar = falseЭтот файл игнорируется git.
Регистрация приложения Microsoft
Учетные записи GoDaddy — это учетные записи Exchange Online, доступные через Microsoft Graph. Специфический API GoDaddy не требуется.
Откройте центр администрирования Microsoft Entra:
https://entra.microsoft.com/Перейдите в:
Entra ID > App registrations > New registrationЕсли левая навигация отличается, выполните поиск по запросу
App registrationsв строке поиска портала.Зарегистрируйте приложение:
Name: personal-mail-mcp Supported account types: Single tenant only - your Microsoft 365 tenantНа странице обзора регистрации приложения скопируйте:
Application (client) ID Directory (tenant) IDВ разделе «Аутентификация» добавьте URL перенаправления для нативного/локального приложения:
http://localhostЭто отображается в разделе «Мобильные и настольные приложения / URL-адреса перенаправления» в текущем интерфейсе портала.
В настройках аутентификации включите потоки для публичного/нативного клиента. Формулировка на портале может быть одной из следующих:
Allow public client flows Enable the following mobile and desktop flows Treat application as a public clientУстановите значение
Yesи сохраните.В разделе «Разрешения API» добавьте делегированные разрешения Microsoft Graph:
Mail.Read Mail.ReadWrite Calendars.ReadWrite offline_access
Создайте config/auth.toml с скопированными идентификаторами:
[microsoft]
client_id = "APPLICATION_CLIENT_ID_FROM_ENTRA"
tenant = "DIRECTORY_TENANT_ID_FROM_ENTRA"
[google]
client_secrets_file = ".private/google-oauth-client.json"Не вставляйте токены OpenAI, ChatGPT, Codex или GitHub в этот файл. Этот файл игнорируется git.
Подключение учетных записей Exchange Online
cd <repo-path>
.venv/bin/python -m personal_mail_mcp.cli status
PYTHONUNBUFFERED=1 .venv/bin/python -m personal_mail_mcp.cli connect exchange_primary
PYTHONUNBUFFERED=1 .venv/bin/python -m personal_mail_mcp.cli connect exchange_secondaryКаждая команда подключения выводит URL-адрес кода устройства Microsoft и сам код. Откройте URL-адрес, введите код и войдите в систему с соответствующей учетной записью:
exchange_primary -> primary Exchange Online mailbox
exchange_secondary -> secondary Exchange Online mailboxУспешные подключения записывают файлы кэша локальных токенов в .tokens/, который игнорируется git.
Проверка:
.venv/bin/python -m personal_mail_mcp.cli statusУчетные записи Microsoft должны отображать:
token_cached: trueПроверка только для чтения
Получите последние пять тем сообщений из основного почтового ящика Exchange:
.venv/bin/python -m personal_mail_mcp.cli recent-messages exchange_primary --limit 5Эквивалентный инструмент MCP, представленный в Codex:
microsoft_recent_messages(account_id, limit=5)Настройка Gmail
Используйте проект Google Cloud для API Gmail и настольных учетных данных OAuth.
Откройте консоль Google Cloud:
https://console.cloud.google.com/Создайте или выберите проект, затем включите:
Gmail APIНастройте согласие OAuth в:
Google Auth Platform > BrandingИспользуйте простое имя приложения, например
personal-mail-mcp. Для личных учетных записей Gmail используйте аудиториюExternalи добавьте свой адрес Gmail в качестве тестового пользователя в:Google Auth Platform > Audience > Test usersСоздайте настольный клиент OAuth в:
Google Auth Platform > Clients > Create clientИспользуйте:
Application type: Desktop app Name: personal-mail-mcpЗагрузите JSON клиента OAuth и сохраните его локально:
<repo-path>/.private/google-oauth-client.jsonУжесточите права доступа:
chmod 600 .private/google-oauth-client.jsonУбедитесь, что
config/auth.tomlуказывает на этот файл:[google] client_secrets_file = ".private/google-oauth-client.json"Подключите учетную запись Gmail:
cd <repo-path> PYTHONUNBUFFERED=1 .venv/bin/python -m personal_mail_mcp.cli connect google_primaryОткройте выведенный URL-адрес Google, войдите в систему с настроенным тестовым пользователем и одобрите области чтения/изменения Gmail.
Проверка:
.venv/bin/python -m personal_mail_mcp.cli statusУчетная запись Gmail должна отображать:
token_cached: trueПолучите последние три темы входящих сообщений Gmail:
.venv/bin/python -m personal_mail_mcp.cli recent-gmail google_primary --limit 3Эквивалентный инструмент MCP, представленный в Codex:
gmail_recent_messages(account_id, limit=5)Сортировка почты
MCP-сервер включает повторно используемые помощники для аудита и архивации входящих сообщений, поэтому для повторяющейся сортировки не требуются специальные скрипты.
Запустите аудит только для чтения по всем учетным записям:
cd <repo-path>
.venv/bin/python -m personal_mail_mcp.cli audit-mail exchange_primary exchange_secondary google_primary --limit-per-account 250Создайте план архивации для пробного запуска. Он возвращает только кандидатов на архивацию, сгруппированных по всем запрошенным учетным записям по причине архивации, отправителю и нормализованной теме. Каждое сообщение включает идентификатор учетной записи, идентификатор сообщения, тему, отправителя и дату получения:
.venv/bin/python -m personal_mail_mcp.cli archive-plan exchange_primary exchange_secondary google_primary --limit-per-account 250Выведите список одного почтового ящика с пагинацией:
.venv/bin/python -m personal_mail_mcp.cli inbox exchange_primary --limit 100Просканируйте непрочитанные письма вне папки «Входящие», например, заархивированные или перемещенные правилами сообщения. Команда классифицирует эти сообщения и возвращает кандидатов на внимание отдельно от очевидных архивов/шума:
.venv/bin/python -m personal_mail_mcp.cli missed-mail exchange_primary exchange_secondary google_primary --limit-per-account 100Архивируйте выбранные сообщения по идентификатору:
.venv/bin/python -m personal_mail_mcp.cli archive-mail exchange_primary <message-id> [<message-id> ...]Эквивалентные инструменты MCP, представленные в Codex:
mail_inbox(account_id, limit=100)
mail_audit(account_ids, limit_per_account=250)
mail_archive_plan(account_ids, limit_per_account=250)
missed_mail(account_ids, limit_per_account=100)
archive_messages(account_id, message_ids)Классификатор аудита намеренно детерминирован. Он группирует почту в keep (оставить), flag (отметить), archive (архивировать) и review (проверить). Используйте mail_archive_plan в качестве обычного шага проверки перед перемещением сообщений; он работает только для чтения и содержит точные идентификаторы, необходимые для archive_messages. Когда один и тот же шаблон архивации появляется более одного раза или в нескольких учетных записях, план также возвращает рекомендации по фильтрам, которые можно использовать для создания правил почтового ящика/провайдера для будущих сообщений.
Удаленное создание фильтров/правил возможно, но требует дополнительных областей OAuth: правила сообщений Microsoft Graph требуют MailboxSettings.ReadWrite; создание фильтров Gmail требует gmail.settings.basic. Пока они не будут добавлены и одобрены, сервер должен только рекомендовать фильтры, а не создавать их.
Повторно используемые значения по умолчанию находятся в config/mail_rules.default.toml. Специфичные для пользователя отправители, количество сохраняемых писем и шаблоны архивации относятся к config/mail_rules.local.toml, который игнорируется git. Используйте config/mail_rules.example.toml в качестве шаблона для локальных переопределений.
Дополнительный навык Codex
Этот проект включает в себя общий навык Codex:
skills/email-appointment-harvest
skills/inbox-triage
skills/missed-mail-review
skills/review-all-mailНавык документирует повторяющийся рабочий процесс для сканирования недавней электронной почты, предложения кандидатов на встречу/календарь, ожидания одобрения, а затем создания или обновления только одобренных записей календаря.
Установите его в среду Codex:
mkdir -p "${CODEX_HOME:-$HOME/.codex}/skills"
cp -R skills/email-appointment-harvest "${CODEX_HOME:-$HOME/.codex}/skills/"
cp -R skills/inbox-triage "${CODEX_HOME:-$HOME/.codex}/skills/"
cp -R skills/missed-mail-review "${CODEX_HOME:-$HOME/.codex}/skills/"
cp -R skills/review-all-mail "${CODEX_HOME:-$HOME/.codex}/skills/"Перезапустите Codex после установки. Пример запроса:
Use email appointment harvest to scan the last 7 days of email for appointments,
propose calendar entries, and add only the entries I approve.Установленный навык предполагает, что этот MCP-сервер настроен в Codex и что токены OAuth для почты/календаря уже подключены.
Примечания по безопасности
config/auth.toml,config/accounts.tomlи.tokens/являются только локальными.Приложение Microsoft является публичным/нативным клиентом; не создавайте и не храните секрет клиента для этого потока CLI.
Учетные данные клиента Gmail в
.private/и кэши токенов в.tokens/должны иметь режим600для файлов и700для каталогов.Для текущих инструментов архивации/календаря требуются
Mail.ReadWriteдля Microsoft,gmail.modifyдля Google иCalendars.ReadWriteдля Microsoft. Ограничьте регистрацию приложения только теми делегированными разрешениями, которые вы используете.Относитесь к
archive_messagesи инструментам изменения календаря как к действиям записи. Предпочитайтеmail_archive_planи чтение календаря перед применением изменений.Ротируйте любые личные токены доступа, которые когда-либо хранились в конфигурации в виде открытого текста.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
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/srogerf/personal-mail-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server