MCP Desktop - Microsoft Cloud Platform Desktop Client について
Microsoft Graph 経由で Microsoft 365 に接続するローカル実行型の MCP サーバーです。メール、カレンダー、ファイル、Teams を扱えます。モックではなく実際のテナントで AI エージェントに操作させたいチーム向けです。
主な機能
- 0112 モジュールにまたがる 117 のツール
- 02Excel、Word、PowerPoint のファイル操作
- 03ユーザーごとに分離されたマルチユーザー対応
- 04保存時に暗号化されたトークン
活用シーン
- 01テストテナントでのメール送信と会議設定
- 02Excel による予算表の作成
- 03Teams チャネルのメッセージと会議記録の取得
MCP 対応
Microsoft 365 の操作を MCP ツールとして公開します。ローカルの MCP アダプターがクライアントとサーバーを接続し、サーバーが Microsoft Graph API を呼び出します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP Microsoft Office
1 つの MCP サーバー。複数ユーザー。テストテナント上で実際の Microsoft 365 トラフィックを利用できます。
課題
テストテナントは空のままです。静的なテストデータでは、実際のワークフローを検証できません。実際のメール送信、会議のスケジュール設定、Teams チャネルでの共同作業を行うエージェントが必要な場合、モックやスタブでは不十分です。
このプロジェクトで解決できること
このプロジェクトは、Graph API を通じて、MCP 互換の AI クライアントを Microsoft 365 に接続します。各エージェントは別々のテナントユーザーとして認証し、実際のデータに対して実際の操作を行います。
- 117 個のツールを 12 のモジュールに搭載:Mail、Calendar、Files、Excel、Word、PowerPoint、Teams、Contacts、To-Do、Groups、People、Search
- マルチユーザー対応:1 つのサーバーでチーム全体をサポートし、各ユーザーのデータは分離されます
- 実際の Graph API 呼び出し:すべての操作でモックではなく、実際のテナントにアクセスします
- 安全:トークンは保存時に暗号化され、サードパーティのサーバーに認証情報は保存されません
アーキテクチャ
┌──────────────────┐
│ MCP Client │
│ (Claude, etc.) │
└────────┬─────────┘
│ JSON-RPC (stdin/stdout)
┌────────▼─────────┐
│ MCP Adapter │
│ (runs locally) │
└────────┬─────────┘
│ HTTP + Bearer Token
┌────────▼─────────┐
│ MCP Server │
│ (local or │
│ remote) │
└────────┬─────────┘
│ Microsoft Graph API
┌────────▼─────────┐
│ Microsoft 365 │
│ (your tenant) │
└──────────────────┘
3 つの要素:
- MCP クライアント -- 操作する AI
- MCP アダプター -- MCP プロトコルを HTTP リクエストに変換する Node.js プロセス(クライアントと同じマシン上で動作します)
- MCP サーバー -- 認証を処理し、Microsoft Graph API を呼び出します(ローカルまたはリモートサーバー上で動作します)
アクセス許可
サーバーには、Microsoft Graph の委任アクセス許可が 18 個必要です。このうち 12 個は管理者の同意なしで利用できます。残り 6 個はテナント管理者による同意が必要です。
管理者の同意が不要
| アクセス許可 | 利用可能になるツール |
|---|---|
User.Read | 認証、ユーザープロファイル |
Mail.ReadWrite | readMail、readMailDetails、markEmailRead、flagMail、getMailAttachments、addMailAttachment、removeMailAttachment |
Mail.Send | sendMail、replyToMail |
Calendars.ReadWrite | getEvents、createEvent、updateEvent、cancelEvent、acceptEvent、tentativelyAcceptEvent、declineEvent、getAvailability、findMeetingTimes、getRooms、getCalendars、addAttachment、removeAttachment |
Files.ReadWrite.All | listFiles、uploadFile、downloadFile、getFileMetadata、getFileContent、setFileContent、updateFileContent、createSharingLink、getSharingLinks、removeSharingPermission、listChannelFiles、uploadFileToChannel、readChannelFile、すべての Excel ワークブックツール、すべての Word/PowerPoint ツール |
Contacts.ReadWrite | listContacts、getContact、createContact、updateContact、deleteContact、searchContacts |
Tasks.ReadWrite | listTaskLists、getTaskList、createTaskList、updateTaskList、deleteTaskList、listTasks、getTask、createTask、updateTask、deleteTask、completeTask |
Chat.ReadWrite | listChats、createChat、getChatMessages、sendChatMessage |
Channel.ReadBasic.All | listTeamChannels、getChannelMessages |
ChannelMessage.Send | sendChannelMessage、replyToMessage |
Channel.Create | createTeamChannel |
OnlineMeetings.ReadWrite | createOnlineMeeting、getOnlineMeeting、listOnlineMeetings、getMeetingByJoinUrl |
管理者の同意が必要
| アクセス許可 | 追加で利用可能になるツール |
|---|---|
User.Read.All | Teams 全体でのユーザー ID の解決、People 検索 |
People.Read.All | findPeople、getRelevantPeople、getPersonById |
Group.Read.All | listGroups、getGroup、listGroupMembers、listMyGroups |
ChannelMember.ReadWrite.All | addChannelMember |
ChannelMessage.Read.All | チャネルのメッセージ履歴の読み取り |
OnlineMeetingTranscript.Read.All | getMeetingTranscripts、getMeetingTranscriptContent |
管理者の同意がない場合は、Mail、Calendar、Files、Excel ワークブック、Word ドキュメント、PowerPoint プレゼンテーション、Contacts、To-Do、Chat、および Teams チャネルの基本操作を利用できます。管理者の同意がある場合は、People ディレクトリ検索、Groups、チャネルメンバー管理、会議のトランスクリプトが追加されます。
クイックスタート
前提条件
手順 1:Azure アプリの登録
- Azure Portal > Microsoft Entra ID > App registrations > New registration に移動します
MCP-Microsoft-Officeという名前を付け、ご希望のアカウントの種類で登録します- Application (client) ID と Directory (tenant) ID をコピーします
- API permissions > Add a permission > Microsoft Graph > Delegated permissions に移動します
- 上記の 18 個のアクセス許可を追加します
- テナント管理者の場合は、Grant admin consent をクリックします
- Authentication > Add a platform > Web に移動します
- リダイレクト URI:
http://localhost:3000/api/auth/callback - Allow public client flows を有効にします
- リダイレクト URI:
手順 2:クローンと設定
git clone https://github.com/Aanerud/MCP-Microsoft-Office.git
cd MCP-Microsoft-Office
npm install
.env.example を .env にコピーし、Azure アプリの詳細を入力します:
MICROSOFT_CLIENT_ID=your-client-id
MICROSOFT_TENANT_ID=your-tenant-id
手順 3:サーバーを起動して認証
npm run dev:web
ブラウザーで http://localhost:3000 を開きます。Login with Microsoft をクリックしてサインインし、アクセス許可を付与します。次に、Generate MCP Token をクリックしてトークンをコピーします。
手順 4:Claude Desktop を設定
Claude Desktop の設定を編集します:
macOS:~/Library/Application Support/Claude/claude_desktop_config.json
Windows:%APPDATA%\Claude\claude_desktop_config.json
Claude Desktop では、MCP サーバーごとのツール数に実用上の上限があり、約 55 個です。このプロジェクトでは 117 個のツールを公開しているため、同じアダプターとバックエンドを共有する 3 つのサーバーに分けています:
{
"mcpServers": {
"microsoft-365": {
"command": "node",
"args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
"env": {
"MCP_SERVER_URL": "http://localhost:3000",
"MCP_BEARER_TOKEN": "paste-your-token-here",
"MCP_MODULES": "search,mail,calendar,files,people,contacts,groups,query"
}
},
"microsoft-365-teams": {
"command": "node",
"args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
"env": {
"MCP_SERVER_URL": "http://localhost:3000",
"MCP_BEARER_TOKEN": "paste-your-token-here",
"MCP_MODULES": "teams,todo"
}
},
"microsoft-365-office": {
"command": "node",
"args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
"env": {
"MCP_SERVER_URL": "http://localhost:3000",
"MCP_BEARER_TOKEN": "paste-your-token-here",
"MCP_MODULES": "excel,word,powerpoint,files"
}
}
}
}
MCP_MODULES は、アダプターが公開するモジュールを絞り込みます。省略すると、117 個すべてのツールが公開されます(ツール数の上限がないクライアントで利用できます)。
env ブロックに MCP_DEBUG=1 を設定すると、診断ログが stderr に出力されます。ツールのディスパッチに関する問題のトラブルシューティングに役立ちます。
Claude Desktop を再起動します。「今日のカレンダーには何がありますか?」や「予算表を含む Excel ブックを作成して」と尋ねてみてください。
ツール(117)
メール(9)
| ツール | 説明 |
|---|---|
readMail | 受信トレイのメッセージを読み取る |
sendMail | メールを送信する |
replyToMail | メールに返信する |
readMailDetails | メールの全文を取得する |
markEmailRead | メールを既読または未読にする |
flagMail | メールにフラグを付ける、または解除する |
getMailAttachments | メールの添付ファイルを一覧表示する |
addMailAttachment | メールに添付ファイルを追加する |
removeMailAttachment | メールから添付ファイルを削除する |
カレンダー(13)
| ツール | 説明 |
|---|---|
getEvents | カレンダーの予定を取得する |
createEvent | 会議または予定を作成する |
updateEvent | 既存の予定を変更する |
cancelEvent | 予定をキャンセルする |
acceptEvent | 会議への招待を承諾する |
tentativelyAcceptEvent | 仮承諾する |
declineEvent | 会議への招待を辞退する |
getAvailability | 予定あり/なしの時間を確認する |
findMeetingTimes | 最適な会議の時間帯を探す |
getRooms | 会議室を探す |
getCalendars | すべてのカレンダーを一覧表示する |
addAttachment | 予定に添付ファイルを追加する |
removeAttachment | 予定の添付ファイルを削除する |
ファイル(10)
| ツール | 説明 |
|---|---|
listFiles | OneDrive のファイルを一覧表示する |
uploadFile | ファイルをアップロードする |
downloadFile | ファイルをダウンロードする |
getFileMetadata | ファイル情報を取得する |
getFileContent | ファイルの内容を読み取る |
setFileContent | ファイルの内容を書き込む |
updateFileContent | 既存のファイルを更新する |
createSharingLink | 共有リンクを作成する |
getSharingLinks | 共有リンクを一覧表示する |
removeSharingPermission | 共有アクセス権を削除する |
Excel (30)
OneDrive または SharePoint に保存されている Excel ブックを、ファイルをダウンロードせずに直接操作できます。すべての操作は、透過的なセッション管理により Microsoft Graph のブック API を通じて行われます。
| ツール | 説明 |
|---|---|
createWorkbookSession | ブックのセッションを開きます(永続または一時) |
closeWorkbookSession | アクティブなブックのセッションを閉じます |
listWorksheets | ブック内のすべてのワークシートを一覧表示します |
addWorksheet | 新しいワークシートを追加します |
getWorksheet | 名前または ID でワークシートを取得します |
updateWorksheet | ワークシートの名前変更、位置変更、または非表示化を行います |
deleteWorksheet | ワークシートを削除します |
getRange | セルの値、数式、書式を読み取ります |
updateRange | セル範囲に値を書き込みます |
getRangeFormat | 書式(フォント、塗りつぶし、罫線)を取得します |
updateRangeFormat | 書式(太字、色、数値形式)を設定します |
sortRange | 範囲内のセルを並べ替えます |
mergeRange | セルを結合します |
unmergeRange | セルの結合を解除します |
listTables | ワークシート内のすべてのテーブルを一覧表示します |
createTable | 範囲からテーブルを作成します |
updateTable | テーブルの名前変更またはスタイル変更を行います |
deleteTable | テーブルを削除します |
listTableRows | テーブル内のすべての行を一覧表示します |
addTableRow | テーブルに行を追加します |
deleteTableRow | インデックスを指定して行を削除します |
listTableColumns | テーブル内のすべての列を一覧表示します |
addTableColumn | テーブルに列を追加します |
deleteTableColumn | 列を削除します |
sortTable | 列を指定してテーブルを並べ替えます |
filterTable | テーブルの列にフィルターを適用します |
clearTableFilter | 列のフィルターを解除します |
convertTableToRange | テーブルを通常の範囲に戻します |
callWorkbookFunction | 300 種類以上の Excel 関数(SUM、VLOOKUP、PMT など)を呼び出します |
calculateWorkbook | すべての数式を再計算します |
Word (5)
Word 文書の作成、読み取り、変換を行います。文書は構造化された JSON から作成され、OneDrive に保存されます。読み取りでは、複数のライブラリを順に試すフォールバックチェーンを使用します。mammoth(.docx に最適な HTML)→ word-extractor(.doc と .docx の両方に対応)→ webUrl フォールバックの順です。バイナリのダウンロードには Graph beta の /contentStream エンドポイントを使用し、信頼性の高いバイナリ転送を実現します。
| ツール | 説明 |
|---|---|
createWordDocument | 構造化コンテンツ(見出し、段落、テーブル、リスト、画像)から .docx を作成します |
readWordDocument | 文書を HTML とプレーンテキストで読み取ります |
getWordDocumentMetadata | タイトル、作成者、日付、キーワードを取得します |
getWordDocumentAsHtml | 文書の内容を HTML に変換します |
convertDocumentToPdf | Word 文書を PDF に変換します |
注記: 一部の SharePoint テナントでは、アップロードされた .docx ファイルがアップロードから数秒以内に OLE2 バイナリ形式に変換されます。この場合、クライアント側の解析ライブラリではファイルを読み取れません。サーバーは適切にフォールバックし、ユーザーがブラウザーで文書を開けるよう
webUrlを返します。
PowerPoint (4)
PowerPoint プレゼンテーションの作成、読み取り、変換を行います。プレゼンテーションは構造化されたスライドデータから作成され、OneDrive に保存されます。読み取りでは Graph の HTML 変換を使用し、スライド単位でテキストを抽出する際は jszip にフォールバックします。
| ツール | 説明 |
|---|---|
createPresentation | タイトル、コンテンツ、空白のスライドを含む .pptx を作成します |
readPresentation | スライドの内容(各スライドのテキスト要素)を読み取ります |
getPresentationMetadata | タイトル、作成者、スライド数、日付を取得します |
convertPresentationToPdf | プレゼンテーションを PDF に変換します |
Teams(21)
| ツール | 説明 |
|---|---|
listChats | Teams のチャットを一覧表示します |
createChat | 新しいチャットを作成します |
getChatMessages | チャットメッセージを読み取ります |
sendChatMessage | チャットメッセージを送信します |
listJoinedTeams | 自分のチームを一覧表示します |
listTeamChannels | チームのチャネルを一覧表示します |
createTeamChannel | チャネルを作成します |
addChannelMember | チャネルにメンバーを追加します |
getChannelMessages | チャネルのメッセージを読み取ります |
sendChannelMessage | チャネルに投稿します |
replyToMessage | チャネルのメッセージに返信します |
listChannelFiles | チャネル内のファイルを一覧表示します |
uploadFileToChannel | チャネルにファイルをアップロードします |
readChannelFile | チャネルのファイルを読み取ります |
createOnlineMeeting | Teams 会議を作成します |
getOnlineMeeting | 会議の詳細を取得します |
listOnlineMeetings | オンライン会議を一覧表示します |
getMeetingByJoinUrl | 参加 URL から会議を検索します |
getMeetingTranscripts | 会議の文字起こしを取得します |
getMeetingTranscriptContent | 文字起こしの内容を読み取ります |
(注:addChannelMember はプライベートチャネルにのみ適用されます。標準チャネルには、チームの全メンバーが自動的に含まれます。)
連絡先(6)
| ツール | 説明 |
|---|---|
listContacts | 連絡先を一覧表示します |
getContact | 連絡先の詳細を取得します |
createContact | 連絡先を作成します |
updateContact | 連絡先情報を更新します |
deleteContact | 連絡先を削除します |
searchContacts | 連絡先を検索します |
To-Do(11)
| ツール | 説明 |
|---|---|
listTaskLists | タスクリストを一覧表示します |
getTaskList | タスクリストを取得します |
createTaskList | タスクリストを作成します |
updateTaskList | タスクリストの名前を変更します |
deleteTaskList | タスクリストを削除します |
listTasks | タスクを一覧表示します |
getTask | タスクの詳細を取得します |
createTask | タスクを作成します |
updateTask | タスクを更新します |
deleteTask | タスクを削除します |
completeTask | タスクを完了としてマークします |
グループ(4)
| ツール | 説明 |
|---|---|
listGroups | Microsoft 365 グループを一覧表示します |
getGroup | グループの詳細を取得します |
listGroupMembers | グループのメンバーを一覧表示します |
listMyGroups | 自分のグループを一覧表示します |
People(3)
| ツール | 説明 |
|---|---|
findPeople | ディレクトリを検索します |
getRelevantPeople | よく連絡する相手を取得します |
getPersonById | 人物の詳細を取得します |
検索(1)
| ツール | 説明 |
|---|---|
search | メール、ファイル、イベント、チャットメッセージを横断して統合検索します |
マルチユーザー
各ユーザーは個別に認証します。サーバーはユーザー ID に基づいて、すべてのデータを分離します。
Alice ([email protected]) Bob ([email protected])
├─ Her own Microsoft tokens ├─ His own Microsoft tokens
├─ Her own session ├─ His own session
└─ Claude Desktop (her laptop) └─ Claude Desktop (his PC)
Complete data isolation.
Alice never sees Bob's data.
複数のエージェントを使った自動テストでは、ROPC(リソースオーナーパスワード資格情報)フローを使用して、プログラムから認証します。
# Start the server
npm run dev:web
# Run the E2E test suite (authenticates 3 users via ROPC)
node tests/run-all.cjs
テストスイートは複数のユーザーを認証してから、12 個のモジュールにまたがる 117 個すべてのツールと、5 個のモジュール横断ワークフローを実行します。実装の全容については tests/ を参照してください。
E2E テストスイート
このプロジェクトには、117 個すべてのツールを網羅する包括的なテストスイートが含まれています。
# Run all tests (requires server running)
node tests/run-all.cjs
# Run a single module
node tests/run-all.cjs --bucket mail --buckets-only
# Run only workflows
node tests/run-all.cjs --workflows-only
テスト構成:
tests/
lib/ Shared auth, HTTP client, reporter
buckets/ One file per module (12 files, 117 tools)
workflows/ Cross-module tests (5 files)
run-all.cjs Master runner
テストは ROPC を使用して認証するため、手動でトークンを管理する必要がなく、約 100 秒で実行されます。
環境変数
.env.example を .env にコピーし、次の設定を行います。
| 変数 | 必須 | 説明 |
|---|---|---|
MICROSOFT_CLIENT_ID | はい | Azure アプリのクライアント ID |
MICROSOFT_TENANT_ID | はい | Azure テナント ID |
MICROSOFT_REDIRECT_URI | いいえ | OAuth コールバック URL(デフォルト:http://localhost:3000/api/auth/callback) |
DEVICE_REGISTRY_ENCRYPTION_KEY | 本番環境 | トークン保存用の 32 バイト暗号化キー |
JWT_SECRET | 本番環境 | JWT トークンの署名に使用するシークレット |
CORS_ALLOWED_ORIGINS | 本番環境 | カンマ区切りの許可オリジン |
PORT | いいえ | サーバーポート(デフォルト:3000) |
NODE_ENV | いいえ | development または production |
デプロイ
ローカル(利用開始時に推奨)
npm install
npm run dev:web
Azure App Service
GitHub Actions を使った CI/CD デプロイについては、docs/azure-deployment.md を参照してください。
セキュリティ
- 暗号化ストレージ:すべての Microsoft トークンは、保存時に AES-256 で暗号化されます
- クライアントシークレットなし:デスクトップ認証にはパブリッククライアントフロー(PKCE)を使用します
- トークンの分離:各ユーザーのトークンは、異なる暗号化キーを使用して個別に保存されます
- レート制限:組み込みのレート制限により、不正利用を防止します
- CORS 保護:本番環境ではオリジンの許可リストを使用します
- セッションの有効期限:セッションは24時間後に期限切れになります
本番環境のチェックリスト
-
NODE_ENV=productionを設定します -
DEVICE_REGISTRY_ENCRYPTION_KEY(32バイト)を設定します -
JWT_SECRET(強力なランダム文字列)を設定します -
CORS_ALLOWED_ORIGINSを設定します - 有効な証明書を使用して HTTPS を設定します
プロジェクト構成
MCP-Microsoft-Office/
├── mcp-adapter.cjs MCP protocol adapter (runs locally with Claude Desktop)
├── src/
│ ├── api/ Express routes and controllers
│ ├── auth/ MSAL authentication (OAuth2, ROPC, token exchange)
│ ├── core/ Services (cache, storage, tools, error handling)
│ ├── graph/ Microsoft Graph API services
│ │ ├── graph-client.cjs HTTP client with retry, binary support, sessions
│ │ ├── files-service.cjs OneDrive file operations
│ │ ├── excel-service.cjs Workbook API (sessions, ranges, tables, functions)
│ │ ├── word-service.cjs Word create/read (docx + mammoth + word-extractor)
│ │ └── powerpoint-service.cjs PPT create/read (pptxgenjs + jszip)
│ └── modules/ Feature modules (mail, calendar, excel, word, powerpoint, etc.)
├── public/ Web UI for authentication
└── tests/ E2E test suite (gitignored)
コントリビューション
- リポジトリをフォークします
- 機能ブランチを作成します
- 変更を加えます
- プルリクエストを送信します
ライセンス
MIT ライセンス -- 詳しくは LICENSE ファイルをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
