ms-365-admin-mcp-server

ms-365-admin-mcp-server

A Model Context Protocol server for Microsoft 365 administration using Graph API application permissions, enabling security monitoring, identity audits, incident response, and service health management.

Category
Visit Server

README

ms-365-admin-mcp-server

CI npm version License: MIT

A Model Context Protocol (MCP) server for Microsoft 365 administration via Graph API application permissions (client credentials).

Built on the architecture and endpoint-driven design pioneered by Softeria/ms-365-mcp-server, and complementary to it: Softeria's server uses delegated permissions for end-user productivity scenarios, while this one uses application permissions for admin operations — security monitoring, identity audits, incident response, and service health. See Acknowledgments below.

Features

  • 622 tools covering security, audit, identity, app credentials, guest users, Exchange, Intune (devices, apps, MAM, reports, macOS Platform Scripts, macOS custom attribute scripts, assignment filters, Remediations, Windows PowerShell scripts, custom compliance scripts), governance (PIM, access reviews, entitlement, lifecycle), compliance, threat intelligence, advanced hunting, Defender for Identity (sensors, candidates, migration, identity accounts, audit policy), Microsoft 365 Copilot admin (usage reports, interaction history audit, AI users, meeting insights, agent registrations, policy settings), custom security attributes, LAPS, policies, reports, incident response, eDiscovery v3 (cases, custodians, noncustodial data sources, review sets, queries, exports, operations), Purview DSPM (protection scopes), event-based retention triggers, Teams online meeting attendance reports (app-only with Application Access Policy), deleted chats restore (admin recovery flow), Teams chat investigation reads (Chat.Read.All for triage; eDiscovery v3 for court-admissible production), Cloud PC, call records, Universal Print, information protection, SharePoint admin, and records management
  • Application permissions (client credentials) — no user interaction required
  • Read-only by default — write operations require explicit --allow-writes
  • Risk classification on write tools (low/medium/high/critical)
  • Presets to filter tools by domain (security, audit, identity, etc.)
  • Two transports: stdio (default) and HTTP (StreamableHTTP)
  • Multi-cloud: Microsoft global and China (21Vianet)
  • Key Vault support for secrets management

Documentation

Document Purpose
docs/USE_CASES.md 18 typical admin scenarios with sample prompts and tool lists
docs/playbooks/ End-to-end security incident response playbooks
agent-skills/ Drop-in skills for LLM agents (Claude Code et al.) with safety patterns
docs/APP_REGISTRATION.md Step-by-step Azure AD app registration and permission consent
docs/HTTP_DEPLOYMENT.md HTTP transport, JWT validation, Docker, Azure Container Apps
docs/AZURE_DEPLOYMENT_SECURITY.md Threat model, required controls, and checklist for Azure production deploys
docs/TROUBLESHOOTING.md Common errors and how to diagnose them
docs/ARCHITECTURE.md Internal architecture and code generation pipeline
docs/RISK_MODEL.md Risk classification rubric for write tools
CONTRIBUTING.md How to contribute new tools, presets, and fixes
SECURITY.md Vulnerability reporting and operator hardening checklist
CHANGELOG.md Release history

Prerequisites

  • Node.js >= 18
  • An Azure AD app registration with application permissions (not delegated)
  • A specific tenant ID (not "common")

Installation

npm (recommended)

npm install -g @okapi-ca/ms-365-admin-mcp-server
ms-365-admin-mcp-server --help

Docker

docker pull ghcr.io/okapi-ca/ms-365-admin-mcp-server:latest
docker run --rm -i \
  -e MS365_ADMIN_MCP_CLIENT_ID=... \
  -e MS365_ADMIN_MCP_CLIENT_SECRET=... \
  -e MS365_ADMIN_MCP_TENANT_ID=... \
  ghcr.io/okapi-ca/ms-365-admin-mcp-server:latest

From source

git clone https://github.com/okapi-ca/ms-365-admin-mcp-server.git
cd ms-365-admin-mcp-server
npm install
npm run generate
npm run build

Configuration

Environment variables

Variable Required Description
MS365_ADMIN_MCP_CLIENT_ID Yes App registration client ID
MS365_ADMIN_MCP_CLIENT_SECRET Yes App registration client secret
MS365_ADMIN_MCP_TENANT_ID Yes Azure AD tenant ID (must be specific)
MS365_ADMIN_MCP_CLOUD_TYPE No global (default) or china
MS365_ADMIN_MCP_KEYVAULT_URL No Azure Key Vault URL (overrides env vars)
MS365_ADMIN_MCP_MAX_TOP No Cap $top query param to limit result size
READ_ONLY No true/1 to force read-only (default behavior)
ENABLED_TOOLS No Regex to filter available tools

MCP client configuration (Claude Desktop, etc.)

{
  "mcpServers": {
    "ms365-admin": {
      "command": "node",
      "args": ["/path/to/ms-365-admin-mcp-server/dist/index.js"],
      "env": {
        "MS365_ADMIN_MCP_CLIENT_ID": "your-client-id",
        "MS365_ADMIN_MCP_CLIENT_SECRET": "your-client-secret",
        "MS365_ADMIN_MCP_TENANT_ID": "your-tenant-id"
      }
    }
  }
}

VS Code (1.102+)

VS Code consumes the same MCP protocol but uses a different config layout — servers instead of mcpServers, an explicit type field, and inputs for secret prompts. A ready-to-copy sample lives at .vscode/mcp.json.example; copy it to .vscode/mcp.json and VS Code will prompt for the tenant / client / secret on first start, then store them in its secret store (the real mcp.json is gitignored so resolved secrets never reach the repo).

Minimal stdio setup:

{
  "inputs": [
    { "type": "promptString", "id": "ms365-tenant-id", "description": "Tenant ID" },
    { "type": "promptString", "id": "ms365-client-id", "description": "Client ID" },
    {
      "type": "promptString",
      "id": "ms365-client-secret",
      "description": "Client secret",
      "password": true,
    },
  ],
  "servers": {
    "ms365-admin": {
      "type": "stdio",
      "command": "ms-365-admin-mcp-server",
      "args": ["--preset", "security,audit,identity,health"],
      "env": {
        "MS365_ADMIN_MCP_TENANT_ID": "${input:ms365-tenant-id}",
        "MS365_ADMIN_MCP_CLIENT_ID": "${input:ms365-client-id}",
        "MS365_ADMIN_MCP_CLIENT_SECRET": "${input:ms365-client-secret}",
      },
    },
  },
}

For remote HTTP deployments, use "type": "http" with a url field (VS Code 1.103+ handles OAuth 2.0 Dynamic Client Registration natively) or fall back to the mcp-remote bridge when the native browser flow is unavailable — see the example file for both shapes.

Tools surface in Agent mode (GitHub Copilot Chat). VS Code asks for per-tool approval; the --preset flag above keeps the catalog manageable. Use Cmd/Ctrl+Shift+PMCP: List ServersShow Output to see logs.

Remote HTTP server: device_code authentication (RFC 8628)

If the server runs in HTTP / OAuth mode on a remote host (e.g. Azure Container Apps) and the client connects via mcp-remote, the standard flow requires a browser to reach localhost:14543/oauth/callback. When that isn't possible — macOS Platform SSO hijacks the WebKit flow, Claude Code runs in a headless Docker container, the user is on a remote SSH dev env — use the ms-365-admin-mcp-auth bootstrap to pre-seed mcp-remote's token cache instead.

npx @okapi-ca/ms-365-admin-mcp-server@latest auth \
  --server https://your-mcp-host.azurecontainerapps.io/mcp

The helper prints a URL and a user code; you sign in on any device you trust (phone, another laptop) and the tokens are written to ~/.mcp-auth/mcp-remote-<version>/. Claude Desktop / Claude Code then launches mcp-remote normally and finds the cached tokens without ever opening a browser.

See docs/TROUBLESHOOTING.md for Docker / remote-dev patterns and exit code reference.

Usage

CLI options

--read-only              Read-only mode (default)
--allow-writes           Enable write operations
--enabled-tools <regex>  Filter tools by regex pattern
--preset <names>         Use preset categories (comma-separated)
--list-presets           List available presets and exit
--list-tools             List available tools and exit
--list-permissions       List required Graph API permissions and exit
--verify-login           Test credentials against Graph API and exit
--cloud <type>           Cloud environment: global (default) or china
--transport <type>       Transport: stdio (default) or http
--port <number>          HTTP port (default: 8080)
--host <address>         HTTP bind address (default: 127.0.0.1)
--allowed-clients <ids>  Comma-separated Entra app IDs (required for HTTP)
-v                       Verbose logging

Presets

# Security alerts and incidents only
node dist/index.js --preset security

# Identity management tools
node dist/index.js --preset identity

# Multiple presets
node dist/index.js --preset security,audit,identity
Preset Description
security Security alerts, incidents, attack simulations, and threat intelligence
audit Directory audits, sign-ins, provisioning logs, deleted items
health Service health and Message Center
reports Usage reports (Teams, Email, SharePoint, OneDrive, Mailbox, M365 Apps)
identity Users, groups, roles, devices, PIM, guest users, external identities
exchange Exchange administration (message traces, mailboxes)
intune Managed devices, compliance, configurations, Autopilot, apps, RBAC
governance Access reviews, entitlement management, lifecycle workflows, terms of use
compliance Licenses, Secure Score, Identity Protection, risk detections, policies
response Incident response write operations (disable, revoke, confirm, dismiss)
ediscovery eDiscovery cases (Microsoft Purview)
cloudpc Cloud PC / Windows 365 (provisioning, images, connections, settings, audit)
callrecords Teams call records
print Universal Print (printers, shares, connectors, services, operations, tasks)
infoprotection Information Protection (BitLocker recovery keys, threat assessment)
sharepointadmin SharePoint tenant administration settings
retention Records Management (retention labels, file plan metadata)
all All available tools

Verify credentials

node dist/index.js --verify-login

Available tools (515)

Security (11)

Tool Method Risk
list-security-alerts GET
get-security-alert GET
update-security-alert PATCH medium
list-security-incidents GET
get-security-incident GET
update-security-incident PATCH medium
list-attack-simulations GET
get-attack-simulation GET
create-attack-simulation POST high
update-attack-simulation PATCH medium
delete-attack-simulation DELETE medium

Audit logs & deleted items (5)

Tool Method
list-directory-audits GET
list-sign-ins GET
list-provisioning-logs GET
list-deleted-users GET
list-deleted-groups GET

Service health (3)

Tool Method
list-service-health GET
list-service-issues GET
list-service-messages GET

Usage reports (8)

Tool Method
get-teams-activity-report GET
get-email-activity-report GET
get-active-users-report GET
get-sharepoint-usage-report GET
get-onedrive-usage-report GET
get-active-user-counts-report GET
get-mailbox-usage-report GET
get-m365-apps-usage-report GET

Users (10)

Tool Method Risk
list-users GET
get-user GET
list-user-memberships GET
list-user-auth-methods GET
list-user-devices GET
create-user POST high
update-user PATCH medium
delete-user DELETE critical
assign-user-license POST medium
reprocess-user-license POST low

Devices (2)

Tool Method
list-devices GET
get-device GET

Groups (8)

Tool Method Risk
list-groups GET
get-group GET
list-group-members GET
list-group-owners GET
create-group POST medium
update-group PATCH medium
delete-group DELETE critical
add-group-member POST medium

Directory roles & PIM (7)

Tool Method Risk
list-directory-roles GET
list-role-members GET
list-role-assignments GET
list-role-definitions GET
list-pim-eligible-assignments GET
list-pim-active-assignments GET
add-directory-role-member POST critical

Administrative units (7)

Tool Method Risk
list-administrative-units GET
get-administrative-unit GET
list-administrative-unit-members GET
create-administrative-unit POST medium
update-administrative-unit PATCH medium
delete-administrative-unit DELETE high
add-administrative-unit-member POST medium

Conditional access (3)

Tool Method
list-conditional-access-policies GET
get-conditional-access-policy GET
list-named-locations GET

Applications & app roles (8)

Tool Method Risk
list-applications GET
list-service-principals GET
list-oauth2-grants GET
list-user-app-role-assignments GET
list-sp-app-role-assignments GET
update-application PATCH high
delete-application DELETE critical
update-service-principal PATCH high

App credentials & owners (7)

Tool Method
get-application GET
list-application-owners GET
list-app-federated-credentials GET
get-app-federated-credential GET
get-service-principal GET
list-service-principal-owners GET
list-sp-delegated-permissions GET

App management policies (2)

Tool Method
list-app-management-policies GET
get-app-management-policy GET

Organization & domains (4)

Tool Method Risk
get-organization GET
list-domains GET
create-domain POST high
verify-domain POST medium

Licenses (2)

Tool Method
list-subscribed-skus GET
get-subscribed-sku GET

Secure Score (4)

Tool Method
list-secure-scores GET
get-secure-score GET
list-secure-score-controls GET
get-secure-score-control GET

Identity Protection & risk detections (7)

Tool Method
list-risky-users GET
get-risky-user GET
list-risky-user-history GET
list-risky-service-principals GET
get-risky-service-principal GET
list-risk-detections GET
get-risk-detection GET

Security & access policies (13)

Tool Method Risk
get-auth-methods-policy GET
list-auth-method-configs GET
get-auth-method-config GET
get-security-defaults GET
get-admin-consent-policy GET
list-auth-strength-policies GET
get-auth-strength-policy GET
create-auth-strength-policy POST high
update-auth-strength-policy PATCH high
delete-auth-strength-policy DELETE high
get-cross-tenant-access-policy GET
list-cross-tenant-partners GET
change-user-password POST high

Guest user invitations (2)

Tool Method Risk
list-invitations GET
create-invitation POST medium

External identity providers (2)

Tool Method
list-identity-providers GET
get-identity-provider GET

Self-service sign-up (4)

Tool Method
list-b2x-user-flows GET
get-b2x-user-flow GET
list-api-connectors GET
get-api-connector GET

Custom authentication extensions (2)

Tool Method
list-custom-auth-extensions GET
get-custom-auth-extension GET

Exchange message traces (2)

Tool Method
list-message-traces GET
get-message-trace GET

Exchange mailboxes (7)

Tool Method Risk
list-exchange-mailboxes GET
get-exchange-mailbox GET
list-exchange-mailbox-folders GET
get-exchange-mailbox-folder GET
export-exchange-mailbox-items POST medium
update-exchange-mailbox PATCH medium
delete-exchange-mailbox DELETE critical

Threat intelligence - hosts (4)

Tool Method
list-threat-intel-hosts GET
get-threat-intel-host GET
get-threat-intel-host-whois GET
list-threat-intel-host-pairs GET

Threat intelligence - articles & profiles (6)

Tool Method
list-threat-intel-articles GET
get-threat-intel-article GET
list-threat-intel-article-indicators GET
list-threat-intel-profiles GET
get-threat-intel-profile GET
list-threat-intel-profile-indicators GET

Threat intelligence - vulnerabilities & WHOIS (4)

Tool Method
list-threat-intel-vulnerabilities GET
get-threat-intel-vulnerability GET
list-threat-intel-whois-records GET
get-threat-intel-whois-record GET

Threat intelligence - infrastructure (2)

Tool Method
list-threat-intel-host-components GET
list-threat-intel-ssl-certs GET

Managed devices (6)

Tool Method Risk
list-managed-devices GET
get-managed-device GET
list-device-compliance-states GET
list-device-configuration-states GET
get-managed-device-overview GET
delete-managed-device DELETE critical

Compliance policies (5)

Tool Method
list-compliance-policies GET
get-compliance-policy GET
list-compliance-policy-device-statuses GET
get-compliance-policy-status-overview GET
get-compliance-state-summary GET

Device configurations (3)

Tool Method
list-device-configurations GET
get-device-configuration GET
get-device-configuration-status-overview GET

macOS Platform Scripts (6)

Intune shell scripts deployed to managed macOS devices. Targets Graph beta (/beta/deviceManagement/deviceShellScripts) — Microsoft has never promoted this endpoint to v1.0. Requires DeviceManagementScripts.ReadWrite.All.

Tool Method Risk
list-device-shell-scripts GET
get-device-shell-script GET
create-device-shell-script POST medium
update-device-shell-script PATCH medium
delete-device-shell-script DELETE high
assign-device-shell-script POST medium

Notes:

  • scriptContent is strict base64 (not URL-safe) of a script with LF line endings — CRLF will break execution on Macs.
  • runAsAccount=user is required for scripts that interact with the user session (e.g. osascript touching System Events).
  • assign-device-shell-script REPLACES all existing assignments — it is not additive. To add a group without removing others, first GET the current assignments, append the new target, then POST the full merged list.
  • By default get-device-shell-script does not return scriptContent; pass $select=id,displayName,scriptContent,... to fetch the base64 body.

Intune Remediations / Proactive Remediations (6)

Paired detection + remediation PowerShell scripts for Windows 10/11 Azure AD joined devices. Targets Graph beta (/beta/deviceManagement/deviceHealthScripts). Requires DeviceManagementScripts.ReadWrite.All.

Tool Method Risk
list-device-health-scripts GET
get-device-health-script GET
create-device-health-script POST medium
update-device-health-script PATCH medium
delete-device-health-script DELETE high
assign-device-health-script POST medium

Notes:

  • Both detectionScriptContent and remediationScriptContent are base64-encoded PowerShell — UTF-8 encoded scripts before base64.
  • Detection script returns exit code 0 (compliant) or 1 (needs remediation). The remediation script only runs when detection returns 1.
  • assign-device-health-script REPLACES all existing assignments — schedules can be daily / hourly / run-once. Set runRemediationScript: false for detect-only deployments.
  • By default get-device-health-script does not return the script bodies; pass $select=id,displayName,detectionScriptContent,remediationScriptContent,....
  • Modern replacement for deviceShellScripts for Windows "verify + fix" use cases (CIS hardening, agent install verification, service state).

Assignment filters (5)

Dynamic membership filters that scope policy/app assignments to a sub-set of an Entra group. Targets Graph beta (/beta/deviceManagement/assignmentFilters). Requires DeviceManagementConfiguration.ReadWrite.All.

Tool Method Risk
list-assignment-filters GET
get-assignment-filter GET
create-assignment-filter POST medium
update-assignment-filter PATCH medium
delete-assignment-filter DELETE high

Notes:

  • Rule syntax is KQL-like on device properties — example: (device.osVersion -startsWith "14") for macOS Sonoma only, (device.deviceOwnership -eq "Corporate") for corporate-owned devices.
  • Operators: -eq, -ne, -startsWith, -contains, -in, -matches, joined by -and / -or.
  • Filters are referenced by deviceConfigurations / mobileApps / deviceCompliancePolicies assignments (not by users — you target the assignment to a group, then add a filter to narrow it).
  • assignmentFilterManagementType: devices for device-scoped assignments, apps for app-scoped (some properties differ).
  • Deleting a filter that is in use will silently fall the dependent assignments back to "all members of the group" — audit assignments before deleting.

macOS custom attribute shell scripts (6)

Intune shell scripts whose STDOUT is stored as a named custom attribute on each device — useful for surfacing inventory data (FileVault, Gatekeeper, encryption flags, custom markers) and driving dynamic group filters. Targets Graph beta (/beta/deviceManagement/deviceCustomAttributeShellScripts). Requires DeviceManagementScripts.ReadWrite.All.

Tool Method Risk
list-device-custom-attribute-shell-scripts GET
get-device-custom-attribute-shell-script GET
create-device-custom-attribute-shell-script POST medium
update-device-custom-attribute-shell-script PATCH medium
delete-device-custom-attribute-shell-script DELETE high
assign-device-custom-attribute-shell-script POST medium

Notes:

  • The script's STDOUT becomes the value stored under customAttributeName on each device.
  • customAttributeType controls how Intune parses STDOUT: integer, string, or dateTime (ISO 8601).
  • scriptContent is strict base64 of a script with LF line endings — CRLF breaks execution on Macs.
  • Changing customAttributeName or customAttributeType after deployment breaks downstream dynamic groups and assignment filters that reference the previous key — audit references first.
  • Deleting a script does NOT clear previously-collected attribute values from device records.

Windows PowerShell scripts (deviceManagementScripts) (6)

One-shot PowerShell scripts deployed to managed Windows 10/11 devices. Runs once per device per assignment, retries on failure. For detect-and-fix patterns use deviceHealthScripts (Remediations) instead. Targets Graph beta (/beta/deviceManagement/deviceManagementScripts). Requires DeviceManagementScripts.ReadWrite.All.

Tool Method Risk
list-device-management-scripts GET
get-device-management-script GET
create-device-management-script POST medium
update-device-management-script PATCH medium
delete-device-management-script DELETE high
assign-device-management-script POST medium

Notes:

  • scriptContent is base64-encoded UTF-8 PowerShell.
  • Runs ONCE per device on the next Intune Management Extension sync after assignment — does NOT re-run after successful execution (use deviceHealthScripts for repeating patterns).
  • Updating scriptContent does NOT re-run on devices that already succeeded; delete + recreate to force re-execution.
  • enforceSignatureCheck=true requires code-signed scripts (recommended for prod).
  • runAs32Bit=true forces 32-bit PowerShell on 64-bit Windows (rarely needed).

Windows custom compliance scripts (deviceComplianceScripts) (6)

PowerShell scripts that emit a JSON object on STDOUT evaluated against rules declared on an associated windows10CustomComplianceConfiguration policy — for organization-specific compliance signals beyond the built-in BitLocker / Defender / firewall checks. Targets Graph beta (/beta/deviceManagement/deviceComplianceScripts). Requires DeviceManagementScripts.ReadWrite.All.

Tool Method Risk
list-device-compliance-scripts GET
get-device-compliance-script GET
create-device-compliance-script POST medium
update-device-compliance-script PATCH medium
delete-device-compliance-script DELETE high
assign-device-compliance-script POST medium

Notes:

  • detectionScriptContent must emit a JSON object on STDOUT (e.g. ConvertTo-Json -Compress @{BitLockerEnabled=$true;TpmReady=$true}).
  • The script alone has no compliance effect — you must also author a windows10CustomComplianceConfiguration policy with matching rules.
  • Changing the JSON keys without updating the linked policy's rules silently breaks compliance evaluation.
  • Deleting a script in use causes referencing compliance policies to fail evaluation on next device check-in.
  • Assignment shape reuses deviceHealthScriptAssignment (set runRemediationScript: false since compliance scripts have no remediation pairing).

Enrollment & Autopilot (10)

Tool Method Risk
list-enrollment-configurations GET
get-enrollment-configuration GET
list-autopilot-devices GET
get-autopilot-device GET
create-enrollment-configuration POST medium
update-enrollment-configuration PATCH medium
delete-enrollment-configuration DELETE high
update-autopilot-device PATCH medium
delete-autopilot-device DELETE high
import-autopilot-device POST medium

Detected apps (3)

Tool Method
list-detected-apps GET
get-detected-app GET
list-detected-app-devices GET

Intune RBAC & config (7)

Tool Method
list-intune-audit-events GET
get-software-update-summary GET
get-apple-push-certificate GET
list-intune-role-definitions GET
list-intune-role-assignments GET
list-intune-terms-and-conditions GET
list-intune-terms-acceptances GET

Intune connectors & updates (3)

Tool Method
get-intune-conditional-access-settings GET
list-mtd-connectors GET
list-ios-update-statuses GET

Device categories (1)

Tool Method
list-device-categories GET

Access reviews (5)

Tool Method
list-access-review-definitions GET
get-access-review-definition GET
list-access-review-instances GET
get-access-review-instance GET
list-access-review-decisions GET

Entitlement management (7)

Tool Method
list-access-packages GET
get-access-package GET
list-access-package-assignments GET
list-access-package-requests GET
list-access-package-catalogs GET
list-connected-organizations GET
get-entitlement-management-settings GET

Lifecycle workflows (3)

Tool Method
list-lifecycle-workflows GET
get-lifecycle-workflow GET
list-lifecycle-task-definitions GET

PIM for Groups (2)

Tool Method
list-pim-group-assignment-schedules GET
list-pim-group-eligibility-schedules GET

Terms of use (3)

Tool Method
list-terms-of-use-agreements GET
get-terms-of-use-agreement GET
list-terms-of-use-acceptances GET

App consent requests (3)

Tool Method
list-app-consent-requests GET
get-app-consent-request GET
list-user-consent-requests GET

Incident response (11) -- requires --allow-writes

Tool Method Risk
disable-user-account PATCH critical
revoke-user-sessions POST high
add-security-alert-comment POST low
update-device PATCH high
confirm-compromised-users POST high
dismiss-risky-users POST high
delete-user-phone-auth-method DELETE high
confirm-compromised-service-principals POST high
dismiss-risky-service-principals POST high
confirm-safe-users POST high
run-hunting-query POST low

Intune device remote actions (16) -- requires --allow-writes

Tool Method Risk
wipe-managed-device POST critical
retire-managed-device POST high
sync-managed-device POST low
reboot-managed-device POST high
remote-lock-device POST medium
reset-device-passcode POST high
shutdown-managed-device POST high
disable-lost-mode POST low
locate-managed-device POST low
bypass-activation-lock POST high
trigger-defender-scan POST low
update-defender-signatures POST low
clean-windows-device POST critical
logout-shared-apple-user POST medium
delete-shared-apple-user POST high
update-windows-device-account POST medium

Conditional Access CRUD (8) -- requires --allow-writes

Tool Method Risk
list-conditional-access-templates GET
get-conditional-access-policy GET
create-conditional-access-policy POST high
update-conditional-access-policy PATCH high
delete-conditional-access-policy DELETE critical
create-named-location POST medium
update-named-location PATCH medium
delete-named-location DELETE high

Intune policies CRUD (6) -- requires --allow-writes

Tool Method Risk
create-compliance-policy POST medium
update-compliance-policy PATCH medium
delete-compliance-policy DELETE high
create-device-configuration POST medium
update-device-configuration PATCH medium
delete-device-configuration DELETE high

eDiscovery (1)

Tool Method Risk
list-ediscovery-cases GET

Teams call records (11)

Tool Method
list-call-records GET
get-call-record GET
list-call-record-sessions GET
get-call-record-session GET
list-call-session-segments GET
get-call-session-segment GET
list-call-record-participants GET
get-call-record-participant GET
get-call-record-organizer GET
get-pstn-calls GET
get-direct-routing-calls GET

Cloud PC / Windows 365 (10)

Tool Method Risk
list-cloud-pcs GET
list-cloud-pc-provisioning-policies GET
list-cloud-pc-device-images GET
list-cloud-pc-gallery-images GET
list-cloud-pc-on-premises-connections GET
list-cloud-pc-user-settings GET
list-cloud-pc-audit-events GET
create-cloud-pc-provisioning-policy POST medium
update-cloud-pc-provisioning-policy PATCH medium
delete-cloud-pc-provisioning-policy DELETE high

Universal Print (6)

Tool Method Risk
list-printers GET
list-print-shares GET
list-print-connectors GET
list-print-services GET
list-print-operations GET
list-print-task-definitions GET

Information Protection & Sensitivity Labels (7)

Tool Method
list-bitlocker-recovery-keys GET
list-threat-assessment-requests GET
list-sensitivity-labels GET
get-sensitivity-label GET
list-sensitivity-sublabels GET
get-sensitivity-label-rights GET
get-protection-scopes GET

SharePoint administration (25)

Tool Method Risk
get-sharepoint-settings GET
list-sharepoint-sites GET
get-sharepoint-site GET
update-sharepoint-site PATCH medium
list-site-drives GET
get-site-default-drive GET
list-site-lists GET
get-site-list GET
create-site-list POST low
update-site-list PATCH low
delete-site-list DELETE high
list-site-list-items GET
create-site-list-item POST low
update-site-list-item PATCH low
delete-site-list-item DELETE medium
list-site-list-columns GET
list-site-columns GET
list-site-content-types GET
list-site-permissions GET
get-site-permission GET
create-site-permission POST medium
update-site-permission PATCH medium
delete-site-permission DELETE high
get-site-analytics GET
list-site-subsites GET

Records Management (6)

Tool Method Risk
list-retention-labels GET
list-file-plan-authorities GET
list-file-plan-categories GET
list-file-plan-citations GET
list-file-plan-departments GET
list-file-plan-references GET

Teams administration (30)

Tool Method Risk
list-teams GET
create-team POST medium
get-team GET
update-team PATCH medium
delete-team DELETE critical
list-team-admin-channels GET
create-team-admin-channel POST low
get-team-admin-channel GET
delete-team-admin-channel DELETE high
list-team-admin-members GET
add-team-admin-members POST medium
remove-team-admin-members POST medium
get-team-admin-member GET
list-team-installed-apps GET
archive-team POST medium
unarchive-team POST low
clone-team POST medium
list-team-operations GET
list-team-permission-grants GET
get-teams-app-settings GET
update-teams-app-settings PATCH high
list-deleted-teams GET
list-teams-catalog-apps GET
get-teams-catalog-app GET
list-teams-app-definitions GET
get-teams-admin-settings GET
list-teams-user-configurations GET
get-teams-admin-policy GET
list-teams-policy-assignments GET
list-teams-phone-assignments GET

Intune reports (18) -- requires --allow-writes (POST endpoints)

Tool Method Risk
intune-device-noncompliance-report POST low
intune-compliance-policy-noncompliance-report POST low
intune-compliance-policy-noncompliance-summary POST low
intune-compliance-setting-noncompliance-report POST low
intune-config-policy-noncompliance-report POST low
intune-config-policy-noncompliance-summary POST low
intune-config-setting-noncompliance-report POST low
intune-devices-without-compliance-report POST low
intune-noncompliant-devices-settings-report POST low
intune-policy-noncompliance-report POST low
intune-policy-noncompliance-summary POST low
intune-policy-noncompliance-metadata POST low
intune-setting-noncompliance-report POST low
intune-report-filters POST low
intune-historical-report POST low
intune-cached-report POST low
list-intune-report-export-jobs GET
intune-device-app-install-status-report POST low

Intune partners & infrastructure (10)

Tool Method Risk
list-compliance-management-partners GET
list-device-management-partners GET
list-exchange-connectors GET
list-remote-assistance-partners GET
list-notification-message-templates GET
list-intune-resource-operations GET
list-imported-autopilot-devices GET
list-windows-malware-info GET
list-intune-mobile-apps GET
list-intune-app-categories GET

Intune app management (11)

Tool Method Risk
list-intune-app-configurations GET
list-managed-app-policies GET
list-managed-app-registrations GET
list-managed-app-statuses GET
list-android-app-protections GET
list-ios-app-protections GET
list-default-app-protections GET
list-targeted-app-configurations GET
list-mdm-wip-policies GET
list-mam-wip-policies GET
list-vpp-tokens GET

Advanced policies (15)

Tool Method Risk
list-activity-timeout-policies GET
get-authorization-policy GET
get-auth-flows-policy GET
list-claims-mapping-policies GET
list-conditional-access-policies-v2 GET
get-default-app-management-policy GET
get-device-registration-policy GET
list-feature-rollout-policies GET
list-home-realm-discovery-policies GET
list-permission-grant-policies GET
list-role-management-policies GET
list-role-management-policy-assignments GET
list-token-issuance-policies GET
list-token-lifetime-policies GET
get-cross-tenant-default-policy GET

Identity Governance+ (11)

Tool Method Risk
list-entitlement-assignment-policies GET
list-entitlement-resources GET
list-entitlement-resource-environments GET
list-lifecycle-workflow-templates GET
get-lifecycle-workflow-settings GET
list-lifecycle-custom-task-extensions GET
list-deleted-lifecycle-workflows GET
list-pim-group-assignment-requests GET
list-pim-group-assignment-instances GET
list-pim-group-eligibility-requests GET
list-pim-group-eligibility-instances GET

PIM role management (6)

Tool Method Risk
list-access-review-history GET
list-pim-role-assignment-requests GET
list-pim-role-assignment-schedules GET
list-pim-role-eligibility-requests GET
list-pim-role-eligibility-schedules GET
list-role-resource-namespaces GET

Identity Protection+ (2)

Tool Method Risk
list-service-principal-risk-detections GET

Security advanced (9)

Tool Method Risk
list-retention-events GET
list-retention-event-types GET
list-subject-rights-requests GET
list-simulation-automations GET
list-simulation-trainings GET
list-simulation-payloads GET
list-simulation-end-user-notifications GET
list-simulation-landing-pages GET
list-simulation-login-pages GET

Defender for Identity (24)

Full surface coverage of Microsoft Defender for Identity (DfI) administration via Graph: sensors, sensor candidates (auto-discovery), sensor migration to unified Defender XDR architecture, identity accounts (with break-glass invokeAction for AD on-prem / Okta), audit policy enforcement, and health alerts. Most endpoints are Graph v1.0; sensorMigration is beta-only.

Tool Method Risk
list-identity-health-issues GET
get-identity-health-issue GET
list-sensor-health-issues GET
get-sensor-health-issue GET
list-identity-sensors GET
get-identity-sensor GET
update-identity-sensor PATCH medium
get-sensor-deployment-access-key GET
get-sensor-deployment-package-uri GET
regenerate-sensor-deployment-access-key POST high
list-sensor-candidates GET
get-sensor-candidate GET
get-sensor-candidate-activation-config GET
update-sensor-candidate-activation-config PATCH medium
activate-sensor-candidates POST medium
list-sensor-migrations GET
get-sensor-migration GET
migrate-sensors POST high
get-identity-security-settings GET
get-auto-auditing-config GET
update-auto-auditing-config PATCH medium
list-identity-accounts GET
get-identity-account GET
invoke-identity-account-action POST critical

Notes:

  • invoke-identity-account-action is the highest-impact write — performs identity-response actions (disable, enable, forcePasswordReset, revokeAllSessions, requireUserToSignInAgain, markUserAsCompromised) on accounts in their source system (AD on-prem, Okta). Action / provider compatibility: disable/enable for AD + Okta, forcePasswordReset for AD only, revokeAllSessions for Okta only.
  • regenerate-sensor-deployment-access-key invalidates the previous key immediately — coordinate with anyone rolling out new sensors before calling.
  • migrate-sensors restarts the sensor service on the target DC during migration to unified Defender XDR — brief capture gap (~minutes). Schedule maintenance windows for production DCs. Beta-only.
  • activate-sensor-candidates triggers sensor installation on detected hosts using the deployment access key flow. Verify with get-sensor-candidate first — wrong serverId installs on the wrong host.
  • update-auto-auditing-config with enabled=true makes DfI enforce the recommended Windows advanced audit policies on every sensor host (revert local admin overrides on next heartbeat) — recommended for production.

New Graph permissions required since v0.10.0 / 0.11.1 (must be consented on the app registration):

  • SecurityIdentitiesSensors.Read.All + SecurityIdentitiesSensors.ReadWrite.All (sensors mgmt)
  • SecurityIdentitiesAutoConfig.Read.All + SecurityIdentitiesAutoConfig.ReadWrite.All (autoAuditingConfiguration)
  • SecurityIdentitiesAccount.Read.All (identityAccounts list/get)
  • SecurityIdentitiesActions.ReadWrite.All (identityAccounts invokeAction — break-glass)
  • SecurityIdentitiesMigration.Read.All + SecurityIdentitiesMigration.ReadWrite.All (sensorMigration, beta)

Threat intelligence+ (7)

Tool Method Risk
list-passive-dns-records GET
list-ssl-certificates GET
list-threat-intel-subdomains GET
list-threat-intel-host-ports GET
list-threat-intel-host-trackers GET
list-threat-intel-host-cookies GET
list-threat-intel-host-pairs GET

Reports+ (5)

Tool Method Risk
list-user-registration-details GET
list-daily-print-usage-by-printer GET
list-daily-print-usage-by-user GET
list-monthly-print-usage-by-printer GET
list-monthly-print-usage-by-user GET

Copilot admin (2)

Tool Method Risk
get-copilot-admin-settings GET
get-copilot-limited-mode GET

Directory+ (5)

Tool Method Risk
list-attribute-sets GET
list-custom-security-attributes GET
list-device-local-credentials GET
list-federation-configurations GET
list-on-premises-sync GET

Application credentials & owners CRUD (11) -- requires --allow-writes

Tool Method Risk
create-application POST high
add-application-password POST high
remove-application-password POST high
add-application-key POST high
remove-application-key POST high
add-application-owner POST high
remove-application-owner DELETE high
create-app-federated-credential POST high
update-app-federated-credential PATCH high
delete-app-federated-credential DELETE high
set-application-verified-publisher POST medium

Service Principals CRUD & credentials (10) -- requires --allow-writes

Tool Method Risk
create-service-principal POST high
delete-service-principal DELETE critical
add-sp-password POST high
remove-sp-password POST high
add-sp-key POST high
remove-sp-key POST high
add-sp-token-signing-certificate POST high
add-sp-owner POST high
remove-sp-owner DELETE high
create-sp-app-role-assignment POST high

PIM activation & requests (10) -- requires --allow-writes

Tool Method Risk
create-pim-role-assignment-request POST critical
cancel-pim-role-assignment-request POST high
create-pim-role-eligibility-request POST critical
cancel-pim-role-eligibility-request POST high
create-pim-group-assignment-request POST high
cancel-pim-group-assignment-request POST medium
create-pim-group-eligibility-request POST high
cancel-pim-group-eligibility-request POST medium
create-role-management-policy-assignment POST high
update-role-management-policy PATCH high

Entitlement Management CRUD (12) -- requires --allow-writes

Tool Method Risk
create-access-package POST medium
update-access-package PATCH medium
delete-access-package DELETE high
create-access-package-catalog POST medium
update-access-package-catalog PATCH medium
delete-access-package-catalog DELETE high
create-access-package-assignment-policy POST medium
update-access-package-assignment-policy PUT medium
delete-access-package-assignment-policy DELETE high
create-access-package-assignment-request POST medium
reprocess-access-package-assignment-request POST low
cancel-access-package-assignment-request POST medium

Lifecycle Workflows CRUD & execution (8) -- requires --allow-writes

Tool Method Risk
create-lifecycle-workflow POST medium
update-lifecycle-workflow PATCH medium
delete-lifecycle-workflow DELETE high
activate-lifecycle-workflow POST high
restore-lifecycle-workflow POST medium
create-lifecycle-custom-task-extension POST medium
update-lifecycle-custom-task-extension PATCH medium
delete-lifecycle-custom-task-extension DELETE high

Access Reviews CRUD & actions (8) -- requires --allow-writes

Tool Method Risk
create-access-review-definition POST medium
update-access-review-definition PUT medium
delete-access-review-definition DELETE high
stop-access-review-instance POST high
send-reminder-access-review POST low
reset-access-review-decisions POST high
apply-access-review-decisions POST high
accept-access-review-recommendations POST medium

eDiscovery v2 (Purview) (12) -- writes require --allow-writes

Tool Method Risk
get-ediscovery-case GET
create-ediscovery-case POST medium
update-ediscovery-case PATCH medium
delete-ediscovery-case DELETE critical
close-ediscovery-case POST medium
reopen-ediscovery-case POST medium
list-ediscovery-custodians GET
create-ediscovery-custodian POST medium
apply-hold-ediscovery-custodian POST high
remove-hold-ediscovery-custodian POST high
list-ediscovery-searches GET
create-ediscovery-search POST medium

Azure AD permissions

Read-only (default)

AccessReview.Read.All
AdministrativeUnit.Read.All
AgentRegistration.Read.All
Agreement.Read.All
AiEnterpriseInteraction.Read.All
APIConnectors.Read.All
AppCatalog.Read.All
Application.Read.All
AppRoleAssignment.Read.All
AttackSimulation.Read.All
AuditLog.Read.All
BitlockerKey.Read.All
CallRecords.Read.All
Chat.ManageDeletion.All
Channel.ReadBasic.All
Chat.Read.All
ChatMember.Read.All
ChatMessage.Read.All
CloudPC.Read.All
ConsentRequest.Read.All
CopilotPolicySettings.Read
CopilotSettings-Internal.ReadWrite.All
CustomAuthenticationExtension.Read.All
CustomSecAttributeDefinition.Read.All
Device.Read.All
DeviceLocalCredential.Read.All
DeviceManagementApps.Read.All
DeviceManagementConfiguration.Read.All
DeviceManagementManagedDevices.Read.All
DeviceManagementRBAC.Read.All
DeviceManagementServiceConfig.Read.All
Directory.Read.All
Domain.Read.All
eDiscovery.Read.All
EntitlementManagement.Read.All
Exchange.ManageAsApp
Group.Read.All
GroupMember.Read.All
IdentityProvider.Read.All
IdentityRiskEvent.Read.All
IdentityRiskyServicePrincipal.Read.All
IdentityRiskyUser.Read.All
IdentityUserFlow.Read.All
InformationProtectionPolicy.Read.All
LifecycleWorkflows.Read.All
MailboxSettings.Read
OnlineMeetingArtifact.Read.All
OnlineMeetings.Read.All
OnPremDirectorySynchronization.Read.All
Organization.Read.All
Policy.Read.All
Printer.Read.All
ProtectionScopes.Compute.All
PrintConnector.Read.All
PrintJob.Read.All
PrivilegedAccess.Read.AzureADGroup
RecordsManagement.Read.All
Reports.Read.All
RoleAssignmentSchedule.Read.Directory
RoleEligibilitySchedule.Read.Directory
RoleManagement.Read.Directory
RoleManagementPolicy.Read.Directory
SecurityAlert.Read.All
SecurityEvents.Read.All
SecurityIdentitiesAccount.Read.All
SecurityIdentitiesAutoConfig.Read.All
SecurityIdentitiesHealth.Read.All
SecurityIdentitiesMigration.Read.All
SecurityIdentitiesSensors.Read.All
SecurityIncident.Read.All
ServiceHealth.Read.All
ServiceMessage.Read.All
SharePointTenantSettings.Read.All
Sites.Read.All
Sites.FullControl.All
SubjectRightsRequest.Read.All
Team.ReadBasic.All
TeamMember.Read.All
TeamsAppInstallation.ReadForTeam.All
TeamworkAppSettings.Read.All
TeamworkDevice.Read.All
ThreatAssessment.Read.All
ThreatHunting.Read.All
ThreatIntelligence.Read.All
User.Invite.All
User.Read.All
UserAuthenticationMethod.Read.All

Write (incident response, device actions, CA policies, Teams, SharePoint, identity management)

AccessReview.ReadWrite.All
AdministrativeUnit.ReadWrite.All
Application.ReadWrite.All
Application.ReadWrite.OwnedBy
AppRoleAssignment.ReadWrite.All
AttackSimulation.ReadWrite.All
Channel.Create
Channel.Delete.All
CloudPC.ReadWrite.All
Device.ReadWrite.All
DeviceManagementConfiguration.ReadWrite.All
DeviceManagementManagedDevices.PrivilegedOperations.All
DeviceManagementManagedDevices.ReadWrite.All
DeviceManagementServiceConfig.ReadWrite.All
Directory.AccessAsUser.All
Domain.ReadWrite.All
eDiscovery.ReadWrite.All
EntitlementManagement.ReadWrite.All
Group.ReadWrite.All
GroupMember.ReadWrite.All
IdentityRiskyServicePrincipal.ReadWrite.All
IdentityRiskyUser.ReadWrite.All
LifecycleWorkflows.ReadWrite.All
Policy.ReadWrite.AuthenticationMethod
Policy.ReadWrite.ConditionalAccess
PrivilegedAccess.ReadWrite.AzureADGroup
RecordsManagement.ReadWrite.All
RoleAssignmentSchedule.ReadWrite.Directory
RoleEligibilitySchedule.ReadWrite.Directory
RoleManagement.ReadWrite.Directory
RoleManagementPolicy.ReadWrite.Directory
SecurityAlert.ReadWrite.All
SecurityIdentitiesActions.ReadWrite.All
SecurityIdentitiesAutoConfig.ReadWrite.All
SecurityIdentitiesMigration.ReadWrite.All
SecurityIdentitiesSensors.ReadWrite.All
SecurityIncident.ReadWrite.All
Sites.ReadWrite.All
Team.Create
Team.ReadWrite.All
TeamMember.ReadWrite.All
TeamworkAppSettings.ReadWrite.All
User.ReadWrite.All
UserAuthenticationMethod.ReadWrite.All

Remote HTTP deployment

Local HTTP mode

node dist/index.js \
  --transport http \
  --port 8080 \
  --allowed-clients "app-id-1,app-id-2"

The --allowed-clients flag is mandatory in HTTP mode. It validates incoming bearer tokens against Microsoft's JWKS endpoint (signature verification, audience, tenant, and client ID checks).

Docker

docker build -t ms365-admin-mcp .
docker run -p 8080:8080 \
  -e MS365_ADMIN_MCP_CLIENT_ID=... \
  -e MS365_ADMIN_MCP_CLIENT_SECRET=... \
  -e MS365_ADMIN_MCP_TENANT_ID=... \
  ms365-admin-mcp --allowed-clients "your-app-id"

Azure Container Apps

A Bicep template is provided in infra/main.bicep. It deploys:

  • User-Assigned Managed Identity (UAMI)
  • Key Vault (RBAC, purge protection, 90-day soft-delete)
  • Log Analytics workspace + Application Insights
  • Container App Environment
  • Container App using the UAMI, with MS365_ADMIN_MCP_KEYVAULT_URL wired to the vault
MY_OID=$(az ad signed-in-user show --query id -o tsv)

az deployment group create \
  --resource-group rg-mcp-admin \
  --template-file infra/main.bicep \
  --parameters baseName=ms365mcpprod \
               containerImage=your-acr.azurecr.io/ms365-admin-mcp:latest \
               kvAdminObjectIds="['$MY_OID']"

Seed the vault with ms365-admin-mcp-{client-id,tenant-id,client-secret} after deploy — see docs/HTTP_DEPLOYMENT.md.

Development

npm run dev              # Run with tsx (hot reload)
npm run generate         # Download OpenAPI spec + generate client
npm run build            # Build with tsup
npm run test             # Run vitest
npm run lint             # ESLint
npm run format           # Prettier
npm run verify           # Full pipeline (generate + lint + format + build + test)
npm run inspector        # MCP Inspector for interactive testing

Adding a new tool

  1. Add the endpoint entry in src/endpoints.json
  2. Run npm run generate to regenerate the client
  3. The tool is automatically registered at startup by registerGraphTools()
  4. Run npm run verify to validate

Security

  • Read-only by default -- mutations require --allow-writes
  • Risk levels on write tools (critical/high/medium/low) with LLM-visible warnings
  • JWT signature verification via Microsoft JWKS (RS256) in HTTP mode
  • Mandatory authentication in HTTP mode (--allowed-clients required)
  • Rate limiting (100 req/min) on the MCP endpoint
  • Security headers (nosniff, DENY, no-store, CSP)
  • Non-root Docker user
  • Sensitive data redacted from logs

Acknowledgments

This project would not exist without Softeria/ms-365-mcp-server. Their work served as the foundation and inspiration for this server — in particular:

  • The endpoint-driven architecture (endpoints.json + auto-registration via graph-tools.ts)
  • The OpenAPI-based code generation pipeline (npm run generate → trimmed Graph spec + Zodios client)
  • The CLI ergonomics (presets, --list-tools, --list-permissions, --verify-login, MCP Inspector integration)
  • The read-only-by-default + --allow-writes safety model

This server diverges from Softeria's by targeting application permissions (client credentials via MSAL ConfidentialClientApplication) rather than delegated permissions, and by adding admin-specific capabilities — risk classification on write tools, JWT validation via Microsoft JWKS for HTTP mode, Azure Key Vault integration, and incident-response tooling.

Sincere thanks to the Softeria team and contributors for making their work available under an open license, and for setting a high bar for MCP server design in the Microsoft 365 ecosystem.

License

MIT — see LICENSE.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured