Skip to main content
Glama

outlook-ews-mcp

Python MCP Exchange Status License

outlook-ews-mcp — это MCP сервер для локального Microsoft Exchange через EWS (exchangelib). Он предоставляет MCP-совместимым клиентам (Claude Desktop, Claude Code и любым другим MCP-клиентам) доступ к электронной почте, календарю, контактам, папкам, вложениям и данным о доступности через единый, тестируемый Python-сервис — без необходимости прямого скриптования почтового ящика.

Переименован из outlook-mcp. Это имя уже было занято на PyPI несвязанным проектом, поэтому имя дистрибутива и CLI теперь — outlook-ews-mcp. Путь импорта Python не изменился. До первого тегированного релиза на PyPI устанавливайте из этого репозитория, как показано ниже.

Содержание

Related MCP server: owa-mail-mcp

Возможности

  • Электронная почта — список, поиск (по подстроке или Advanced Query Syntax), чтение, отправка, ответ, пересылка, перемещение, копирование, удаление, пометка, категоризация, массовые операции, экспорт в сыром MIME, добавление/удаление вложений

  • Система — правила входящих, автоответы (автоматические ответы), список делегатов только для чтения

  • Календарь — список, создание, обновление, удаление, ответы на приглашения, поиск свободных слотов, просмотр календаря общего/делегированного почтового ящика, Room Finder, массовые операции

  • Контакты — поиск, чтение, создание, обновление, удаление

  • Папки и вложения — CRUD для папок и загрузка вложений

  • АутентификацияNTLM и Basic для локального Exchange

  • Транспортstdio и SSE

  • Архитектура — централизованное сопоставление ошибок через единую абстракцию ExchangeClient (см. Заметки о проекте)

  • Безопасность — более приватная проверка работоспособности по умолчанию (см. Проверка работоспособности)

  • Операции — Docker-образ и готовые пайплайны CI/CD для GitHub и GitLab

Каталог инструментов

Каждый инструмент ниже зарегистрирован в tool_specs.py — едином источнике истины для его имени, описания и схемы. Read-only помечает инструменты, которые никогда не изменяют почтовый ящик — они получают больше конкурентности (см. Очередь запросов) и их безопасно вызывать спекулятивно.

Система

Инструмент

Описание

Только чтение

ping_exchange

Проверка подключения к Exchange

get_mailbox_info

Получение метаданных почтового ящика

list_delegates

Список делегатов почтового ящика и уровней их прав на папки — только чтение, потому что exchangelib не поддерживает запись делегатов

list_inbox_rules

Список серверных правил входящих

create_inbox_rule

Создание серверного правила входящих, например «от этого отправителя → переместить в папку»

update_inbox_rule

Включение/отключение правила или изменение его приоритета (другие поля здесь не обновляются)

delete_inbox_rule

Удаление серверного правила входящих по id

get_out_of_office

Получение настроек автоответа (автоматических ответов)

set_out_of_office

Отключение, включение автоматических ответов или планирование окна начала/окончания

⚠️ create_inbox_rule / update_inbox_rule / delete_inbox_rule управляют правилами через EWS, что удаляет клиентский блоб правил, который хранит настольный Outlook — это может стереть правила, созданные пользователем в самом Outlook. Это документированное поведение EWS, а не ошибка здесь.

Электронная почта

Инструмент

Описание

Только чтение

list_emails

Список писем в папке

get_email

Получение полного письма по id

get_email_mime

Экспорт сырого MIME-содержимого сообщения в формате RFC 822, закодированного в base64

get_thread

Получение всех сообщений беседы по порядку, включая тела

search_emails

Поиск по подстроке (тема/тело/отправитель) или серверный Advanced Query Syntax

send_email

Отправка нового письма

reply_email

Ответ на письмо

forward_email

Пересылка письма

move_email

Перемещение письма в другую папку

copy_email

Копирование письма в другую папку

move_emails

Массовое перемещение с результатами по каждому элементу — один плохой id не ломает остальные

copy_emails

Массовое копирование с результатами по каждому элементу

delete_emails

Массовое удаление с результатами по каждому элементу (мягкое удаление, если не hard_delete)

delete_email

Удаление письма

mark_email

Обновление состояния прочитанности, важности или флага отслеживания

categorize_email

Установка, добавление или удаление категорий Outlook (цветных меток)

mark_emails

Массовая версия mark_email с результатами по каждому элементу

categorize_emails

Массовая версия categorize_email с результатами по каждому элементу

list_categories

Список используемых категорий с количеством, выбранных из недавних сообщений (не из главного списка категорий почтового ящика)

list_folders

Список папок почтового ящика

create_folder

Создание папки почтового ящика

rename_folder

Переименование папки — отказывается от встроенных папок (Входящие, Отправленные, Календарь, ...)

delete_folder

Удаление папки и всего её содержимого — отказывается от встроенных папок

create_draft

Создание черновика письма

update_draft

Обновление черновика; пропущенные поля остаются без изменений, attachments (если заданы) заменяют весь набор

send_draft

Отправка существующего черновика

add_attachment

Прикрепление локального файла к сообщению, обычно к черновику — файл должен находиться в EXCHANGE_ATTACHMENT_ROOT

delete_attachment

Удаление одного вложения из сообщения по id

get_attachment

Сохранение вложения на диск

Календарь

Инструмент

Описание

Только чтение

list_events

Перечислить события календаря в диапазоне времени; передайте mailbox для календаря по умолчанию коллеги (требуется доступ делегата/от имени, не комбинируется с calendar_id)

get_event

Получить событие календаря по id; передайте mailbox для календаря коллеги

create_event

Создать событие календаря

update_event

Обновить событие календаря

delete_event

Удалить событие календаря

respond_to_invite

Принять, отклонить или предварительно ответить на приглашение

find_free_slots

Найти свободные временные слоты для встречи

delete_events

Массовое удаление событий с результатами по каждому элементу

respond_to_invites

Массовый ответ на приглашения с результатами по каждому элементу

get_my_availability

Получить слоты свободен/занят; передайте mailbox для календаря коллеги

list_calendars

Перечислить календари

list_room_lists

Перечислить списки комнат Room Finder (группы переговорных комнат)

list_rooms

Перечислить переговорные комнаты в списке комнат Room Finder

Контакты

Инструмент

Описание

Только чтение

search_contacts

Поиск контактов

get_contact

Получить контакт по id

create_contact

Создать личный контакт

update_contact

Обновить личный контакт

delete_contact

Удалить личный контакт

Типичные сценарии использования

  • Подключить Claude Desktop или другой MCP-клиент к локальному Exchange

  • Искать сообщения во входящих и получать полное содержимое электронной почты

  • Отправлять или создавать черновики писем из AI-процессов

  • Просматривать календари и создавать встречи

  • Проверять окна свободен/занят для планирования

  • Искать личные контакты или глобальный список адресов

  • Предоставлять операции Exchange через контролируемую границу MCP вместо прямого скриптования почтового ящика

Замечания по безопасности

Что делает текущий код:

Ограниченное подключение

Подключается только к конечной точке Exchange/EWS, настроенной в EXCHANGE_SERVER

Без телеметрии

Не содержит телеметрии, аналитики или логики экспорта данных третьим сторонам

Секреты остаются локальными

Хранит секреты в переменных окружения / .env, игнорируемых .gitignore (.env, .env.*, сохраняя .env.example)

Чистые ответы об ошибках

Структурированные ответы об ошибках MCP никогда не включают исходный текст исключений Exchange, тела сообщений, содержимое вложений или пароли; успешные инструменты возвращают только те данные почтового ящика, которые были запрошены

Чистые журналы

LOG_LEVEL управляет только собственными логгерами приложения outlook_mcp.*; логгеры SOAP XML exchangelib — которые в противном случае выводили бы полный XML запросов/ответов, даже на уровне ERROR при транспортных ошибках — всегда принудительно отключены

Чистые Docker-сборки

.dockerignore исключает .env, тесты, кэши и метаданные VCS из контекста сборки

На что вам всё же следует обратить внимание:

  • EXCHANGE_VERIFY_SSL=false отключает проверку TLS-сертификатов — только для доверенных внутренних/самоподписанных сред.

  • EXCHANGE_AUTH_TYPE=Basic отправляет учетные данные в открытом виде, поэтому сервер отказывается запускаться против http:// EXCHANGE_SERVER; переопределите это только с помощью EXCHANGE_ALLOW_INSECURE_BASIC_AUTH=true для локального/тестового сервера, которым вы управляете.

  • get_attachment записывает файлы на диск, а send_email/reply_email/forward_email/create_draft читают локальные файлы (через attachments) и прикрепляют их содержимое к исходящей почте. В сочетании с недоверенным содержимым электронной почты это вероятный путь для эксфильтрации любого файла, читаемого процессом, через внедрение в промпт. Локальный доступ к файлам по умолчанию запрещен и работает только после установки EXCHANGE_ATTACHMENT_ROOT в абсолютный каталог, который затем ограничивает и пути attachments, и save_path из get_attachment этим деревом каталогов (неустановленный save_path по-прежнему использует системную временную папку).

  • outlook-ews-mcp-smoke по умолчанию безопасен для конфиденциальности и выводит только замаскированную информацию о почтовом ящике и счетчики; установите OUTLOOK_MCP_SMOKE_INCLUDE_DATA=true только если вы явно хотите видеть реальные данные входящих/событий в stdout.

  • Если вы включаете ведение журнала в файл с помощью LOG_FILE, защитите этот файл правами ОС.

  • Если вы публикуете Docker-образы из CI, защитите доступ к проекту GitLab/GitHub и права на реестр.

Быстрый старт

uv venv
source .venv/bin/activate
uv pip install -e .[dev]
cp .env.example .env
outlook-ews-mcp

По умолчанию сервер работает в режиме stdio. Установите MCP_TRANSPORT=sse, чтобы вместо этого запустить HTTP-сервер.

Конфигурация

Минимальный .env для начала — всё остальное ниже имеет рабочий вариант по умолчанию:

EXCHANGE_SERVER=https://mail.company.com/EWS/Exchange.asmx
EXCHANGE_USERNAME=DOMAIN\username
EXCHANGE_PASSWORD=secret
EXCHANGE_EMAIL_ADDRESS=user@company.com
EXCHANGE_AUTH_TYPE=NTLM

Полностью прокомментированная копия каждой переменной находится в .env.example.

Переменная

По умолчанию

Описание

EXCHANGE_SERVER

(обязательно)

URL конечной точки EWS, например https://mail.company.com/EWS/Exchange.asmx

EXCHANGE_USERNAME

(обязательно)

DOMAIN\username или UPN. Ровно одна обратная косая черта — dotenv не обрабатывает escape-последовательности

EXCHANGE_PASSWORD

(обязательно)

Пароль учётной записи

EXCHANGE_EMAIL_ADDRESS

не задано

SMTP-адрес; задаётся, когда EXCHANGE_USERNAME не является таковым

EXCHANGE_AUTH_TYPE

NTLM

NTLM или Basic

EXCHANGE_ALLOW_INSECURE_BASIC_AUTH

false

Разрешить Basic-аутентификацию по http:// — только для локальных/тестовых серверов

EXCHANGE_VERIFY_SSL

true

Проверять TLS-сертификат сервера; false только для доверенных внутренних/самоподписанных настроек

EXCHANGE_VERSION

не задано (автоопределение)

Версия сервера Exchange, например EXCHANGE_2016

EXCHANGE_TIMEZONE_FALLBACK

Europe/Moscow

Используется только когда Exchange сообщает неразрешимый GUID-идентификатор часового пояса; в обычной работе используется часовой пояс почтового ящика по умолчанию

EXCHANGE_TIMEOUT

30

Таймаут на запрос в секундах (1–300)

EXCHANGE_MAX_RETRY_WAIT_SECONDS

90

Бюджет ожидания по реальному времени для read-only вызовов, когда Exchange сообщает о своей занятости; это не количество повторов; 0 отключает повторы. Записи никогда не повторяются автоматически

EXCHANGE_IMPERSONATE_AS

не задано

Почтовый ящик для олицетворения (требуются права на олицетворение Exchange)

EXCHANGE_ATTACHMENT_MAX_SIZE_MB

10

Максимальный размер одного вложения, применяется и при загрузке, и при скачивании через get_attachment (1–100)

EXCHANGE_ATTACHMENT_MAX_COUNT

10

Максимальное количество вложений в одном вызове send/reply/forward/create_draft (1–100)

EXCHANGE_ATTACHMENT_MAX_TOTAL_SIZE_MB

25

Максимальный суммарный размер вложений в одном вызове (1–500)

EXCHANGE_ATTACHMENT_ROOT

не задано (отключено)

Каталог, ограничивающий пути к вложениям. Если не задано, отказывает в любом локальном доступе к файлам для attachments/save_path; задайте абсолютный путь к каталогу, чтобы разрешить пути внутри него

EXCHANGE_EMAIL_BODY_MAX_CHARS

200000

Ограничение на body_text/body_html в get_email (1,000–5,000,000); более длинные тела обрезаются с truncated: true

EXCHANGE_EMAIL_MIME_MAX_SIZE_MB

25

Ограничение на размер необработанного MIME-экспорта до расширения base64 (1–100)

EXCHANGE_SIGNATURE_TEXT

не задано

Добавляется к исходящим текстовым телам и ответам/пересылкам. API подписи EWS не существует, поэтому это конфигурация, а не подпись Outlook почтового ящика

EXCHANGE_SIGNATURE_HTML

не задано

Добавляется к исходящим HTML-телам. Та же оговорка, что выше; взаимного преобразования между ними нет. Любую можно пропустить в вызове с include_signature: false

MCP_TRANSPORT

stdio

stdio или sse

MCP_SSE_HOST

127.0.0.1

Адрес привязки, когда MCP_TRANSPORT=sse

MCP_SSE_PORT

8080

Порт привязки, когда MCP_TRANSPORT=sse

MCP_MAX_CONCURRENCY

4

Одновременные read-only вызовы инструментов (1–8); изменяющие вызовы всегда выполняются исключительно. См. Очередь запросов

MCP_MAX_QUEUE_SIZE

20

Максимальное количество вызовов, принимаемых одновременно, выполняющихся и ожидающих (1–1000); сверх этого вызовы получают немедленную ошибку server_busy

LOG_LEVEL

INFO

DEBUG, INFO, WARNING или ERROR

LOG_FILE

не задано (stderr)

Путь к файлу журнала; защитите его правами ОС, если задан

Примечания о поведении, не привязанные к отдельной переменной:

  • list_events и find_free_slots принимают ограниченный limit (по умолчанию 200, максимум 1000); диапазоны событий ограничены 366 днями, а диапазоны свободных слотов — 31 днём, так что широкие запросы не могут порождать неограниченные ответы EWS или MCP.

  • Списки остаются компактными по замыслу: сводки писем содержат отправителя, но не списки получателей (get_email их содержит), list_events возвращает события без тел (get_event их содержит), а get_email возвращает заголовки RFC-822 только с include_headers: true.

  • Операции отправки возвращают id: null, когда EWS не предоставляет устойчивый идентификатор для отправленной копии (в частности, для ответов, пересылок и отправленных черновиков).

  • Метаданные вложений включают downloadable; встроенные вложения элементов Exchange имеют downloadable: false и не могут быть сохранены через get_attachment.

Очередь запросов

Клиенты отправляют несколько вызовов инструментов параллельно. Работа с Exchange блокирующая, поэтому сервер выполняет её в рабочих потоках и допускает вызовы через одну общую FIFO-очередь.

  • MCP_MAX_CONCURRENCY (по умолчанию 4) задаёт, сколько read-only вызовов выполняется одновременно, так что агент, запрашивающий письмо, список папок и календарь, платит за самый медленный круговой путь вместо суммы. Изменяющие вызовы всегда выполняются исключительно — по одному, никогда не пересекаясь с чтением — поэтому гонки чтения/записи в общем состоянии учётной записи невозможны. Вызывающие сверх лимита ждут своей очереди, обслуживаясь в порядке поступления; ожидающая мутация блокирует более поздние чтения, не позволяя им обогнать её.

  • MCP_MAX_QUEUE_SIZE (по умолчанию 20) ограничивает, сколько вызовов может быть принято одновременно, выполняющихся или ожидающих. Когда столько уже находится в очереди, дальнейшие вызовы получают немедленную ошибку server_busy вместо присоединения к неограниченной очереди.

  • Транспорт остаётся отзывчивым, пока работа выполняется. Инструменты ожидаются (await), а не выполняются в потоке цикла событий, поэтому завершённые ответы отправляются немедленно, а пинги обрабатываются, пока длинный вызов ещё выполняется.

  • Таймаута на вызов нет, намеренно. Поток, заблокированный на чтении сокета, нельзя убить извне; среда выполнения может только перестать ждать его, что бросает поток вместе с удерживаемой им сессией EWS. Пул сессий exchangelib имеет жёсткий максимум и выдаёт сессии в цикле без пути отказа, поэтому утёкшие сессии в конечном итоге истощают его, и каждый последующий вызов блокируется навсегда. Медленный вызов пережидается, ограниченный EXCHANGE_TIMEOUT плюс EXCHANGE_MAX_RETRY_WAIT_SECONDS: политика повторов учётной записи — быстрый отказ, поэтому каждый вызов EWS вызывает исключение при первой же временной ошибке, а не exchangelib повторяет его бесконечно внутри, и ExchangeClient сам повторяет только read-only вызовы, ограниченные этим бюджетом реального времени. Записи никогда не повторяются автоматически. Превышения сверх ожидаемого бюджета регистрируются в журнале.

Пример для Claude Desktop

{
  "mcpServers": {
    "outlook": {
      "command": "outlook-ews-mcp",
      "env": {
        "EXCHANGE_SERVER": "https://mail.company.com/EWS/Exchange.asmx",
        "EXCHANGE_USERNAME": "DOMAIN\\username",
        "EXCHANGE_PASSWORD": "secret",
        "EXCHANGE_EMAIL_ADDRESS": "user@company.com",
        "EXCHANGE_AUTH_TYPE": "NTLM"
      }
    }
  }
}

Быстрая проверка

После заполнения .env выполните:

outlook-ews-mcp-smoke

Вывод по умолчанию очищен для более безопасной проверки. Если вы намеренно хотите получить образцы данных почтового ящика/событий в выводе:

OUTLOOK_MCP_SMOKE_INCLUDE_DATA=true outlook-ews-mcp-smoke

Docker

docker build -t outlook-ews-mcp .
docker run --rm --env-file .env outlook-ews-mcp

CI/CD

GitHub Actions и GitLab CI оба запускают lint, форматирование, проверки типов, тесты, аудит зависимостей и сборку пакетов, используя версию uv, закреплённую в pyproject.toml.

GitHub

Дополнительно публикует тегированные релизы (v*) на PyPI через OIDC trusted publishing. Перед первым релизом настройте pending publisher PyPI для репозитория viartemev/outlook-ews-mcp, workflow ci.yml и окружения pypi — в GitHub не хранится долгоживущий токен PyPI.

GitLab

Дополнительно собирает и публикует Docker-образ в GitLab Container Registry на ветке по умолчанию и на тегах, используя встроенные переменные CI_REGISTRY / CI_REGISTRY_USER / CI_REGISTRY_PASSWORD / CI_REGISTRY_IMAGE.

Поведение тегирования образов по умолчанию:

Триггер

Отправляемые теги

Ветка по умолчанию

:$CI_COMMIT_SHORT_SHA и :latest

Git-тег

:$CI_COMMIT_TAG

Разработка

uv run --python 3.12 --with '.[dev]' ruff check .
uv run --python 3.12 --with '.[dev]' pytest -q

Заметки о проекте

  • Реализация сосредоточена вокруг единой абстракции ExchangeClient, чтобы аутентификация, транспорт, повторы и сопоставление ошибок оставались централизованными.

  • Ошибки возвращаются в структурированной JSON-форме, подходящей для обработки MCP isError=true.

Вклад в проект

Сообщения об ошибках и PR приветствуются — см. CONTRIBUTING.md о том, как настроить среду разработки и запустить тестовый набор без реального сервера Exchange. О сообщениях об уязвимостях см. SECURITY.md.

Лицензия

MIT — см. LICENSE.

Install Server
A
license - permissive license
C
quality
A
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity
Issues opened vs closed

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

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for any Microsoft Exchange / OWA deployment. Gives LLM agents access to email, calendar, directory search, folders, availability, and meeting analytics via 30 tools.
    30
    7
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    A local MCP server for on-premises Microsoft Exchange, connecting via EWS and NTLM. It provides mail, template, availability, and calendar workflow tools through stdio, with draft-first safety and Windows Credential Manager integration.
    7
    MIT

View all related MCP servers

Related MCP Connectors

  • Read, search, send, organize, draft and schedule email across your inboxes from any MCP client.

  • Fully-managed email as MCP tools - register domains, real mailboxes, send and receive mail.

  • MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.

View all MCP Connectors

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/viartemev/outlook-ews-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server