Outlook MCP について
Outlook MCPは、個人用Microsoft Outlookアカウント向けのMCPサーバーです。メールやカレンダー、連絡先、タスク、下書き、添付ファイルを扱う幅広いツールに加え、読み取り専用モードやOSのキーリングによるトークン保存を備えています。
主な機能
- 01メールの読み取り、検索、整理
- 02メール送信と下書きの管理
- 03予定とファイルの管理
- 04連絡先とTo Doタスクの管理
- 05一括操作とスレッド管理
- 06読み取り専用モードとキーリング保存
活用シーン
- 01受信メールの要約と整理
- 02予定の設定と招待への返信
- 03旅行やメールの計画からタスクを作成
- 04返信の下書きとフォルダーの整理
MCP 対応
Outlookの操作を型付きMCPツールとして公開し、一般的な手順に使えるワークフロープロンプトも提供します。stdioと任意のStreamable HTTPトランスポートに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
68掲載時のツール一覧 · 今日に更新
このツールにパラメーターはありません。
詳細
outlook-mcp
Microsoft Graph API を介して個人用 Microsoft Outlook アカウントに接続する MCP サーバーです。
個人用 Microsoft アカウントのみ —
@outlook.com、@hotmail.com、@live.comが対象です。職場または学校のアカウント(Entra ID)はサポートしていません。このサーバーは個人用アカウント向けに構築・テストされています。個人用アカウントでの動作を変えずに、職場アカウントでツールが動作するようにする修正は歓迎します。
免責事項: 独立したオープンソースプロジェクトです。Microsoft Corporation との提携、同社による承認またはサポートはありません。「Outlook」と「Microsoft Graph」は Microsoft の商標です。
対象ユーザー
次のような方に適しています。
- エージェントの構築者で、Outlook を独自のインフラ(OpenClaw、Claude Code、Cursor、カスタム MCP ホスト)に接続し、解析が必要な標準出力ではなく、型付きのツールインターフェイスを使いたい方
- 個人用 Microsoft アカウント(Outlook.com/Hotmail/Live)で利用し、完全な制御を求める方:独自の Azure アプリを使い、エンタープライズの同意フローや共有クライアント ID は不要です
- メールのみ、またはカレンダーのみのラッパーではなく、メール、カレンダー、連絡先、To Do、下書き、フォルダー、一括操作、スレッド化に対応する幅広い機能を求める方
- セキュリティを重視する方:トークンは OS のキーリングに保存されます(macOS では Keychain、Linux では libsecret。明示的に選択しない限り平文では保存されません)。カテゴリごとの
allow_categories、任意のread_onlyモード、テレメトリーなしに対応しています
職場または学校の M365 アカウントが必要な方(Microsoft の公式ツールをご利用ください。Entra ID 認証と管理者の同意フローは対象外です)、または基本的なメール専用クライアントで十分な方には適していません(このサーバーには 72 個のツールがあり、「受信トレイを読んで」という用途には多すぎます)。
他の Outlook ツールとの違い
個人用 Outlook の分野で、本格的な MCP サーバーはこれだけです。他の多くの選択肢は、エージェントがシェルから実行する Bash スクリプトやスキル形式の CLI ラッパーです。この違いは重要です。エージェントは、解析が必要な標準出力ではなく、構造化された引数と戻り値を持つ型付きツールスキーマを利用できます。他では見られない機能として、/$batch による効率的なトリアージ(一括操作が 10~20 倍高速)、名前解決に対応した再帰的なフォルダー操作、カテゴリごとの細かなアクセス許可、複数のメールボックス(OUTLOOK_MCP_CONFIG_DIR を使ってアカウントごとに 1 つのサーバー)、さらに下書きやカレンダーイベントで 3MB を超える場合のアップロードセッションを含む、添付ファイルの完全な書き込み機能があります。
これでできること
AI エージェントに Outlook への完全なアクセスを提供できます。たとえば、次のようなプロンプトをそのまま利用できます。
- 「過去 24 時間に届いた未読メールを要約し、急ぎのものに印を付けて。」
- 「今、優先受信トレイには何がある? その他のメールに、優先受信トレイに入れるべきものはある?」
- 「受信トレイに配送状況の更新はある? 届く予定のものと到着予定日を追跡して。」
- 「メールを確認して、今後のサブスクリプション更新を調べて。これから 2 週間以内に自動請求されるものはある?」
- 「来週シアトルに旅行する。旅程をカレンダーで確認して、荷造りチェックリスト付きの To Do タスクを作成して。」
- 「妹からの最新のメッセージに、今週末に電話すると返信する下書きを作成して。」
- 「今週届いたニュースレターと広告メールをすべて『あとで読む』フォルダーに移動して。1 回につき 20 件ずつ処理して。」
このサーバーは 72 個の独立したツールを公開します(既定では 71 個が読み込まれ、ドキュメントリーダーはオプトインです)。これによりエージェントは、ハードコードされたマクロを使わずに、メールの閲覧、トリアージ、作成、スケジュール設定、タスクの追跡といった独自のワークフローを組み立てられます。
対応クライアント
- OpenClaw — MCP をネイティブサポートしており、ClawHubから利用できます
- Claude Code —
claude mcp add outlook -- outlook-mcp - Cursor — MCP に対応しています
- 任意の MCP クライアント — 標準の stdio MCP サーバーです。ローカルプロセスを起動できないクライアント向けに、オプトイン方式のストリーミング可能な HTTP トランスポートも利用できます
公式 MCP Registryには、io.github.mpalermiti/outlook-mcpとして登録されています。
機能
13 カテゴリにわたる 72 個のツールを備えています。71 個はデフォルトで読み込まれ、outlook_read_attachment はオプトインの documents グループに含まれます(ツールセットの選択を参照)。
- 認証(1) -- 認証状態の確認(ログインは CLI から行います)
- メールの読み取り(7) -- 受信トレイの一覧表示(Focused Inbox およびカテゴリ未設定のフィルター付き)、メッセージの読み取り、
$batchによる ID 指定での一括読み取り、検索(KQL)、フォルダーの一覧表示、受信トレイの変更の差分同期、メール/予定/連絡先を横断した「前回の呼び出し以降」の要約作成 - メールの書き込み(3) -- 送信、返信/全員に返信、転送
- メールのトリアージ(9) -- 移動、削除(デフォルトでは論理削除)、フラグ設定、カテゴリ設定、既読/未読の設定、再分類(Focused Inbox)、送信者ごとの Focused Inbox 上書き設定の一覧表示/設定/削除
- カレンダーの読み取り(4) -- 予定の一覧表示(繰り返し予定の展開付き)、予定の詳細取得、キーによる予定の検索、予定の変更の差分同期
- カレンダーの書き込み(6) -- 作成、更新、削除、出欠の回答(承諾/辞退/仮承諾)、予定ファイルの添付と削除
- 連絡先(7) -- 一覧表示、検索、取得、作成、更新、削除、変更の差分同期
- To Do(14) -- タスクリスト、タスク(一覧表示/取得/作成/更新/完了/削除)、チェックリスト項目(追加/更新/削除)、タスクの添付ファイル(一覧表示/ダウンロード/アップロード/削除)
- 下書き(5) -- 一覧表示、作成(新規、またはメッセージのスレッド内での返信/全員に返信/転送)、更新、送信、削除
- 添付ファイル(6) -- 一覧表示、ダウンロード、ドキュメントテキストの読み取り(オプトイン)、添付ファイル付き送信、下書きへの添付、下書きからの添付ファイル削除
- フォルダー管理(3) -- メールフォルダーの作成、名前変更、削除
- スレッド処理と一括操作(3) -- スレッドの一覧表示、メッセージのコピー、一括トリアージ
- ユーザーと管理(4) -- whoami、カレンダーの一覧表示、カテゴリの一覧表示、メールのヒント
設計原則:
- BYOID -- Bring Your Own ID。独自の Azure AD アプリを登録します。共有クライアント ID はありません。
- テレメトリゼロ -- 分析、ローカルキャッシュ、サードパーティへの呼び出しはありません。
- トークンの保存 --
azure-identityを介した OS のキーリング(macOS Keychain、Windows Credential Store、Linux Secret Service)。 - 入力検証 -- API を呼び出す前に、すべての入力(メールアドレス、Graph ID、OData、KQL、日時)を検証します。
- 読み取り専用モード -- 設定で
read_only: trueにすると、すべての書き込み操作がブロックされます。これは ツール を制限するものであり、トークン を制限するものではありません。read_onlyが行うことと行わないことを参照してください。 - 論理削除 -- デフォルトでは、削除すると「削除済みアイテム」に移動します。完全削除には
permanent: trueの明示的な指定が必要です。 - タイムゾーン対応 -- カレンダー操作には、設定した IANA タイムゾーンが適用されます。
- 相対日付 -- すべての日時パラメーターには ISO 8601 形式またはオフセットを指定できます。
7dは 7 日前、+7dは 7 日後、nowは現在の時刻を表します。単位:m、h、d、w。 - 添付ファイルへのアクセス制限 -- 添付ファイルの読み取りと書き込みは
attachments_dirの範囲内に限定されるため、ディスク上の別の場所にあるファイルを送信するようエージェントに指示するメッセージには従えません。 - 差分カーソルへのアクセス制限 --
delta_tokenは呼び出し元が保持する状態であり、信頼できない入力です。Graph のベアラートークンを含むすべての URL を解析し、graph.microsoft.com上の https であることを必須としています。これにより、汚染されたカーソルがメールボックスのトークンを他者にリダイレクトするのを防ぎます。また、そのパスはカーソルが渡されたツールの差分エンドポイントでなければならないため、カーソルによって差分ツールがメールボックス内の別の場所を指すこともありません。 - ワークフローのプロンプト --
morning_brief、triage_folder、catch_upは MCP プロンプトとして提供されるため、よく使う一連の操作を呼び出しごとに組み立て直す必要はありません。
エージェントに扱いやすい設計(1.8.0)
AI エージェントがツールをより低コストで利用でき、問題からの復旧もしやすくなる、2 つのコードのみの機能強化です。
-
簡潔モード — 高頻度で利用される 6 つの読み取りツール(
outlook_list_inbox、outlook_read_message、outlook_read_messages、outlook_search_mail、outlook_list_events、outlook_list_thread)にconcise=Trueを渡すと、サイズの大きいフィールド(メッセージ本文全体、スレッド内の引用された過去のメッセージ、受信トレイ一覧の本文プレビューとカテゴリ)を省略できます。通常、ペイロードを約 10 分の 1 に削減できます。outlook_list_eventsでは、削減される情報の種類と量が異なります。organizer、response_status、type、show_as、keyが省略され、is_organizerとattendees_countが追加されます。また、is_onlineはis_online_meetingという名前になります。そのため、簡潔なスキャンでは、繰り返し発生する予定と単発の予定を区別できません。デフォルトのconcise=Falseでは既存の応答形式が維持されるため、厳密な後方互換性があります。 -
構造化された Graph エラー — すべてのツールで、msgraph SDK の例外を、Graph のメッセージと復旧方法のヒントを含むツールエラーに変換します。401 では再認証、403/
ErrorAccessDeniedではリポジトリの解決策のない問題の一覧(ROADMAP)へのリンク、404/ErrorItemNotFoundでは再度の一覧取得、429 ではバックオフ、503 では再試行を案内します。ただし、メール送信が可能なツール(メール、招待、予定の更新、RSVP)では例外です。5xx エラーの場合、書き込みがすでに完了している可能性があることと、確認場所を伝えます。これらの書き込みは、一度実行した後に再送されることはありません。OutlookMCPErrorのサブクラスと検証エラーは変更せず、そのまま返されます。
Azure AD アプリの登録
クライアント ID を取得するには、無料の Azure AD アプリを登録する必要があります。
前提条件(個人用 Microsoft アカウント)
Microsoft は、Azure AD テナントのない個人用アカウントでのアプリ登録を廃止しました。まず無料の Azure アカウントを作成する必要があります。
- azure.microsoft.com/free にアクセスし、個人用の
@outlook.comアカウントで登録します。本人確認のためにクレジットカードが必要ですが、課金されることはありません。これにより、適切な Azure AD テナントが作成されます。
アプリを登録する
-
アプリの登録にアクセスし、
@outlook.comアカウントでサインインします。 -
**「+ 新規登録」**をクリックし、次の項目を入力します。
- 名前: Microsoft ブランドの用語以外なら何でも構いません(例:
mp-outlook-mcp。「Outlook MCP」のような名前は拒否されます) - サポートされているアカウントの種類: **「個人用 Microsoft アカウントのみ」**を選択します
- リダイレクト URI: 空欄のままにします
- 名前: Microsoft ブランドの用語以外なら何でも構いません(例:
-
登録をクリックします。概要ページでアプリケーション(クライアント)IDをコピーします。
-
認証(プレビュー) → 設定タブに移動し、「パブリック クライアント フローを許可する」をはいに切り替えて、保存します。
-
API のアクセス許可 → アクセス許可の追加 → Microsoft Graph → 委任されたアクセス許可に移動し、次を追加します。
Mail.ReadWrite、Mail.SendCalendars.ReadWriteContacts.ReadWrite、Tasks.ReadWriteMailboxSettings.ReadUser.Read、offline_access
クライアントシークレットは不要です。デバイスコードフローではパブリッククライアント認証を使用します。
クイックスタート
インストール
オプション A — PyPI からインストール(推奨):
uv tool install outlook-graph-mcp
# or: pipx install outlook-graph-mcp
# or: pip install outlook-graph-mcp
PDF および XLSX の添付ファイルをテキストとして読み取るには、代わりに省略可能な documents エクストラをインストールし(uv tool install 'outlook-graph-mcp[documents]')、オプトインの documents グループを有効にしてください。
詳細は添付ファイルを参照してください。
オプション B — ソースからインストール:
git clone https://github.com/mpalermiti/outlook-mcp.git
cd outlook-mcp
uv sync
設定
~/.outlook-mcp/config.json を作成します。
{
"client_id": "YOUR_APPLICATION_CLIENT_ID",
"tenant_id": "consumers",
"timezone": "America/Los_Angeles",
"read_only": true,
"attachments_dir": "~/.outlook-mcp/attachments"
}
必須のフィールドは client_id のみです。それ以外はすべて、適切なデフォルト値が設定されています。まずは read_only: true で始め、使い慣れてきたら false に切り替えてください。
MCP クライアントに登録する
PyPI からインストールした場合:
{
"mcpServers": {
"outlook": {
"command": "outlook-mcp"
}
}
}
ソースからインストールした場合:
{
"mcpServers": {
"outlook": {
"command": "uv",
"args": ["--directory", "/path/to/outlook-mcp", "run", "outlook-mcp"]
}
}
}
OpenClaw の場合は、openclaw mcp CLI を使用してください。~/.openclaw/openclaw.json の mcp.servers に設定が書き込まれます。
# If installed from PyPI:
openclaw mcp set outlook '{"command":"outlook-mcp"}'
# If installed from source:
openclaw mcp set outlook '{"command":"uv","args":["--directory","/path/to/outlook-mcp","run","outlook-mcp"]}'
# Verify:
openclaw mcp list
openclaw mcp show outlook --json
登録後、OpenClaw ゲートウェイを再起動してください。SSE/HTTP トランスポートのバリエーションについては、OpenClaw MCP ドキュメントを参照してください。
認証する
MCP サーバーを実行するマシンで、次のコマンドを一度実行してください。
outlook-mcp auth # installed from PyPI
uv run outlook-mcp auth # from a source checkout
URL とコードが表示されます。任意のブラウザーで URL を開き、コードを入力して、Microsoft アカウントでサインインしてください。トークンは OS のキーリングにキャッシュされ、MCP サーバーが自動的に使用します。
同意画面には、読み取りと書き込みの全権限(Mail.ReadWrite、Mail.Send、Calendars.ReadWrite、Contacts.ReadWrite、Tasks.ReadWrite、MailboxSettings.Read、User.Read)が表示されます。設定が read_only: true から始まる場合も同様です。これは、read_only がトークンではなくツールを制限するためです(「read_only が行うこと、行わないこと」を参照)。また、最初の同意で許可されなかったスコープは、再度ログインしない限り、後から許可できません。(例外は read_only_consent: true で、この場合は読み取り権限のみが要求されます。これは、同じ見出しで説明されている別の読み取り専用アプリ向けの設定です。)以降のすべてのリクエスト(サイレント更新と各 Graph 呼び出し)では .default スコープが使用されます。すでに同意済みのアカウントでは、これは「許可した権限のセット」のみを意味します。この順序には意図があります。個人用アカウントでは、最初の同意で .default のみを要求すると、委任された権限のないセッションが作成されることがあり、その場合は再度ログインしない限り、トークンを取得できません(AADSTS70000)(#82)。
その他の CLI コマンド(ソースのチェックアウトからは uv run を先頭に付けます):
outlook-mcp status # Check auth status
outlook-mcp logout # Remove this instance's auth record (the OS token cache is left to age out)
outlook-mcp serve # Start MCP server (default; stdio, or HTTP with OUTLOOK_MCP_TRANSPORT)
トラブルシューティング
毎回の呼び出しで me-token-to-replace is invalid が発生する
2026-09-18 以降にインストールした 1.22.0 を使用しています。このバージョンを新規インストールすると microsoft-kiota-* 1.13 以降が解決されますが、msgraph-core 1.5.1 はこれに対応していません。そのため、すべての /me リクエストが Graph に /users/me-token-to-replace として送信されます。この問題は、kiota を 1.13 未満に制限した 1.22.1 で修正されています(#80)。1.26.0 では、この制限を msgraph-core>=1.5.2 という下限に置き換えています。このバージョンには修正が含まれており、kiota 1.13 以降でも動作します。
uv tool upgrade outlook-graph-mcp
# or: pipx upgrade outlook-graph-mcp
# or: pip install --upgrade outlook-graph-mcp
設定とサインイン状態は変更されません。再認証は不要です。
Linux で SSL: CERTIFICATE_VERIFY_FAILED が発生する
認証時に [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate が発生する場合、Python 環境がシステムの CA バンドルを見つけられていません。これは、最小構成の Linux イメージやコンテナーイメージ、および uv tool install による分離された仮想環境でよく発生します。
Python がシステムの CA バンドルを参照するように設定してください。両方の変数を設定します。認証(azure-identity 経由の requests)では REQUESTS_CA_BUNDLE が読み取られ、delta と $batch の処理(httpx 経由)では SSL_CERT_FILE が読み取られます。
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt # httpx + Python ssl
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # azure-identity auth
パスはディストリビューションによって異なります。Debian/Ubuntu では /etc/ssl/certs/ca-certificates.crt、RHEL/Fedora では /etc/pki/tls/certs/ca-bundle.crt を使用します。ファイルが見つからない場合は、ディストリビューションの CA パッケージ(ca-certificates)をインストールしてください。これらの設定は、一度だけ実行する auth コマンドだけでなく、実行時にも適用されるよう、MCP クライアントがサーバーを起動する環境に設定してください。
トークンキャッシュが暗号化されずに保存される(Linux)
暗号化ストア(libsecret/PyGObject をインポートできない、または Secret Service が実行されていない)がない Linux では、outlook-mcp auth とサーバーはトークンキャッシュを平文で書き込むことを拒否し、各ツール呼び出しで理由が表示されます。暗号化ストア用のシステムパッケージをインストールしてください。プライバシーとセキュリティを参照してください。または allow_unencrypted_token_cache: true を設定して、平文のキャッシュファイルを使用することを許可してください。その場合、サーバーの起動時に一度だけ警告がログに記録されます。
ツールリファレンス
日付。 すべての日時パラメーター(after、before、start、end、due、
deferred_send_datetime)は、ISO 8601形式(2026-10-22 または 2026-10-22T14:30:00Z)か、
相対オフセットを受け付けます。7d は7日前、+7d は7日後、now は現在を表します。
単位は m、h、d、w です。符号を付けない値は「前」を意味し、一般的なCLIの慣例に
従います。そのため、未来の日付を指定するには + が必要です。タイムゾーンのない入力は、設定済みの
timezone で解釈され、応答は常にUTCです。
フォルダー。 すべての folder 引数、outlook_create_folder の parent_folder、
および outlook_batch_triage の移動先には、既知の名前(inbox、junkemail)、表示名
(Junk Email)、Graph ID、またはパスを指定します。Inbox/Travel/Flights は、
Inbox の下の Travel の下にある Flights を表します。フォルダー名に / が含まれる場合は
// と記述します(Inbox/Q1//Q2)。表示名を指定すると、まず同じ名前の最上位フォルダーが
検索されます。同じ名前のフォルダーが複数の入れ子階層に存在する場合は拒否され、エラーにそれらの
パスが表示されます。outlook_rename_folder と outlook_delete_folder にはIDを指定します。
認証
| ツール | 説明 |
|---|---|
outlook_auth_status | 認証済みかどうかと、読み取り専用モードが有効かどうかを確認します。 |
注記: 認証はMCPツールではなく、CLI(
outlook-mcp auth)を介して行います。上記の認証を参照してください。
メールの閲覧
| ツール | 説明 |
|---|---|
outlook_list_inbox | フォルダー内のメッセージを一覧表示します。folder には、表示名、既知の名前、パス(Inbox/Travel/Flights)、または Graph ID を指定できます。既読状態、送信者、日付範囲、Focused Inbox の分類、またはカテゴリなし(uncategorized_only)で絞り込みます。cursor(または skip)でページネーションします。 |
outlook_read_message | ID、または Message-ID ヘッダー値(<[email protected]>。完全一致。レスポンスの id は、ほかのツールが使用する Graph ID)でメッセージ全体を取得します。形式は text、html、full(両方)です。include_deferred_send=True を渡すと、下書きの予約配信時刻も表示されます。include_sender_auth=True を渡すと、From ドメインに対する Microsoft の判定である sender_authentication が追加されます。これには authenticated、from_domain、dkim、dmarc、compauth の結果、および簡潔な reason が含まれます。Microsoft 独自の最上位の Authentication-Results ヘッダーのみが対象で、authenticated が true になるのは、From ドメインと整合する認証に合格した場合のみです。これは from_domain のみを保証するもので、表示名は保証しません。また、false は未検証を意味し、なりすましを意味するものではありません。 |
outlook_read_messages | Graph $batch を使って、最大20件のメッセージを1回のラウンドトリップで ID により一括取得します。同じ (format, concise, include_deferred_send, include_sender_auth) の場合、各メッセージの形式は outlook_read_message とバイト単位で一致します。一部の ID で404が発生しても全体の呼び出しは失敗せず、該当する ID は failures[] に表示されます。outlook_read_message を N 回呼び出す代わりに使用してください。 |
outlook_search_mail | KQL クエリを使ってメールを検索します。名前、パス、または ID でフォルダーを指定して検索範囲を限定できます。cursor を使うと、検索を開始したフォルダーで検索を続行します。Graph は検索を終了してもそれを通知せず、250件を少し超えたあたりで結果が途切れることがあります(Exchange Online では255~275件、Outlook.com でも275件が確認されています)。そのため、250件を超える最終ページには incomplete が付き、古い一致結果が欠落している可能性と、それらを取得する方法が示されます。 |
outlook_list_folders | 件数、parent_id、child_count を含むメールフォルダーの一覧を表示します。recursive=true を渡すと、サブフォルダーを含むフォルダーツリー全体をたどります。この場合、各フォルダーには、すべての folder 引数で使用できる形式の path が含まれます。 |
outlook_list_inbox_delta | 前回の呼び出し以降に受信トレイで発生した変更のみを一覧表示します。folder(既定値は inbox)には名前、パス、または ID を指定できます。初回の呼び出しでは、完全なスナップショットと delta_token が返されます。以降の呼び出しでは、トークンを渡すことで追加・更新・削除された項目のみが返されます。削除された項目は {id, is_deleted: True} として返されます。カーソルはステートレスです。エージェントが保持し、再利用します。 |
outlook_changes_since | メール、イベント、連絡先の差分をまとめた、構造化された「前回の呼び出し以降」のダイジェストを返します。件数に加え、緊急フラグ付きメール、送信者別上位5件、新規・キャンセル済みイベントを返します。各リソースには独立した delta_token があります。古いトークンからの復旧(HTTP 410)では、そのリソースが自動で再同期され、_meta.resync に示されます。初回の呼び出しでは、過去 fallback_window_hours 時間(既定値は24時間)が対象になります。メールでは Graph に受信時刻フィルターを要求し、無視された場合はクライアント側で適用します(_meta.mail_window_fallback)。連絡先は最終更新時刻で絞り込み、イベントはカレンダービュー(対象期間とその後7日間)で絞り込みます。Graph がメールフィルターを適用した場合、後続の呼び出しでもフィルターが維持されます。その場合、対象期間より前に受信したメールについて報告されるのは、削除、受信トレイからの移動、既読・未読の変更のみで、新しいフラグやカテゴリは報告されません。1回の呼び出しあたりの上限に達して同期が途中で止まったリソースは has_more に示されます。保存済みの delta_tokens ディクショナリは、返されたものに置き換えてから渡してください。ディクショナリをマージしないでください。メールの初期同期が完了するまでは mail_bootstrap_from が保持されるため、継続時にも元の境界が引き継がれ、window.from に報告されます。新しいカーソルがない場合、応答では渡されたトークンがそのまま返されます。エージェントの定期実行ループ向けに設計されています。 |
メールの作成
| ツール | 説明 |
|---|---|
outlook_send_message | メールを送信します。TO/CC/BCC、HTML または Markdown の本文、重要度、reply_to、開封確認(request_read_receipt)に対応しています。 |
outlook_reply | メッセージに返信、または全員に返信します。返信文は引用された元のメッセージの上に追加されます。プレーンテキストでは段落、改行、- の箇条書きが保持され、プレーンテキストのスレッドにはプレーンテキストで返信します。 |
outlook_forward | 任意のコメントを添えて、メッセージを1人以上の受信者に転送します。コメントの改行は返信文と同様に保持されます。 |
本文は、is_html=True(HTMLを記述どおりに送信)またはis_markdown=Trueを指定しない限り、プレーンテキストです。Markdown は、安全なサブセット(段落、改行、-/*/+の箇条書きと番号付きリスト、**太字**、*斜体*、`コード`、https:およびmailto:アドレスへの[テキスト](url)リンク)を対象にHTMLへ変換されます。画像()は埋め込み画像にはならず、画像へのリンクになります。それ以外は、HTMLの生コードも含め、記述どおりに表示されます。outlook_send_message、outlook_reply、outlook_forward(そのcomment)、outlook_create_draft、outlook_update_draftで指定できます。プレーンテキストのスレッドでは、Markdown 形式の返信はプレーンテキストとして記述どおりに送信されます。
メールの整理
| ツール | 説明 |
|---|---|
outlook_move_message | 名前、パス、または ID を指定して、メッセージをフォルダーに移動します。 |
outlook_delete_message | メッセージを削除します。デフォルトでは論理削除(削除済みアイテムへの移動)です。完全削除するにはpermanent: trueを指定します。 |
outlook_flag_message | フォローアップフラグをflagged、complete、またはnotFlaggedに設定します。 |
outlook_categorize_message | メッセージのカテゴリーを設定します。 |
outlook_mark_read | メッセージを既読または未読にします。 |
outlook_reclassify_message | メッセージを「優先」受信トレイと「その他」の間で移動します(focused/other)。 |
outlook_list_inbox_overrides | 差出人ごとの「優先」受信トレイの上書きルールを一覧表示します。 |
outlook_set_inbox_override | 差出人ごとの「優先」受信トレイの上書き設定(focused/other)を登録または更新します。差出人の照合では大文字と小文字を区別しません。既存の場合は PATCH、存在しない場合は POST を実行します。 |
outlook_delete_inbox_override | ID を指定して「優先」受信トレイの上書き設定を削除します。 |
カレンダーの読み取り
| ツール | 説明 |
|---|---|
outlook_list_events | 日付範囲内のイベントを一覧表示します。繰り返しイベントは展開されます。各イベントには type が含まれます。シリーズのインスタンスの場合は occurrence または exception、単発のイベントの場合は singleInstance となるため、2 回目の呼び出しをしなくても一覧から繰り返しの予定を判別できます。seriesMaster はここには表示されません。calendarView は展開されたインスタンスを返すため、マスターを確認するには outlook_get_event を使用してください。各イベントには show_as も含まれ、これは Outlook で「表示方法」として指定される空き時間情報の状態です。days、after、before で設定できます。calendar では読み取るカレンダーを選択します。省略するか "primary" を指定すると既定のカレンダーが選択され、それ以外の場合は表示名(大文字と小文字を区別しません。見つからない場合や候補が複数ある場合は、該当する候補がエラーに表示されます)または outlook_list_calendars で取得した ID を指定します。cursor は元の一覧表示の続きを取得するため、後続ページでは calendar も2回目の検索も不要です。key を持つイベント(outlook_create_event を参照)にはその値が含まれ、持たないイベントには key フィールドがありません。concise=True を指定すると、type、show_as、key が省略されます。 |
outlook_get_event | イベントの詳細(出席者、本文、オンライン会議の URL、繰り返し設定、type(singleInstance / seriesMaster / occurrence / exception)、show_as、key(イベントにない場合は null)、および各ファイルの id、name、size、content_type、is_inline を含む attachments)を取得します。添付ファイルのバイトデータは返されません(添付ファイルがない場合は [] です。Graph がイベントに添付ファイルがあると報告した場合にのみ、2回目のリクエストで読み取ります)。event_id または招待の message_id を渡すと、カレンダー内の正確なイベントを解決します(件名では検索しません)。最新の詳細と招待の古さに加え、null 許容の is_organizer、allow_new_time_proposals、is_cancelled、およびタイムゾーン付きの出席者の proposed_new_time スロットを返します。欠落しているメタデータは null のままです。開催者かどうかはカレンダーの所有者を基準に判断されます。 |
outlook_find_event_by_key | 指定された key を持つイベントを検索します。これは呼び出し元が outlook_create_event または outlook_update_event で設定した独自の参照値です。日付範囲の制限はありません。数か月先の予定も、明日の予定と同様に検索できます。既定のカレンダー、または calendar(outlook_list_events と同様に解決されます)を検索します。既定の一覧と同じ形式で key を含むイベントを返します。単発のイベントとシリーズマスターが対象で、インスタンスは対象外です。そのため、見つかった ID を更新に使用できます。一致するものがなければ空のリストを返します。同じ key を持つイベントが25件を超える場合、has_more は true になります。 |
outlook_list_events_delta | 前回の呼び出し以降、指定範囲内で変更されたイベントだけを一覧表示します。最初の呼び出しでは start と end(ISO 8601)が必須です(Graph の制約により、カレンダー全体の同期はできません)。変更された各イベントには、key を除き、type と show_as を含む outlook_list_events の既定の一覧に含まれるすべてのフィールドが含まれ、さらに is_deleted も含まれます(concise=True では独自の簡略化された形式になり、差分取得ツールはその形式には準拠しません)。一覧表示とは異なり、このエンドポイントは seriesMaster も返すため、outlook_list_events から初期データを取得した呼び出し元には、初期データに含まれていなかった ID が返されることがあります。削除されたイベントは {id, is_deleted: True} のみを返します。カーソルはステートレスです。 |
カレンダーへの書き込み
| ツール | 説明 |
|---|---|
outlook_create_event | 場所と参加者を指定してイベントを作成します。(個人アカウントでは is_online は効果がありません。Graph は個人用メールボックスの isOnlineMeeting を無視します。)recurrence を指定すると、シリーズを作成できます。簡略形式(daily、weekdays、weekly、monthly、yearly。start を基準とします)か、それ以外の場合は完全な Graph recurrence object を指定します。range.startDate の既定値はイベントの開始日です。timezone(America/Los_Angeles のような IANA 名。略称は指定しないでください)は、イベントの基準となり、シリーズが展開されるタイムゾーンです。省略すると、設定の timezone が使われます。show_as は、Outlook の「表示方法」で示される空き時間情報のステータスを設定します。free、tentative、busy、oof(不在)、workingElsewhere、unknown を指定できます。省略すると、Graph 独自の既定値 busy が適用されます。calendar を指定すると、別のカレンダーに作成します。解決方法は outlook_list_events と同じです。省略するか "primary" を指定すると既定のカレンダーになり、それ以外の場合は outlook_list_calendars の表示名または ID を指定します。Graph が読み取り専用(canEdit: false)として一覧表示するカレンダーは、何も送信される前に拒否されます。イベント ID を受け取るツールでは calendar は不要です。ID を使えば、自分のどのカレンダーにあるイベントにもアクセスできます。key を指定すると、イベントの独自の参照情報(予約番号など。1~128 文字の英字、数字、.、_、:、@、-)を非表示の拡張プロパティに保存できます。同じ予約の変更が届いたときに、outlook_find_event_by_key でイベントを再度検索できます。同じキーを複数のイベントに設定することもできます。作成前に検索してください。 |
outlook_update_event | イベントのフィールド(件名、時刻、場所、本文、参加者、終日、show_as)を更新します。変更されたフィールドのみを更新します。recurrence を指定すると単一のイベントをシリーズに変更でき、remove_recurrence=True を指定するとシリーズを単一のイベントに戻せます。attendees はゲストリスト全体を置き換え、招待またはキャンセルのメールを送信します。is_all_day を指定する場合は、同じ呼び出しで start と end も指定する必要があります。show_as は単独で更新できます。時刻を更新しても、イベントの基準となっているタイムゾーンは維持されます。timezone を start と end とともに指定すると、別のタイムゾーンを基準に設定できます。これは、タイムゾーンが導入される前に作成されたシリーズを修正する方法です。編集済みまたは削除済みの予定があるシリーズに対する start、end、recurrence の更新は、それらの予定を示して拒否されます。Graph はそれらをすべて黙って破棄するためです。key はイベントのキーを設定または置き換えます。単独で更新できますが、キーをクリアする方法はありません。 |
outlook_delete_event | カレンダーのイベントを削除します。 |
outlook_rsvp | イベントに出欠を返信します。accept、decline、tentative を指定します。任意でメッセージを含めることができます。 |
outlook_attach_to_event | イベントにファイルを添付します。たとえば、フライトに電子チケットを添付できます。attachment_paths は outlook_attach_to_draft と同様に attachments_dir 内で解決されます。ファイルが見つからない場合、またはいずれかのパスがその外にある場合、ファイルは添付されません。3 MB を超えるファイルにはアップロードセッションを使用します。Graph がチャンクを拒否した場合、またはアップロード完了が報告されなかった場合は、ファイルが添付されたと報告するのではなく、エラーで呼び出しを停止します。新しい添付ファイル ID を返します(アップロードセッションを使ったファイルの ID はまだ返されません)。添付時に参加者へファイルは送信されません。イベントが次に更新されたときに送信されます。そのため、参加者がいるイベントでは、制限付きの allow_categories のもとで mail_send が必要です。 |
outlook_remove_event_attachment | outlook_attach_to_event が返した ID、または outlook_get_event が一覧表示する ID を使って、イベントから添付ファイルを1つ削除します。 |
連絡先
| ツール | 説明 |
|---|---|
outlook_list_contacts | カーソルページネーションを使用して連絡先を一覧表示します。概要には categories が含まれます。Graph の $search はこれを返さないため、outlook_search_contacts ではこのキーは省略されます。 |
outlook_search_contacts | 名前またはメールアドレスで連絡先を検索します。query の代わりに phone を指定すると、国番号の有無、先頭の 00 または国内通話用の 0、スペースやハイフンの有無にかかわらず、少なくとも末尾 7 桁から番号を検索します。Graph の連絡先 $search では、保存時と同じ形式の番号しか検索できず、電話番号フィールドはフィルターできません。そのため、電話番号で検索する場合は連絡先一覧(1,000 件単位でページを取得し、最大 10,000 件)を読み込み、数字を比較します。has_more は、count を超える一致があった場合、または 10,000 件目より後に連絡先がある場合に true になります。 |
outlook_get_contact | ID で連絡先の詳細情報を取得します。middle_name、job_title、birthday、自宅・勤務先・その他の住所、カテゴリ、個人メモが含まれます。 |
outlook_create_contact | 新しい連絡先を作成します。title は名前の敬称(「Dr.」「Ms.」など)で、Outlook では表示名に表示されます。職務は job_title に指定します。phone_type(mobile がデフォルト、または business、home)は、phone がどの種類の電話番号かを示します。birthday は日付(YYYY-MM-DD)で、UTC−11 から UTC+12 までのすべてのタイムゾーンで同じ日付になるよう、UTC の 11:59 に保存されます。outlook_get_contact はそのタイムスタンプを返します。middle_name、personal_notes、categories は指定されたとおりに設定されます。 |
outlook_update_contact | middle_name、company、title、job_title、personal_notes などの連絡先フィールドを更新します。categories は連絡先のカテゴリ一覧全体を置き換えます。これは outlook_categorize_message がメッセージのカテゴリ一覧に対して行うのと同じです。そのため、[] を指定するとすべてのカテゴリが削除されます。カテゴリを追加するには、先に連絡先を読み込んでください。phone_type は作成時と同様に機能します。business または home の番号を指定すると、その種類の番号一覧全体が指定した番号で置き換えられます。clear_phones は指定した種類の番号を空にします。そのため、phone_type="business", clear_phones=["mobile"] と指定すると、携帯電話として保存されている番号を 1 回の更新で勤務先の番号に移せます。home_address、business_address、other_address は、outlook_get_contact が返す形式(street、city、state、postal_code、country_or_region の任意の組み合わせ)で指定し、住所全体を置き換えます。そのため、保持したい部分はすべて指定してください。変更しない住所は省略します。birthday は作成時と同様に日付を設定または置き換えます。email はすべてのメールアドレスを指定したアドレスで置き換えます。add_emails と remove_emails は指定したアドレスのみを変更し、残りは保持します(連絡先に登録できるメールアドレスは最大 3 件です)。これらの変更は現在の連絡先の内容と統合され、更新は If-Match によって読み込み時点の状態に固定されます。そのため、読み込み後に編集が行われていた場合は上書きされず、412 が返されます。連絡先に存在しないアドレスを削除しようとすると拒否されます。 |
outlook_delete_contact | 連絡先を削除します。 |
outlook_list_contacts_delta | 前回の呼び出し以降に変更された連絡先のみを一覧表示します。削除された連絡先は {id, is_deleted: True} として返されます。カーソルはステートレスです。 |
To Do
| ツール | 説明 |
|---|---|
outlook_list_task_lists | To Do リストを一覧表示します。 |
outlook_list_tasks | ステータスフィルターとページネーションを指定してタスクを一覧表示します。 |
outlook_get_task | タスクの詳細情報(メモ(body)、チェックリスト項目(未チェック項目を先に並べた順序)、期限、繰り返しフラグ)を取得します。 |
outlook_create_task | 期限、重要度、繰り返しを指定してタスクを作成します。 |
outlook_update_task | タスクのフィールドを更新します。 |
outlook_complete_task | タスクを完了済みにします。 |
outlook_delete_task | タスクを削除します。 |
outlook_add_checklist_item | タスクにチェックリスト項目(サブステップ)を追加します。 |
outlook_update_checklist_item | チェックリスト項目を更新します。完了としてマーク(is_checked)するか、名前を変更します(部分パッチ)。 |
outlook_delete_checklist_item | タスクからチェックリスト項目を削除します。 |
outlook_list_task_attachments | To Do タスクの添付ファイル(id、name、size、content_type)をページネーション付きで一覧表示します。 |
outlook_download_task_attachment | タスクの添付ファイルの内容をローカルファイルにダウンロードします(attachments_dir 内に限定)。または、as_content=True を指定して内容を返します。 |
outlook_upload_task_attachment | attachments_dir 内のローカルファイルを、インライン base64 POST でタスクに添付します(1 byte~20 MiB)。 |
outlook_delete_task_attachment | To Do タスクから添付ファイルを削除します。 |
下書き
| ツール | 説明 |
|---|---|
outlook_list_drafts | 下書きメッセージをページネーション付きで一覧表示します。 |
outlook_create_draft | 必要に応じて、HTML(is_html=True)または Markdown(is_markdown=True)の本文を含む下書きを作成します。reply_to_message_id(全員に返信する場合は reply_all=True)または forward_message_id を指定すると、元のメッセージを引用した状態で、そのメッセージのスレッドに下書きが作成されます。送信はされません。Graph は返信の宛先と件名を設定します。転送の場合は to が必要です。deferred_send_datetime を指定して、サーバー側での配信予約(Outlook デスクトップと互換性のある「配信の遅延」)に対応します。 |
outlook_update_draft | 下書きのフィールドを更新します。HTML 本文には is_html=True、Markdown 本文には is_markdown=True を指定できます。また、deferred_send_datetime を指定して配信予約時刻を設定または解除できます。 |
outlook_send_draft | 既存の下書きを送信します。 |
outlook_delete_draft | 下書きを削除します。 |
添付ファイル
1.20.0 以降、これらのツールがアクセスできるのは
attachments_dirのみです(デフォルトは~/.outlook-mcp/attachments)。 ファイル名のみを指定するとこのディレクトリ内のファイルとして解決されます。シンボリックリンク経由を含め、このディレクトリ外のパスは拒否されます。 ファイルをメールで送信するには、まずこのディレクトリに移動してください。または、attachments_dirを広げることもできますが、そこからアクセスできるものはすべて送信可能になる点にご注意ください。1.20.0 より前は、これらのツールはサーバープロセスが読み取れるあらゆるファイルを読み取れたため、エージェントにファイルを添付するよう求めるメールに従ってしまう可能性がありました。同じ制限は To Do の添付ファイルツール(
outlook_upload_task_attachment、outlook_download_task_attachment)にも適用されます。アップロードではattachments_dirから読み取り、ダウンロードではそこに書き込むため、どちらもディスク上の任意のファイルを取得することはできません。(ダウンロードは読み取りであり、outlook_download_attachmentと同様にtodo_writeによる制限は受けません。制限しているのはカテゴリではなく、このディレクトリの境界です。)リモートまたはサンドボックス化されたクライアントなど、サーバーのディスクにアクセスできないクライアントは、呼び出しにバイトデータを含めることができ、その場合はディスクからの読み取りもディスクへの書き込みも行われません。 どちらのダウンロードでも
as_content=Trueを指定すると、添付ファイルが結果に含まれます(最大 10 MB)。PNG、JPEG、GIF、WebP は最大 5 MB まで画像として、テキストは最大 100,000 文字までテキストとして返され、それ以外(PDF を含む)は base64 のバイトデータとその種類を保持する埋め込みリソースとして返されます。終端チャンクがない PNG など、途中で切れた画像も同様にリソースとして返されます。制御文字を含むテキストや、文字セットによるデコードで単独のサロゲート文字になったテキストも、変更せずに届くようリソースとして返されます。outlook_send_with_attachmentsとoutlook_attach_to_draftのattachmentsにはインラインファイルを指定できます。形式は[{name, content_base64, content_type?}]で、各ファイルは最大 3 MB です(Graph の単純な添付ファイルのサイズ制限)。すべてのパス引数には引き続きこのディレクトリの制限が適用されます。インラインファイルはエージェントがすでに保持しているバイトデータであり、すでにメッセージ本文に入れることもできるため、新たなアクセス範囲は広がりません。outlook_attach_to_eventとoutlook_upload_task_attachmentが受け付けるのはパスのみです。
| ツール | 説明 |
|---|---|
outlook_list_attachments | メッセージに添付されたファイルを一覧表示します。 |
outlook_download_attachment | 添付ファイルをダウンロードし、デコードしたバイトデータを attachments_dir に保存するか、as_content=True を指定して返します。 |
outlook_read_attachment | オプトイン(documents グループ。デフォルトでは読み込まれません。以下を参照)。PDF のページ、XLSX のセル・数式・保存済みの計算結果、または宣言された文字セット(デフォルトは UTF-8)のテキストを読み取ります。offset / max_chars でテキストをページ分割し、ファイルは保存しません。 |
outlook_send_with_attachments | attachments_dir から読み取った添付ファイル(3 MB 超の場合はアップロードセッションを自動使用)または attachments で渡されたインラインファイルとともに、メッセージを送信します。大容量ファイルのアップロードに失敗した場合は送信されず、エラーには Drafts に残された下書きが示されます。これを削除するか、二重送信を避けるため outlook_attach_to_draft で完了できます。 |
outlook_attach_to_draft | attachments_dir のファイル(3 MB 超の場合はアップロードセッションを自動使用)または attachments のインラインファイルを既存の下書きに追加します。大容量ファイルのアップロードに失敗した場合はエラーとなり、添付済みとして報告されることはありません。新しい添付ファイル ID を返します(アップロードセッションによるファイルの ID はまだありません)。 |
outlook_remove_draft_attachment | 下書きから添付ファイルを 1 つ削除します。 |
元のバイトデータではなく読み取り可能なドキュメントの内容が必要な場合は、outlook_read_attachment を使用してください。
ダウンロード時に保存されるパスはサーバー上のものなので、リモートクライアントから開けない場合があります。
as_content=True を指定するとこのパスを使わず、元のファイルをそのまま保持できます。一方、読み取りツールは埋め込みバイナリリソースを解釈できないクライアント向けに、抽出したテキストを返します。
既存のダウンロード動作とデフォルト設定は変更されません。
PDF および XLSX の解析は任意です。outlook-graph-mcp[documents] をインストールします(たとえば、
uv tool install 'outlook-graph-mcp[documents]'、pipx install 'outlook-graph-mcp[documents]'、
pip install 'outlook-graph-mcp[documents]'、またはソースのチェックアウト内で
uv sync --extra documents を実行します)。オプトインの documents グループを
OUTLOOK_MCP_TOOLSETS=mail,attachments,documents(必要なほかのグループも含めて)で有効にし、再起動します。
グループを指定すると指定したグループのみが読み込まれるため、必要なグループをすべて列挙してください。
ツールセットの選択を参照してください。
有効にすると、基本インストールでも宣言された文字セット(デフォルトは UTF-8)のテキストを読み取れます。
PDF/XLSX の場合はインストール方法の案内が返されます。解析の依存関係には上限付きのバージョンが指定され、
短時間だけ実行されるワーカー内でのみインポートされます。基本インストールに新たな要件は追加されません。
outlook_read_attachment(message_id, attachment_id, offset=0, max_chars=20000) は text、
next_offset(末尾では null)、total_chars、ファイルの bytes / sha256、および warnings を返します。
同じ ID と返されたオフセットを使い、null が返されるまで続きを取得してください。続きの取得では毎回
ファイル全体をダウンロードして解析し、要求された範囲を返します。ドキュメントのキャッシュはありません。
処理の繰り返しを減らすには、max_chars を大きくします(最大 50000)。PDF 出力にはページ番号が示されます。
テキストレイヤーのないページは、空白または OCR が必要なページとして報告されます。
抽出された PDF のテキスト行には | が前置されるため、PDF 出力で接頭辞のない [Page N] 構造マーカーを出力できるのは PDF リーダーのみです。
この保証は PDF のみに適用されます。XLSX とテキストのチャンクはセルや行の途中から始まることがあり、
内容に含まれる見かけ上のセルアドレスやページマーカーは信頼できないテキストです。OCR は実行されません。XLSX の出力には非表示のシート、
セルアドレス、数値書式、数式、saved_result(Excel に保存された値。存在しない場合は null)が含まれます。
数式は再計算されず、グラフや画像も抽出されません。すべての添付ファイルの内容は信頼できないデータとして扱われます。
ワークシートのメタデータ(sheets)が返されるのはオフセット 0 の場合のみで、シリアライズされたリストと
少なくとも 1 文字のテキストが max_chars に収まる場合に限られます。収まらない場合はリストが省略され、
ワークシート名はページ分割されたテキスト内に残ります。シート数が 100 を超えるブックは拒否されます。
表示されるシート名は Excel の 31 文字の上限で切り詰められます。切り詰められた名前には … [N] が付加され、
共有されている接頭辞を区別できるよう、1 から始まるワークシートの位置が示されます。上限以内の名前は変更されません。
max_chars にはテキストとシリアライズされたワークシートメタデータが含まれます。
固定のレスポンスエンベロープと上限付きの警告は別枠です。行の途中から始まる PDF のスライスには、収まる場合に | の表示用接頭辞が付加されます。
continuation_prefix はこの接頭辞を示します。チャンクを結合してテキストを再構築する前に、この接頭辞を削除してください。
オフセットと total_chars は、この表示用接頭辞を除いた正規化済みテキストをカウントします。
読み取りの上限は、ファイルサイズ 10 MiB、PDF 200 ページ、訪問するスプレッドシートのセル 100,000 個、抽出文字数 100 万文字、
および展開後の XLSX コンテンツ 50 MiB / 2,000 エントリです。max_chars の上限は 50,000 です。
テキストはプロセス内でデコードされ、抽出されたテキストはすべてページ分割の前に制御文字が除去されます。PDF/XLSX では、
クラッシュやリソースを封じ込めるためにサブプロセスを使用しますが、サンドボックスではありません。サーバーの認証情報を含む環境変数は渡されませんが、
同じユーザーとして実行されるため、ファイルシステム、ネットワーク、Keychain にアクセスできます。親プロセスのウォッチドッグは 10 ms ごとに RSS を確認し、
Linux、macOS、Windows で 256 MiB を超えた解析プロセスを強制終了します。確認間隔の間に一時的に上限を超える可能性があります。
一度に実行される解析プロセスは 1 つのみで、実行時間の上限は 30 秒です。
対応する環境では、OS のリソース制限もこれらのチェックを補完します。
上限に達した場合は明示的なエラーとなり、ドキュメントが黙って部分的に返されることはありません。
フォルダーの管理
| ツール | 説明 |
|---|---|
outlook_create_folder | メールフォルダーを作成します(最上位、または parent_folder の下にネストして作成します。parent_folder には名前、パス、ID を指定できます)。 |
outlook_rename_folder | ID を指定してメールフォルダーの名前を変更します。 |
outlook_delete_folder | ID を指定してメールフォルダーを削除します(既知のフォルダーは削除できません)。 |
スレッドとバッチ処理
| ツール | 説明 |
|---|---|
outlook_list_thread | 会話スレッド内のすべてのメッセージを取得します。 |
outlook_copy_message | メッセージを別のフォルダー(名前、パス、または ID)にコピーします。 |
outlook_batch_triage | メッセージの移動/フラグ設定/カテゴリ分け/既読化を一括で行います(1 回の呼び出しにつき最大 20 件)。Graph の /$batch を使った単一の往復処理で、大量の振り分けではメッセージごとに呼び出す場合より 10~20 倍高速です。Graph によってスロットリングされたメッセージは、失敗として報告されず、Retry-After の経過後に再送されます。mark_read には true/false(または read/unread)を指定します。 |
ユーザーと管理者
| ツール | 説明 |
|---|---|
outlook_whoami | 現在のユーザープロファイルを取得します。 |
outlook_list_calendars | 利用可能なカレンダーを一覧表示します。owner(name、address)と can_view_private_items も含まれます。所有者または非公開アイテムの権限に関するメタデータがない場合は null です。false は、そのカレンダーの非公開アイテムを表示できないことを意味します。名前が重複する場合は、カレンダー ID を使用してください。 |
outlook_list_categories | 色付きのカテゴリ定義を一覧表示します。 |
outlook_get_mail_tips | 送信前の確認(OOF、配信制限)を行います。 |
プロンプト
一般的な手順を呼び出しごとに組み立て直す必要がないよう、3 つのワークフローが MCP プロンプトとして提供されています。プロンプトに対応する MCP クライアントであれば、どれでもこれらを一覧表示できます。多くのクライアントでは、スラッシュコマンドまたはプロンプト選択画面に表示されます。
| プロンプト | 引数 | 内容 |
|---|---|---|
morning_brief | folder(デフォルトは inbox) | 今日の予定、未読メール、期限を迎えるタスクを、最も低コストな順序で表示します。各項目を 1 回スキャンし、concise=True とバッチ読み取りを使用します。 |
triage_folder | folder(デフォルトは inbox)、count(デフォルトは 50) | フォルダーを低コストで 1 回スキャンし、返信/アーカイブ/迷惑メールに分類します。メッセージごとに 1 回呼び出すのではなく、単一の outlook_batch_triage 呼び出しで適用します。 |
catch_up | since(デフォルトは 24h) | 差分取得を使って、メール、カレンダー、連絡先の変更内容を確認します。定期的に再スキャンする場合と比べて、コストをおよそ 10 分の 1 に抑えられます。 |
呼び出すまでは費用はかかりません。prompts/list に含まれるのは名前と各 1 行の説明だけで、本文は使用時に取得されます。
設定
設定は ~/.outlook-mcp/config.json にあります(macOS と Linux では権限 0600 で作成されます。Windows については以下の 設定の権限 を参照してください)。すべてのプラットフォームで UTF-8 として読み込まれ、バイトオーダーマークも受け入れられます。設定ディレクトリを移動するには、環境変数 OUTLOOK_MCP_CONFIG_DIR を設定してください(config.json、認証レコード、添付ファイルのデフォルト保存先も一緒に移動します)。以下の 2 つのアカウント、2 つのインスタンス を参照してください。
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
client_id | string | null | Azure AD アプリケーション(クライアント)ID です。認証に必要です。 |
tenant_id | string | "consumers" | Azure AD テナントです。個人用 Microsoft アカウントの場合は "consumers" を使用してください。 |
expected_username | string | null | 1.29 以降:このインスタンスのサインイン用ユーザー名を任意で指定します。別のユーザー名で保存されたサインイン情報は、更新する前に拒否されます。新しいサインイン情報は、レコードの保存または資格情報の使用前に確認されます。大文字と小文字を区別せず、Microsoft のサインイン用ユーザー名を文字列どおりに比較し、エイリアスの解決は行いません。未設定の場合は、既存の動作が維持されます。旧バージョンではこのキーは警告とともに無視され、チェックは適用されません。 |
timezone | string | "UTC" | IANA タイムゾーン(例:"America/New_York")です。タイムゾーンのない日付を解釈し、作成するすべてのイベントの基準にもなります。繰り返しイベントはこのタイムゾーンで展開されるため、デフォルトの "UTC" では、週次の 09:00 の会議は時計が切り替わる際に 1 時間ずれます。お住まいの場所に合わせて設定してください。 |
read_only | bool | false | true の場合、すべての書き込みツール(送信、返信、移動、削除、作成、更新、RSVP)はエラーを返します。これはツールを制限するものであり、Microsoft トークンを制限するものではありません。以下を参照してください。 |
read_only_consent | bool | false | true の場合、outlook-mcp auth は読み取りと書き込みの権限セットではなく、読み取り権限のみを Microsoft に要求します。2 つ目の読み取り専用アプリ登録については、「read_only が行うこと、行わないこと」 を参照してください。read_only: true が必要です。これが設定されていない場合、設定は拒否されます。 |
attachments_dir | string | "~/.outlook-mcp/attachments" | 添付ファイルツールが読み取りまたは書き込みを行える唯一のディレクトリです。エージェントが指定するすべてのパスは解決され、このディレクトリ内に収まる必要があります。ディレクトリ外へのシンボリックリンクや .. は拒否されます。到達可能なファイルがメールで送信される可能性があることを理解している場合にのみ、範囲を広げてください。 |
allow_categories | list[string] | [] | 任意項目です。書き込みツールを特定のカテゴリに制限します(以下を参照)。空のリストの場合、read_only: false であればすべての書き込みが許可されます。 |
allow_unencrypted_token_cache | bool | false | プラットフォームに暗号化ストアがない場合(libsecret のない Linux)に、OAuth トークンキャッシュを平文で書き込むことを許可します。デフォルトでは無効です。再利用可能な Graph トークンを暗黙に平文で保存するのではなく、認証を説明付きで停止します。macOS と Windows では常に暗号化されるため、影響はありません。 |
環境設定(任意)
auth、serve、status は同じローダーを共有します。まず config.json(ファイルが存在しない場合は既存のデフォルト値)を読み込んで検証し、その後、以下の任意の環境変数を読み込みます。不正な設定ファイル、読み取り不能な設定ファイル、またはシンボリックリンクになっている設定ファイルがある場合は、引き続き起動を拒否します。環境変数の値でこの拒否を回避することはできません。上書き値がファイルに自動的に書き戻されることはありません。
| 変数 | 入力値 | ファイル/デフォルト値との関係 |
|---|---|---|
OUTLOOK_MCP_CLIENT_ID | 空でない文字列 | ファイルに client_id がない場合にのみ値を設定します。異なるアプリ登録を指定した場合は拒否されます |
OUTLOOK_MCP_TENANT_ID | 空でない文字列 | tenant_id を上書きします |
OUTLOOK_MCP_TIMEZONE | IANA タイムゾーン | timezone を上書きします |
OUTLOOK_MCP_READ_ONLY | true または false | 制限を有効にできますが、無効にはできません |
OUTLOOK_MCP_READ_ONLY_CONSENT | true または false | 読み取り専用への同意を有効にできます。実効値が read_only: true である必要があります |
OUTLOOK_MCP_ALLOW_CATEGORIES | カテゴリ名の JSON 配列 | 許可されるカテゴリを絞り込めますが、拡大はできません |
OUTLOOK_MCP_ATTACHMENTS_DIR | ディレクトリパス | 設定済みディレクトリ、またはその配下に解決される必要があります |
OUTLOOK_MCP_ALLOW_UNENCRYPTED_TOKEN_CACHE | true または false | 平文での保存を禁止できます。ファイルですでに許可されている場合を除き、許可することはできません |
未設定の変数は何も変更しません。サポート対象の変数に空の値を設定すると、起動を拒否します。空の Compose ${VAR} パススルーも同様です。ブール値は true/false のみ受け付けます(大文字と小文字は区別せず、前後の空白は許可されます)。リスト値は JSON で指定する必要があります。例:["mail_drafts","contacts_write"]。
カテゴリの空のリストはすべてのカテゴリを意味するため、ファイルで指定した制限付きリストの代わりにはなりません。各セキュリティ設定は個別にチェックされます。読み取り専用モードを有効にしても、別の設定を広げることはできません。ファイルで明示的な同意が必要とされているセキュリティ権限には、引き続き同意が必要です。
添付ファイルのルートは、ディレクトリを作成せずに展開・解決されます。上書き値は検証済みの絶対パスとして保持され、..、同階層のパス接頭辞、シンボリックリンクによって設定済みルートの外に出ることはできません。起動後にディレクトリがシンボリックリンクになった場合も含め、添付ファイルのパスをチェックするたびにルートを再検証します。
Windows では、異なるドライブ/共有フォルダーや、許可されていない UNC/デバイスの場所は、解決処理でアクセスが試みられる前に拒否されます。
不正な入力、スペルミスのあるセキュリティ変数、ポリシーを緩和する試みがあると起動が停止し、起動環境で修正すべき変数名が示されます。既存の OUTLOOK_MCP_CONFIG_DIR、toolset、transport の各変数の意味は変わりません。新しい変数が設定されていない場合、ファイルの読み込み動作は変更されません。
これらのチェックで保護されるのは、サポート対象の設定変数であり、起動環境全体ではありません。起動環境を制御できるユーザーは、OUTLOOK_MCP_CONFIG_DIR または HOME を使って設定ファイルの参照先も変更できます。
ツールセットの選択(任意)— OUTLOOK_MCP_TOOLSETS
既定の71個のツールスキーマは、各ターンでクライアントのコンテキストに読み込まれます(test_tool_surface_budget.py が測定に使用する文字数÷4の目安であり、ROADMAPに記載されている62ツールのサーフェスに関する約8.6kのo200k値とは異なる基準です)。サーフェスの一部だけを必要とするクライアントは、OUTLOOK_MCP_TOOLSETS 環境変数にツールグループをカンマ区切りで指定でき、指定したグループのみが読み込まれます。account グループ(認証/ID)は常に利用できます。
# e.g. a recurring mail + calendar agent: 31 tools instead of 71 (about half the tool tokens per turn)
OUTLOOK_MCP_TOOLSETS="mail,calendar,digest,delta"
グループ:mail、drafts、attachments、calendar、contacts、todo、folders、digest、delta、admin、documents。未設定の場合は既定の71個のスキーマが読み込まれます。documents は明示的に指定するまで無効です。宣言されている全サーフェスには72個のツールが含まれます。これは、公開されるツールにのみ影響します。有効化されたツールの動作は変わりません。
グループ名を指定すると、指定したグループと account のみが読み込まれ、グループ名ではない名前は何にも一致しません。そのため、既定のセットに documents を追加するには、11個すべてを指定します:OUTLOOK_MCP_TOOLSETS=mail,drafts,attachments,calendar,contacts,todo,folders,digest,delta,admin,documents。
グループは「ツールリファレンス」の見出しとは一致しません。mail には、メールの読み取り、作成、トリアージのツール、outlook_list_thread、outlook_copy_message、outlook_batch_triage が含まれますが、outlook_list_folders は folders に含まれます。Focused Inbox のツール(outlook_reclassify_message と3つの override ツール)は、categories および mail tips とともに admin に含まれます。3つの *_delta ツールは delta に、outlook_changes_since は digest に含まれます。outlook_list_calendars は calendar に含まれます。下書きの添付ファイル用ツール2つは drafts に、outlook_read_attachment は documents に含まれます。account は outlook_auth_status と outlook_whoami です。
2 つのアカウント、2 つのインスタンス(任意)— OUTLOOK_MCP_CONFIG_DIR
1 つのサーバープロセスで 1 つのメールボックスを扱います。2 つのアカウントを使用するには、クライアントエントリーを 2 つ登録し、それぞれに OUTLOOK_MCP_CONFIG_DIR で個別の設定ディレクトリを指定してください。また、OUTLOOK_MCP_TOOLSETS と組み合わせると、各インスタンスで必要なツールグループだけを読み込むようにできます。
{
"mcpServers": {
"outlook-net": {
"command": "outlook-mcp",
"env": {
"OUTLOOK_MCP_TOOLSETS": "mail,calendar,contacts",
"OUTLOOK_MCP_CONFIG_DIR": "~/.outlook-mcp-net"
}
},
"outlook-neko": {
"command": "outlook-mcp",
"env": {
"OUTLOOK_MCP_TOOLSETS": "todo",
"OUTLOOK_MCP_CONFIG_DIR": "~/.outlook-mcp-neko"
}
}
}
}
次に、環境変数を同じように設定して、各インスタンスで outlook-mcp auth を 1 回ずつ実行し、それぞれのディレクトリに認証レコードを書き込みます。各インスタンスは、それぞれのディレクトリから独自の config.json(独自の client_id、timezone、アクセス許可)を読み込みます。
移動するのは設定ディレクトリだけにしてください。HOME は絶対に変更しないでください。 トークンキャッシュは設定ディレクトリ内にはありません。OS のキーチェーンに保存されます。macOS では、ホスト上のすべての azure-identity キャッシュが、シグナルファイルを介して調整される 1 つの Keychain 項目を共有します。このサーバーでは ~/.IdentityService/outlook-mcp.nocae です(azure-identity は、すべての非 CAE キャッシュ名に .nocae を追加します。CAE キャッシュは同じ項目を共有する別のファイルになります)。両方のプロセスは引き続き同じシグナルファイルを参照し、キャッシュへの書き込みをロックして 1 つの共有エントリーにマージする必要があります。設定ディレクトリを移動すればこの状態が保たれますが、HOME(またはキャッシュの場所)を変更すると、各プロセスが自分のシグナルファイルを信頼して Keychain 項目を所有していると認識し、互いのトークンを上書きするため、問題が発生します。OUTLOOK_MCP_CONFIG_DIR で移動するのは、config.json、認証レコード、添付ファイルの保存先だけです。未設定または空の場合は、既定の ~/.outlook-mcp が使用されます。
1.29 以降では、特定のサインインをインスタンスに必須とするには、そのインスタンスの config.json に "expected_username": "[email protected]" を追加します。古いバージョンでは、このキーは警告とともに無視され、制限は適用されません。この任意の制限では、Microsoft に保存されたサインインユーザー名を大文字と小文字を区別せずに比較します。メールのエイリアスは解決されません。キャッシュされたユーザー名が一致しない場合、資格情報の作成または更新より前に拒否されます。outlook-mcp status には、どちらのユーザー名も表示せずに拒否の理由と対処方法が示されます。期待するユーザーでサインインするか、誤っている場合は expected_username を修正してください。新しいサインインでは、Microsoft の対話型サインインが完了した後、レコードの保存または資格情報の使用より前に検証されます。サインインが拒否されても、以前の認証レコードは変更されません。ただし、azure-identity によって、そのアカウントのリフレッシュトークンがローカルの共有 OS トークンキャッシュにすでに追加されている場合があります。macOS では、以前のアカウントのトークンも残ったまま、同じ Keychain 項目に保存されます。logout を含め、outlook-mcp の機能でこれらのキャッシュ済みトークンが削除されることはありません。未設定または null の場合は、現在の動作が維持されます。空白の値や expected_usename のようなスペルミスがあると、制限が黙って無効化されるのではなく、起動が停止します。
リモート/HTTP トランスポート(任意)— OUTLOOK_MCP_TRANSPORT
既定は stdio で、上記のすべてのクライアントエントリーで使用されます。別のマシンやコンテナーで実行するサーバー、またはローカルプロセスを起動できないクライアントの場合は、OUTLOOK_MCP_TRANSPORT=streamable-http を設定すると、代わりに /mcp で MCP のストリーマブル HTTP トランスポートを提供します。
export OUTLOOK_MCP_TRANSPORT=streamable-http
export OUTLOOK_MCP_HTTP_HOST=127.0.0.1 # default 127.0.0.1
export OUTLOOK_MCP_HTTP_PORT=8000 # default 8000
export OUTLOOK_MCP_HTTP_TOKEN=... # python -c "import secrets; print(secrets.token_urlsafe(32))"
outlook-mcp serve
クライアントは https://<your proxy>/mcp に接続し、Authorization: Bearer <token> を送信します。
OUTLOOK_MCP_TRANSPORT に指定できるのは stdio(既定値。未設定または空の場合も同様)または streamable-http です。それ以外の値、1~65535 の範囲外のポート、不正な OUTLOOK_MCP_HTTP_ALLOWED_HOSTS、トークンの欠落または形式の誤りがある場合は、バインド開始前に理由を示してサーバーの起動が停止します。
コンテナーの場合は、OUTLOOK_MCP_HTTP_HOST=0.0.0.0 と、プロキシが転送するパブリックホスト名を指定した OUTLOOK_MCP_HTTP_ALLOWED_HOSTS=mcp.example.com を明示的に設定してください。パブリックアドレスにバインドする場合は、開始前に必ずプレーン HTTP の警告が表示されます。許可するホストが設定されていない状態でワイルドカードアドレス(0.0.0.0 または ::)にバインドすると、通常のクライアント Host ヘッダーには 421 が返されることも警告されます。ワイルドカードアドレスそのものは、クライアントが使用するホスト名やアドレスではありません。トークンは、他の OS ユーザーやブラウザーページからのアクセスを保護します。OS ユーザーとして実行されるコードは、クライアントの設定を読み取ったり、自身でサーバーを起動したりできます。転送されたヘッダーは信頼されません。
環境変数のトークンの代わりにシークレットファイルを使用できます。OUTLOOK_MCP_HTTP_TOKEN_FILE に、トークンだけを含む 4096 バイト以下の通常ファイルを指定し(末尾の改行は許可されます)、OUTLOOK_MCP_HTTP_TOKEN の設定を解除してください。両方が設定されている場合は拒否されます。POSIX では、ファイルはサーバーユーザーが所有し、グループおよびその他のユーザーに対する権限がない必要があります(chmod 600)。シンボリックリンクは拒否されます。Windows では、ファイル ACL をサーバーアカウントのみに制限してください。サーバーは Windows の ACL を検証しません。トークンファイルのエラーにファイルの内容やパスが含まれることはありません。
コンテナーのシークレットマウントにも、同じファイル保護が必要です。
- Kubernetes: 投影された Secret キーはシンボリックリンクであるため、通常のボリュームパスは拒否されます。
subPathを使ってマウントするとシンボリックリンクを回避できますが、それでもサーバー UID がファイルを所有し、モードが0400または0600である必要があります。subPathを使うだけでは所有権の問題は解決しません。非 root のサーバーの場合、init コンテナーで投影されたキーを、サーバー UID として書き込み可能なemptyDirにモード0400でコピーし、その後、アプリケーションで準備したディレクトリを読み取り専用でマウントできます。ローテーション後に Pod を再作成して、コピーまたはsubPathマウントを更新してください。subPath マウントには Secret の更新が反映されません。 - Docker: Swarm シークレットは、デフォルトで root が所有し、すべてのユーザーが読み取り可能なファイルとして作成されるため、拒否されます。シークレットの
uidをサーバー UID に、gidをサーバーのグループに、modeを0400に設定してください。ローカルファイルを使用する Compose シークレットでは、uid、gid、modeは無視されます。コンテナー内の UID に一致する所有者とモード0400を設定した通常のホストファイルを用意し、読み取り専用でマウントしてください。OUTLOOK_MCP_HTTP_TOKEN_FILEに、コンテナー内でのファイルパスを設定します。トークンを置き換えた後は、サーバーを再起動してください。ファイルは起動時にのみ読み取られます。
これにより、メールボックスにアクセスできるユーザーが変わります。 stdio 経由では、サーバーを起動したプロセスのみがアクセスできます。HTTP 経由では、ポートへのリクエストを 1 回送るだけで、トークンを持つものは誰でもアクセスできるため、アクセス制御はすべてトークンにかかっています。
- すべてのバインドでトークンが必要です。ループバックの場合も同様です。 サーバーは、
OUTLOOK_MCP_HTTP_TOKENまたはOUTLOOK_MCP_HTTP_TOKEN_FILEからトークンを取得できない場合、起動を拒否します。ループバックでは、トークンのないポートがあると、他の OS ユーザーやブラウザーページが HTTP リクエストを 1 回送るだけでメールボックスを読み取れてしまいます。すべてのリクエストにはAuthorization: Bearer <token>を含める必要があり、含まれていない場合は401が返されます。トークンには、A–Z a–z 0–9 -._~+/の文字を使った 32 文字以上の値が 1 つ必要で、そのうち 8 文字以上は異なる文字でなければなりません(末尾の=によるパディングは許可されます)。これは文字の種類が明らかに少ない値を拒否するもので、予測可能なトークンをすべて拒否するものではありません。上記のジェネレーターを使用してください。変更するには、新しいトークンを指定してサーバーを再起動してください。 - プレーン HTTP ではトークンが暗号化されずに送信されます。 サーバーは TLS を終端しません。他のマシンから到達できるアドレスにバインドすると、サーバーの前段にあるリバースプロキシが TLS を終端しない限り、トークンとツールが返すすべての情報は、経路上のあらゆるものから読み取れる状態でネットワークを通過します。リバースプロキシの背後に配置してください。また、複数のクライアントが接続する場合は、プロキシ側でも呼び出し元を認証してください。
- すべてのバインドで Host と Origin がチェックされます。 ループバックへのバインドでは、ループバックのホストとオリジンが許可されます。
OUTLOOK_MCP_HTTP_ALLOWED_HOSTSを指定すると、ホスト名または IP アドレスをカンマ区切りで追加できます。ポートは任意です(例:mcp.example.comまたはmcp.example.com:8443)。パブリックアドレスへのバインドでは、許可するホストをこの設定で指定します。未設定の場合は、バインド先のアドレスそのものだけが許可されます。ポートを指定しない名前と:*エントリは、ポートを問わず許可します。これには、HTTP/HTTPS のデフォルトポートでポートを省略した Host も含まれます。無効な Host は421で拒否されます。Origin が指定されている場合、HTTP または HTTPS 経由で許可されたホストと一致する必要があり、一致しない場合は403が返されます。Origin を指定しないクライアントは使用できます。同一ホストのプロキシでは、Host: 127.0.0.1:<port>を送信できます。 - ファイルパスはサーバー上のものです。 添付と添付ファイル付き送信のパスは、サーバーの
attachments_dir内で解決されます。リモートクライアントが自身のローカルパスを渡すことはできません。ダウンロードしたファイルとsaved_toはサーバー上に残り、パスが拒否された場合、サーバーの絶対パスである添付ファイル用ディレクトリが示されることがあります。代わりに、インラインのattachmentsとas_content=Trueを使うと、呼び出し時にバイト列を渡せます(添付ファイルを参照)。 - ステートレスです。 サーバーは
Mcp-Session-Idを発行せず、各リクエストにイベントストリームではなく JSON で応答します。ツールが呼び出し中にクライアントへ何かを送信することはないため、失われるものはありません。 - 1 つのプロセスが引き続き処理するアカウントは 1 つです。 stdio の場合と同様に
OUTLOOK_MCP_CONFIG_DIRと組み合わせてください(メールボックスごとに 1 プロセス、1 ポート、1 設定ディレクトリ)。サーバーを実行する環境で、同じ環境変数を設定してoutlook-mcp authを実行してください。通常、コンテナーにはキーリングがありません。暗号化されずに保存されるトークンキャッシュ(Linux)を参照してください。 - トークン、リクエスト URL、リクエスト行はログに記録されません。
read_onlyが行うことと行わないこと
read_only: trueにすると、outlook-mcpの書き込みツールは実行されなくなります。メールの送信を依頼すると、拒否されます。
Microsoftの認証情報が読み取り専用になるわけではありません。 設定でread_only: trueにしていても、最初のサインインでは読み取りと書き込みの権限一式に同意します。最初の同意で付与されなかったスコープは、再度ログインしない限り追加できません(以後の更新では常に.default(「このアカウントがこれまでに同意したすべての権限」)が使われるため、読み取り権限だけを付与されたセッションでは、設定にかかわらず書き込みのたびに403エラーが発生します)。保存されたトークンは、read_onlyのオン・オフにかかわらずメールを送信できます。また、read_onlyを有効にする前に同意したセッションには、引き続き書き込みスコープが残ります。
理解しておくべき点は次の2つです。
read_onlyはテキストファイル内の設定です。~/.outlook-mcp/config.jsonを編集できるものは、これをオフにしてすぐに書き込み権限を得られます。再認証も、新たな同意画面も必要ありません。- 制御はこのサーバーのPythonコード内で行われます。キャッシュされたトークンを保持する別のプロセスには影響しません。
そのため、read_onlyはエージェントが軽率な操作をするのを防ぐためのガードレールとして扱い、セキュリティ境界とはみなさないでください。実際に書き込みができない認証情報が必要な場合は、こちらではなくMicrosoft側で制限してください。
-
Azureアプリをもう1つ登録し、読み取り権限だけを付与します:
Mail.Read、Calendars.Read、Contacts.Read、Tasks.Read、MailboxSettings.Read、User.Read。このアカウントが書き込みアクセスを許可したことのないアプリである必要があります。Microsoftはアプリごとに同意を記憶し、更新時にはそのアプリにこれまで付与されたすべての権限を返します。 -
client_idをこのアプリに設定し、次の両方のキーを設定します。{ "client_id": "<the read-only app>", "read_only": true, "read_only_consent": true } -
outlook-mcp authを実行します。read_only_consentを設定すると、同意画面には読み取り権限だけが表示されます。設定しない場合、このアプリでもサインイン時に読み取りと書き込みの権限一式を求められます。
read_only: trueを設定せずにread_only_consentを指定すると拒否されます。読み取りアクセスだけを求めてサインインした場合、書き込みはできないため、書き込みを想定するサーバーでは毎回エラーが発生します。また、サインインは実行時に使用したアプリに紐づきます。client_idを変更すると、サーバーは古いアプリを使用しなくなります。再度outlook-mcp authを実行するまでは、outlook-mcp statusとoutlook_auth_statusにその旨が表示されます。
細かな書き込み権限(任意)
デフォルトでは、read_only: false にするとすべての書き込みツールが有効になります。より細かく制御するには、allow_categories を設定して、書き込みアクセスを特定のカテゴリに制限します。読み取りツール(一覧表示、検索、取得)は常に許可されます。allow_categories は書き込み可能な範囲のみを制限します。
利用可能なカテゴリ:
| カテゴリ | ツール | リスク |
|---|---|---|
mail_drafts | 下書きの作成/更新/削除、下書きへの添付/下書きからの削除 | 安全 — 下書きのみで、送信はしません |
mail_triage | 移動、削除(ソフト削除)、フラグ設定、分類、既読にする、コピー、一括処理、再分類、優先受信トレイの上書き設定/削除 | 中程度 — 完全削除を除き、取り消し可能です |
mail_folders | フォルダーの作成/名前変更/削除 | 中程度 |
mail_send | 送信、返信、転送、下書きの送信、添付ファイル付きで送信 | 危険 — あなたに代わってメールを送信します |
calendar_write | イベントの作成/更新/削除、出欠の返信、イベントファイルの添付/削除 | 中程度 — あなた自身のカレンダーが対象ですが、outlook_attach_to_event は attachments_dir からローカルファイルを読み込み、そのバイト列を Graph に送信します。他の人にメールで伝えるエージェント作成のテキストを含む操作には、mail_send も必要です。これには、参加者の招待、参加者がすでに設定されているイベントの文面(件名、本文、場所)の変更、そのようなイベントへのファイルの添付(次回の更新時に参加者へ送信されます)、出欠の返信へのメッセージ追加が含まれます。出欠だけの返信、時刻の変更、キャンセルでも関係者に通知されますが、エージェントが作成した内容は含まれません |
contacts_write | 連絡先の作成/更新/削除 | 中程度 |
todo_write | タスクやチェックリスト項目の作成/更新/完了/削除、タスク添付ファイルのアップロード/削除 | 中程度 — あなた自身のタスクリストが対象ですが、outlook_upload_task_attachment は attachments_dir からローカルファイルを読み込み、そのバイト列を Graph に送信します。また、タスク/チェックリスト/添付ファイルの削除は取り消せません。添付ファイルの一覧表示とダウンロードは通常の読み取り操作であり、他のすべての読み取りと同様にアクセス制限はありません(つまり、制限されません)。また、attachments_dir の範囲内に制限されています |
ポリシーの例:
下書き専用アシスタント(エージェントが下書きを作成し、あなたが確認して送信します):
{ "read_only": false, "allow_categories": ["mail_drafts", "mail_triage", "todo_write"] }
(todo_write には、書き込み側のタスク添付ファイル用ツールも含まれます。attachments_dir からのファイル読み込み、Graph へのアップロード、取り消せない削除が対象です。タスク添付ファイルの一覧表示とダウンロードは読み取り操作であり、メール添付ファイルの読み取りと同様に、書き込み権限による制限はありません。)
カレンダーのみ(エージェントは予定を管理できますが、それ以外はできません):
{ "read_only": false, "allow_categories": ["calendar_write"] }
(他の人を招待することはできません。招待はメールなので、参加者を招待するには mail_send も必要です。自分の時間を確保するだけでなく、エージェントに他の人との会議を設定させる場合は、これも追加してください。)
すべての書き込みを許可(エージェントはすべての操作を実行できます):
{ "read_only": false }
読み取り専用(最も安全なデフォルト設定で、書き込みはできません):
{ "read_only": true }
allow_categories が設定されている場合、許可されていないカテゴリのツールは、ブロックされたカテゴリ名を示す権限拒否エラー(PermissionDeniedError)を返します。allow_categories が空(または未設定)で、read_only が false の場合、すべての書き込みツールが許可されます。read_only: true は常に優先されます。設定されている場合、allow_categories に関係なく、すべての書き込みがブロックされます。不明なカテゴリ名は設定の読み込み時に検証エラーとなり、上記の7つの名前のみ使用できます。
プライバシーとセキュリティ
- テレメトリーはゼロです。 分析、追跡、利用データの収集は一切ありません。
- ローカルキャッシュはゼロです。 すべての呼び出しは Microsoft Graph に直接送信されます。メールやカレンダーのデータをローカルに保存しません。(例外が1つあります。To Do の既定のリスト ID はプロセスごとに一度だけ解決され、セッション中保持されます。これはコンテンツではなく ID です。
outlook_list_tasksを参照してください。) - サードパーティへの呼び出しはゼロです。 サーバーは
graph.microsoft.comとlogin.microsoftonline.comとのみ通信します。 - トークンの保存。 OAuth トークンは
azure-identityのTokenCachePersistenceOptionsを使用して永続化されます。macOS では OS の Keychain、Windows では DPAPI、PyGObject/libsecret を利用できる Linux では gnome-keyring が使用されます。libsecret がない Linux(たとえば、uv tool installで作成された分離された仮想環境)では、allow_unencrypted_token_cacheがtrueでない限り、サーバーはトークンの永続化を拒否します。有効にした場合は、~/.IdentityService/にある0600の平文ファイルにフォールバックし、MCP は起動時に一度だけ警告をログに記録します。Linux で暗号化ストレージを使用するには、python3-gi gnome-keyring libsecret-1-0をインストールし、--system-site-packagesを指定して仮想環境を再作成してください。 - 機密データのログ記録はありません。 メッセージ本文、宛先アドレス、トークンがログに記録されることはありません。
- 設定ファイルの権限。 macOS と Linux では、設定ディレクトリが
0700、設定ファイルが0600で作成され、ファイルの権限が緩すぎる場合は読み込み時に修正されます。Windows ではこれらの POSIX 権限を適用できず、os.chmodが設定するのは読み取り専用属性のみです。そのため、アクセスはパスの Windows ACL によって制御されます。これには、作成元のディレクトリから継承される設定も含まれますが、このサーバーは ACL を適用も検証もしません。シンボリックリンクされた設定ファイルは、すべてのプラットフォームで拒否されます。 - 入力の検証。 すべてのユーザー入力(メールアドレス、Graph ID、OData フィルター、KQL クエリ、日時)は、Graph API に送信される前に検証およびサニタイズされます。
- HTTP トランスポート(オプトイン)。 メールボックスにアクセスできるユーザーが変わります。バインドごとにベアラートークンが必要となり、リクエストごとに検証されます。また、サーバーはプレーン HTTP で通信するため、TLS は前段のプロキシで処理する必要があります。セキュリティに関する詳細はすべて、リモート/HTTP トランスポートに記載されています。
開発
# Install dev dependencies and the documents extra, as CI does (without it the PDF/XLSX tests skip)
uv sync --all-extras
# Run tests
uv run pytest
# Lint
uv run ruff check src/ tests/ scripts/
# Format (CI fails if `ruff format --check` would change a file)
uv run ruff format src/ tests/ scripts/
# Run server locally (stdio)
uv run outlook-mcp
要件: Python 3.10+
ロードマップ
- 高度なメール機能 -- 生の MIME エクスポート、インターネットメッセージヘッダー
- カレンダー -- イベントのキャンセル(出席者への通知付き)
- 職場/学校アカウント専用ツール -- 空き時間情報、会議の時間、自動応答、共有メールボックス:現時点では予定していません(#133)。今後いずれかを追加する場合は、個人アカウントでは読み込まれないオプトインのグループとして提供します
確定した方針、および調査の結果対象外とした項目(受信トールール、メールボックスの設定)については、ROADMAP.md を参照してください。
ライセンス
MIT。LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。