Skip to main content
Glama

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 --toon

Claude 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.ReadWriteMail.Read を必要とするツールをカバーし、Files.ReadWrite.AllFiles.Read を必要とするツールをカバーします。

SharePoint では、エンタープライズ権限モデルが2つのサポートされています。

  • Sites.Read.AllSites.ReadWrite.AllSites.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 など)のみ利用できます。

共有メールボックスへのアクセス

共有メールボックスにアクセスするには、次の必要があります。

  1. 組織モード:共有メールボックスツールには --org-mode が必要です(職場/学校アカウントのみ)

  2. 委任されたアクセス許可:読み取りは Mail.Read.Shared、作成・更新・移動には Mail.ReadWrite.Shared、送信・返信・転送には Mail.Send.Shared、共有カレンダーツールには Calendars.Read.Shared

  3. Exchange のアクセス許可:サインインしているユーザーに共有メールボックスのアクセス権が付与されていること

  4. 使用方法:共有メールボックスの電子メールアドレスを、共有メールボックスツールの user-id パラメータとして使用します

共有メールボックスの検索方法list-users ツールを使用して、組織内のユーザーと共有メールボックスを確認します。

例:list-usersuser-idshared-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 サーバーをサポートしています。

  1. HTTP モードでサーバーを起動します。

    npx @a-impact/ms365-mcp --http
  2. Open WebUI で、Admin Settings → Tools を開きます (/admin/settings/tools) → Add Connection:

    • Type: MCP Streamable HTTP

    • URL: /mcp へのパスを含む MCP サーバーの URL

    • Auth: OAuth 2.1

  3. Register Client クリックします。

注意: HTTP モードでは、動的クライアント登録はデフォルトで有効です。無効にするには --no-dynamic-registration(または MS365_MCP_DISABLE_DCR=true) を使用します。カスタム Azure Entra アプリを使用する場合、リダイレクト URI のプラットフォームタイプは、クライアントシークレットがあるかどうかによって異なります。シークシークレットがある場合は "Web"、ない場合は "Mobile and desktop applications" を使用します("Singleप्र" を使用しないでください)。

簡単なテスト設定 デフォルトの Azure アプリ (ID ms-365localhost: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 に接続を追加します。

Open WebUI MCP 接続

**リバース プロキシを組み合わせた 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 アプリ登録を設定する必要があります。

  1. Azure AD アプリを作成します:

  • Azure ポータル にアクセスします。

  • Azure Active Directory → アプリの登録 → 新しい登録 に移動します。

  • Name: "MS 365 MCP Server" と設定します。

  1. リダイレクト URI を構成します:

  • OAuth コールバック URI を設定する: アプリの登録画面で、左側の「認証」に移動します。

  • プラットフォーム構成の場合:

    • 「プラットフォームを追加」をクリックします(「Mobile and desktop applications」/「Public client」がまだ表示されていない場合)。

    • 「Mobile and desktop applications」または「Public client/native (mobile & desktop)」のいずれかを選択します(ラベルはポータルのバージョンによって異なります)。

  1. MCP Inspector でのテスト(npm run inspector:

  • アプリの登録画面で、左側の「認証」に移動します。

  • プラットフォーム構成の場合:

    • 「プラットフォームを追加」をクリックします(「Web」がまだ表示されていない場合)。

    • 「Web」を選択します。

  • 次のリダイレクト URI を構成します:

    • http://localhost:6274/oauth/callback

    • http://localhost:6274/oauth/callback/debug

    • http://localhost:3000/callback(オプション、サーバーコールバック用)

  1. 資格情報を取得する:

  • 概要ページからアプリケーション(クライアント)ID をコピーします

  • 「証明書とシークレット」→「新しいクライアントシークレット」→シークレットの値をコピーします(パブリックアプリではオプション)

  1. 環境変数を設定する: プロジェクトのルートに .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_IDMS365_MCP_CLIENT_SECRETMS365_MCP_TENANT_IDMS365_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_USERNAMEMS365_MCP_EXPECTED_HOME_ACCOUNT_ID よりも優先されます。

  • 空のピン値を指定すると、無視されるのではなく起動時に失敗します。

  • ユーザー名のピンは大文字と小文字を区別して比較します。homeAccountId のピンは完全一致です。

  • 両方のピンを設定する場合は、同じキャッシュ済みアカウントに解決される必要があります。

  • 予期されたアカウントがトークン キャッシュにない場合、ローカル stdio の起動は即座に失敗します。ピンを設定し、--login を実行してから、ヘッドレス サーバーを起動してください。

  • デバイスコードおよびブラウザーでのログインは、選択したアカウントやトークン キャッシュを保存する前に、ピンとの欠落または不一致を拒否します。

  • ピン留めにより、実効 MCP モードはアカウント数のモードになります: サーバーは account パラメータを公開せず、MCP の手順もアカウントの切り替えを提案しません。

  • --http--oboMS365_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

利用可能なプリセット: mailcalendarfilespersonalworkexcelcontactstasksonenotesearchusersoutlookonedriveteamsteams-writeall

endpoints.json 内の各エンドポイントは presets 配列を使用して所属プリセットを宣言するため、各プリセットはツール名の正確な許可リストとなり、アプリ間での過剰一致は発生しません(例: mail には共有メールボックスツールは含まれず、これらは work に含まれます)。ユニバーサルバイナリリーダー download-bytesteams-write を除くすべてのプリセットに含まれているため、アプリが返すもの(ファイル、添付ファイル、写真、録音)は常に取得できます。get-download-url(drive/SharePoint ファイルの事前認証 URL)はドライブ対応プリセットに同梱されます。つまり、ファイルを特定できるプリセットは必ずそのバイトデータを読み取れます。

outlookonedriveteams の各プリセットはアプリ固有で、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 teams

teams-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=15

  • MS365_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月現在、既定の common authority で発行されたリフレッシュ トークンは最初のリフレッシュで拒否されるため、セッションはログイン後約 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

%APPDATA%\ms-365-mcp-server\

macOS

~/Library/Application Support/ms-365-mcp-server/

Linux

$XDG_CONFIG_HOME/ms-365-mcp-server/ (または ~/.config/ms-365-mcp-server/)

以前のバージョンでは、インストールされたパッケージ内のパスが既定値でした。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_PATHMS365_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=10000

MS365_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 に役立ちます。

セットアップ

  1. Key Vault を作成します (まだない場合):

    az keyvault create --name your-keyvault-name --resource-group your-rg --location eastus
  2. Key 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"
  3. 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
  4. サーバーを構成します:

    MS365_MCP_KEYVAULT_URL=https://your-keyvault-name.vault.azure.net npx @a-impact/ms365-mcp

シークレット名のマッピング

Key Vault シークレット名

環境変数

必須

ms365-mcp-client-id

MS365\_MCP\_CLIENT\_ID

はい

ms365-mcp-tenant-id

MS365\_MCP\_TENANT\_ID

いいえ (デフォルト: 'common')

ms365-mcp-client-secret

MS365\_MCP\_CLIENT\_SECRET

いいえ

認証

Key Vault 統合では、Azure Identity SDK の DefaultAzureCredential を使用します。これは、複数の認証方法を次の順序で自動的に試します。

  1. 環境変数 (AZURE\_CLIENT\_ID, AZURE\_CLIENT\_SECRET, AZURE\_TENANT\_ID)

  2. マネージ ID (Azure Container Apps での使用を推奨)

  3. Azure CLI の資格情報 (ローカル開発用)

  4. Visual Studio Code の資格情報

  5. 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: アプリケーション権限 (クライアント資格情報フロー) を使用する管理者/デーモンシナリオ用のコンパニオンサーバー。セキュリティアラート、監査ログ、サービスの健全性、利用状況レポートをカバーしています。

サポート

問題が発生している場合やヘルプが必要な場合:

ライセンス

MIT © 2026 A-Impact

Install Server
A
license - permissive license
C
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • 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.

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/A-Impact-Pavel/ms365-mcp'

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