Skip to main content
Glama
ItayElizur

mcp-outlook

by ItayElizur

mcp-outlook

セルフホスト可能な EWS 経由のオンプレミス Microsoft Exchange 向け MCP サーバー(Exchange Web Services)です。エアギャップ / クラウド非接続環境向けに作られており、内部の Exchange サーバーと直接通信し、Microsoft Graph、Azure AD、デスクトップ版 Outlook クライアントには一切触れません。

  • バックエンド: exchangelib(EWS クライアント)

  • フレームワーク: FastMCP

  • トランスポート: streamable-http(他の内部ホストが接続するスタンドアロン HTTP サーバー)

  • Exchange への認証: basic また は NTLM(設定で選択可能)

2 つのモード

モード

対象

認証方法

static(デフォルト)

1 つのメールボックス

そのアカウント(自分の資格情報)として接続 — ローカルでのベータテストに最適

jwt

多数のユーザー

各呼び出し元のユーザー JWT を検証し、サービスアカウント + EWS Impersonation を介してそのユーザーのメールボックスに対して操作を行う

jwt モードが ID を橋渡しする仕組み。 Exchange は会社の JWT を消費できません(Outlook は PKINIT/Kerberos ベースのため)。そこで MCP は、混ざることのない 2 つの 独立した 認証を行います:

User --(JWT)--> MCP validates the token, reads the user's email
                MCP --(service account, NTLM)--> Exchange
                MCP --(impersonation header = user's email)--> acts on the user's mailbox

ユーザーの JWT が Exchange に送信されることは決してなく、ユーザーのパスワードやスマートカードが MCP に触れることも一切ありません。MCP に渡るのは、唯一のサービス資格情報だけです。jwt モードで管理者が設定すべき内容については TODO.md を参照してください。

Related MCP server: OWA Exchange MCP Server

ツール

ツール

目的

list_emails(folder="inbox", limit=20)

最近のメッセージを新しい順に取得

search_emails(query, folder, start_date, end_date, sender, recipient, limit)

テキスト + 日付範囲 + 送信者/受信者による検索

get_email(message_id, folder="inbox")

メッセージ全体:本文、受信者、添付ファイル名

draft_email(to, subject, body)

インタラクティブな作成ウィジェット (MCP Apps) を開く。ユーザーが編集して送信する

reply_email(message_id, folder, reply_all, body)

返信として事前入力された作成ウィジェットを開く

forward_email(message_id, folder, to, body)

転送として事前入力された作成ウィジェットを開く

send_email(to, subject, body, cc, bcc, html, attachments)

送信 — ウィジェットからのみ呼び出し可能 (アプリのみ表示)

search_contacts(query, limit)

連絡先を検索 — ウィジェットからのみ呼び出し可能 (アプリのみ)

mark_email_read(message_id, folder) / mark_email_unread(...)

既読/未読ステータスの切り替え

delete_email(message_id, folder, permanent=False)

削除済みアイテムへ移動、または完全に削除

flag_email_important(message_id, folder, important=True)

Outlook の重要度 (高/標準) を設定

move_email(message_id, destination, folder)

メッセージを別のフォルダーへ移動

list_folders()

利用可能なメールフォルダー名の一覧(サブフォルダーを含む)

list_events(start_date, end_date, limit)

指定した日付範囲のカレンダー予定

get_event(event_id)

予定の全詳細:本文、参加者、場所

find_meeting_slots(attendees, duration_minutes, ...)

スケジュール アシスタント — 参加者の空き状況に応じて候補時間枠をランク付け

draft_event(subject, start, end, location, body, required_attendees, optional_attendees)

インタラクティブな予定下書きウィジェットを開く

create_event(subject, start, end, required_attendees, ...)

予定を作成 — ウィジェットからのみ呼び出し可能 (アプリのみ)

accept_meeting(event_id) / decline_meeting(event_id)

会議の出席依頼に応答する

list_emailssearch_emails は、未読メッセージのみを返すために unread_only=true も受け付けます。

セットアップ

Python 3.11+ と uv が必要です。

uv sync                 # create venv + install deps
cp .env.example .env    # then edit .env with your Exchange details
uv run python -m mcp_outlook

サーバーは MCP_HOST:MCP_PORT(デフォルトは 127.0.0.1:8000)にバインドし、/mcp で streamable-htp の MCP エンドポイントを提供します。

ローカルでのベータテスト(管理者のセットアップは不要)

自分自身のメールボックスに対して、自分のユーザー名/パスワードで実行します — JWT なし、偽装なし、サービスアカウントなし、スマートカードなし:

# in .env:
OUTLOOK_AUTH_MODE=static          # the default
OUTLOOK_EWS_ENDPOINT=https://mail.corp.local/EWS/Exchange.asmx
OUTLOOK_USERNAME=CORP\you
OUTLOOK_PASSWORD=...
uv run python -m mcp_outlook

設定

すべての設定は環境変数(または .env ファイル)から読み込まれます。完全な一覧は .env.example を参照してください。主なものは次のとおりです:

変数

備考

OUTLOOK_AUTH_MODE

static(デフォルト、1 つのメールボックス)または jwt(マルチユーザートンネル)

OUTLOOK_EWS_ENDPOINT

完全な asmx UR。例:https://mai.corp.local/EWS/Exchange.asmx推奨。

OUTLOOK_SERVER

ホスト名のみの代替(エンドポイントは /EWS/Exchange.asmx とみなされる)

OUTLOOK_USERNAME

接続アカウント — 自分自身 (static) またはサービスアカウント (jwt)。NTLM の場合は DOMAIN\user、basic の場合はメールアドレス。sspi では使用されません

OUTLOOK_EMAIL

開くメールボックス (static モード)。省略可能 — OUTLOOK_USERNAME がメールアドレスの場合はそれがデフォルトになります。jwt モードでは無視されます。sspi では必須(デフォルトにできるユーザー名がないため)

OUTLOOK_PASSWORD

アカウントのパスワード。sspi では使用されません

OUTLOOK_AUTH_TYPE

ntlm(デフォルト)、basic、または sspi(Windows 統合認証 — このプロセスの自身の AD ID として認証し、ユーザー名/パスワードは不要。Windows のみ、uv sync --extra sspi が必要)

OUTLOOK_JWT_ISSUER / _AUDIENCE

jwt モードで必須 — 要求するトークンの発行者 (issuer) とオーディエンス

OUTLOOK_JWT_JWKS_URI / _PUBLIC_KEY

jwt モード — 署名鍵(JWKS URI、またはエアギャップ環境向けの静的 PEM)

OUTLOOK_JWT_EMAI_CLAIM

jwt モード — ユーザーの SMTP アドレスを保持するクレーム(デフォルトは emai)

OUTLOOK_CA_BUNDLE

内部 CA の .pem へのパス(自己署/内部 CA 用)

OUTLOOK_VERIFY_SSL

true(デフォルト)。false は TLS 検証を無効化(開発のみ)

MCP_HOST / MCP_PORT

HTTP バインド(デフォルト 127.0.0.1:8000)

EWS エンドポイントの探し方

EWS の URL は OWA(Web メール)の URL とは異なります。Exchange サーバー上で:

Get-WebServicesVirtualDirectory | fl Name,InternalUrl,ExternalUrl

エアギャップ環境では、ほとんどの場合 InternalUrl を使用します。

テスト

ユニットテストは Exchange サーバーを必要としません(設定の解析とシリアライズのみ):

uv run pytest

ライブのスモークテスト(実際の .env を使用):サーバーを起動し、MCP クライアントまた は MCP Inspector を接続してから、list_folderslist_emailssend_emai(自分宛て)を呼び出し、受信を確認します。OUTLOOK_AUTH_TYPEntlmbasic の間で切リ替えて、Exchange 管理者が有効にしている方式を確認してください。

作成 UI (MCP Apps)

draft_emai はインタラクティブな MCP Apps ウィジットを開きます — 単一の自己完結型 HTML ファイル(src/mcp_outlook/widgets/compose.html)に組み込まれた React 製の作成エデイターです。MCP Apps 対応のホストは、チャットスレッド内にインラインで描画します。

ウィジットの機能:

  • To フィールドとインラインの連絡先検索 — 最後のカンマの後に入力すると連絡先を検索します。候補を選ぶとクエリがチップに置き換わり、有効なアドレスはラベル付きチップとして表示されます。

  • 送信 / 破棄 — 送信はウィジットから直接 send_email を実行します(アプリのみ — モデルは呼び出せません)。破棄はカードを折り畳みます。

  • 後継 (Supersession) — 新しい下書きを開くと、開いている古い下書きウィジェットがグレーアウトされます。

  • 署名 — すべての下書きにはあらかじめ「Airchat で作成」と入力されています(編集可能)。

エアギャップ保証: ビルド済み HTML(React + ブリッジ JS をインライン化)は Python パッケージに同梱されます。実行時に外部アセットへのリクエストは一切発生しません。Node.js が必要なのはウィジェットを再ビルドするときだけです。

ウィジェットの再ビルド(開発時のみ)

cd frontend
npm ci
npm run build     # tsc + vite build + artifact copy → src/mcp_outlook/widgets/compose.html

ビルドスクリプトは、コピー前に外部 URL が HTML に混入していないことを検証します。

視覚的に試す(スタンドアロンの開発プレビュー)

cd frontend && npm run dev
# Opens http://localhost:5173 with a mock host — no Exchange needed.
# Type in To, see chips form, contact results appear, Send/Discard collapse the card.

注意点

  • 最近の Exchange では Basic 認証が無効になっていることがよくあります — 安全なデフォルトは NTLM です。

  • 内部/自己署名証明書を使用する場合は OUTLOOK_CA_BUNDLE が必要です。指定しないと TLS 検証で接続が失敗します。

  • マルチユーザー (jwt) モードには Exchange の 1 つの権限付与が必要です — サービスアカウントが ApplicationImpersonation RBAC ロールを保持している必要があります。TODO.md を参照してください。static モードではそのような権限付与は不要です。

  • .env には平文のパスワードが保存されます。 このファイルは gitignore の対象ですが、ホスト上でファイルのアクセス権限も厳格に設定してください(chmod 600 .env)。

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

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
    C
    maintenance
    Enables reading, sending, and managing Microsoft 365/Outlook emails through MCP tools with OAuth 2.1 authentication.
    114
    MIT

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

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