Skip to main content
Glama

Outlook MCP Server

Model Context Protocol サーバー。Claude を Microsoft Outlook + Teams(メール、カレンダー、連絡先、タスク、ファイル、Teams 会議の録画・文字起こし)に橋渡しし、Cloudflare Workers 上にデプロイします。

このリポジトリをフォークし、自分の Cloudflare アカウントにデプロイし、Microsoft Azure AD アプリを登録し、Claude.ai を自分のワーカーに向ければ、Claude は自然言語で Microsoft 365 データを読み書きできます。

@bashco/mcp-toolkit 上に構築 — OAuth、クライアントごとのベアラートークン、レート制限、構造化ログ、型付きツールディスパッチはすべて共有ライブラリが処理します。

Claude が使えるもの — 7 ドメインにわたる 39 のツール

  • メール: メール一覧、メールの閲覧、検索、返信、転送、削除、送信、フォルダー間の移動、下書きの作成、下書きの更新、下書きの送信、送信予約

  • カレンダー: イベント一覧、イベントの出現回数一覧、作成、更新、削除、イベントのキャンセル、イベントへの返答

  • 連絡先: 一覧、連絡先の作成、連絡先の更新

  • タスク: タスク一覧の一覧、タスクの一覧、タスクの作成

  • ファイル: ファイルの一覧、ファイルの共有

  • Teams 会議: 最近の録画の一覧(発見の出発点 — 過去 N 日間にコンテンツがある会議を探します。入力は不要)、オンライン会議の検索、会議の録画の一覧、会議の文字起こしの一覧、文字起こしの内容の取得。各会議ツールは meeting_idcalendar_event_idjoin_url のいずれも受け付けます — 予定された会議(イベント経由で解決)、アドホック / Meet-now 通話(Teams チャットから貼り付けた join URL 経由で解決)、直接の ID 検索のすべてが機能します。

  • 会話: 会話の取得(完全なスレッド)

  • 設定: メールボックス設定の取得、外出中設定

デプロイ後、tools/list MCP エンドポイントで完全なライブカタログを確認できます。

Related MCP server: MCP Outlook Server

認証の仕組み

2 つの層:

  1. Claude.ai ↔ あなたのワーカー — 標準の MCP OAuth 2.0 + PKCE フロー。各 Claude クライアントは一意のベアラートークンを取得します。MCP_APPROVAL_CODE は、/authorize で一度貼り付けてそのベアラーを発行するためのものです。

  2. あなたのワーカー ↔ Microsoft Graph — プロキシ OAuth。デプロイしたワーカーの /oauth/start にアクセスして Microsoft を 一度だけ 認証します。更新トークンは Cloudflare KV に暗号化されて保存されます。更新は自動的に行われます。

セットアップ — 自分のコピーをデプロイ

前提条件

1. フォークしてクローン

git clone https://github.com/<your-username>/outlook-mcp
cd outlook-mcp
npm install

2. KV 名前空間を作成

wrangler kv:namespace create OAUTH_KV

Wrangler は次のようなものを出力します:

🌀 Creating namespace with title "outlook-mcp-OAUTH_KV"
✨ Success! Add the following to your configuration file:
[[kv_namespaces]]
binding = "OAUTH_KV"
id = "abc123def456..."

wrangler.jsonc を編集し、kv_namespaces の下にある既存の id を、wrangler が出力したものに置き換えます。

wrangler.jsonc は意図的にコミットされています — Wrangler と CI デプロイの両方が必要とし、シークレットは含まれていません(KV 名前空間 ID、公開 Azure クライアント ID、ワーカー URL のみ)。wrangler.jsonc.example はプレースホルダー付きで同じ構造を持ち、クリーンなコピーから始めたい場合に使えます。実際のシークレットは wrangler secret put を通じて設定され、このファイルには決して表示されません。

3. Microsoft Azure AD アプリを登録

  1. entra.microsoft.com → Identity → Applications → App registrations → New registration に移動

  2. 名前: 任意(例: "Claude Outlook MCP")

  3. サポートされるアカウントの種類:

    • 単一テナントに制限する場合は「この組織ディレクトリ内のアカウントのみ」

    • 最も広いサポートの場合は「任意の組織ディレクトリ内のアカウントと個人の Microsoft アカウント」

  4. リダイレクト URI: 今は空白のまま — ステップ 6 の後に戻ってきます

  5. [登録] をクリック

  6. アプリの [概要] ページから、以下を記録:

    • アプリケーション (クライアント) ID → これが MICROSOFT_CLIENT_ID

    • ディレクトリ (テナント) ID → これが MICROSOFT_TENANT_ID(マルチテナント + 個人アカウントのサポートには文字列 common を使用)

  7. API のアクセス許可 → 次の Microsoft Graph 委任アクセス許可を追加:

    • Mail.ReadWriteMail.Send

    • Calendars.ReadWrite

    • Contacts.ReadWrite

    • Tasks.ReadWrite

    • Files.Read.All(書き込み可能なファイルツールが必要な場合は Files.ReadWrite.All

    • User.Read

    • offline_access(更新トークンに必須)

    • MailboxSettings.ReadWrite

    • Sites.Read.All

    • OnlineMeetings.Read

    • OnlineMeetingRecording.Read.All管理者の同意が必要

    • OnlineMeetingTranscript.Read.All管理者の同意が必要

    2 つの .Read.All アクセス許可を追加した後、API のアクセス許可ページで [テナント名] に管理者の同意を与えます」 をクリックします。管理者の同意がないと、会議の録画 / 文字起こしツールは 403 を返します。

  8. 証明書とシークレット → 新しいクライアントシークレット → 値を記録(1Password に)。これが MICROSOFT_CLIENT_SECRET です。表示されるのは一度だけなので、すぐにコピーしてください。

4. wrangler.jsonc を更新

wrangler.jsonc を編集し、次の両方を置き換えます:

  • vars.MICROSOFT_CLIENT_ID — ステップ 3.6 のアプリケーション ID

  • vars.MICROSOFT_TENANT_ID — ステップ 3.6 のディレクトリ ID(または common

5. シークレットを設定

新しい承認コードを生成:

openssl rand -base64 32

パスワードマネージャーに保存し、Cloudflare にプッシュ:

wrangler secret put MCP_APPROVAL_CODE          # paste the value from above
wrangler secret put MICROSOFT_CLIENT_SECRET    # from Step 3.8

シークレット

目的

MCP_APPROVAL_CODE

/authorize で貼り付けて Claude ベアラーを発行するためのワンタイムコード。また、保存時のアップストリーム Microsoft トークンの暗号化シークレットとしても使用 — ローテーションすると保存済みトークンが無効になり、Microsoft の再認証が強制されます。

MICROSOFT_CLIENT_SECRET

Azure AD アプリのクライアントシークレット。

SIGNATURE_HTML

任意。サーバー側で追加されるメール署名ブロック — メール署名 を参照。

SIGNATURE_LOGO_URL

任意。署名ロゴの公開 HTTPS URL。

6. 最初のデプロイ(ワーカー URL を確認)

npm run deploy

Wrangler がワーカー URL を出力します — https://outlook-mcp.<your-account>.workers.dev のような形式です。保存してください。

7. WORKER_URL と Microsoft リダイレクト URI を更新

2 つの更新が必要:

a) wrangler.jsonc を編集vars の下で、WORKER_URL をステップ 6 の URL に置き換えます。

b) Azure AD アプリで(entra.microsoft.com → アプリ → 認証 → プラットフォームを追加 → Web)、リダイレクト URI を <your-worker-url>/oauth/callback に設定します。これがないと、Microsoft は OAuth フローを拒否します。

その後、再デプロイ:

npm run deploy

8. Microsoft に接続(一度だけ)

ブラウザで <your-worker-url>/oauth/start にアクセスします。MCP_APPROVAL_CODE を貼り付けます。Microsoft にリダイレクトされ、サインインしてステップ 3.7 のスコープを許可します。同意後、暗号化されたアップストリームトークンが OAUTH_KV に保存されます。以降は自動的に更新されます。

<your-worker-url>/oauth/status にアクセスして接続を確認できます — connected: true と表示されるはずです。

9. Claude.ai に接続

  1. Claude.ai で、設定 → 統合 → MCP サーバーを追加 に移動

  2. サーバー URL: <your-worker-url>/mcp

  3. Claude.ai がワーカーの /authorize ページにリダイレクトします

  4. MCP_APPROVAL_CODE を貼り付けて確認

  5. 接続完了 — Claude は 38 の Outlook + Teams ツールを利用できます

メール署名

任意。設定すると、Worker は送信時に署名を追加するため、呼び出し側のエージェントがそれを再現する必要はありません — 言い換えたり、切り詰めたり、忘れたりすることはできません。

send_emailschedule_sendreply_to_emailforward_emailcreate_draftupdate_draftcreate_reply_draftcreate_reply_all_draftcreate_forward_draft のいずれかに include_signature: true を渡します。デフォルトは false なので、既存の呼び出し元には影響しません。

下書きの場合、署名は 下書き作成時 に注入され、送信時ではありません — send_draft は ID のみを受け取り、本文には触れません。つまり、送信前に署名付きの本文を確認できるということです。update_draft では、新しい body も渡す場合にのみフラグが適用されます(そうでない場合、署名するものがないため、署名のみの本文で下書きを置き換えてしまいます)。その場合は、下書きを黙って消去するのではなく、応答の notes で報告されます。

カレンダー招待

create_calendar_eventupdate_calendar_event は同じ include_signature フラグを受け付け、イベントの 説明 に署名を追加します。メールと同じ SIGNATURE_HTML ブロックを再利用します — マーケティング用の CTA ボタンも含まれるため、社内会議よりも顧客向けの招待に適しています。そのため、イベントごとにオプトインとなっています。update_calendar_eventupdate_draft と同じガードに従います: 新しい description も渡す場合にのみフラグが適用されます。

セットアップ

cp signature-block.example.html signature-block.html   # then edit it
wrangler secret put SIGNATURE_HTML < signature-block.html
wrangler secret put SIGNATURE_LOGO_URL                 # paste your HTTPS logo URL

signature-block.html意図的に gitignore されています。署名はデプロイ設定であり、ソースではありません: コミットされた署名を継承したフォークは、他人の名前、電話番号、予約リンクを含むメールを送信することになります。プレースホルダーの signature-block.example.html のみがコミットされています。

SIGNATURE_HTML 内の __LOGO_URL__ トークンは、実行時に SIGNATURE_LOGO_URL に置き換えられます。

ロゴは HTTPS で公開アクセス可能である必要があります。 メールクライアントは 受信者 のマシンから取得します — あなたのネットワーク、Worker のバインディング、保持している資格情報にはアクセスできません。プライベート、認証付き、または localhost の URL は、全員に壊れた画像として表示されます。SIGNATURE_LOGO_URL が設定されていない場合、<img> は壊れた src を出力する代わりに完全に削除されます。

SIGNATURE_HTML が設定されていない場合、フラグは黙って何もしません — メールは署名なしで送信されます。設定されていないデプロイはエラーになりません。

動作

  • HTML を強制。 プレーンテキスト本文内の署名は生のマークアップとして表示されるため、フラグが設定されている場合は body_typehtml に上書きされます。明示的に body_type: "text" を渡した場合、上書きはツール応答の notes で報告され、黙って適用されることはありません。

  • プレーンテキスト本文はエスケープされ、改行は <br> になります — 強制された HTML 切り替え後も改行が保持され、余分な < 文字がマークアップになることはありません。

  • 冪等。 本文にすでに署名が含まれている場合 — Worker 自身のマーカーまたは署名の特徴的なテキストで認識 — 2 回追加されません。

  • 返信と転送 では、署名は引用された元のメールの に配置され、スレッド全体の下部には配置されません。

  • 空の本文 は、先頭の空行なしで署名のみを送信します。

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

署名は、呼び出し元の本文がサニタイズされた に連結されます。これは意図的で重要な設計です: sanitizeOutboundHtml はすべての style= 属性(属性のみの XSS シンク)を削除し、署名は完全にインラインスタイルで構築されているため、サニタイザーを通すとロゴのサイズ、区切り線、CTA ボタンが削除されてしまいます。

2 つの文字列は信頼レベルが異なります。本文はエージェントが提供し、信頼できないため、完全にサニタイズされます。署名は wrangler secret put で設定されるオペレーター提供のデプロイ設定です — そのシークレットを設定できる人は、Worker 自体を変更することもできます。src/signature.ts を参照してください。

ローカル開発

cp .dev.vars.example .dev.vars   # fill in MCP_APPROVAL_CODE + MICROSOFT_CLIENT_SECRET; .dev.vars is gitignored
npm test                          # 171 tests via vitest with workers pool
npm run typecheck                 # tsc --noEmit
npm run dev                       # wrangler dev — local at http://localhost:8787

エンドポイント

  • GET /.well-known/oauth-authorization-server — OAuthメタデータ(公開)

  • GET /.well-known/oauth-protected-resource — リソースメタデータ(公開)

  • GET /authorize — 承認コード貼り付けページ(公開)

  • POST /approve — 承認コード送信(レート制限あり)

  • POST /token — OAuthトークン交換(レート制限あり)

  • POST /register — RFC 7591に基づく動的クライアント登録(レート制限あり)

  • GET /oauth/start — Microsoft OAuthフロー開始(MCP_APPROVAL_CODEで制御)

  • GET /oauth/callback — Microsoft OAuthリダイレクト先

  • GET /oauth/status — 接続状態の確認(MCP_APPROVAL_CODEで制御)

  • POST /mcp — JSON-RPCツールディスパッチ(ベアラー保護、レート制限あり)

Stack

  • Cloudflare Workers(compatibility_date 2025-04-28nodejs_compat

  • TypeScript(strict)

  • Hono v4

  • Zod v4

  • Vitestと@cloudflare/vitest-pool-workers(171テスト)

  • @bashco/mcp-toolkit — 共有のOAuth/暗号化/レート制限/ディスパッチ基盤

セキュリティアーキテクチャの要点

  • 送信メールプレビューにおけるエンティティ正規化を備えた2パスHTMLサニタイザー

  • 送信HTTPにおける32ビットIP正規化を備えたSSRFガード

  • 構造化エラー返却のためのMicrosoft Graph odataエラーエンベロープ解析

  • 監査可能性のためのsrc/tools/配下のドメイン別ツールファイル(メール、カレンダー、連絡先、タスク、ファイル、会議、設定)

継続的デプロイ

.github/workflows/deploy.ymlmainへのプッシュのたびにvitest runを実行し、その後Cloudflareにデプロイします。フォークで有効にするには、2つのリポジトリシークレットを設定してください:

  • CLOUDFLARE_API_TOKENdash.cloudflare.com/profile/api-tokensで作成(「Edit Cloudflare Workers」テンプレートを使用)

  • CLOUDFLARE_ACCOUNT_ID — Cloudflareダッシュボードの右下にあります

コントリビューション

IssueとPRはgithub.com/doublebash/outlook-mcpで歓迎します。

基盤となるOAuth/暗号化/レート制限コードの変更については、ツールキットはgithub.com/doublebash/mcp-toolkitにあります — そちらにIssueを登録してください。

セキュリティ

脆弱性を発見しましたか?公開Issueは開かないでください。GitHubでプライベートセキュリティアドバイザリを開いてください。

ライセンス

MIT — Copyright (c) 2026 Bashar Basheer.

A
license - permissive license
Not graded
quality - not tested
C
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

View all related MCP servers

Related MCP Connectors

  • Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.

  • Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.

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

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

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