Outlook MCP Server
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_id、calendar_event_id、join_urlのいずれも受け付けます — 予定された会議(イベント経由で解決)、アドホック / Meet-now 通話(Teams チャットから貼り付けた join URL 経由で解決)、直接の ID 検索のすべてが機能します。会話: 会話の取得(完全なスレッド)
設定: メールボックス設定の取得、外出中設定
デプロイ後、tools/list MCP エンドポイントで完全なライブカタログを確認できます。
Related MCP server: MCP Outlook Server
認証の仕組み
2 つの層:
Claude.ai ↔ あなたのワーカー — 標準の MCP OAuth 2.0 + PKCE フロー。各 Claude クライアントは一意のベアラートークンを取得します。
MCP_APPROVAL_CODEは、/authorizeで一度貼り付けてそのベアラーを発行するためのものです。あなたのワーカー ↔ Microsoft Graph — プロキシ OAuth。デプロイしたワーカーの
/oauth/startにアクセスして Microsoft を 一度だけ 認証します。更新トークンは Cloudflare KV に暗号化されて保存されます。更新は自動的に行われます。
セットアップ — 自分のコピーをデプロイ
前提条件
Cloudflare アカウント(無料プランで可)
Wrangler CLI をインストールし、ログイン済み(
wrangler login)Node.js 22+
entra.microsoft.com で Azure AD アプリを登録できる Microsoft アカウント(個人、職場、学校)
1. フォークしてクローン
git clone https://github.com/<your-username>/outlook-mcp
cd outlook-mcp
npm install2. KV 名前空間を作成
wrangler kv:namespace create OAUTH_KVWrangler は次のようなものを出力します:
🌀 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 アプリを登録
entra.microsoft.com → Identity → Applications → App registrations → New registration に移動
名前: 任意(例: "Claude Outlook MCP")
サポートされるアカウントの種類:
単一テナントに制限する場合は「この組織ディレクトリ内のアカウントのみ」
最も広いサポートの場合は「任意の組織ディレクトリ内のアカウントと個人の Microsoft アカウント」
リダイレクト URI: 今は空白のまま — ステップ 6 の後に戻ってきます
[登録] をクリック
アプリの [概要] ページから、以下を記録:
アプリケーション (クライアント) ID → これが
MICROSOFT_CLIENT_IDディレクトリ (テナント) ID → これが
MICROSOFT_TENANT_ID(マルチテナント + 個人アカウントのサポートには文字列commonを使用)
API のアクセス許可 → 次の Microsoft Graph 委任アクセス許可を追加:
Mail.ReadWrite、Mail.SendCalendars.ReadWriteContacts.ReadWriteTasks.ReadWriteFiles.Read.All(書き込み可能なファイルツールが必要な場合はFiles.ReadWrite.All)User.Readoffline_access(更新トークンに必須)MailboxSettings.ReadWriteSites.Read.AllOnlineMeetings.ReadOnlineMeetingRecording.Read.All— 管理者の同意が必要OnlineMeetingTranscript.Read.All— 管理者の同意が必要
2 つの
.Read.Allアクセス許可を追加した後、API のアクセス許可ページで 「[テナント名] に管理者の同意を与えます」 をクリックします。管理者の同意がないと、会議の録画 / 文字起こしツールは 403 を返します。証明書とシークレット → 新しいクライアントシークレット → 値を記録(1Password に)。これが
MICROSOFT_CLIENT_SECRETです。表示されるのは一度だけなので、すぐにコピーしてください。
4. wrangler.jsonc を更新
wrangler.jsonc を編集し、次の両方を置き換えます:
vars.MICROSOFT_CLIENT_ID— ステップ 3.6 のアプリケーション IDvars.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シークレット | 目的 |
|
|
| Azure AD アプリのクライアントシークレット。 |
| 任意。サーバー側で追加されるメール署名ブロック — メール署名 を参照。 |
| 任意。署名ロゴの公開 HTTPS URL。 |
6. 最初のデプロイ(ワーカー URL を確認)
npm run deployWrangler がワーカー 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 deploy8. Microsoft に接続(一度だけ)
ブラウザで <your-worker-url>/oauth/start にアクセスします。MCP_APPROVAL_CODE を貼り付けます。Microsoft にリダイレクトされ、サインインしてステップ 3.7 のスコープを許可します。同意後、暗号化されたアップストリームトークンが OAUTH_KV に保存されます。以降は自動的に更新されます。
<your-worker-url>/oauth/status にアクセスして接続を確認できます — connected: true と表示されるはずです。
9. Claude.ai に接続
Claude.ai で、設定 → 統合 → MCP サーバーを追加 に移動
サーバー URL:
<your-worker-url>/mcpClaude.ai がワーカーの
/authorizeページにリダイレクトしますMCP_APPROVAL_CODEを貼り付けて確認接続完了 — Claude は 38 の Outlook + Teams ツールを利用できます
メール署名
任意。設定すると、Worker は送信時に署名を追加するため、呼び出し側のエージェントがそれを再現する必要はありません — 言い換えたり、切り詰めたり、忘れたりすることはできません。
send_email、schedule_send、reply_to_email、forward_email、create_draft、update_draft、create_reply_draft、create_reply_all_draft、create_forward_draft のいずれかに include_signature: true を渡します。デフォルトは false なので、既存の呼び出し元には影響しません。
下書きの場合、署名は 下書き作成時 に注入され、送信時ではありません — send_draft は ID のみを受け取り、本文には触れません。つまり、送信前に署名付きの本文を確認できるということです。update_draft では、新しい body も渡す場合にのみフラグが適用されます(そうでない場合、署名するものがないため、署名のみの本文で下書きを置き換えてしまいます)。その場合は、下書きを黙って消去するのではなく、応答の notes で報告されます。
カレンダー招待
create_calendar_event と update_calendar_event は同じ include_signature フラグを受け付け、イベントの 説明 に署名を追加します。メールと同じ SIGNATURE_HTML ブロックを再利用します — マーケティング用の CTA ボタンも含まれるため、社内会議よりも顧客向けの招待に適しています。そのため、イベントごとにオプトインとなっています。update_calendar_event は update_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 URLsignature-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_typeがhtmlに上書きされます。明示的に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-28、nodejs_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.ymlはmainへのプッシュのたびにvitest runを実行し、その後Cloudflareにデプロイします。フォークで有効にするには、2つのリポジトリシークレットを設定してください:
CLOUDFLARE_API_TOKEN— dash.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.
This server cannot be installed
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
- AlicenseBqualityAmaintenanceA Model Context Protocol server that enables interaction with Microsoft 365 services (Excel, Calendar, Mail, OneDrive, Teams, etc.) through the Graph API, allowing AI assistants to manage Microsoft 365 resources via natural language.18841,593937MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Microsoft Outlook via the Microsoft Graph API for managing emails and calendar events. It allows users to read and send emails, list messages, and create calendar appointments with automatic Teams links.1
- AlicenseBqualityCmaintenanceEnables AI assistants to manage Microsoft Outlook email and calendar through the Microsoft Graph API, including reading, sending, searching emails, and handling calendar events.4310025MIT
- FlicenseNot gradedqualityDmaintenanceEnables LLMs to manage your Microsoft 365 calendar, tasks, and email via Microsoft Graph API, acting as a personal secretary.
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.
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/Sidd-doshi/outlook-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server