A live, interactive identity relationship visual for Microsoft Entra ID — the polyarchy Microsoft demoed as PolyArchy Server in the MIIS Toolkit 2003 but never shipped, finally built on Microsoft Graph.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Documented (README)
git clone https://github.com/darrenjrobinson/entrapulse-polyarchy{
"mcpServers": {
"entrapulse-polyarchy": {
"command": "node",
"args": ["/path/to/entrapulse-polyarchy/dist/index.js"],
"env": {
"USE_CLIENT_TOKEN": "<use_client_token>"
}
}
}
}USE_CLIENT_TOKENMCP Servers overview
# EntraPulse Polyarchy
**An interactive Microsoft Entra ID identity relationship visualization, served as an MCP App.**
[](https://www.npmjs.com/package/entrapulse-polyarchy)
[](https://www.npmjs.com/package/entrapulse-polyarchy)
[](LICENSE)

In 2003 Microsoft demoed *PolyArchy Server* — a web visual over identity data showing
intersecting relationship hierarchies, where clicking a datapoint flipped the whole view
to that context. It never shipped. This is it, finally real: a live D3 force-graph over
your Entra ID tenant that renders **inside your MCP client** (Claude Desktop, VS Code
Copilot, M365 Copilot, ChatGPT, Cursor, Goose, Postman — anything that supports the
[MCP Apps](https://modelcontextprotocol.io/docs/extensions/apps) extension).
Ask your assistant *"show me the identity polyarchy around Rebecca"* and explore:
- **Org** — manager chains and direct reports
- **Groups** — memberships, and group fan-out to members
- **Attributes** — pivot hubs linking everyone who shares a value: pick from the
common defaults (department, office, city…) or type ahead into the full Graph
attribute catalog, including nested paths like
`onPremisesExtensionAttributes/extensionAttribute9`
- **Access** — directory roles and app assignments
Prefer data over pictures? `polyarchy-report` returns the same relationships as
structured JSON — manager chain, group memberships with type and assigned/dynamic,
roles, app assignments — for the assistant to reason over, no UI required.
## Exploring
- **Click** a node to open its profile panel (photo, attributes, manager chain link).
- **Double-click** any node — or use the panel's *Set as focus* button — to flip the
whole context to it: hop distances re-anchor, the view glides to center, and its
relationships load. The original PolyArchy interaction.
- **Reset** (toolbar) clears the canvas for a fresh lineage without losing anything:
everything fetched this session stays cached, so re-exploring the same people,
groups or cohorts rebuilds instantly with **zero extra Graph calls**. The status
bar shows when a neighbourhood was served from cache.
- **Expand / Minimise** (toolbar) toggles the app between fullscreen and its inline
card. The automatic fullscreen claim happens only when a polyarchy opens, so this
is the way back to full canvas after minimising in the host. Hidden on hosts
without fullscreen support.
- **Legend** checkboxes filter relationship kinds and object types in place.
The graph accumulates across dimensions: one intersecting polyarchy, not four separate
charts. **People** are shaded by degrees of separation from the focus (blue ramp);
**groups, roles, apps and attribute hubs** wear the colour of the relationship that
connects them — matching their edges — faded with distance so the hop cue survives.
Light and dark theme follow your MCP client.
## Install (Claude Desktop example)
```json
{
"mcpServers": {
"entrapulse-polyarchy": {
"command": "npx",
"args": ["-y", "entrapulse-polyarchy"]
}
}
}
```
That's it for most tenants — **no app registration needed**. Be aware of what that
means: with no configuration the server signs you in through **Microsoft's first-party
"Microsoft Graph Command Line Tools" public client**
(client ID `14d82eec-204b-4c2f-b7e8-296a70dab67e`) — the same well-known app the Graph
PowerShell/CLI tooling uses. It exists in every tenant and already has broad delegated
consent in many. Hardened environments commonly block or restrict this app (Conditional
Access, consent policies, or app management restrictions) — if that's your tenant, use
[your own app registration](#hardened-tenants-bring-your-own-app-registration) instead;
everything else works identically.
Sign-in happens on the first tool call — and then never again:
- Tokens persist in your **OS keychain** (DPAPI/Keychain/libsecret).
- The signed-in account is remembered in `~/.entrapulse-polyarchy/auth-record.json`,
so **freshly spawned server processes sign in silently** — MCP clients respawn stdio
servers freely, and none of those spawns re-prompt.
- Token acquisition is **single-flighted and cached in-process**: a focus flip fires a
dozen-plus concurrent Graph calls (expansion + photos), and they all share one token
request instead of racing the MSAL cache.
- Every auth event is mirrored to `~/.entrapulse-polyarchy/auth.log` with timings
(silent acquisitions are milliseconds; anything interactive is obvious) — the first
place to look if you ever see a prompt you didn't expect.
## Auth modes
| Mode | Configure | Notes |
|---|---|---|
| **Interactive** (default) | nothing — or `TENANT_ID` + `CLIENT_ID` to use your own app | System browser sign-in (random loopback port — register `http://localhost` portless); delegated permissions; `/me` is the default focus |
| **Device code** | `USE_DEVICE_CODE=true` | Headless/SSH — code printed to the server log |
| **App-only** | `TENANT_ID` + `CLIENT_ID` + `CLIENT_SECRET` | Application permissions; no `/me`, so always pass a person to `visualize-identity` / `polyarchy-report` |
| **Client-provided token** | `USE_CLIENT_TOKEN=true` (+ optional `ACCESS_TOKEN`) | The MCP client supplies/refreshes a Graph bearer token via the `set-access-token` tool — seamless SSO for hosts like EntraPulse that already hold one |
Other env vars: `POLYARCHY_DISABLE_TOKEN_CACHE=true` disables OS-keychain token
persistence; `POLYARCHY_AUTH_RECORD=<path>` relocates the persisted sign-in record
(delete the file to force a fresh sign-in).
### Permissions (delegated)
| Scope | Used for |
|---|---|
| `User.Read.All` | org hierarchy, search, attribute pivots |
| `Group.Read.All` | group memberships and members |
| `RoleManagement.Read.Directory` | directory roles |
| `Application.Read.All` | app assignments |
The default first-party client typically has broad delegated consent already. Missing
consent shows up as a clear 403 message naming the scope — ask your assistant to run
`get-auth-status` to see exactly which app registration, scopes and account your token
contains.
Scopes and directory roles are separate gates: the token must always carry the scopes
above (an admin role can't substitute for them), while on the user side plain member
default permissions cover everything this app reads — no admin role required. Only
tenants that restrict default user read access (or guest users) need a role that
includes directory read, for which **Directory Readers** is the least-privileged fit.
### Hardened tenants: bring your own app registration
If the Graph Command Line Tools app is blocked, unconsented, or you simply want an
app you control (own Conditional Access targeting, own consent trail), point the server
at your own registration — supported in both interactive and device-code modes:
1. **Entra admin center → App registrations → New registration** — single tenant is fine.
2. **Authentication → Add a platform → Mobile and desktop applications** — add redirect
URI **`http://localhost`** (no port!), and enable **Allow public client flows** if you
want device-code sign-in. The port matters: interactive sign-in listens on a **random
loopback port** each time (e.g. `http://localhost:51106`), and Entra only ignores the
port when the registered redirect is the portless `http://localhost`. Registering a
fixed port like `:3000`, or reusing an app that only has web redirects (Graph
Explorer, for instance), fails with a reply-URL mismatch.
3. **API permissions → Microsoft Graph → Delegated** — add the four scopes from the
table above, then **Grant admin consent**.
4. Configure the server with your IDs:
```json
{
"mcpServers": {
"entrapulse-polyarchy": {
"command": "npx",
"args": ["-y", "entrapulse-polyarchy"],
"env": {
"TENANT_ID": "<your-tenant-guid>",
"CLIENT_ID": "<your-app-registration-client-id>"
}
}
}
}
```
Setting `TENANT_ID` alone (without `CLIENT_ID`) is also useful on its own: it pins
sign-in to your tenant instead of the `common` endpoint, which multi-tenant users and
guest accounts often want regardless of which client app is used.
## Attribute pivots
The Attributes view groups people around shared values. The toolbar picker offers the
everyday pivots (Department, Job title, Company, Office, City, State, Employee type),
plus **Other attributes…** which opens a type-ahead over the full Graph user-attribute
catalog — all fifteen `onPremisesExtensionAttributes`, `employeeOrgData/costCenter`,
`onPremisesSamAccountName`, `employeeId` and ~50 more. Matching is forgiving (`ext9`
finds `extensionAttribute9`), free text is accepted for anything uncatalogued, and
attributes you pick join the dropdown for the rest of the session. Nested paths are
resolved server-side: the needed property is `$select`ed on demand and cohort filters
use Graph advanced queries, with attribute paths validated before they reach an OData
filter.
## Tools
| Tool | Purpose |
|---|---|
| `visualize-identity` | Open the polyarchy focused on you, or `{search: "name"}` / `{userId}`. Ambiguous names don't guess: the tool returns the candidates (with object ids) so the assistant can ask which one you meant, then re-call with `userId`. A GUID passed as `search` is treated as an object id directly |
| `polyarchy-expand` | Relationships for one node as a nodes/edges delta (org/groups/access/attributes; group/role members; attribute cohorts — `attr` accepts nested paths). The full delta — every node with object id, and group type / assigned-vs-dynamic for groups — is returned to the caller; What people ask about entrapulse-polyarchy
What is darrenjrobinson/entrapulse-polyarchy?
+
darrenjrobinson/entrapulse-polyarchy is mcp servers for the Claude AI ecosystem. A live, interactive identity relationship visual for Microsoft Entra ID — the polyarchy Microsoft demoed as PolyArchy Server in the MIIS Toolkit 2003 but never shipped, finally built on Microsoft Graph. It has 0 GitHub stars and its last recorded update is dated 2026-09-02.
How do I install entrapulse-polyarchy?
+
You can install entrapulse-polyarchy by cloning the repository (https://github.com/darrenjrobinson/entrapulse-polyarchy) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is darrenjrobinson/entrapulse-polyarchy safe to use?
+
Our security agent has analyzed darrenjrobinson/entrapulse-polyarchy and assigned a Trust Score of 87/100 (tier: Trusted). See the full breakdown of passed checks and flags on this page.
Who maintains darrenjrobinson/entrapulse-polyarchy?
+
darrenjrobinson/entrapulse-polyarchy is maintained by darrenjrobinson. The last recorded GitHub activity is dated 2026-09-02, with 1 open issues.
Are there alternatives to entrapulse-polyarchy?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy entrapulse-polyarchy to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/darrenjrobinson-entrapulse-polyarchy)<a href="https://claudewave.com/repo/darrenjrobinson-entrapulse-polyarchy"><img src="https://claudewave.com/api/badge/darrenjrobinson-entrapulse-polyarchy" alt="Featured on ClaudeWave: darrenjrobinson/entrapulse-polyarchy" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!