ms-365-mcp-server
ms-365-mcp-server
Microsoft 365 MCP Server
Microsoft 365 および Microsoft Office のサービスに Graph API 経由でアクセスするための Model Context Protocol (MCP) サーバーです。
注: これは A-Impact の内部ビルドであり、npm には公開されていません。以下の
npx @a-impact/ms365-mcpコマンドは、そのスコープでパッケージを自分で公開した場合にのみ使用できます。このリポジトリから実行する場合は、代わりにnpm install && npm run buildを実行して、ローカル開発で説明されているように MCP クライアントでdist/index.jsを指定してください。
サポートされているクラウド
このサーバーは複数の Microsoft クラウド環境をサポートしています。
クラウド | 説明 | 認証エンドポイント | Graph API エンドポイント |
Global(デフォルト) | 国際版 Microsoft 365 | login.microsoftonline.com | graph.microsoft.com |
China(21Vianet) | 21Vianet が運用する Microsoft 365 | login.chinacloudapi.cn | microsoftgraph.chinacloudapi.cn |
Related MCP server: Microsoft Graph MCP Server
前提条件
Node.js >= 20(推奨)
Node.js 14+ でも依存関係の警告は出ますが動作する可能性があります。
機能
Microsoft Authentication Library (MSAL) による認証
Microsoft 365 サービスとのシームレスな統合
安全な操作のための読み取り専用モードのサポート
細かなアクセス制御のためのツールフィルタリング
出力形式: JSON と TOON
このサーバーは、グローバルに設定できる2つの出力形式をサポートしています。
JSON 形式(デフォルト)
見やすいプリティプリント付きの標準的な JSON 出力:
{
"value": [
{
"id": "1",
"displayName": "Alice Johnson",
"mail": "alice@example.com",
"jobTitle": "Software Engineer"
}
]
}(実験的な)TOON 形式
LLM のトークン効率化のための Token-Oriented Object Notation:
value[1]{id,displayName,mail,jobTitle}:
"1",Alice Johnson,alice@example.com,Software Engineer利点
JSON と比較して 30〜60% トークンが少ない
均一な配列データ(メールの一覧、カレンダーイベント、ファイルなど)に最適
大規模でコストに敏感なアプリケーションに最適
使用方法 (実験的な)TOON 形式をグローバルに有効にする:
CLI フラグを使用する場合:
npx @a-impact/ms365-mcp --toonClaude Desktop 設定を使用する場合:
{
"mcpServers": {
"ms365": {
"command": "npx",
"args": ["-y", "@a-impact/ms365-mcp", "--toon"]
}
}
}環境変数を使用する場合:
MS365_MCP_OUTPUT_FORMAT=toon npx @a-impact/ms365-mcpサポートされているサービスとツール
このサーバーは、Microsoft Graph API の大部分をカバーする 300 以上のツールを提供します。各ツールは Graph API エンドポイントに 1 対 1 で対応しており、src/endpoints.json で宣言ファイルとして定義されています。
個人アカウントツール(デフォルトで利用可能)
メール(Outlook)、カレンダー、OneDrive ファイル、Excel、OneNote、To Do タスク、Planner、連絡先、ユーザープロファイル、検索
組織アカウントツール(--org-mode フラグが必要)
Teams とチャット、オンライン会議、文字起こしと録音、出席レポート、SharePoint サイトとリスト、共有メールボックスとカレンダー、ユーザー管理、プレゼンス、会話イベント
必要な Graph API アクセス許可
アクセス許可は、有効なツールに基づいて動的に要求されます。構成に応じた正確な権限を確認するには、--list-permissions を使用します。
# Personal mode (default)
npx @a-impact/ms365-mcp --list-permissions
# Organization mode (includes Teams, SharePoint, etc.)
npx @a-impact/ms365-mcp --org-mode --list-permissions
# Filtered by preset
npx @a-impact/ms365-mcp --preset mail --list-permissionsこれは、Graph API の権限を新しいバージョンの開発前に事前承認および管理者の同意を得てからデプロイする必要があるエンタープライズ環境で役立ちます。
--list-permissions の JSON には以下が含まれます。
toolPermissions:--allowed-scopesフィルタリング以前のツールサーフェスによって暗黙的に決まる権限effectivePermissions:--allowed-scopes適用後も有効なツールによって暗黙的に決まる権限permissions:effectivePermissionsの従来のエイリアスで、既存のスクリプトとの互換性のために維持allowedScopes: 設定されているスコープの許可リストdisabledTools: 必要な Graph スコープがallowedScopesでカバーされていないために非表示になっているツールmissingAllowedScopesForTools: 無効になっているツール全体で不足している一意のスコープextraAllowedScopesNotUsedByTools: 現在のツールサーフェスで使用されていない許可済みスコープ
許可スコープ
既定では、MSAL は有効なツールが要求するスコープを要求し、ツールサーフェスは --enabled-tools、--preset、--org-mode、--read-only で制御されます。
エンタープライズや自動実行環境では、--allowed-scopes または MS365_MCP_ALLOWED_SCOPES を使用して、スコープ境界を追加できます。構成すると、サーバーは最初に通常のツールサーフェスを計算し、許可リストに含まれない必要なスコープを持つ Graph ツールを非表示にします。OAuth メタデータとログインフローは、有効なツールに対して効果的な権限のみを要求します。
npx @a-impact/ms365-mcp \
--org-mode \
--enabled-tools '^(list-mail-messages|get-mail-message|list-drives|get-drive-item|download-bytes)$' \
--allowed-scopes 'User.Read Mail.Read Files.Read'CLI の値は MS365_MCP_ALLOWED_SCOPES よりも優先されます。どちらも設定されていない場合、デフォルトのツール由来のスコープ動作は変更されません。空の値を指定すると起動時に失敗するため、誤って広いツールサーフェスにフォールバックしたものにしません。
スコープのカバレッジは階層を認識します。たとえば、Mail.ReadWrite は Mail.Read を必要とするツールをカバーし、Files.ReadWrite.All は Files.Read を必要とするツールをカバーします。
SharePoint では、エンタープライズ権限モデルが2つのサポートされています。
Sites.Read.AllやSites.ReadWrite.All、Sites.Manage.Allのような広範なテナントスコープ。Microsoft Graph の
Sites.Selectedを使用すると、特定のサイト コレクションでアプリに SharePoint サイトへのアクセスが許可され、Graph は要求時に対象ユーザー自身の権限を評価します。
デフォルトの org モードの動作は、既存の配置で使用される幅広い SharePoint スコープを引き続き要求します。選択したサイトの SharePoint アクセスを必要とするエンタープライズでは、広範な Sites.*.All スコープの代わりに、Sites.Selected を含む許可リストを設定できます。特定の SharePoint サイトを直接対象としたサイト/リスト/アイテムツールは Sites.Selected で実行できます。テナント全体 SharePoint の検出ツールと検索ツールは、引き続き広範な SharePoint スコープが必要です。
npx @a-impact/ms365-mcp \
--org-mode \
--read-only \
--enabled-tools 'sharepoint|site|drive|planner' \
--allowed-scopes 'User.Read Files.Read Notes.Read Tasks.Read Sites.Selected'HTTP モードでは、OAuth ディスカバリは有効なフィルタリングされた権限をアドバタイズするため、クライアントは同じ同意サーフェスを要求します。On-Behalf-Of モード(--obo)は、保護リソースのメタデータとして api://<clientId>/access_as_user を今後もアドバタイズします。--allowed-scopes は OBO を上書きしません。
追加スコープの要求
--allowed-scopes でできるのは、トークンの要求を狭めることだけです。バンドルされているツールが必要としない Graph スコープを要求する場合(graph-batch でエンドポイントを駆動する場合など)は、--extra-scopes または MS365_MCP_EXTRA_SCOPES を使用します。これらのスコープは、ツール由来のスコープに加えて、トークン要求にそのまま追加されます。
npx @a-impact/ms365-mcp \
--org-mode \
--extra-scopes 'CopilotPackages.ReadWrite.All'これは、独自の Azure アプリ登録(MS365_MCP_CLIENT_ID / MS365_MCP_CLIENT_SECRET)で使用するためのものです。既定の upstream アプリは制限された固定的な権限セットのみを宣言しているため、追加スコープを自分が管理してあるアプリに対して要求してください(テナント管理者がそのアプリで同意します)。CLI の値は環境変数より優先されます。空の値は起動時に失敗します。
組織/業務モード
職場/学校の機能 (Teams、SharePoint など) にアクセスするには、次のいずれかのフラグを使用して組織モードを有効にします。
{
"mcpServers": {
"ms365": {
"command": "npx",
"args": ["-y", "@a-impact/ms365-mcp", "--org-mode"]
}
}
}職場アカウント機能にアクセスするには、最初に組織モードを有効にする必要があります。このモードがないと、個人アカウント機能(メール、カレンダー、OneDrive など)のみ利用できます。
共有メールボックスへのアクセス
共有メールボックスにアクセスするには、次の必要があります。
組織モード:共有メールボックスツールには
--org-modeが必要です(職場/学校アカウントのみ)委任されたアクセス許可:読み取りは
Mail.Read.Shared、作成・更新・移動にはMail.ReadWrite.Shared、送信・返信・転送にはMail.Send.Shared、共有カレンダーツールにはCalendars.Read.SharedExchange のアクセス許可:サインインしているユーザーに共有メールボックスのアクセス権が付与されていること
使用方法:共有メールボックスの電子メールアドレスを、共有メールボックスツールの
user-idパラメータとして使用します
共有メールボックスの検索方法:list-users ツールを使用して、組織内のユーザーと共有メールボックスを確認します。
例:list-users に user-id を shared-mailbox@company.com として指定すると、共有メールボックスのメッセージを一覧表示します。
クイック スタート例
Claude Desktop でログインをテストします。
例
連携
Claude Desktop
Claude Desktop にこの MCP サーバーを追加するには、設定 > 開発者 メニューで設定ファイルを編集します。
個人アカウント (MSA)
{
"mcpServers": {
"ms365": {
"command": "npx",
"args": ["-y", "@a-impact/ms365-mcp"]
}
}
}職場/学校アカウント (Global)
{
"mcpServers": {
"ms365": {
"command": "npx",
"args": ["-y", "@a-impact/ms365-mcp", "--org-mode"]
}
}
}職場/学校アカウント (China 21Vianet)
{
"mcpServers": {
"ms365-china": {
"command": "npx",
"args": ["-y", "@a-impact/ms365-mcp", "--org-mode", "--cloud", "china"]
}
}
}Claude Code CLI
個人アカウント (MSA)
claude mcp add ms365 -- npx -y @a-impact/ms365-mcp職場/学校アカウント (Global)
# macOS/Linux
claude mcp add ms365 -- npx -y @a-impact/ms365-mcp --org-mode
# Windows (use cmd /c wrapper)
claude mcp add ms365 -s user -- cmd /c "npx -y @a-impact/ms365-mcp --org-mode"職場/学校アカウント (China 21Vianet)
# macOS/Linux
claude mcp add ms365-china -- npx -y @a-impact/ms365-mcp --org-mode --cloud china
# Windows (use cmd /c wrapper)
claude mcp add ms365-china -s user -- cmd /c "npx -y @a-impact/ms365-mcp --org-mode --cloud china"MCP をサポートする他のインターフェイスの場合、それぞれのドキュメントを参照して正しい統合方法を確認してください。
Open WebUI
Open WebUI は、HTTP トランスポートと OAuth 2.1 を介した MCP サーバーをサポートしています。
HTTP モードでサーバーを起動します。
npx @a-impact/ms365-mcp --httpOpen WebUI で、Admin Settings → Tools を開きます (
/admin/settings/tools) → Add Connection:Type: MCP Streamable HTTP
URL:
/mcpへのパスを含む MCP サーバーの URLAuth: OAuth 2.1
Register Client クリックします。
注意: HTTP モードでは、動的クライアント登録はデフォルトで有効です。無効にするには
--no-dynamic-registration(またはMS365_MCP_DISABLE_DCR=true) を使用します。カスタム Azure Entra アプリを使用する場合、リダイレクト URI のプラットフォームタイプは、クライアントシークレットがあるかどうかによって異なります。シークシークレットがある場合は "Web"、ない場合は "Mobile and desktop applications" を使用します("Singleप्र" を使用しないでください)。
簡単なテスト設定 デフォルトの Azure アプリ (ID ms-365 と localhost:8080 は事前構成済み) を使用します。
docker run -d -p 8080:8080 \
-e WEBUI_AUTH=false \
-e OPENAI_API_KEY \
ghcr.io/open-webui/open-webui:main
npx @a-impact/ms365-mcp --http次に、URL http://localhost:3000/mcp と ID ms-365 に接続を追加します。
**リバース プロキシを組み合わせた Docker で実行中?」 コンテナネットワーク外からアクセスできるように、
--public-url https://your-domain.comを設定します。詳細は docs/deployment.md を参照してください。
ローカル開発
ローカル開発やテストの場合:
# From the project directory
claude mcp add ms -- npx tsx src/index.ts --org-modeまたは Claude Desktop を手動で構成する場合:
{
"mcpServers": {
"ms365": {
"command": "node",
"args": ["/absolute/path/to/ms-365-mcp-server/dist/index.js", "--org-mode"]
}
}
}注意: コード変更後は、
npm run buildを実行してdist/フォルダを更新してください。
認証
⚠️ ツールを使用する前に認証する必要があります。
サーバーは3つの認証方法をサポートしています。
1. デバイス コードフロー(デフォルト)
デバイスコードによる対話的な認証:
MCP クライアントのログイン:
loginツールを呼び出し(既存のトークンは自動確認されます)必要に応じて、URL とコードを取得し、ブラウザで開きます。
verify-loginツールで確認します。
CLI のログイン:
npx @a-impact/ms365-mcp --loginターミナルに表示される URL とコードに従います。
トークンは OS の資格情報ストアに安全にキャッシュされます (フォールバックとしてファイル)。
2. OAuth 認可コード フロー(HTTP モードでのみ)
--http で実行する場合、サーバーは OAuth 認証が必要です。
npx @a-impact/ms365-mcp --http 3000このモードでは:
OAuth 対応を MCP クライアントにアドバタイズします
/auth/*に OAuth エンドポイントを提供します(authorize、token、metadata)すべての MCP リクエストに
Authorization: Bearer <token>が必要ですMicrosoft Graph API でトークンを検証します
デフォルトで login/logout ツールを無効にします(有効にするには
--enable-auth-tools)
MCP クライアントは、アドバタイズされた機能を検出すると、自動的に OAuth フローを処理します。
OAuth テスト用の Azure AD のセットアップ
OAuth モードをカスタム Azure 認証情報(本番環境の推奨)で使用するには、Azure AD アプリ登録を設定する必要があります。
Azure AD アプリを作成します:
Azure ポータル にアクセスします。
Azure Active Directory → アプリの登録 → 新しい登録 に移動します。
Name: "MS 365 MCP Server" と設定します。
リダイレクト URI を構成します:
OAuth コールバック URI を設定する: アプリの登録画面で、左側の「認証」に移動します。
プラットフォーム構成の場合:
「プラットフォームを追加」をクリックします(「Mobile and desktop applications」/「Public client」がまだ表示されていない場合)。
「Mobile and desktop applications」または「Public client/native (mobile & desktop)」のいずれかを選択します(ラベルはポータルのバージョンによって異なります)。
MCP Inspector でのテスト(
npm run inspector):
アプリの登録画面で、左側の「認証」に移動します。
プラットフォーム構成の場合:
「プラットフォームを追加」をクリックします(「Web」がまだ表示されていない場合)。
「Web」を選択します。
次のリダイレクト URI を構成します:
http://localhost:6274/oauth/callbackhttp://localhost:6274/oauth/callback/debughttp://localhost:3000/callback(オプション、サーバーコールバック用)
資格情報を取得する:
概要ページからアプリケーション(クライアント)ID をコピーします
「証明書とシークレット」→「新しいクライアントシークレット」→シークレットの値をコピーします(パブリックアプリではオプション)
環境変数を設定する: プロジェクトのルートに
.envファイルを作成します。MS365_MCP_CLIENT_ID=your-azure-ad-app-client-id-here MS365_MCP_CLIENT_SECRET=your-secret-here # Optional for public apps MS365_MCP_TENANT_ID=common
これらを設定すると、サーバーは組み込みアプリではなく、カスタム Azure アプリを使用します。
注:
.envはサーバーが起動されたディレクトリから読み取られ、そのディレクトリがどこになるかは MCP クライアントが決定します。 読み取られるのはMS365_MCP_CLIENT_ID、MS365_MCP_CLIENT_SECRET、MS365_MCP_TENANT_ID、MS365_MCP_CLOUD_TYPEのみです。上記の他の変数はすべてシェルまたは MCP クライアントの設定で設定する必要があります。.envにある他の内容は無視され、stderr で警告を表示します。
3. Bring Your Own Token(BYOT)
ms-365-mcp-server を、Microsoft OAuth トークンを外部で管理する大規模なシステムの一部として実行している場合は、この MCP サーバーにアクセス トークンを直接提供できます。
MS365_MCP_OAUTH_TOKEN=your_oauth_token npx @a-impact/ms365-mcpこの方法は:
対話型認証フローをバイパスします
Microsoft Graph API のリクエストには既存の OAuth トークンを使用します
トークンの更新は処理しません(トークンのライフサイクル管理は利用者の責任です)
注: HTTP モードでは認証が必要です。未認証のテストには、stdio モードとデバイスコードフローを使用してください。
認証ツール: HTTP モードでは、OAuth が認証を処理するため、ログイン/ログアウトツールは既定では無効です。 それらを必要とする場合は
--enable-auth-toolsを使用してください。
マルチアカウントサポート
単一のサーバー インスタンスで複数の Microsoft アカウントを扱えます。複数のアカウントがログインしている場合、account パラメーターがすべてのツールに自動的に注入され、ツール呼び出しごとに使用するアカウントを指定できます。
複数アカウントへログイン(アカウントごとに 1 回):
# Login first account (device code flow)
npx @a-impact/ms365-mcp --login
# Follow the device code prompt, sign in as personal@outlook.com
# Login second account
npx @a-impact/ms365-mcp --login
# Follow the device code prompt, sign in as work@company.com構成済みアカウントの一覧を表示:
npx @a-impact/ms365-mcp --list-accountsツール呼び出しで使用: 任意のツール リクエストで "account": "work@company.com" を渡します:
{ "tool": "list-mail-messages", "arguments": { "account": "work@company.com" } }動作:
単一 アカウントが設定されている場合は、自動で選択されます(
accountパラメータは不要)。複数 アカウントで
accountパラメータがない場合、サーバーは既定の選択済みアカウントを使用するか、利用可能なアカウントを一覧表示したエラーを返します。100% 後方互換性: 既存の単一アカウント構成は変更不要で動作します。
accountパラメータは、メール アドレス(例:user@outlook.com)または MSAL のhomeAccountIdを受け入れます。
厳密なアカウント固定
ヘッドレスな stdio デプロイでは、ローカル MSAL キャッシュを 1 つの予期される Microsoft アカウントに固定できます。
# Username matching is case-insensitive
MS365_MCP_EXPECTED_USERNAME=work@company.com npx @a-impact/ms365-mcp --login
# Or pin the exact MSAL homeAccountId shown by --list-accounts
npx @a-impact/ms365-mcp --expected-home-account-id <homeAccountId> --login--list-accounts を使用して homeAccountId の値を確認します。MCP の list-accounts ツールはアカウント ID を意図的に隠すため、正確な ID の固定には CLI を使用してください。
ピン固定はオプトインであり、ローカル MSAL のみ:
CLI の値(
--expectedَusername、--expected-home-account-id)はMS365_MCP_EXPECTED_USERNAMEとMS365_MCP_EXPECTED_HOME_ACCOUNT_IDよりも優先されます。空のピン値を指定すると、無視されるのではなく起動時に失敗します。
ユーザー名のピンは大文字と小文字を区別して比較します。
homeAccountIdのピンは完全一致です。両方のピンを設定する場合は、同じキャッシュ済みアカウントに解決される必要があります。
予期されたアカウントがトークン キャッシュにない場合、ローカル stdio の起動は即座に失敗します。ピンを設定し、
--loginを実行してから、ヘッドレス サーバーを起動してください。デバイスコードおよびブラウザーでのログインは、選択したアカウントやトークン キャッシュを保存する前に、ピンとの欠落または不一致を拒否します。
ピン留めにより、実効 MCP モードはアカウント数のモードになります: サーバーは
accountパラメータを公開せず、MCP の手順もアカウントの切り替えを提案しません。--http、--obo、MS365_MCP_OAUTH_TOKENは Graph 呼び出しにリクエスト提供のトークンを使用するため、これらのモードではアカウントのピン留めは警告のみになります。HTTP 認証ツールが有効な場合は、ピン留めはそれらのローカルMSALヘルパーフローにも引き続き適用されます。--list-accountsを消去する--logoutは、ピン留めされたアカウントを含むすべてのキャッシュ済みアカウントをクリアします。部分的なクリーンアップには--remove-account <id>を推奨します。
MCP マルチプレクサー(英語版: Greate、Governor)に向けて: マルチアカウントモードは“N プロセス”方式の代替です。各アカウントにサーバーを生成するのではなく、単一インスタンスが
accountパラメータで全アカウントを処理するため、ツールの重複を N×110 から 110 に減らします。
ツール プリセット
初期接続のオーバーヘッドとトークン使用量を削減するため、完全なツールセットを読み込む代わりに、プリセット ツール カテゴリを使用します。
npx @a-impact/ms365-mcp --preset mail
npx @a-impact/ms365-mcp --list-presets # See all available presets利用可能なプリセット: mail、calendar、files、personal、work、excel、contacts、tasks、onenote、search、users、outlook、onedrive、teams、teams-write、all
endpoints.json 内の各エンドポイントは presets 配列を使用して所属プリセットを宣言するため、各プリセットはツール名の正確な許可リストとなり、アプリ間での過剰一致は発生しません(例: mail には共有メールボックスツールは含まれず、これらは work に含まれます)。ユニバーサルバイナリリーダー download-bytes は teams-write を除くすべてのプリセットに含まれているため、アプリが返すもの(ファイル、添付ファイル、写真、録音)は常に取得できます。get-download-url(drive/SharePoint ファイルの事前認証 URL)はドライブ対応プリセットに同梱されます。つまり、ファイルを特定できるプリセットは必ずそのバイトデータを読み取れます。
outlook、onedrive、teams の各プリセットはアプリ固有で、1 つの Microsoft アプリのみを公開します。これらは「アプリを正確に 1 つだけ公開する」というデプロイに使用します:
# Outlook only (mail + calendar + contacts; no shared mailboxes, no files)
npx @a-impact/ms365-mcp --preset outlook
# Teams only (requires --org-mode)
npx @a-impact/ms365-mcp --org-mode --preset teamsteams-write プリセットは --read-only の送信専用版です。チャットで送信、チャネルでの送信/返信、名前によるチャット/チーム/チャネルの一覧表示、アクティビティ通知を行いますが、メッセージの読み取りやバイト単位のダウンローダーは含まれません。要求されるトークンは設計上最小限です(Chat.ReadBasic、 *.Send スコープ、基本的なチーム/チャネルのリスト表示で、メッセージ内容を読み取るものはありません)。
npx @a-impact/ms365-mcp --org-mode --preset teams-write動的ツールディスカバリ
全ツールを事前に読み込む代わりに、動的ディスカバリを使用すると、LLM が必要なときだけツールを検出して読み込むことができます:
npx @a-impact/ms365-mcp --discovery初期のコンテキストを小さく維持し、トークン使用量を削減できるため、長時間のセッションやコスト重視の環境(有料 API で動く Open WebUI など)で特に役立ちます。
CLI オプション
ms-365-mcp-server をコマンドラインから直接実行する場合、以下のオプションを使用できます:
--login Login using device code flow
--logout Log out and clear saved credentials
--verify-login Verify login without starting the server
--list-permissions List required Graph API permissions and exit (respects --org-mode, --preset, --enabled-tools, --allowed-scopes)
--org-mode Enable organization/work mode from start (includes Teams, SharePoint, etc.)
--work-mode Alias for --org-mode
--force-work-scopes Backwards compatibility alias for --org-mode (deprecated)
--cloud <type> Microsoft cloud environment: global (default) or china (21Vianet)
--allowed-scopes <scopes> Limit exposed tools to Graph scopes covered by this allowlist
--extra-scopes <scopes> Append additional Graph scopes to the token request (for use with your own app registration + graph-batch)
--expected-username <username> Require local MSAL auth to use this account username
--expected-home-account-id <id> Require local MSAL auth to use this exact homeAccountIdサーバーオプション
MCP サーバーとして実行する場合、以下のオプションを使用できます:
-v Enable verbose logging
--read-only Start server in read-only mode, disabling write operations
--http [port] Use Streamable HTTP transport instead of stdio (optionally specify port, default: 3000)
Starts Express.js server with MCP endpoint at /mcp
--enable-auth-tools Enable login/logout tools when using HTTP mode (disabled by default in HTTP mode)
--no-dynamic-registration Disable OAuth Dynamic Client Registration (enabled by default in HTTP mode)
--enabled-tools <pattern> Filter tools using regex pattern (e.g., "excel|contact" to enable Excel and Contact tools)
--preset <names> Use preset tool categories (comma-separated). See "Tool Presets" section above
--list-presets List all available presets and exit
--toon (experimental) Enable TOON output format for 30-60% token reduction
--discovery Dynamic tool discovery: loads tools on demand to reduce initial token usage (see "Dynamic Tool Discovery" above)
--public-url <url> Public base URL for OAuth when behind a reverse proxy (see Open WebUI section and docs/deployment.md)環境変数:
READ_ONLY=true|1:--read-onlyフラグの代替ENABLED_TOOLS: 正規表現パターンでツールをフィルター(--enabled-toolsフラグの代替)MSGRaph365_MCP_ORG_MODE=true|1: 組織/仕事モードを有効にします(--org-modeフラグの代替)MS365_MCP_ORG_MODEの後方互換性(MSGRaph365_MCP_FORCE_WORK_SCOPES=true|1)MS365_MCP_OUTPUT_FORMAT=toon: TOON 出力形式(--toonフラグの代替)MS365_MCP_MAX_TOP=<n>: リストリクエストの Graph$top/topの上限(正の整数)。モデルが大きい値を渡した場合、サーバーはnにクランプして応答を小さくします。例:MS365_MCP_MAX_TOP=15MS365_MCP_MAX_PAGES=<n>:fetchAllPages: trueで呼び出されたとき追跡する最大ページ数(正の整数、既定100)。大きな結果セットのメモリとレイテンシを制限します。MS365_MCP_MAX_ITEMS=<n>:fetchAllPages: trueで累積するアイテム数の上限(正の整数、既定10000)。この数に達するとページングは停止し、応答は切り捨てられます。MS365_MCP_ALLOW_PAGINATION=0|false|no: マルチページの追従を完全に無効にします、設定時、fetchAllPagesパラメータはツールで通知されなくなり、渡っても最初のページのみ返します(既定: ページング有効)。MS365_MCP_BODY_FORMAT=html: メール本文をプレーンテキストではなく HTML で返します(既定: text)MS365_MCP_MESSAGE_SIGNOFF_PREFIX=<text>: 送信メッセージに前置する署名(受信者がエージェント送信と分かるようにするため、例:🤖)。既定: なし。CLI 相当:--message-signoff-prefix <text>(後述「message signoff」参照)MS365_MCP_MESSAGE_SIGNOFF_SUFFIX=<text>: 送信メッセージに後置する署名。既定:なし。CLI 相当:--message-signoff-suffix <text>。--no-message-signoffで両方無効(後述「message signoff」参照)MS365_MCP_RATE_LIMIT_DISABLED=true|1: HTTP モードの IP ごとのレート制限を無効にします(既定: 有効 —/authorize、/token、/registerで 30 リクエスト/分、/mcpで 120 リクエスト/分)MS365_MCP_TRUST_PROXY_HOPS=<n>: HTTP モードで信頼するリバール—プロキシホップ数(既定1)。正確なIP帯域の速度制限はデプロイと一致する必要があります。サーバーの前にあるプロキシ数を指定、0は生ソケットのピア IP、またはカンマ区切りのサブネットリストMS365_MCP_CLOUD_TYPE=global|china: Microsoft クラウド環境(--cloudフラグの代替)LOG_LEVEL: ログレベルを設定(既定: 'info')SILENT=true|1: コンソール出力を無効にしますMS365_MCP_REDACT_PII=false|0: ログからの JWT、Bearer ヘッダー、OAuth トークン フィールド、メール アドレスの排除を無効にします(既定: 有効)。サーバーは生の Graph ベアラートークンを扱うため、フル verbose のローカルデバッグを明示的に選択しない限り、マスキングは有効です。MS365_MCP_CLIENT_ID: カスタム Azure アプリのクライアント ID(既定は組み込みアプリ)MS365_MCP_TENANT_ID: カスタム テナント ID(既定はマルチテナントのcommon)。個人用 Microsoft アカウントはこれをconsumersに設定してください(2026年6月現在、既定のcommonauthority で発行されたリフレッシュ トークンは最初のリフレッシュで拒否されるため、セッションはログイン後約 1 時間で終了します)MS365_MCP_OAUTH_TOKEN: Microsoft Graph API 用の既存の OAuth トークン(BYOT 方式)MS365_MCP_KEYVAULT_URL: シークレット管理用の Azure Key Vault URL(「Azure Key Vault」セクション参照)MS365_MCP_TOKEN_CACHE_PATH: MSAL トークン キャッシュのカスタム ファイル パス(「トークンストレージ」参照)MS365_MCP_SELECTED_ACCOUNT_PATH: 選択済みアカウントのメタデータのカスタム ファイルパス(「トークンストレージ」参照)MS365_MCP_AUTH_CACHE_COMMAND: プロバイダーには依存しない認証キャッシュストレージ用の外部実行ラッパー(「トークンストレージ」参照)MS365_MCP_AUTH_CACHE_COMMAND_TIMEOUT_MS:MS365_MCP_AUTH_CACHE_COMMANDの 1 回の呼び出しタイムアウト(既定:10000)MS365_MCP_EXPECTED_USERNAME: ローカル MSAL 認証をこの Microsoft アカウントのユーザー名で固定します(大文字小文字は無視、CLI フラグが優先) *COUNT_ACCOUNT_EXPECTED_HOME_ACCOUNT_ID: ローカル MSAL 認証でこの正確な MSAL homeAccountId を使うことを要求します(CLI フラグが優先)
トークンストレージ
認証トークンは暗号化ファイル(AES-256-GCM)に保存されます。32 バイトの暗号化キーのみが keytar を介して OS の資格情報ストアに保存されます。
キャッシュ自体は一部の資格情報ストアには大きすぎます。Windows Credential Manager の blob は 2560 バイトが上限で、実際のトークン キャッシュはその数倍になるため、Windows では書き込みができません。キーは サインインしているアカウント数に関係なく 32 バイトなので、すべてのスクラムフォームで同じように機能します。
既定のパス はユーザーごとの構成ディレクトリにあります:
プラットフォーム | 場所 |
Windows |
|
macOS |
|
Linux |
|
以前のバージョンでは、インストールされたパッケージ内のパスが既定値でした。npx では、これはコンテンツハッシュされたキャッシュディレクトリに解決され、npm cache clean やバージョンアップによって破棄されます。パッケージディレクトリに残っているキャッシュは、初回起動時に新しい場所へ移動されます。
これによって、グローバルインストール、ローカルインストール、およびハッシュが変わっていない場合の npx が対象になります。以前の npx ハッシュディレクトリに残されたキャッシュには到達できないため、npx インストールを最後にもう一度アップグレードする際には再サインインが必要です。別のディレクトリからキャッシュを取り込むということは、このパッケージが自分で書き込んだことを証明できないディレクトリを信頼することになり、サインインが1回省けるという価値はありません。
必要に応じてパスを上書きできます:
export MS365_MCP_TOKEN_CACHE_PATH="$HOME/.config/ms365-mcp/.token-cache.json"
export MS365_MCP_SELECTED_ACCOUNT_PATH="$HOME/.config/ms365-mcp/.selected-account.json"親ディレクトリは自動的に作成されます。ファイルは 0600 パーミッションで書き込まれます。
資格情報ストアがない場合(ヘッドレスLinux、ほとんどのコンテナ)では、キーはキャッシュファイルの隣に .cache-key として 0600 パーミッションで書き込まれます。これにより、トークンがうっかり cat、バックアップ、または偶発的なコミットに表示されるのを防げます。ただし、すでにディレクトリを読み取れる人からの保護にはなりません。キーはそこにあるからです。キャッシュを本格的なシークレットストアに置く必要がある場合は、下記の MS365_MCP_AUTH_CACHE_COMMAND を使用してください。
キャッシュを復号できない場合(鍵の紛失、キーチェーンのロック、ファイルの変更)は、サーバーが起動に失敗するのではなく、再サインインを求められます。キャッシュファイルは、削除もされず、新しいサインインで上書きもされず、そのままの状態で残されます。単にロックされているだけのキーチェーンは、通常次の起動時に問題なく読み取られ、そのときにはキャッシュもまだそこに存在します。
その間は、新しいセッションが保存されないため、起動のたびに再サインインを求められます。鍵が本当に失われてキャッシュが二度と開かない場合は、.token-cache.json を削除してやり直してください。ログにその旨とパスが記載されます。
ホスト型/サンドボックス環境(例: Anthropic Cowork): トークンがセッション間で保持されるように、
MS365_MCP_TOKEN_CACHE_PATHとMS365_MCP_SELECTED_ACCOUNT_PATHを永続マウントに設定してください。
外部 auth-cache コマンド
ヘッドレスのローカルMSALデプロイメントでは、組み込みの keytar/ファイルストレージの代わりに、プロバイダに依存しない外部コマンドを使用できます:
export MS365_MCP_AUTH_CACHE_COMMAND="/path/to/ms365-auth-cache-store"
export MS365_MCP_AUTH_CACHE_COMMAND_TIMEOUT_MS=10000MS365_MCP_AUTH_CACHE_COMMAND がローカル認証フロー用に設定されている場合、サーバーはそのコマンドのみを MSAL トークンキャッシュと選択済みアカウントメタデータに使用します。keytar やローカルファイルにはフォールバックしません。コマンドパスが存在しない、POSIX で実行可能でない、非ゼロの終了コードを返す、タイムアウトする、または不正な形式のデータを返す場合、auth-cache 操作はサニタイズされたエラーメッセージとともにフェイルクローズします。
値は実際の実行可能ラッパーパスでなければなりません。シェルのコマンド文字列ではなく、引数用の環境変数も存在しません。インタープリタ、リージョン、プロファイル、プロバイダー固有の設定は、すべてラッパー内に置いてください。Windows ユーザーは、Node がシェル解析を介さずに直接起動できるラッパー実行可能ファイルかスクリプトを変数に指定してください。
サーバーは次のようにラッパーを起動します:
$MS365_MCP_AUTH_CACHE_COMMAND load token-cache
$MS365_MCP_AUTH_CACHE_COMMAND save token-cache
$MS365_MCP_AUTH_CACHE_COMMAND delete token-cache
$MS365_MCP_AUTH_CACHE_COMMAND load selected-account
$MS365_MCP_AUTH_CACHE_COMMAND save selected-account
$MS365_MCP_AUTH_CACHE_COMMAND delete selected-accountプロトコル v1:
load <key>は標準入力を読み取りません。値が存在する場合は{"found":true,"value":"<stored envelope string>"}を出力し、終了コード0とします。存在しない場合は、終了コード0で{"found":false}または空の標準出力を返します。save <key>は標準入力から{"value":"<stamped envelope string>"}を受け取り、値が永続的にコミットされた後に終了コード0を返さなければなりません。v1 では一方向の fire-and-forget や coalesced 保存はありません。delete <key>は標準入力を読み取らず、キーの有無にかかわらず終了コード0で終了します。<key>はtoken-cacheまたはselected-accountです。非ゼロの終了コードはすべてストレージエラーです。キャッシュミスに終了コード
2を使用しないでください。標準エラーはサニタイズされたエラー内で取り込まれ、切り詰められます。標準入力と標準出力のペイロードがサーバーに記録されることはありません。
トークンキャッシュペイロードは大きくなることがあります。ラッパーは少なくとも 256 KB の値を処理する必要があります。
通常のステートレスな HTTP Graph リクエストは、ローカル認証キャッシュストレージを使用しません。HTTPモードでは、ローカル認証ツールが明示的に有効になっているか、--login、--verify-login、--list-accounts、--select-account、--logout などのローカルアカウントコマンドが使われていない限り、コマンドストレージは起動時とリクエストごとにスキップされます。
Azure Key Vault の統合
本番環境のデプロイでは、環境変数の代わりに Azure Key Vault にシークレットを格納できます。これは特に、マネージド ID を使用する Azure Container Apps に役立ちます。
セットアップ
Key Vault を作成します (まだない場合):
az keyvault create --name your-keyvault-name --resource-group your-rg --location eastusKey Vault にシークレットを追加します:
az keyvault secret set --vault-name your-keyvault-name --name ms365-mcp-client-id --value "your-client-id" az keyvault secret set --vault-name your-keyvault-name --name ms365-mcp-tenant-id --value "your-tenant-id" # Optional: if using confidential client flow az keyvault secret set --vault-name your-keyvault-name --name ms365-mcp-client-secret --value "your-secret"Key Vault へのアクセスを許可します:
Azure Container Apps でマネージ ID を使用する場合:
# Get the managed identity principal ID PRINCIPAL_ID=$(az containerapp show --name your-app --resource-group your-rg --query identity.principalId -o tsv) # Grant access to Key Vault secrets az keyvault set-policy --name your-keyvault-name --object-id $PRINCIPAL_ID --secret-permissions get listローカル開発で Azure CLI を使用する場合:
# Your Azure CLI identity already has access if you have appropriate RBAC roles az loginサーバーを構成します:
MS365_MCP_KEYVAULT_URL=https://your-keyvault-name.vault.azure.net npx @a-impact/ms365-mcp
シークレット名のマッピング
Key Vault シークレット名 | 環境変数 | 必須 |
ms365-mcp-client-id |
| はい |
ms365-mcp-tenant-id |
| いいえ (デフォルト: 'common') |
ms365-mcp-client-secret |
| いいえ |
認証
Key Vault 統合では、Azure Identity SDK の DefaultAzureCredential を使用します。これは、複数の認証方法を次の順序で自動的に試します。
環境変数 (
AZURE\_CLIENT\_ID,AZURE\_CLIENT\_SECRET,AZURE\_TENANT\_ID)マネージ ID (Azure Container Apps での使用を推奨)
Azure CLI の資格情報 (ローカル開発用)
Visual Studio Code の資格情報
Azure PowerShell の資格情報
オプションの依存関係
Azure Key Vault のパッケージ (@azure/identity と @azure/keyvault-secrets) はオプションの依存関係です。これらは MS365_MCP_KEYVAULT_URL が設定されている場合にのみロードされます。Key Vault を使用しない場合、これらのパッケージは必要ありません。
メッセージのサインネ緑
送信メッセージは、設定可能な署名 (例: 🤖 プレフィックス) でラップできます。これにより、受信者はエージェントが送信したメッセージと、ユーザーが自分で入力したメッセージを区別できます。デフォルトではオフです。--message-signoff-prefix / --message-signoff-suffix で有効にできます (環境変数: MS365_MCP_MESSAGE_SIGNOFF_PREFIX / MS365_MCP_MESSAGE_SIGNOFF_SUFFIX)。--no-message-signoff または空の環境変数値で再度オフになります。
一度構成すると、すべての Teams メッセージ (graph-batch 経由の送信、返信、編集を含む)、直接メール送信 (send-mail、返信/転送、共有メールボックス版、グループスレッドの返信)、およびメール下書きが書き込まれる際の下書きにも適用されます。また、メール下書きの内容として書き込まれる際にも適用されます。send-draft-message は、下書きをそのまま送信するため、自分で作成した下書きは変更されずに送信されます。すでにマーカーが含まれているメッセージは、二重署名されません。署名できない本文を持つ送信は、署名されず送信されず、拒否されます。
マーカーには、表示されるテキストを描画する限り、マークアップ (例: 色付きの <span>) を含めることができます。なお、この署名はエージェントが提供されたツールを誤用することを防ぐためのガードレールであり、厳格なセキュリティ境界ではありません — 同じマシンでシェルアクセスを持つエージェントは、サーバーをサインオフなしで再起動するだけで回避できてしまうためです。
本番環境デプロイ
組織全体でのアクセスに向けてサーバーをホストするための完全なガイドは、docs/deployment.md を参照してください。Docker、Azure Container Apps、Azure App Service、Azure AD アプリの登録、リバースプロキシの設定、クライアントの設定、公開エンドポイントが含まれます。
コントリビューション
コントリビューションは歓迎します! プルリクエストを送る前に、変更内容が品質基準を満たしていることを確認してください。
すべてのコード品質要件を確認するための検証スクリプトを実行してください:
npm run verify開発者向け
リポジトリをクローンした後、Microsoft Graph OpenAPI 仕様からクライアントコードを生成する必要がある場合があります:
npm run generate関連プロジェクト
ms-365-admin-mcp-server by @okapi-ca: アプリケーション権限 (クライアント資格情報フロー) を使用する管理者/デーモンシナリオ用のコンパニオンサーバー。セキュリティアラート、監査ログ、サービスの健全性、利用状況レポートをカバーしています。
サポート
問題が発生している場合やヘルプが必要な場合:
issue を作成する
discussion を開始する
メール: eirikb@eirikb.no
Discord: https://discord.gg/WvGVNScrAZ または @eirikb
ライセンス
MIT © 2026 A-Impact
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
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Microsoft Graph API services including Outlook email, Calendar events, OneDrive files, and Contacts. Supports multiple Microsoft accounts with unified search across all services.
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to interact with Microsoft 365 services (users, mail, calendar, files) via Microsoft Graph API.371MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Microsoft 365 through the Microsoft Graph API, including searching Teams messages, managing chats, and sending messages.77MIT
- FlicenseNot gradedqualityDmaintenanceConnects AI assistants to Microsoft 365 via the Graph API, enabling email search, attachment extraction, and OneDrive file reading through natural conversation.
Related MCP Connectors
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
SaaS intelligence for AI agents. 5 unified tools cover 1,000+ services with 91-96% token savings.
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
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/A-Impact-Pavel/ms365-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server