MCP server for Microsoft Entra ID sign-in and audit-log triage (read-only)
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
English | ζ₯ζ¬θͺ
MCP server for Microsoft Entra ID sign-in and audit-log triage. Read-only.
Microsoft ships an official MCP Server for Enterprise for Entra ID data. It is a good fit for an interactive admin at a keyboard, and is not a fit for an unattended triage bot:
az login) fallback for local development.GET/schema-discovery calls against Microsoft Graph. That is flexible for
a human, and awkward to put behind an allow-list for an automated triage
profile. entraadm-mcp exposes seven fixed, read-only tools instead.status/errorCode server-side, and has no built-in
password-spray view. signin_failure_stats aggregates client-side and
flags IPs with failed sign-ins against many distinct users β the pattern
Entra's per-account smart lockout does not catch on its own.| Tool | What it answers |
|---|---|
health_check | Is Graph reachable, and can this credential read sign-in logs? |
get_user | Is this account enabled, synced from on-prem, and what are its licenses? |
signin_logs | Why did this user's sign-in fail (or succeed), with the AADSTS code translated? |
signin_failure_stats | Tenant-wide failure aggregation: top error codes, users, apps, source IPs, and password-spray suspects |
directory_audits | Who changed what in the directory (block/unblock, attribute edits), and when? |
get_user_auth_methods | Is MFA actually registered for this account? |
daily_brief | One-call summary combining signin_failure_stats and directory_audits |
Every tool is read-only. Write operations (unblocking an account, resetting a password, revoking a session) are out of scope for this server.
Two auth modes, selected by which environment variables are set:
| Mode | When | Env vars |
|---|---|---|
| app-only | All three set | ENTRAADM_TENANT_ID, ENTRAADM_CLIENT_ID, ENTRAADM_CLIENT_SECRET |
| azure-cli | None set | (uses the current az login session) |
Setting one or two of the three app-only variables is a configuration error and the server refuses to start, rather than silently falling back to a different auth mode than intended.
| Tool(s) | Permission | Notes |
|---|---|---|
get_user (base fields) | User.Read.All | |
signin_logs, signin_failure_stats, directory_audits, get_user's sign_in_activity field | AuditLog.Read.All (app-only) or the Reports Reader directory role (delegated) | |
get_user_auth_methods | UserAuthenticationMethod.Read.All | App-only only; not available under delegated (az login) auth in a typical tenant role assignment |
A missing permission never crashes a tool. It degrades that tool (or that
one field) to {"error": "...", "missing_permission": "..."} with a
human-readable explanation of what role or permission is needed, so
health_check and every other tool stay usable even before full permissions
are granted.
Set the three app-only variables for production/unattended use:
Or leave all three unset and run az login first for local development.
Optional:
Add to .mcp.json:
| Option | Effect |
|---|---|
--version | Print the version and exit |
--check | Resolve auth, probe Graph reachability and sign-in log access, print a report, exit 0 (or 1 on config error) |
capped boolean when its window was not fully scanned β a
partial scan is never reported as if it were exhaustive.found: false is not an error. get_user and get_user_auth_methods
answer a nonexistent account with {"found": false, ...}, not an error
key β a typo'd userPrincipalName should never look like this server being
broken.Read-only, no payloads printed (tool names/statuses/row counts only), and bounded (small explicit windows/page caps) β nothing here writes to the tenant or scans more than a day of logs.
This repository uses release-please
driven by Conventional Commits. Merge
a feat:/fix: PR to main, and release-please opens (or updates) a
release PR; merging that PR tags a release and triggers the publish pipeline
(PyPI, MCP Registry).
MIT
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/entraadm-mcp)<a href="https://allmcps.com/mcp/entraadm-mcp"><img src="https://allmcps.com/api/badge/entraadm-mcp?style=directory" alt="Entraadm MCP on AllMCPs" /></a>