Skip to main content

IdenGraph

Identity & Access intelligence powered by Microsoft Graph and MCP.

A read-only MCP server that turns natural-language questions into audited answers about Microsoft Entra ID and Azure RBAC — answered by your own Copilot, inside VS Code.

VS Code Marketplace PyPI License: MIT

It never writes. Every create, update, delete, grant, or privilege-activation operation is blocked before routing.

What you can ask

  • Who has Owner on Azure? And who holds Global Administrator in Entra?
  • Which applications were created in my tenant, and which are Microsoft first-party?
  • Which users have no MFA, or rely on weak methods?
  • Which application secrets expire in the next 30 days?
  • Which objects have no owner assigned?
  • What is the blast radius of a given identity?
  • Are we paying for security features we don't use?

66 tools across users, groups, applications, service principals, managed identities, PIM, RBAC, authentication, conditional access, ownership, privilege timeline, licensing posture, and toxic combinations (SoD).

Design principles

These three rules define the behavior, and they matter more than the feature list.

Source separation

Microsoft Graph answers for identity and directory. Azure APIs answer for RBAC and resources. Graph is never treated as a source of truth for Azure RBAC.

No false zero

If a permission is missing, the answer is PERMISSION_DENIED with NOT_EVALUATED coverage — never 0.

"I could not evaluate this" and "this does not exist" are different answers. Conflating them in an audit is worse than not answering at all, because a false zero looks like a clean result.

This applies to licensing too: zero conditional access policies means something entirely different when the feature isn't licensed versus when it's licensed and unused.

Read-only by construction

Only GET, LIST, QUERY, ASSESS, and CORRELATE. The graph_query tool can receive read-only KQL generated from a user request, but it does not accept arbitrary endpoints: the capability registry selects the data source, and the executor blocks mutation operators and external-access constructs before sending the query.

Architecture

flowchart TB
    User(["You"]) -->|natural language| Copilot["Copilot Chat<br/><i>your own model</i>"]
    Copilot <-->|MCP / stdio| Server

    subgraph Server["IdenGraph MCP Server · 66 read-only tools"]
        direction TB
        Router["Capability router<br/><i>intent → capability</i>"]
        Guard{{"Write guard<br/><i>blocks mutations</i>"}}
        Registry[("Capability registry<br/>43 capabilities · 29 domains")]
        Executor["Read-only executor<br/><i>allowlist + validation</i>"]

        Router --> Guard --> Registry --> Executor
    end

    Executor -->|identity & directory| Graph["Microsoft Graph"]
    Executor -->|RBAC & resources| Azure["Azure Management<br/>+ Resource Graph"]

    Graph --> Normalizer["Normalizer & correlation<br/><i>preserves evidence and coverage</i>"]
    Azure --> Normalizer
    Normalizer -->|answer + provenance| Copilot

    style Guard fill:#c62828,color:#fff
    style Server fill:#0B1F3A,color:#fff
    style Normalizer fill:#1565c0,color:#fff

Two details worth highlighting:

The write guard sits before routing, not after. A mutation request is rejected before it can be interpreted as a query.

The normalizer preserves coverage, not just data. Every answer carries where it came from and whether the source could actually be evaluated — which is what makes the no-false-zero rule enforceable rather than aspirational.

How the pieces are distributed

Layer Artifact Role
Discovery VS Code extension One-click install, prerequisite checks, settings UI
Engine idengraph on PyPI The MCP server itself
Model Your Copilot subscription No LLM cost to this project or to you

The extension does not replace the Python package — it registers it. The engine runs the same way whether launched by the extension or configured by hand.

Install

Install IdenGraph from the Marketplace, then sign in to Azure:

az login

Open Copilot Chat in agent mode and ask. The extension verifies prerequisites and guides you if anything is missing.

Alternative: manual MCP configuration

Create .vscode/mcp.json:

{
  "servers": {
    "idengraph": {
      "type": "stdio",
      "command": "uvx",
      "args": ["idengraph"],
      "env": { "MOCK_MODE": "false" }
    }
  }
}

Prerequisites

  • Python 3.10+
  • uv
  • Azure CLI with an active session (az login)

Authentication uses DefaultAzureCredential, which reuses your Azure CLI session. There is no API key to manage, and no credential is stored by this project.

Configuration

Setting Env var Default Purpose
idengraph.useMockData MOCK_MODE false (extension) Query fictional data instead of your tenant
idengraph.sanitizeOutput SANITIZE_FOR_LLM true Mask resource names, subscription IDs, and IPs before they reach the model
idengraph.subscriptions AZURE_SUBSCRIPTIONS all accessible Restrict queries to specific subscriptions

The Python package defaults to MOCK_MODE=true so that nothing touches a real tenant without explicit intent. The extension sets it to false, since installing it is already that intent.

Permissions

On Azure: Reader on the subscriptions you want to audit.

On Microsoft Graph, delegated permissions vary by question:

Area Permission
Users, groups, applications, service principals Directory.Read.All
Directory roles and directory PIM RoleManagement.Read.All
Authentication methods and MFA UserAuthenticationMethod.Read.All
Conditional access Policy.Read.All
License posture Organization.Read.All

Missing a permission only marks the matching area as not evaluated. Everything else keeps working — and the affected area reports why it could not be evaluated.

Privacy

Queried data belongs to your tenant and travels between your machine, Microsoft APIs, and the Copilot model you already use. This project sends nothing to third-party servers and collects no telemetry.

By default, SANITIZE_FOR_LLM=true masks resource names, resource groups, subscription IDs, and IP addresses before content reaches the model.

Development

python -m venv .venv
.venv\Scripts\activate        # Windows
# source .venv/bin/activate   # Linux/macOS
pip install -r requirements.txt
cp .env.example .env
python test_smoke.py

All tests run in mock mode and never touch a tenant:

python test_smoke.py
python test_capability_layer.py
python test_tool_annotations.py
python test_tool_catalog_smoke.py

Repository layout

mcp_server.py                       MCP server and tool registration
services/azure_auth.py              credentials, tokens, caching
services/graph_capabilities.py      capability registry
services/capability_router.py       natural language → capability
services/capability_executor.py     validated read-only execution
services/azure_role_definitions.py  authoritative Azure role name resolution
services/azure_pim.py               resource PIM with confirmed coverage
services/entra_licenses.py          tenant licensing and feature availability
services/data/                      mock data used when MOCK_MODE=true
extension/                          VS Code extension (TypeScript)

The published package's surface is the MCP server only — there is no bundled UI or chat orchestrator; the model comes from your own Copilot/MCP client.

Known limitations

  • Agent Identity detection is heuristic where the directory exposes no dedicated type. Results are labeled as such, never presented as fact.
  • Public IP indicates a public address, which does not prove workload exposure.
  • Without RoleManagement.Read.All, directory PIM reports as not evaluated rather than empty.
  • License posture currently cross-references PIM and Conditional Access. Capabilities still marked not_integrated in the registry are not probed, and deliberately return no verdict.

License

MIT — see LICENSE.

Metadata

Release files for idengraph 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for idengraph 0.2.0
File Size Uploaded
idengraph-0.2.0.tar.gz 120.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for idengraph 0.2.0
File Interpreter ABI Platform
idengraph-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 261.5 kB

Release files / idengraph-0.2.0.tar.gz

Download URL idengraph-0.2.0.tar.gz
Size 120.0 kB
Tags Source
SHA-256 checksum
How to use checksums
b0ca2e756b90b7e98ed2a53a36031362d8cba44222c418fc53b5f8d40b1a288a
BLAKE2b-256 checksum
How to use checksums
6ccbb4106bd678dd2f7ab7871726b5f2090e1305a02c52ca86cd0c61eabe049c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.

Transparency log

Release files / idengraph-0.2.0-py3-none-any.whl

Download URL idengraph-0.2.0-py3-none-any.whl
Size 141.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0281c7aec4b4807329064fa818cbad7a5b0879fae24264d2aa8b4852ffa42c74
BLAKE2b-256 checksum
How to use checksums
d6cc69939d63ba605d5cc49e3e4568667c0c3997332bb8a4d1a3bc2c76233f80
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page