entrapulse-polyarchy について
EntraPulse Polyarchyは、ディレクトリ構造やアクセス関係を調査するチーム向けに、Microsoft Entra IDテナントのID関係を可視化します。組織、グループ、属性、ロール、アプリの関係をMCPクライアント内のグラフにまとめ、構造化レポートも提供します。
主な機能
- 01対話型の関係フォースグラフ
- 02組織・グループ・属性・アクセスの探索
- 03別のIDを中心にグラフを再表示
- 04関係とオブジェクト種別のフィルター
- 05構造化された関係レポート
活用シーン
- 01人物の上司階層と直属の部下の確認
- 02グループ所属とメンバーへの展開の調査
- 03共有されるID属性の追跡
- 04ディレクトリロールとアプリ割り当ての確認
MCP 対応
互換性のあるMCPクライアント内に対話型グラフを表示するMCP Appを提供し、検索、関係の展開、構造化レポートのツールも備えます。サーバーはMicrosoft Graph経由でディレクトリデータを読み取ります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
8掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| search | string | いいえ | 検索してフォーカスする名前または UPN |
| userId | string | いいえ | フォーカスする正確な Entra オブジェクト ID |
詳細
EntraPulse Polyarchy
MCP アプリとして提供される、Microsoft Entra ID のインタラクティブなアイデンティティ関係の可視化です。

2003 年、Microsoft は PolyArchy Server をデモしました。アイデンティティデータ上に交差する関係階層を表示するウェブビジュアライゼーションで、データポイントをクリックすると、ビュー全体がそのコンテキストに切り替わるものでした。製品化はされませんでした。ついに、それが実現しました。Entra ID テナント上のリアルタイム D3 フォースグラフを、MCP クライアント内(Claude Desktop、VS Code Copilot、M365 Copilot、ChatGPT、Cursor、Goose、Postmanなど、MCP Apps 拡張機能に対応するもの)に表示します。
アシスタントに 「Rebecca 周辺のアイデンティティポリアーキーを表示して」 と尋ねて、探索してみましょう。
- 組織 — マネージャーの階層と直属の部下
- グループ — メンバーシップと、グループからメンバーへの展開
- 属性 — 同じ値を共有するユーザーをつなぐピボットハブ:共通の既定値(部門、オフィス、都市など)から選ぶか、Graph 属性カタログ全体から入力候補を選択できます。次のようなネストされたパスも含まれます。
onPremisesExtensionAttributes/extensionAttribute9 - アクセス — ディレクトリロールとアプリの割り当て
画像よりデータを重視する場合は、polyarchy-report が同じ関係を構造化 JSON で返します。マネージャー階層、種類と割り当て方法(割り当て済み/動的)を含むグループメンバーシップ、ロール、アプリの割り当てを、UI を使わずにアシスタントが推論できます。
探索
- ノードをクリックすると、プロフィールパネルが開きます(写真、属性、マネージャー階層へのリンク)。
- ノードをダブルクリックするか、パネルの フォーカスとして設定 ボタンを使うと、コンテキスト全体がそのノードに切り替わります。ホップ距離が再設定され、ビューが中央へ滑らかに移動し、そのノードの関係が読み込まれます。これが PolyArchy の元々のインタラクションです。
- リセット(ツールバー)を使うと、何も失うことなくキャンバスがクリアされ、新しい系譜を探索できます。このセッションで取得したデータはすべてキャッシュに保持されるため、同じユーザー、グループ、コホートを再探索すると、Graph への追加呼び出しゼロで即座に再構築されます。近傍がキャッシュから提供された場合は、ステータスバーに表示されます。
- 展開/最小化(ツールバー)を使うと、アプリを全画面表示とインラインカードで切り替えられます。全画面表示への自動切り替えはポリアーキーを開いたときにのみ行われるため、ホスト側で最小化した後にキャンバス全体へ戻るには、この機能を使います。全画面表示に対応していないホストでは非表示になります。
- 凡例のチェックボックスを使うと、関係の種類とオブジェクトの種類をその場で絞り込めます。
グラフは複数の観点をまたいで蓄積されます。4 つの別々のチャートではなく、交差する 1 つのポリアーキーです。ユーザーはフォーカスからの隔たりに応じて青の濃淡で表示されます。グループ、ロール、アプリ、属性ハブは、それらをつなぐ関係と同じ色で表示され、距離に応じて薄くなります。そのため、ホップの手がかりは維持されます。ライトテーマとダークテーマは MCP クライアントに従います。
インストール(Claude Desktop の例)
{
"mcpServers": {
"entrapulse-polyarchy": {
"command": "npx",
"args": ["-y", "entrapulse-polyarchy"]
}
}
}
ほとんどのテナントではこれだけで完了し、アプリの登録は不要です。ただし、その意味にご注意ください。設定がない場合、サーバーは Microsoft のファーストパーティ「Microsoft Graph Command Line Tools」パブリッククライアント(クライアント ID 14d82eec-204b-4c2f-b7e8-296a70dab67e)を通じてサインインします。これは、Graph PowerShell/CLI ツールが使用する、よく知られた同じアプリです。すべてのテナントに存在し、多くのテナントですでに広範な委任された同意が付与されています。セキュリティを強化した環境では、このアプリが一般的にブロックまたは制限されています(条件付きアクセス、同意ポリシー、アプリ管理の制限など)。該当する場合は、代わりに独自のアプリ登録を使用してください。それ以外はすべて同じように動作します。
サインインは最初のツール呼び出し時に行われ、その後は再度必要ありません。
- トークンはOS のキーチェーン(DPAPI/Keychain/libsecret)に保存されます。
- サインインしたアカウントは
~/.entrapulse-polyarchy/auth-record.jsonに記録されるため、新たに起動したサーバープロセスはサイレントにサインインします。MCP クライアントは標準入出力サーバーを自由に再起動できますが、再起動のたびに再認証を求められることはありません。 - トークンの取得は単一実行にまとめられ、プロセス内でキャッシュされます。フォーカスの切り替えによって十数件以上の Graph 呼び出し(展開+写真)が同時に発生しても、MSAL キャッシュへの競合ではなく、すべてが 1 回のトークン要求を共有します。
- すべての認証イベントは、処理時間とともに
~/.entrapulse-polyarchy/auth.logに記録されます(サイレント取得は数ミリ秒ですが、対話型の処理はすぐにわかります)。予期しないプロンプトが表示された場合は、まずここを確認してください。
認証モード
| モード | 設定 | 備考 |
|---|---|---|
| 対話型(デフォルト) | なし。独自のアプリを使用する場合は TENANT_ID + CLIENT_ID | システムブラウザーでサインインします(ランダムなループバックポートを使用するため、ポートを指定せずに http://localhost を登録します)。委任された権限を使用し、デフォルトのフォーカスは /me です |
| デバイスコード | USE_DEVICE_CODE=true | ヘッドレス/SSH 環境向け。コードはサーバーログに出力されます |
| アプリ専用 | TENANT_ID + CLIENT_ID + CLIENT_SECRET | アプリケーション権限を使用します。/me は使えないため、visualize-identity/polyarchy-report には必ずユーザーを指定してください |
| クライアント提供トークン | USE_CLIENT_TOKEN=true(+任意で ACCESS_TOKEN) | MCP クライアントが set-access-token ツールを通じて Graph のベアラートークンを提供/更新します。すでにトークンを保持している EntraPulse などのホストでは、シームレスな SSO を実現できます |
その他の環境変数:POLYARCHY_DISABLE_TOKEN_CACHE=true は OS キーチェーンへのトークン保存を無効にします。POLYARCHY_AUTH_RECORD=<path> は、保存されたサインイン記録の保存先を変更します(ファイルを削除すると、新たにサインインできます)。
権限(委任)
| スコープ | 用途 |
|---|---|
User.Read.All | 組織階層、検索、属性を使った関連検索 |
Group.Read.All | グループのメンバーシップとメンバー |
RoleManagement.Read.Directory | ディレクトリロール |
Application.Read.All | アプリの割り当て |
デフォルトのファーストパーティクライアントには、通常、すでに広範な委任された同意が付与されています。同意が不足している場合は、スコープ名を示す明確な 403 メッセージが表示されます。アシスタントに get-auth-status を実行してもらうと、トークンに含まれるアプリ登録、スコープ、アカウントを正確に確認できます。
スコープとディレクトリロールは別々の要件です。トークンには上記のスコープが常に必要であり、管理者ロールで代用することはできません。一方、ユーザー側では、一般ユーザーのデフォルト権限でこのアプリが読み取るすべての情報にアクセスでき、管理者ロールは不要です。デフォルトのユーザー読み取りアクセスが制限されているテナント、またはゲストユーザーの場合に限り、ディレクトリ読み取り権限を含むロールが必要です。その場合、最小権限に適しているのは Directory Readers です。
セキュリティを強化したテナント:独自のアプリ登録を使用する
Graph Command Line Tools アプリがブロックされている、同意が付与されていない、または管理下にあるアプリ(独自の条件付きアクセスの適用対象、独自の同意履歴)を使いたい場合は、独自の登録をサーバーに指定します。対話型モードとデバイスコードモードの両方に対応しています。
- Entra 管理センター → アプリの登録 → 新規登録 — シングルテナントで問題ありません。
- 認証 → プラットフォームの追加 → モバイル アプリケーションとデスクトップ アプリケーション — リダイレクト URI
http://localhost(ポートなし)を追加し、デバイスコードでサインインする場合は パブリック クライアント フローを許可するを有効にします。ポートは重要です。対話型サインインでは、毎回ランダムなループバックポート(例:http://localhost:51106)で待ち受けます。Entra がポートを無視するのは、登録されたリダイレクト URI がポートなしのhttp://localhostの場合のみです。:3000のような固定ポートを登録したり、Web リダイレクトしか設定されていないアプリ(たとえば Graph Explorer)を再利用したりすると、返信 URL の不一致で失敗します。 - API のアクセス許可 → Microsoft Graph → 委任されたアクセス許可 — 上記の表にある 4 つのスコープを追加し、管理者の同意を与えます。
- サーバーに ID を設定します。
{
"mcpServers": {
"entrapulse-polyarchy": {
"command": "npx",
"args": ["-y", "entrapulse-polyarchy"],
"env": {
"TENANT_ID": "<your-tenant-guid>",
"CLIENT_ID": "<your-app-registration-client-id>"
}
}
}
}
CLIENT_ID を指定せずに TENANT_ID だけを設定する方法も便利です。これにより、サインイン先が common エンドポイントではなく自分のテナントに固定されます。これは、使用するクライアントアプリに関係なく、複数テナントのユーザーやゲストアカウントがよく必要とする設定です。
属性による絞り込み
属性ビューでは、共通の値を基準にユーザーをグループ化します。ツールバーのピッカーには、日常的に使う絞り込み項目(部署、役職、会社、オフィス、都市、都道府県、従業員の種類)に加え、Graph のユーザー属性カタログ全体を対象にした入力補完機能を開く その他の属性… があります。これには、15 個すべての onPremisesExtensionAttributes、employeeOrgData/costCenter、onPremisesSamAccountName、employeeId など、さらに約 50 個の属性が含まれます。あいまいな検索にも対応しており(ext9 で extensionAttribute9 が見つかります)、カタログにない属性も自由入力できます。選択した属性は、セッション中、ドロップダウンに追加されます。ネストしたパスはサーバー側で解決されます。必要なプロパティは要求に応じて $select され、コホートのフィルターには Graph の高度なクエリが使われます。また、属性パスは OData フィルターに渡す前に検証されます。
ツール
| ツール | 目的 |
|---|---|
visualize-identity | 自分を中心としたポリアーキーを開きます。または {search: "name"} / {userId} を指定します。名前が曖昧な場合、ツールは推測せず、候補(オブジェクト ID 付き)を返します。これにより、アシスタントはどのユーザーを指しているか確認してから、userId を指定して再度呼び出せます。search に渡された GUID は、オブジェクト ID として直接扱われます |
polyarchy-expand | 1 つのノードの関係を、ノード/エッジの差分として返します(組織/グループ/アクセス/属性、グループ/ロールのメンバー、属性コホート。attr はネストしたパスを受け付けます)。差分全体(オブジェクト ID を含むすべてのノード、およびグループの種類/割り当て済みか動的かの情報)は呼び出し元に返されます。すでに開いているキャンバスは再描画しません(UI は操作時に独自のデータを取得します) |
polyarchy-search | 名前/UPN でユーザーを検索し、各候補の UPN、役職/部署、オブジェクト ID を返します |
polyarchy-report | UI を使わずに、ユーザーの関係を構造化 JSON レポートで返します。上司の全階層と直属の部下、グループメンバーシップ(グループの種類と割り当て済み/動的の情報付き)、ディレクトリロール、アプリの割り当て、主要な属性が含まれます。dimensions を選ぶか、all を指定します |
set-access-token / get-auth-status | トークンの受け渡しと認証の診断 |
(get-photo、get-app-logo、get-manager もありますが、アプリの UI でのみ表示され、モデルには表示されません。ユーザーと Microsoft 365 グループのノードに写真を、アプリケーションノードにロゴを設定します。)
開発
npm install
npm run build # tsc (server → build/server) + vite single-file (UI → build/ui/mcp-app.html)
npm start # run the server on stdio
MCPJam inspector または MCP Apps 対応ホストで、node build/server/index.js を指定して対話的にテストできます。UI は自己完結型の HTML ファイル 1 つ(D3 をインライン化)で、MCP Apps のデフォルト CSP に準拠しています。iframe からネットワークへの呼び出しは一切ありません。Graph へのすべての通信は、tools/call を介してサーバー経由で行われます。
リリース
npm version patch # bumps package.json + server.json (synced automatically) and tags
git push --follow-tags
このタグによって .github/workflows/release.yml が実行され、npm(Trusted
Publishing — OIDC、provenance attested、トークン不要)に公開した後、MCP レジストリに公開されます
(mcp-publisher login github-oidc)。リポジトリにも Actions にもシークレットは保存されていません。
誕生の経緯
Microsoft は 2003 年の TechEd で PolyArchy Server をデモしましたが、リリースしませんでした。2017 年、Darren は MIM + Power BI + Journey Chart でその概念を再現しました (ブログ記事)。 2026 年、MCP Apps によって本物を実現できるようになりました。すでに利用している AI クライアント内で動作する ID ポリアーキーで、EntraPulse ファミリーの一部です。
MIT ライセンス。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。