Skip to main content
Glama
README.md
# owa-mail-mcp

MCP-сервер к корпоративному Exchange: почта, календарь, справочник людей.

Наружу Exchange отдаёт только `/owa/` (EWS SOAP, MAPI, IMAP/SMTP закрыты), поэтому
сервер работает через OWA JSON API (`/owa/service.svc`) — тот же протокол, что и
веб-клиент OWA, — поверх NTLM.

## Подключение

Конфиг MCP-клиента:

```json
{
  "mcpServers": {
    "owa-mail": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/mainpart/owa-mail-mcp.git", "owa-mail-mcp"],
      "env": {
        "EXCHANGE_USERNAME": "DOMAIN\\user",
        "EXCHANGE_PASSWORD": "..."
      }
    }
  }
}
```

Локальный запуск из клона: `uv sync && uv run owa-mail-mcp`.

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

| Переменная | Обяз. | Дефолт | Назначение |
|---|---|---|---|
| `EXCHANGE_USERNAME` | да | — | учётка NTLM, `DOMAIN\user` |
| `EXCHANGE_PASSWORD` | да | — | пароль |
| `EXCHANGE_OWA_URL` | | `https://owa.example.com` | хост OWA |
| `EXCHANGE_COOKIE_FILE` | | `~/.config/owa-mail-mcp/cookies` | кэш сессии (0600), пишется сервером |
| `EXCHANGE_VERIFY_SSL` | | `false` | `true` — строгая проверка TLS |
| `EXCHANGE_ATTACHMENT_DIR` | | `/tmp/attachments` | куда сохраняются вложения |
| `EXCHANGE_TIME_ZONE` | | `Russian Standard Time` | Windows-зона для `TimeZoneContext` |
| `EXCHANGE_LOG_LEVEL` | | `INFO` | уровень логов (в stderr) |
| `MCP_ENABLED_TOOLS` | | 20 тулов | allowlist видимых тулов (см. «Конфиг») |
| `MCP_TRANSPORT` / `MCP_HOST` / `MCP_PORT` | | `stdio` | транспорт |

## Методы

Служебное:

| Метод | Что делает |
|---|---|
| `check_auth` | Жив ли сеанс OWA — делает лёгкий запрос к ящику, возвращает `{authenticated, user, owa_url}` или `not_authenticated` |

Почта:

| Метод | Что делает |
|---|---|
| `get_folders` | Папки с id, счётчиками и непрочитанными (`limit`/`offset`) |
| `find_emails` | Список папки или полнотекстовый поиск (`query`, `granularity=threads\|messages`); листается по позиции (`offset`) или по курсору (`after`) |
| `get_email` | Письмо целиком: тело, получатели, id вложений, ссылки (`include_links`) |
| `get_thread` | Вся переписка по письму или `conversation_id` |
| `send_email` | Отправить письмо или сохранить черновик (`draft`) |
| `reply_email` | Ответить / ответить всем (`reply_all`) |
| `forward_email` | Переслать письмо с вложениями |
| `delete_email` | Удалить (в «Удалённые» или `hard_delete`) |
| `mark_email_read` ⚙ | Пометить прочитанным / непрочитанным |
| `move_email` ⚙ | Переместить письмо в папку |

Календарь:

| Метод | Что делает |
|---|---|
| `get_calendar_events` | События за период (`start`/`end`), свои или чужие (`person`); окно читается целиком, сужается датами, `limit` — только предохранитель |
| `get_event` | Событие целиком: тело, участники, статусы ответов |
| `get_calendars` | Какие календари видны и какие из них реально читаются |
| `get_user_availability` | Занятость человека с темами встреч — даже без доступа к папке |
| `find_meeting_time` | Свободные для всех слоты в рабочих часах |
| `create_event` | Создать событие или серию, разослать приглашения |
| `update_event` | Изменить событие и уведомить участников (`apply_to` для серий) |
| `cancel_event` | Отменить своё событие (`apply_to` для серий) |
| `respond_to_event` | Принять / отклонить / под вопросом (`comment`, `notify_organizer`, `apply_to`) |

Люди, вложения, автоответчик:

| Метод | Что делает |
|---|---|
| `find_people` | Справочник: имя/логин/адрес → адрес; при одном совпадении — полная карточка (должность, отдел, телефоны); `details` раскрывает несколько, `limit`/`offset` листают |
| `get_attachment` | Скачать вложение на диск |
| `get_oof` ⚙ | Прочитать настройки автоответчика |
| `set_oof` ⚙ | Включить / выключить / по расписанию |

⚙ — выключены по умолчанию, включаются через `MCP_ENABLED_TOOLS`.

## Конфиг

`MCP_ENABLED_TOOLS` полностью заменяет дефолт — перечисляйте ровно то, что нужно;
пустая строка выключает все тулы.

Включить всё (24 тула):

```
check_auth,get_folders,find_emails,get_email,get_thread,send_email,reply_email,forward_email,delete_email,mark_email_read,move_email,get_calendar_events,get_event,get_calendars,get_user_availability,find_meeting_time,create_event,update_event,cancel_event,respond_to_event,get_attachment,find_people,get_oof,set_oof
```

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

```
check_auth,get_folders,find_emails,get_email,get_thread,get_calendar_events,get_event,get_calendars,get_user_availability,find_people
```

TDQS

A3.9/5.0

Scored across 20 tools

Disambiguation4/5

Most tools target a distinct action and resource, but get_folders and get_calendars have slight overlap since both list folders for mail/calendar. The descriptions clarify the distinction, so ambiguity is low.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in lowercase snake_case. Verbs like get, find, send, create, and update are used predictably, making the API easy to learn and navigate.

Tool Count3/5

At 20 tools, the server is heavier than the typical 3-15 range. While the dual email/calendar scope justifies the number, it falls into the 'heavy' category and could feel overwhelming for agents.

Completeness2/5

Calendar operations are well-covered with full CRUD and response handling, but the email side has significant gaps: get_folders references move_email, which does not exist, and there is no update or edit operation for emails. This creates dead ends for workflows involving moving or modifying messages.

Maintenance

ActivitySlowing
ResponsivenessNo issues