outlook-mcp
outlook-ews-mcp
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 に対する
NTLMとBasicトランスポート —
stdioとSSEアーキテクチャ — 単一の
ExchangeClient抽象化による集中エラーマッピング(プロジェクトノート を参照)安全性 — デフォルトでプライバシーに配慮したスモークチェック(スモークチェック を参照)
運用 — Docker イメージと GitHub / GitLab CI/CD パイプラインを含む
ツールカタログ
以下の各ツールは tool_specs.py に登録されており、名前、説明、スキーマの唯一の情報源です。読み取り専用 は、メールボックスを変更しないツールを示します。これらのツールはより多くの同時実行が許可され(リクエストキュー を参照)、推測的に呼び出しても安全です。
システム
ツール | 説明 | 読み取り専用 |
| Exchange への接続を確認 | ✅ |
| メールボックスのメタデータを取得 | ✅ |
| メールボックスの代理人とそのフォルダー権限レベルを一覧表示 — | ✅ |
| サーバー側の受信トレイルールを一覧表示 | ✅ |
| サーバー側の受信トレイルールを作成(例:「この送信者から → フォルダーに移動」) | |
| ルールの有効/無効化、または優先度の変更(他のフィールドはここでは更新不可) | |
| ID でサーバー側の受信トレイルールを削除 | |
| 外出中(自動返信)の設定を取得 | ✅ |
| 自動返信をオフ、オンにするか、開始/終了の時間枠をスケジュール |
⚠️
create_inbox_rule/update_inbox_rule/delete_inbox_ruleは EWS 経由でルールを管理します。これにより、デスクトップ版 Outlook が保持するクライアント側のルールブロブが削除され、ユーザーが Outlook 自体で作成したルールが消去される可能性があります。これは文書化された EWS の動作であり、ここでのバグではありません。
メール
ツール | 説明 | 読み取り専用 |
| フォルダー内のメールを一覧表示 | ✅ |
| ID で完全なメールを取得 | ✅ |
| メッセージの生の RFC 822 MIME コンテンツを base64 エンコードでエクスポート | ✅ |
| 会話のすべてのメッセージを順序どおりに本文を含めて取得 | ✅ |
| 部分一致(件名/本文/送信者)またはサーバー側の Advanced Query Syntax で検索 | ✅ |
| 新しいメールを送信 | |
| メールに返信 | |
| メールを転送 | |
| メールを別のフォルダーに移動 | |
| メールを別のフォルダーにコピー | |
| 一括移動、項目ごとの結果付き — 1 つの不正な ID があっても残りは失敗しない | |
| 一括コピー、項目ごとの結果付き | |
| 一括削除、項目ごとの結果付き( | |
| メールを削除 | |
| 既読状態、重要度、フォローアップフラグを更新 | |
| Outlook のカテゴリ(色付きラベル)を設定、追加、削除 | |
|
| |
|
| |
| 使用中のカテゴリを件数付きで一覧表示(最近のメッセージからサンプリング、メールボックスのマスターカテゴリリストではない) | ✅ |
| メールボックスのフォルダーを一覧表示 | ✅ |
| メールボックスのフォルダーを作成 | |
| フォルダー名を変更 — 組み込みフォルダー(受信トレイ、送信済みアイテム、カレンダーなど)は拒否 | |
| フォルダーとその中のすべてを削除 — 組み込みフォルダーは拒否 | |
| メールの下書きを作成 | |
| 下書きを更新; 省略されたフィールドは変更されず、 | |
| 既存の下書きを送信 | |
| ローカルファイルをメッセージ(通常は下書き)に添付 — ファイルは | |
| ID でメッセージから添付ファイルを 1 つ削除 | |
| 添付ファイルをディスクに保存 | ✅ |
カレンダー
ツール | 説明 | 読み取り専用 |
| 期間内の予定表イベントを一覧表示します。同僚の既定の予定表には | ✅ |
| ID で予定表イベントを取得します。同僚の予定表には | ✅ |
| 予定表イベントを作成します | |
| 予定表イベントを更新します | |
| 予定表イベントを削除します | |
| 招待に対して承諾、辞退、または仮承諾で応答します | |
| 空いている会議時間枠を検索します | ✅ |
| イベントを一括削除し、項目ごとの結果を返します | |
| 招待に一括応答し、項目ごとの結果を返します | |
| 空き/予定ありスロットを取得します。同僚の予定表には | ✅ |
| 予定表を一覧表示します | ✅ |
| Room Finder の会議室リスト(会議室のグループ)を一覧表示します | ✅ |
| Room Finder の会議室リスト内の会議室を一覧表示します | ✅ |
連絡先
ツール | 説明 | 読み取り専用 |
| 連絡先を検索します | ✅ |
| ID で連絡先を取得します | ✅ |
| 個人用連絡先を作成します | |
| 個人用連絡先を更新します | |
| 個人用連絡先を削除します |
一般的な使用例
Claude Desktop や他の MCP クライアントをオンプレミスの Exchange に接続する
受信トレイのメッセージを検索し、メールの全文を取得する
AI ワークフローからメールを送信または下書きする
予定表を確認し、会議を作成する
スケジュール調整のため空き/予定ありの時間帯を確認する
個人用連絡先またはグローバル アドレス一覧を検索する
直接のメールボックス スクリプトではなく、制御された MCP 境界を通じて Exchange 操作を公開する
セキュリティに関する注意
現在のコードが行うこと:
接続範囲の限定 |
|
テレメトリなし | テレメトリ、分析、サードパーティへのデータエクスポートのロジックは一切含まれていません |
シークレットはローカルに保持 | シークレットは環境変数 / |
クリーンなエラーペイロード | 構造化された MCP エラー応答には、Exchange の生の例外テキスト、メッセージ本文、添付ファイルの内容、パスワードは一切含まれません。成功したツールは、要求されたメールボックスデータのみを返します |
クリーンなログ |
|
クリーンな Docker ビルド |
|
それでも注意すべき点:
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_attachmentのsave_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 にあります。
変数 | デフォルト | 説明 |
| (必須) | EWSエンドポイントURL(例: |
| (必須) |
|
| (必須) | アカウントのパスワード |
| 未設定 | SMTPアドレス。 |
|
|
|
|
|
|
|
| サーバーのTLS証明書を検証する。 |
| 未設定(自動検出) | Exchangeサーバーのバージョン(例: |
|
| Exchangeが解決不能なGUIDタイムゾーンIDを報告した場合のみ使用。通常の操作ではメールボックス自身のデフォルトタイムゾーンを使用する |
|
| リクエストごとのタイムアウト(秒)(1〜300) |
|
| Exchangeがビジー状態を報告した際の読み取り専用呼び出しに対する実時間ベースのリトライ予算。リトライ回数ではない。 |
| 未設定 | 偽装するメールボックス(Exchangeの偽装権限が必要) |
|
| 添付ファイルあたりの最大サイズ。アップロードと |
|
| 1回の送信/返信/転送/create_draft呼び出しあたりの最大添付ファイル数(1〜100) |
|
| 1回の呼び出しあたりの添付ファイル合計サイズの上限(1〜500) |
| 未設定(無効) | 添付ファイルのパスを制限するディレクトリ。未設定の場合、 |
|
|
|
|
| base64展開前の生MIMEエクスポートサイズの上限(1〜100) |
| 未設定 | 送信テキスト本文および返信/転送に追加される。EWSに署名APIは存在しないため、これは設定であり、メールボックスのOutlook署名ではない |
| 未設定 | 送信HTML本文に追加される。上記と同じ注意事項。両者間の相互変換はない。どちらも呼び出しごとに |
|
|
|
|
|
|
|
|
|
|
| 同時実行できる読み取り専用ツール呼び出し数(1〜8)。変更を伴う呼び出しは常に排他的に実行される。リクエストキュー を参照 |
|
| 同時に受け入れられる呼び出しの最大数(実行中+待機中)(1〜1000)。これを超えると呼び出しは即座に |
|
|
|
| 未設定(stderr) | ログファイルのパス。設定する場合はOSの権限で保護すること |
単一の変数に紐づかない動作上の注意事項:
list_eventsとfind_free_slotsは上限付きのlimit(デフォルト200、最大 1000)を受け付ける。イベント範囲は366日、空きスロット範囲は31日に制限されるため、 広範なクエリで無制限のEWSまたはMCPレスポンスが生成されることはない。一覧は意図的に軽量に保たれている: メールの要約には送信者は含まれるが受信者リストは含まれない (
get_emailに含まれる)、list_eventsは本文なしでイベントを返す (get_eventに含まれる)、get_emailはinclude_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_TIMEOUTとEXCHANGE_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-smokeDocker
docker build -t outlook-ews-mcp .
docker run --rm --env-file .env outlook-ews-mcpCI/CD
GitHub ActionsとGitLab CIはどちらも、pyproject.toml に固定された uv バージョンを使用して、lint、フォーマット、
型チェック、テスト、依存関係監査、パッケージビルドを実行する。
GitHub | さらに、OIDCトラステッドパブリッシングを介してタグ付きリリース( |
GitLab | さらに、デフォルトブランチとタグで、組み込みの |
デフォルトのイメージタグ付け動作:
トリガー | プッシュされるタグ |
デフォルトブランチ |
|
Gitタグ |
|
開発
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を参照してください。
Maintenance
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
- AlicenseAqualityDmaintenanceMCP server for any Microsoft Exchange / OWA deployment. Gives LLM agents access to email, calendar, directory search, folders, availability, and meeting analytics via 30 tools.307MIT
- FlicenseAqualityBmaintenanceMCP server for corporate Exchange that provides access to email, calendar, and people directory via OWA JSON API.20
- FlicenseAqualityBmaintenanceMCP server for Claude to access on-premises Outlook/Exchange mailboxes via EWS with NTLM authentication, providing tools for email, calendar, and contact management without relying on Microsoft 365 or Graph API.18
- AlicenseNot gradedqualityAmaintenanceA 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.7MIT
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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