Skip to main content
Glama

outlook-ews-mcp

Python MCP Exchange Status License

outlook-ews-mcp は、オンプレミスの Microsoft Exchange を EWS(exchangelib)経由で操作するための MCP サーバーです。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 と添付ファイルのダウンロード

  • 認証 — オンプレミス Exchange に対する NTLMBasic

  • トランスポートstdioSSE

  • アーキテクチャ — 単一の ExchangeClient 抽象化による集中エラーマッピング(プロジェクトノート を参照)

  • 安全性 — デフォルトでプライバシーに配慮したスモークチェック(スモークチェック を参照)

  • 運用 — Docker イメージと GitHub / GitLab CI/CD パイプラインを含む

ツールカタログ

以下の各ツールは tool_specs.py に登録されており、名前、説明、スキーマの唯一の情報源です。読み取り専用 は、メールボックスを変更しないツールを示します。これらのツールはより多くの同時実行が許可され(リクエストキュー を参照)、推測的に呼び出しても安全です。

システム

ツール

説明

読み取り専用

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

メッセージの生の RFC 822 MIME コンテンツを base64 エンコードでエクスポート

get_thread

会話のすべてのメッセージを順序どおりに本文を含めて取得

search_emails

部分一致(件名/本文/送信者)またはサーバー側の Advanced Query Syntax で検索

send_email

新しいメールを送信

reply_email

メールに返信

forward_email

メールを転送

move_email

メールを別のフォルダーに移動

copy_email

メールを別のフォルダーにコピー

move_emails

一括移動、項目ごとの結果付き — 1 つの不正な 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 でメッセージから添付ファイルを 1 つ削除

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 ワークフローからメールを送信または下書きする

  • 予定表を確認し、会議を作成する

  • スケジュール調整のため空き/予定ありの時間帯を確認する

  • 個人用連絡先またはグローバル アドレス一覧を検索する

  • 直接のメールボックス スクリプトではなく、制御された MCP 境界を通じて Exchange 操作を公開する

セキュリティに関する注意

現在のコードが行うこと:

接続範囲の限定

EXCHANGE_SERVER で設定された Exchange/EWS エンドポイントにのみ接続します

テレメトリなし

テレメトリ、分析、サードパーティへのデータエクスポートのロジックは一切含まれていません

シークレットはローカルに保持

シークレットは環境変数 / .env に保持し、.gitignore で無視します(.env.example は保持しつつ .env.env.* を無視)

クリーンなエラーペイロード

構造化された MCP エラー応答には、Exchange の生の例外テキスト、メッセージ本文、添付ファイルの内容、パスワードは一切含まれません。成功したツールは、要求されたメールボックスデータのみを返します

クリーンなログ

LOG_LEVEL はアプリ自身の outlook_mcp.* ロガーのみを制御します。exchangelib の SOAP XML ロガーは、通常はトランスポートエラー時でも ERROR レベルで完全な要求/応答 XML を出力しますが、常に強制的に無音化されます

クリーンな 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 のパスと get_attachmentsave_path の両方がそのディレクトリ ツリー内に制限されます(save_path が未設定の場合は、依然としてシステムの一時ディレクトリに フォールバックします)。

  • outlook-ews-mcp-smoke は既定でプライバシーに配慮しており、マスクされたメールボックス情報 と件数のみを出力します。stdout に実際の受信トレイ/イベントデータを明示的に出力したい場合のみ OUTLOOK_MCP_SMOKE_INCLUDE_DATA=true を設定してください。

  • LOG_FILE でファイルログを有効にする場合は、OS の権限でそのファイルを保護してください。

  • CI から Docker イメージを公開する場合は、GitLab/GitHub のプロジェクトアクセスと レジストリの権限を保護してください。

クイックスタート

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

既定ではサーバーは stdio モードで実行されます。代わりに HTTP サーバーを起動するには MCP_TRANSPORT=sse を設定します。

設定

開始するための最小限の .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

(必須)

EWSエンドポイントURL(例: https://mail.company.com/EWS/Exchange.asmx

EXCHANGE_USERNAME

(必須)

DOMAIN\username または UPN。バックスラッシュは正確に1つ — dotenvはエスケープシーケンスを処理しない

EXCHANGE_PASSWORD

(必須)

アカウントのパスワード

EXCHANGE_EMAIL_ADDRESS

未設定

SMTPアドレス。EXCHANGE_USERNAMEがSMTPアドレスでない場合に設定する

EXCHANGE_AUTH_TYPE

NTLM

NTLM または Basic

EXCHANGE_ALLOW_INSECURE_BASIC_AUTH

false

http:// 経由の Basic 認証を許可 — ローカル/テストサーバーのみ

EXCHANGE_VERIFY_SSL

true

サーバーのTLS証明書を検証する。false は信頼できる内部/自己署名環境のみ

EXCHANGE_VERSION

未設定(自動検出)

Exchangeサーバーのバージョン(例: EXCHANGE_2016

EXCHANGE_TIMEZONE_FALLBACK

Europe/Moscow

Exchangeが解決不能なGUIDタイムゾーンIDを報告した場合のみ使用。通常の操作ではメールボックス自身のデフォルトタイムゾーンを使用する

EXCHANGE_TIMEOUT

30

リクエストごとのタイムアウト(秒)(1〜300)

EXCHANGE_MAX_RETRY_WAIT_SECONDS

90

Exchangeがビジー状態を報告した際の読み取り専用呼び出しに対する実時間ベースのリトライ予算。リトライ回数ではない。0 でリトライ無効。書き込みは自動リトライされない

EXCHANGE_IMPERSONATE_AS

未設定

偽装するメールボックス(Exchangeの偽装権限が必要)

EXCHANGE_ATTACHMENT_MAX_SIZE_MB

10

添付ファイルあたりの最大サイズ。アップロードと get_attachment ダウンロードの両方で適用(1〜100)

EXCHANGE_ATTACHMENT_MAX_COUNT

10

1回の送信/返信/転送/create_draft呼び出しあたりの最大添付ファイル数(1〜100)

EXCHANGE_ATTACHMENT_MAX_TOTAL_SIZE_MB

25

1回の呼び出しあたりの添付ファイル合計サイズの上限(1〜500)

EXCHANGE_ATTACHMENT_ROOT

未設定(無効)

添付ファイルのパスを制限するディレクトリ。未設定の場合、attachments/save_path に対するすべてのローカルファイルアクセスを拒否する。絶対ディレクトリを設定すると、その内部のパスのみ許可される

EXCHANGE_EMAIL_BODY_MAX_CHARS

200000

get_emailbody_text/body_html の上限(1,000〜5,000,000)。より長い本文は truncated: true 付きで切り詰められる

EXCHANGE_EMAIL_MIME_MAX_SIZE_MB

25

base64展開前の生MIMEエクスポートサイズの上限(1〜100)

EXCHANGE_SIGNATURE_TEXT

未設定

送信テキスト本文および返信/転送に追加される。EWSに署名APIは存在しないため、これは設定であり、メールボックスの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

同時実行できる読み取り専用ツール呼び出し数(1〜8)。変更を伴う呼び出しは常に排他的に実行される。リクエストキュー を参照

MCP_MAX_QUEUE_SIZE

20

同時に受け入れられる呼び出しの最大数(実行中+待機中)(1〜1000)。これを超えると呼び出しは即座に server_busy エラーを受け取る

LOG_LEVEL

INFO

DEBUGINFOWARNING、または ERROR

LOG_FILE

未設定(stderr)

ログファイルのパス。設定する場合はOSの権限で保護すること

単一の変数に紐づかない動作上の注意事項:

  • list_eventsfind_free_slots は上限付きの limit(デフォルト200、最大 1000)を受け付ける。イベント範囲は366日、空きスロット範囲は31日に制限されるため、 広範なクエリで無制限のEWSまたはMCPレスポンスが生成されることはない。

  • 一覧は意図的に軽量に保たれている: メールの要約には送信者は含まれるが受信者リストは含まれない (get_email に含まれる)、list_events は本文なしでイベントを返す (get_event に含まれる)、get_emailinclude_headers: true の場合のみRFC-822ヘッダーを返す。

  • 送信操作は、EWSが送信済みコピーに永続的なIDを提供しない場合(特に返信、転送、送信済み下書き)に id: null を返す。

  • 添付ファイルのメタデータには downloadable が含まれる。埋め込まれたExchangeアイテム添付ファイルは downloadable: false であり、get_attachment で保存できない。

リクエストキュー

クライアントは複数のツール呼び出しを並行して発行する。Exchangeの処理はブロッキングであるため、サーバーは ワーカースレッドで実行し、1つの共有FIFOキューを通じて呼び出しを受け入れる。

  • MCP_MAX_CONCURRENCY(デフォルト 4)は、読み取り専用呼び出しを同時にいくつ実行するかを設定する。 これにより、エージェントがメール、フォルダーリスト、カレンダーを要求する場合、合計ではなく最も遅い ラウンドトリップの時間で済む。変更を伴う呼び出しは常に排他的に実行される — 一度に1つ、読み取りと 重なることはない — そのため、共有アカウント状態での読み取り/書き込み競合は発生しない。制限を超えた 呼び出し元は到着順に待機する。待機中の変更操作は、後続の読み取りが追い越すのをブロックする。

  • MCP_MAX_QUEUE_SIZE(デフォルト 20)は、実行中または待機中として同時に受け入れられる呼び出し数を 制限する。すでにその数に達している場合、それ以降の呼び出しは無制限のキューに参加する代わりに即座に server_busy エラーを受け取る。

  • 処理実行中もトランスポートは応答性を維持する。 ツールはイベントループスレッドで実行されるのではなく awaitされるため、完了したレスポンスは即座に送信され、長時間の呼び出しが実行中でもpingに応答する。

  • 意図的に呼び出しごとのタイムアウトはない。 ソケット読み取りでブロックされたスレッドは外部から 強制終了できない。ランタイムができるのは待機をやめることだけであり、それは保持しているEWSセッションと ともにスレッドを放棄することになる。exchangelib のセッションプールにはハードな上限があり、諦める経路なしに ループでセッションを配布するため、リークしたセッションは最終的にプールを枯渇させ、以降のすべての呼び出しが 永久にブロックされる。遅い呼び出しは代わりに待機され、EXCHANGE_TIMEOUTEXCHANGE_MAX_RETRY_WAIT_SECONDS によって制限される: アカウントのリトライポリシーはフェイルファストであるため、 すべてのEWS呼び出しは最初の一時エラーで例外を発生させ、exchangelib が内部的に永久にリトライすることはない。 ExchangeClient は読み取り専用呼び出しのみを自身でリトライし、その実時間予算によって制限される。 書き込みは自動リトライされない。予算を超えた超過分はログに記録される。

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はどちらも、pyproject.toml に固定された uv バージョンを使用して、lint、フォーマット、 型チェック、テスト、依存関係監査、パッケージビルドを実行する。

GitHub

さらに、OIDCトラステッドパブリッシングを介してタグ付きリリース(v*)をPyPIに公開する。最初のリリース前に、リポジトリ viartemev/outlook-ews-mcp、ワークフロー ci.yml、環境 pypi に対してPyPIのpending publisherを設定すること — GitHubには長期間有効なPyPIトークンは保存されない。

GitLab

さらに、デフォルトブランチとタグで、組み込みの CI_REGISTRY / CI_REGISTRY_USER / CI_REGISTRY_PASSWORD / CI_REGISTRY_IMAGE 変数を使用してDockerイメージをビルドし、GitLab Container Registryにプッシュする。

デフォルトのイメージタグ付け動作:

トリガー

プッシュされるタグ

デフォルトブランチ

:$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 抽象化を中心としており、認証、トランスポート、リトライ、エラーマッピングが一元化されている。

  • エラーはMCPの isError=true 処理に適した構造化JSON形式で返される。

コントリビューション

バグ報告とPRは歓迎します — CONTRIBUTING.mdを参照してください。実際のExchange serverなしで開発環境をセットアップし、テストスイートを実行する方法が記載されています。脆弱性の報告については、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