{
  "markdown": "# ms-365-admin-mcp-server\n\n[![CI](https://github.com/okapi-ca/ms-365-admin-mcp-server/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/okapi-ca/ms-365-admin-mcp-server/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/@okapi-ca/ms-365-admin-mcp-server.svg)](https://www.npmjs.com/package/@okapi-ca/ms-365-admin-mcp-server)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nA [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server for Microsoft 365 administration via Graph API **application permissions** (client credentials).\n\nBuilt on the architecture and endpoint-driven design pioneered by [Softeria/ms-365-mcp-server](https://github.com/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](#acknowledgments) below.\n\n## Features\n\n- **641 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\n- **Application permissions** (client credentials) — no user interaction required\n- **Read-only by default** — write operations require explicit `--allow-writes`\n- **Risk classification** on write tools (low/medium/high/critical)\n- **Presets** to filter tools by domain (security, audit, identity, etc.)\n- **Two transports**: stdio (default) and HTTP (StreamableHTTP)\n- **Multi-cloud**: Microsoft global and China (21Vianet)\n- **Key Vault** support for secrets management\n\n## Documentation\n\n| Document                                                               | Purpose                                                                     |\n| ---------------------------------------------------------------------- | --------------------------------------------------------------------------- |\n| [docs/USE_CASES.md](docs/USE_CASES.md)                                 | 18 typical admin scenarios with sample prompts and tool lists               |\n| [docs/playbooks/](docs/playbooks/README.md)                            | End-to-end security incident response playbooks                             |\n| [agent-skills/](agent-skills/README.md)                                | Drop-in skills for LLM agents (Claude Code et al.) with safety patterns     |\n| [docs/APP_REGISTRATION.md](docs/APP_REGISTRATION.md)                   | Step-by-step Azure AD app registration and permission consent               |\n| [docs/HTTP_DEPLOYMENT.md](docs/HTTP_DEPLOYMENT.md)                     | HTTP transport, JWT validation, Docker, Azure Container Apps                |\n| [docs/AZURE_DEPLOYMENT_SECURITY.md](docs/AZURE_DEPLOYMENT_SECURITY.md) | Threat model, required controls, and checklist for Azure production deploys |\n| [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md)                     | Common errors and how to diagnose them                                      |\n| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)                           | Internal architecture and code generation pipeline                          |\n| [docs/RISK_MODEL.md](docs/RISK_MODEL.md)                               | Risk classification rubric for write tools                                  |\n| [CONTRIBUTING.md](CONTRIBUTING.md)                                     | How to contribute new tools, presets, and fixes                             |\n| [SECURITY.md](SECURITY.md)                                             | Vulnerability reporting and operator hardening checklist                    |\n| [CHANGELOG.md](CHANGELOG.md)                                           | Release history                                                             |\n\n## Prerequisites\n\n- Node.js >= 18\n- An Azure AD app registration with **application permissions** (not delegated)\n- A specific tenant ID (not \"common\")\n\n## Installation\n\n### npm (recommended)\n\n```bash\nnpm install -g @okapi-ca/ms-365-admin-mcp-server\nms-365-admin-mcp-server --help\n```\n\n### Docker\n\n```bash\ndocker pull ghcr.io/okapi-ca/ms-365-admin-mcp-server:latest\ndocker run --rm -i \\\n  -e MS365_ADMIN_MCP_CLIENT_ID=... \\\n  -e MS365_ADMIN_MCP_CLIENT_SECRET=... \\\n  -e MS365_ADMIN_MCP_TENANT_ID=... \\\n  ghcr.io/okapi-ca/ms-365-admin-mcp-server:latest\n```\n\n### From source\n\n```bash\ngit clone https://github.com/okapi-ca/ms-365-admin-mcp-server.git\ncd ms-365-admin-mcp-server\nnpm install\nnpm run generate\nnpm run build\n```\n\n## Configuration\n\n### Environment variables\n\n| Variable                        | Required | Description                                      |\n| ------------------------------- | -------- | ------------------------------------------------ |\n| `MS365_ADMIN_MCP_CLIENT_ID`     | Yes      | App registration client ID                       |\n| `MS365_ADMIN_MCP_CLIENT_SECRET` | Yes      | App registration client secret                   |\n| `MS365_ADMIN_MCP_TENANT_ID`     | Yes      | Azure AD tenant ID (must be specific)            |\n| `MS365_ADMIN_MCP_CLOUD_TYPE`    | No       | `global` (default) or `china`                    |\n| `MS365_ADMIN_MCP_KEYVAULT_URL`  | No       | Azure Key Vault URL (overrides env vars)         |\n| `MS365_ADMIN_MCP_MAX_TOP`       | No       | Cap `$top` query param to limit result size      |\n| `READ_ONLY`                     | No       | `true`/`1` to force read-only (default behavior) |\n| `ENABLED_TOOLS`                 | No       | Regex to filter available tools                  |\n\n### MCP client configuration (Claude Desktop, etc.)\n\n```json\n{\n  \"mcpServers\": {\n    \"ms365-admin\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/ms-365-admin-mcp-server/dist/index.js\"],\n      \"env\": {\n        \"MS365_ADMIN_MCP_CLIENT_ID\": \"your-client-id\",\n        \"MS365_ADMIN_MCP_CLIENT_SECRET\": \"your-client-secret\",\n        \"MS365_ADMIN_MCP_TENANT_ID\": \"your-tenant-id\"\n      }\n    }\n  }\n}\n```\n\n### VS Code (1.102+)\n\nVS Code consumes the same MCP protocol but uses a different config layout —\n`servers` instead of `mcpServers`, an explicit `type` field, and `inputs` for\nsecret prompts. A ready-to-copy sample lives at\n[`.vscode/mcp.json.example`](.vscode/mcp.json.example); copy it to\n`.vscode/mcp.json` and VS Code will prompt for the tenant / client / secret on\nfirst start, then store them in its secret store (the real `mcp.json` is\ngitignored so resolved secrets never reach the repo).\n\nMinimal stdio setup:\n\n```jsonc\n{\n  \"inputs\": [\n    { \"type\": \"promptString\", \"id\": \"ms365-tenant-id\", \"description\": \"Tenant ID\" },\n    { \"type\": \"promptString\", \"id\": \"ms365-client-id\", \"description\": \"Client ID\" },\n    {\n      \"type\": \"promptString\",\n      \"id\": \"ms365-client-secret\",\n      \"description\": \"Client secret\",\n      \"password\": true,\n    },\n  ],\n  \"servers\": {\n    \"ms365-admin\": {\n      \"type\": \"stdio\",\n      \"command\": \"ms-365-admin-mcp-server\",\n      \"args\": [\"--preset\", \"security,audit,identity,health\"],\n      \"env\": {\n        \"MS365_ADMIN_MCP_TENANT_ID\": \"${input:ms365-tenant-id}\",\n        \"MS365_ADMIN_MCP_CLIENT_ID\": \"${input:ms365-client-id}\",\n        \"MS365_ADMIN_MCP_CLIENT_SECRET\": \"${input:ms365-client-secret}\",\n      },\n    },\n  },\n}\n```\n\nFor remote HTTP deployments, use `\"type\": \"http\"` with a `url` field (VS Code\n1.103+ handles OAuth 2.0 Dynamic Client Registration natively) or fall back to\nthe `mcp-remote` bridge when the native browser flow is unavailable — see the\nexample file for both shapes.\n\nTools surface in **Agent mode** (GitHub Copilot Chat). VS Code asks for\nper-tool approval; the `--preset` flag above keeps the catalog manageable.\nUse `Cmd/Ctrl+Shift+P` → `MCP: List Servers` → `Show Output` to see logs.\n\n### Remote HTTP server: device_code authentication (RFC 8628)\n\nIf the server runs in HTTP / OAuth mode on a remote host (e.g. Azure Container Apps) and the client connects via [`mcp-remote`](https://www.npmjs.com/package/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.\n\n```bash\nnpx -p @okapi-ca/ms-365-admin-mcp-server@latest ms-365-admin-mcp-auth \\\n  --server https://your-mcp-host.azurecontainerapps.io/mcp\n```\n\nThe 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.\n\nSee [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md#oauth--browser-authentication-problems) for Docker / remote-dev patterns and exit code reference.\n\n## Usage\n\n### CLI options\n\n```\n--read-only              Read-only mode (default)\n--allow-writes           Enable write operations\n--enabled-tools <regex>  Filter tools by regex pattern\n--preset <names>         Use preset categories (comma-separated)\n--list-presets           List available presets and exit\n--list-tools             List available tools and exit\n--list-permissions       List required Graph API permissions and exit\n--verify-login           Test credentials against Graph API and exit\n--cloud <type>           Cloud environment: global (default) or china\n--transport <type>       Transport: stdio (default) or http\n--port <number>          HTTP port (default: 8080)\n--host <address>         HTTP bind address (default: 127.0.0.1)\n--allowed-clients <ids>  Comma-separated Entra app IDs (required for HTTP)\n-v                       Verbose logging\n```\n\n### Presets\n\n```bash\n# Security alerts and incidents only\nnode dist/index.js --preset security\n\n# Identity management tools\nnode dist/index.js --preset identity\n\n# Multiple presets\nnode dist/index.js --preset security,audit,identity\n```\n\n| Preset            | Description                                                                 |\n| ----------------- | --------------------------------------------------------------------------- |\n| `security`        | Security alerts, incidents, attack simulations, and threat intelligence     |\n| `audit`           | Directory audits, sign-ins, provisioning logs, deleted items                |\n| `health`          | Service health and Message Center                                           |\n| `reports`         | Usage reports (Teams, Email, SharePoint, OneDrive, Mailbox, M365 Apps)      |\n| `identity`        | Users, groups, roles, devices, PIM, guest users, external identities        |\n| `exchange`        | Exchange administration (message traces, mailboxes)                         |\n| `intune`          | Managed devices, compliance, configurations, Autopilot, apps, RBAC          |\n| `governance`      | Access reviews, entitlement management, lifecycle workflows, terms of use   |\n| `compliance`      | Licenses, Secure Score, Identity Protection, risk detections, policies      |\n| `response`        | Incident response write operations (disable, revoke, confirm, dismiss)      |\n| `ediscovery`      | eDiscovery cases (Microsoft Purview)                                        |\n| `cloudpc`         | Cloud PC / Windows 365 (provisioning, images, connections, settings, audit) |\n| `callrecords`     | Teams call records                                                          |\n| `print`           | Universal Print (printers, shares, connectors, services, operations, tasks) |\n| `infoprotection`  | Information Protection (BitLocker recovery keys, threat assessment)         |\n| `sharepointadmin` | SharePoint tenant administration settings                                   |\n| `retention`       | Records Management (retention labels, file plan metadata)                   |\n| `all`             | All available tools                                                         |\n\n### Verify credentials\n\n```bash\nnode dist/index.js --verify-login\n```\n\n## Available tools (641)\n\n### Security (11)\n\n| Tool                       | Method | Risk   |\n| -------------------------- | ------ | ------ |\n| `list-security-alerts`     | GET    |        |\n| `get-security-alert`       | GET    |        |\n| `update-security-alert`    | PATCH  | medium |\n| `list-security-incidents`  | GET    |        |\n| `get-security-incident`    | GET    |        |\n| `update-security-incident` | PATCH  | medium |\n| `list-attack-simulations`  | GET    |        |\n| `get-attack-simulation`    | GET    |        |\n| `create-attack-simulation` | POST   | high   |\n| `update-attack-simulation` | PATCH  | medium |\n| `delete-attack-simulation` | DELETE | medium |\n\n### Audit logs & deleted items (5)\n\n| Tool                     | Method |\n| ------------------------ | ------ |\n| `list-directory-audits`  | GET    |\n| `list-sign-ins`          | GET    |\n| `list-provisioning-logs` | GET    |\n| `list-deleted-users`     | GET    |\n| `list-deleted-groups`    | GET    |\n\n### Service health (3)\n\n| Tool                    | Method |\n| ----------------------- | ------ |\n| `list-service-health`   | GET    |\n| `list-service-issues`   | GET    |\n| `list-service-messages` | GET    |\n\n### Usage reports (8)\n\n| Tool                            | Method |\n| ------------------------------- | ------ |\n| `get-teams-activity-report`     | GET    |\n| `get-email-activity-report`     | GET    |\n| `get-active-users-report`       | GET    |\n| `get-sharepoint-usage-report`   | GET    |\n| `get-onedrive-usage-report`     | GET    |\n| `get-active-user-counts-report` | GET    |\n| `get-mailbox-usage-report`      | GET    |\n| `get-m365-apps-usage-report`    | GET    |\n\n### Users (9)\n\n| Tool                     | Method | Risk     |\n| ------------------------ | ------ | -------- |\n| `list-users`             | GET    |          |\n| `get-user`               | GET    |          |\n| `list-user-memberships`  | GET    |          |\n| `list-user-auth-methods` | GET    |          |\n| `list-user-devices`      | GET    |          |\n| `create-user`            | POST   | high     |\n| `delete-user`            | DELETE | critical |\n| `assign-user-license`    | POST   | medium   |\n| `reprocess-user-license` | POST   | low      |\n\nThere is no general-purpose `update-user`. The only PATCH on `/users/{id}` this server exposes is `disable-user-account` (see [Incident response](#incident-response-17----requires---allow-writes)), which is deliberately narrow: it sets `accountEnabled` and nothing else.\n\n### Devices (2)\n\n| Tool           | Method |\n| -------------- | ------ |\n| `list-devices` | GET    |\n| `get-device`   | GET    |\n\n### Groups (11)\n\n| Tool                  | Method | Risk     |\n| --------------------- | ------ | -------- |\n| `list-groups`         | GET    |          |\n| `get-group`           | GET    |          |\n| `list-group-members`  | GET    |          |\n| `list-group-owners`   | GET    |          |\n| `create-group`        | POST   | medium   |\n| `update-group`        | PATCH  | medium   |\n| `delete-group`        | DELETE | critical |\n| `add-group-member`    | POST   | medium   |\n| `remove-group-member` | DELETE | medium   |\n| `add-group-owner`     | POST   | high     |\n| `remove-group-owner`  | DELETE | high     |\n\n`remove-group-member`, `add-group-owner` and `remove-group-owner` run pre-flight guardrails: they refuse on an on-premises-synced group, a member removal on a dynamic group, and the removal of a group's only owner. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#guardrails--srcguardrailsts).\n\n### Directory roles & PIM (9)\n\n| Tool                            | Method | Risk     |\n| ------------------------------- | ------ | -------- |\n| `list-directory-roles`          | GET    |          |\n| `list-role-members`             | GET    |          |\n| `list-role-assignments`         | GET    |          |\n| `list-role-definitions`         | GET    |          |\n| `list-pim-eligible-assignments` | GET    |          |\n| `list-pim-active-assignments`   | GET    |          |\n| `add-directory-role-member`     | POST   | critical |\n| `delete-role-assignment`        | DELETE | critical |\n| `remove-directory-role-member`  | DELETE | critical |\n\n`delete-role-assignment` is the one to reach for: `list-role-assignments` with `$filter=principalId eq '{user-id}'` already returns the assignment id it takes. `remove-directory-role-member` covers roles activated the legacy way. Both refuse **unconditionally** on the tenant's last active Global Administrator — an anti-lockout guardrail no parameter overrides.\n\n### Administrative units (8)\n\n| Tool                                | Method | Risk   |\n| ----------------------------------- | ------ | ------ |\n| `list-administrative-units`         | GET    |        |\n| `get-administrative-unit`           | GET    |        |\n| `list-administrative-unit-members`  | GET    |        |\n| `create-administrative-unit`        | POST   | medium |\n| `update-administrative-unit`        | PATCH  | medium |\n| `delete-administrative-unit`        | DELETE | high   |\n| `add-administrative-unit-member`    | POST   | medium |\n| `remove-administrative-unit-member` | DELETE | high   |\n\n### Conditional access (3)\n\n| Tool                               | Method |\n| ---------------------------------- | ------ |\n| `list-conditional-access-policies` | GET    |\n| `get-conditional-access-policy`    | GET    |\n| `list-named-locations`             | GET    |\n\n### Applications & app roles (11)\n\n| Tool                              | Method | Risk     |\n| --------------------------------- | ------ | -------- |\n| `list-applications`               | GET    |          |\n| `list-service-principals`         | GET    |          |\n| `list-oauth2-grants`              | GET    |          |\n| `list-user-app-role-assignments`  | GET    |          |\n| `list-sp-app-role-assignments`    | GET    |          |\n| `update-application`              | PATCH  | high     |\n| `delete-application`              | DELETE | critical |\n| `update-service-principal`        | PATCH  | high     |\n| `delete-oauth2-grant`             | DELETE | high     |\n| `delete-sp-app-role-assignment`   | DELETE | high     |\n| `delete-user-app-role-assignment` | DELETE | high     |\n\n`delete-oauth2-grant` is the remediation for an illicit consent grant: `list-oauth2-grants` identifies it, this revokes it. A grant with `consentType: AllPrincipals` revokes the app's delegated access for every user at once — check the blast radius first, and pair with `revoke-user-sessions`, since revoking consent does not end existing sessions.\n\n### App credentials & owners (7)\n\n| Tool                             | Method |\n| -------------------------------- | ------ |\n| `get-application`                | GET    |\n| `list-application-owners`        | GET    |\n| `list-app-federated-credentials` | GET    |\n| `get-app-federated-credential`   | GET    |\n| `get-service-principal`          | GET    |\n| `list-service-principal-owners`  | GET    |\n| `list-sp-delegated-permissions`  | GET    |\n\n### App management policies (2)\n\n| Tool                           | Method |\n| ------------------------------ | ------ |\n| `list-app-management-policies` | GET    |\n| `get-app-management-policy`    | GET    |\n\n### Organization & domains (4)\n\n| Tool               | Method | Risk   |\n| ------------------ | ------ | ------ |\n| `get-organization` | GET    |        |\n| `list-domains`     | GET    |        |\n| `create-domain`    | POST   | high   |\n| `verify-domain`    | POST   | medium |\n\n### Licenses (2)\n\n| Tool                   | Method |\n| ---------------------- | ------ |\n| `list-subscribed-skus` | GET    |\n| `get-subscribed-sku`   | GET    |\n\n### Secure Score (4)\n\n| Tool                         | Method |\n| ---------------------------- | ------ |\n| `list-secure-scores`         | GET    |\n| `get-secure-score`           | GET    |\n| `list-secure-score-controls` | GET    |\n| `get-secure-score-control`   | GET    |\n\n### Identity Protection & risk detections (7)\n\n| Tool                            | Method |\n| ------------------------------- | ------ |\n| `list-risky-users`              | GET    |\n| `get-risky-user`                | GET    |\n| `list-risky-user-history`       | GET    |\n| `list-risky-service-principals` | GET    |\n| `get-risky-service-principal`   | GET    |\n| `list-risk-detections`          | GET    |\n| `get-risk-detection`            | GET    |\n\n### Security & access policies (13)\n\n| Tool                             | Method | Risk |\n| -------------------------------- | ------ | ---- |\n| `get-auth-methods-policy`        | GET    |      |\n| `list-auth-method-configs`       | GET    |      |\n| `get-auth-method-config`         | GET    |      |\n| `get-security-defaults`          | GET    |      |\n| `get-admin-consent-policy`       | GET    |      |\n| `list-auth-strength-policies`    | GET    |      |\n| `get-auth-strength-policy`       | GET    |      |\n| `create-auth-strength-policy`    | POST   | high |\n| `update-auth-strength-policy`    | PATCH  | high |\n| `delete-auth-strength-policy`    | DELETE | high |\n| `get-cross-tenant-access-policy` | GET    |      |\n| `list-cross-tenant-partners`     | GET    |      |\n| `change-user-password`           | POST   | high |\n\n### Guest user invitations (2)\n\n| Tool                | Method | Risk   |\n| ------------------- | ------ | ------ |\n| `list-invitations`  | GET    |        |\n| `create-invitation` | POST   | medium |\n\n### External identity providers (2)\n\n| Tool                      | Method |\n| ------------------------- | ------ |\n| `list-identity-providers` | GET    |\n| `get-identity-provider`   | GET    |\n\n### Self-service sign-up (4)\n\n| Tool                  | Method |\n| --------------------- | ------ |\n| `list-b2x-user-flows` | GET    |\n| `get-b2x-user-flow`   | GET    |\n| `list-api-connectors` | GET    |\n| `get-api-connector`   | GET    |\n\n### Custom authentication extensions (2)\n\n| Tool                          | Method |\n| ----------------------------- | ------ |\n| `list-custom-auth-extensions` | GET    |\n| `get-custom-auth-extension`   | GET    |\n\n### Exchange message traces (2)\n\n| Tool                  | Method |\n| --------------------- | ------ |\n| `list-message-traces` | GET    |\n| `get-message-trace`   | GET    |\n\n### Exchange mailboxes (7)\n\n| Tool                            | Method | Risk     |\n| ------------------------------- | ------ | -------- |\n| `list-exchange-mailboxes`       | GET    |          |\n| `get-exchange-mailbox`          | GET    |          |\n| `list-exchange-mailbox-folders` | GET    |          |\n| `get-exchange-mailbox-folder`   | GET    |          |\n| `export-exchange-mailbox-items` | POST   | medium   |\n| `update-exchange-mailbox`       | PATCH  | medium   |\n| `delete-exchange-mailbox`       | DELETE | critical |\n\n### Threat intelligence - hosts (4)\n\n| Tool                           | Method |\n| ------------------------------ | ------ |\n| `list-threat-intel-hosts`      | GET    |\n| `get-threat-intel-host`        | GET    |\n| `get-threat-intel-host-whois`  | GET    |\n| `list-threat-intel-host-pairs` | GET    |\n\n### Threat intelligence - articles & profiles (6)\n\n| Tool                                   | Method |\n| -------------------------------------- | ------ |\n| `list-threat-intel-articles`           | GET    |\n| `get-threat-intel-article`             | GET    |\n| `list-threat-intel-article-indicators` | GET    |\n| `list-threat-intel-profiles`           | GET    |\n| `get-threat-intel-profile`             | GET    |\n| `list-threat-intel-profile-indicators` | GET    |\n\n### Threat intelligence - vulnerabilities & WHOIS (4)\n\n| Tool                                | Method |\n| ----------------------------------- | ------ |\n| `list-threat-intel-vulnerabilities` | GET    |\n| `get-threat-intel-vulnerability`    | GET    |\n| `list-threat-intel-whois-records`   | GET    |\n| `get-threat-intel-whois-record`     | GET    |\n\n### Threat intelligence - infrastructure (2)\n\n| Tool                                | Method |\n| ----------------------------------- | ------ |\n| `list-threat-intel-host-components` | GET    |\n| `list-threat-intel-ssl-certs`       | GET    |\n\n### Managed devices (6)\n\n| Tool                               | Method | Risk     |\n| ---------------------------------- | ------ | -------- |\n| `list-managed-devices`             | GET    |          |\n| `get-managed-device`               | GET    |          |\n| `list-device-compliance-states`    | GET    |          |\n| `list-device-configuration-states` | GET    |          |\n| `get-managed-device-overview`      | GET    |          |\n| `delete-managed-device`            | DELETE | critical |\n\n### Compliance policies (5)\n\n| Tool                                     | Method |\n| ---------------------------------------- | ------ |\n| `list-compliance-policies`               | GET    |\n| `get-compliance-policy`                  | GET    |\n| `list-compliance-policy-device-statuses` | GET    |\n| `get-compliance-policy-status-overview`  | GET    |\n| `get-compliance-state-summary`           | GET    |\n\n### Device configurations (3)\n\n| Tool                                       | Method |\n| ------------------------------------------ | ------ |\n| `list-device-configurations`               | GET    |\n| `get-device-configuration`                 | GET    |\n| `get-device-configuration-status-overview` | GET    |\n\n### macOS Platform Scripts (6)\n\nIntune 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`.\n\n| Tool                         | Method | Risk   |\n| ---------------------------- | ------ | ------ |\n| `list-device-shell-scripts`  | GET    |        |\n| `get-device-shell-script`    | GET    |        |\n| `create-device-shell-script` | POST   | medium |\n| `update-device-shell-script` | PATCH  | medium |\n| `delete-device-shell-script` | DELETE | high   |\n| `assign-device-shell-script` | POST   | medium |\n\nNotes:\n\n- `scriptContent` is **strict base64** (not URL-safe) of a script with LF line endings — CRLF will break execution on Macs.\n- `runAsAccount=user` is required for scripts that interact with the user session (e.g. `osascript` touching System Events).\n- `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.\n- By default `get-device-shell-script` does **not** return `scriptContent`; pass `$select=id,displayName,scriptContent,...` to fetch the base64 body.\n\n### Intune Remediations / Proactive Remediations (6)\n\nPaired detection + remediation PowerShell scripts for Windows 10/11 Azure AD joined devices. **Targets Graph beta** (`/beta/deviceManagement/deviceHealthScripts`). Requires `DeviceManagementScripts.ReadWrite.All`.\n\n| Tool                          | Method | Risk   |\n| ----------------------------- | ------ | ------ |\n| `list-device-health-scripts`  | GET    |        |\n| `get-device-health-script`    | GET    |        |\n| `create-device-health-script` | POST   | medium |\n| `update-device-health-script` | PATCH  | medium |\n| `delete-device-health-script` | DELETE | high   |\n| `assign-device-health-script` | POST   | medium |\n\nNotes:\n\n- Both `detectionScriptContent` and `remediationScriptContent` are **base64-encoded PowerShell** — UTF-8 encoded scripts before base64.\n- Detection script returns exit code 0 (compliant) or 1 (needs remediation). The remediation script only runs when detection returns 1.\n- `assign-device-health-script` **REPLACES** all existing assignments — schedules can be daily / hourly / run-once. Set `runRemediationScript: false` for detect-only deployments.\n- By default `get-device-health-script` does **not** return the script bodies; pass `$select=id,displayName,detectionScriptContent,remediationScriptContent,...`.\n- Modern replacement for `deviceShellScripts` for Windows \"verify + fix\" use cases (CIS hardening, agent install verification, service state).\n\n### Assignment filters (5)\n\nDynamic 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`.\n\n| Tool                       | Method | Risk   |\n| -------------------------- | ------ | ------ |\n| `list-assignment-filters`  | GET    |        |\n| `get-assignment-filter`    | GET    |        |\n| `create-assignment-filter` | POST   | medium |\n| `update-assignment-filter` | PATCH  | medium |\n| `delete-assignment-filter` | DELETE | high   |\n\nNotes:\n\n- 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.\n- Operators: `-eq`, `-ne`, `-startsWith`, `-contains`, `-in`, `-matches`, joined by `-and` / `-or`.\n- 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).\n- `assignmentFilterManagementType`: `devices` for device-scoped assignments, `apps` for app-scoped (some properties differ).\n- Deleting a filter that is in use will silently fall the dependent assignments back to \"all members of the group\" — audit assignments before deleting.\n\n### macOS custom attribute shell scripts (6)\n\nIntune 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`.\n\n| Tool                                          | Method | Risk   |\n| --------------------------------------------- | ------ | ------ |\n| `list-device-custom-attribute-shell-scripts`  | GET    |        |\n| `get-device-custom-attribute-shell-script`    | GET    |        |\n| `create-device-custom-attribute-shell-script` | POST   | medium |\n| `update-device-custom-attribute-shell-script` | PATCH  | medium |\n| `delete-device-custom-attribute-shell-script` | DELETE | high   |\n| `assign-device-custom-attribute-shell-script` | POST   | medium |\n\nNotes:\n\n- The script's STDOUT becomes the value stored under `customAttributeName` on each device.\n- `customAttributeType` controls how Intune parses STDOUT: `integer`, `string`, or `dateTime` (ISO 8601).\n- `scriptContent` is strict base64 of a script with LF line endings — CRLF breaks execution on Macs.\n- Changing `customAttributeName` or `customAttributeType` after deployment breaks downstream dynamic groups and assignment filters that reference the previous key — audit references first.\n- Deleting a script does NOT clear previously-collected attribute values from device records.\n\n### Windows PowerShell scripts (deviceManagementScripts) (6)\n\nOne-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`.\n\n| Tool                              | Method | Risk   |\n| --------------------------------- | ------ | ------ |\n| `list-device-management-scripts`  | GET    |        |\n| `get-device-management-script`    | GET    |        |\n| `create-device-management-script` | POST   | medium |\n| `update-device-management-script` | PATCH  | medium |\n| `delete-device-management-script` | DELETE | high   |\n| `assign-device-management-script` | POST   | medium |\n\nNotes:\n\n- `scriptContent` is base64-encoded UTF-8 PowerShell.\n- 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).\n- Updating `scriptContent` does NOT re-run on devices that already succeeded; delete + recreate to force re-execution.\n- `enforceSignatureCheck=true` requires code-signed scripts (recommended for prod).\n- `runAs32Bit=true` forces 32-bit PowerShell on 64-bit Windows (rarely needed).\n\n### Windows custom compliance scripts (deviceComplianceScripts) (6)\n\nPowerShell 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`.\n\n| Tool                              | Method | Risk   |\n| --------------------------------- | ------ | ------ |\n| `list-device-compliance-scripts`  | GET    |        |\n| `get-device-compliance-script`    | GET    |        |\n| `create-device-compliance-script` | POST   | medium |\n| `update-device-compliance-script` | PATCH  | medium |\n| `delete-device-compliance-script` | DELETE | high   |\n| `assign-device-compliance-script` | POST   | medium |\n\nNotes:\n\n- `detectionScriptContent` must emit a JSON object on STDOUT (e.g. `ConvertTo-Json -Compress @{BitLockerEnabled=$true;TpmReady=$true}`).\n- The script alone has no compliance effect — you must also author a `windows10CustomComplianceConfiguration` policy with matching rules.\n- Changing the JSON keys without updating the linked policy's rules silently breaks compliance evaluation.\n- Deleting a script in use causes referencing compliance policies to fail evaluation on next device check-in.\n- Assignment shape reuses `deviceHealthScriptAssignment` (set `runRemediationScript: false` since compliance scripts have no remediation pairing).\n\n### Enrollment & Autopilot (10)\n\n| Tool                              | Method | Risk   |\n| --------------------------------- | ------ | ------ |\n| `list-enrollment-configurations`  | GET    |        |\n| `get-enrollment-configuration`    | GET    |        |\n| `list-autopilot-devices`          | GET    |        |\n| `get-autopilot-device`            | GET    |        |\n| `create-enrollment-configuration` | POST   | medium |\n| `update-enrollment-configuration` | PATCH  | medium |\n| `delete-enrollment-configuration` | DELETE | high   |\n| `update-autopilot-device`         | PATCH  | medium |\n| `delete-autopilot-device`         | DELETE | high   |\n| `import-autopilot-device`         | POST   | medium |\n\n### Detected apps (3)\n\n| Tool                        | Method |\n| --------------------------- | ------ |\n| `list-detected-apps`        | GET    |\n| `get-detected-app`          | GET    |\n| `list-detected-app-devices` | GET    |\n\n### Intune RBAC & config (7)\n\n| Tool                               | Method |\n| ---------------------------------- | ------ |\n| `list-intune-audit-events`         | GET    |\n| `get-software-update-summary`      | GET    |\n| `get-apple-push-certificate`       | GET    |\n| `list-intune-role-definitions`     | GET    |\n| `list-intune-role-assignments`     | GET    |\n| `list-intune-terms-and-conditions` | GET    |\n| `list-intune-terms-acceptances`    | GET    |\n\n### Intune connectors & updates (3)\n\n| Tool                                     | Method |\n| ---------------------------------------- | ------ |\n| `get-intune-conditional-access-settings` | GET    |\n| `list-mtd-connectors`                    | GET    |\n| `list-ios-update-statuses`               | GET    |\n\n### Device categories (1)\n\n| Tool                     | Method |\n| ------------------------ | ------ |\n| `list-device-categories` | GET    |\n\n### Access reviews (5)\n\n| Tool                             | Method |\n| -------------------------------- | ------ |\n| `list-access-review-definitions` | GET    |\n| `get-access-review-definition`   | GET    |\n| `list-access-review-instances`   | GET    |\n| `get-access-review-instance`     | GET    |\n| `list-access-review-decisions`   | GET    |\n\n### Entitlement management (7)\n\n| Tool                                  | Method |\n| ------------------------------------- | ------ |\n| `list-access-packages`                | GET    |\n| `get-access-package`                  | GET    |\n| `list-access-package-assignments`     | GET    |\n| `list-access-package-requests`        | GET    |\n| `list-access-package-catalogs`        | GET    |\n| `list-connected-organizations`        | GET    |\n| `get-entitlement-management-settings` | GET    |\n\n### Lifecycle workflows (3)\n\n| Tool                              | Method |\n| --------------------------------- | ------ |\n| `list-lifecycle-workflows`        | GET    |\n| `get-lifecycle-workflow`          | GET    |\n| `list-lifecycle-task-definitions` | GET    |\n\n### PIM for Groups (2)\n\n| Tool                                   | Method |\n| -------------------------------------- | ------ |\n| `list-pim-group-assignment-schedules`  | GET    |\n| `list-pim-group-eligibility-schedules` | GET    |\n\n### Terms of use (3)\n\n| Tool                            | Method |\n| ------------------------------- | ------ |\n| `list-terms-of-use-agreements`  | GET    |\n| `get-terms-of-use-agreement`    | GET    |\n| `list-terms-of-use-acceptances` | GET    |\n\n### App consent requests (3)\n\n| Tool                         | Method |\n| ---------------------------- | ------ |\n| `list-app-consent-requests`  | GET    |\n| `get-app-consent-request`    | GET    |\n| `list-user-consent-requests` | GET    |\n\n### Incident response (17) -- requires `--allow-writes`\n\n| Tool                                            | Method | Risk     |\n| ----------------------------------------------- | ------ | -------- |\n| `disable-user-account`                          | PATCH  | critical |\n| `revoke-user-sessions`                          | POST   | high     |\n| `add-security-alert-comment`                    | POST   | low      |\n| `update-device`                                 | PATCH  | high     |\n| `confirm-compromised-users`                     | POST   | high     |\n| `dismiss-risky-users`                           | POST   | high     |\n| `delete-user-phone-auth-method`                 | DELETE | high     |\n| `delete-user-fido2-auth-method`                 | DELETE | high     |\n| `delete-user-authenticator-auth-method`         | DELETE | high     |\n| `delete-user-software-oath-auth-method`         | DELETE | high     |\n| `delete-user-windows-hello-auth-method`         | DELETE | high     |\n| `delete-user-email-auth-method`                 | DELETE | high     |\n| `delete-user-temporary-access-pass-auth-method` | DELETE | high     |\n| `confirm-compromised-service-principals`        | POST   | high     |\n| `dismiss-risky-service-principals`              | POST   | high     |\n| `confirm-safe-users`                            | POST   | high     |\n| `run-hunting-query`                             | POST   | low      |\n\nOne deletion tool per authentication-method collection, since the ids are collection-scoped and not interchangeable. Run `list-user-auth-methods` first and match on `@odata.type` to pick the right tool and id. Graph refuses the deletion when the method is the user's only remaining MFA factor and MFA is required.\n\n### Intune device remote actions (16) -- requires `--allow-writes`\n\n| Tool                            | Method | Risk     |\n| ------------------------------- | ------ | -------- |\n| `wipe-managed-device`           | POST   | critical |\n| `retire-managed-device`         | POST   | high     |\n| `sync-managed-device`           | POST   | low      |\n| `reboot-managed-device`         | POST   | high     |\n| `remote-lock-device`            | POST   | medium   |\n| `reset-device-passcode`         | POST   | high     |\n| `shutdown-managed-device`       | POST   | high     |\n| `disable-lost-mode`             | POST   | low      |\n| `locate-managed-device`         | POST   | low      |\n| `bypass-activation-lock`        | POST   | high     |\n| `trigger-defender-scan`         | POST   | low      |\n| `update-defender-signatures`    | POST   | low      |\n| `clean-windows-device`          | POST   | critical |\n| `logout-shared-apple-user`      | POST   | medium   |\n| `delete-shared-apple-user`      | POST   | high     |\n| `update-windows-device-account` | POST   | medium   |\n\n### Conditional Access CRUD (7) -- requires `--allow-writes`\n\n| Tool                                | Method | Risk     |\n| ----------------------------------- | ------ | -------- |\n| `list-conditional-access-templates` | GET    |          |\n| `create-conditional-access-policy`  | POST   | high     |\n| `update-conditional-access-policy`  | PATCH  | high     |\n| `delete-conditional-access-policy`  | DELETE | critical |\n| `create-named-location`             | POST   | medium   |\n| `update-named-location`             | PATCH  | medium   |\n| `delete-named-location`             | DELETE | high     |\n\n### Intune policies CRUD (6) -- requires `--allow-writes`\n\n| Tool                          | Method | Risk   |\n| ----------------------------- | ------ | ------ |\n| `create-compliance-policy`    | POST   | medium |\n| `update-compliance-policy`    | PATCH  | medium |\n| `delete-compliance-policy`    | DELETE | high   |\n| `create-device-configuration` | POST   | medium |\n| `update-device-configuration` | PATCH  | medium |\n| `delete-device-configuration` | DELETE | high   |\n\n### OneDrive / user drive (DSAR enumeration) (4)\n\nRead-only traversal of a user's personal drive, for subject-access requests. Content bytes are not exposed; these return metadata and download URLs.\n\n| Tool                  | Method | Risk |\n| --------------------- | ------ | ---- |\n| `get-user-drive`      | GET    |      |\n| `get-drive-root`      | GET    |      |\n| `list-drive-children` | GET    |      |\n| `get-drive-item`      | GET    |      |\n\n### Purview DSPM (protection scopes) (2)\n\n| Tool                                | Method | Risk |\n| ----------------------------------- | ------ | ---- |\n| `get-data-security-governance-root` | GET    |      |\n| `compute-protection-scopes`         | POST   | low  |\n\n`compute-protection-scopes` is a POST but computes rather than mutates — hence the `low` tier. It still needs `--allow-writes`.\n\n### Teams online meeting attendance (4)\n\nAttendance reporting for a specific user's meetings. App-only access requires an Application Access Policy on the tenant, granted per service principal with `Set-CsApplicationAccessPolicy`; without it Graph answers 403 regardless of the Graph permission.\n\n| Tool                                   | Method | Risk |\n| -------------------------------------- | ------ | ---- |\n| `get-user-online-meeting`              | GET    |      |\n| `list-user-meeting-attendance-reports` | GET    |      |\n| `get-user-meeting-attendance-report`   | GET    |      |\n| `list-user-meeting-attendance-records` | GET    |      |\n\n### Teams deleted chats (3)\n\n| Tool                 | Method | Risk   |\n| -------------------- | ------ | ------ |\n| `list-deleted-chats` | GET    |        |\n| `get-deleted-chat`   | GET    |        |\n| `undo-delete-chat`   | POST   | medium |\n\nAdministrative recovery flow for a chat a user deleted. The retention window is Microsoft's, not configurable here.\n\n### Teams chat investigation reads (5)\n\nTriage reads over a user's chats, on `Chat.Read.All`. For court-admissible production use the eDiscovery tools instead — these reads carry no chain of custody.\n\n| Tool                 | Method | Risk |\n| -------------------- | ------ | ---- |\n| `list-user-chats`    | GET    |      |\n| `get-chat`           | GET    |      |\n| `list-chat-members`  | GET    |      |\n| `list-chat-messages` | GET    |      |\n| `get-chat-message`   | GET    |      |\n\n### Teams call records (11)\n\n| Tool                            | Method |\n| ------------------------------- | ------ |\n| `list-call-records`             | GET    |\n| `get-call-record`               | GET    |\n| `list-call-record-sessions`     | GET    |\n| `get-call-record-session`       | GET    |\n| `list-call-session-segments`    | GET    |\n| `get-call-session-segment`      | GET    |\n| `list-call-record-participants` | GET    |\n| `get-call-record-participant`   | GET    |\n| `get-call-record-organizer`     | GET    |\n| `get-pstn-calls`                | GET    |\n| `get-direct-routing-calls`      | GET    |\n\n### Cloud PC / Windows 365 (10)\n\n| Tool                                    | Method | Risk   |\n| --------------------------------------- | ------ | ------ |\n| `list-cloud-pcs`                        | GET    |        |\n| `list-cloud-pc-provisioning-policies`   | GET    |        |\n| `list-cloud-pc-device-images`           | GET    |        |\n| `list-cloud-pc-gallery-images`          | GET    |        |\n| `list-cloud-pc-on-premises-connections` | GET    |        |\n| `list-cloud-pc-user-settings`           | GET    |        |\n| `list-cloud-pc-audit-events`            | GET    |        |\n| `create-cloud-pc-provisioning-policy`   | POST   | medium |\n| `update-cloud-pc-provisioning-policy`   | PATCH  | medium |\n| `delete-cloud-pc-provisioning-policy`   | DELETE | high   |\n\n### Universal Print (6)\n\n| Tool                          | Method | Risk |\n| ----------------------------- | ------ | ---- |\n| `list-printers`               | GET    |      |\n| `list-print-shares`           | GET    |      |\n| `list-print-connectors`       | GET    |      |\n| `list-print-services`         | GET    |      |\n| `list-print-operations`       | GET    |      |\n| `list-print-task-definitions` | GET    |      |\n\n### Information Protection & Sensitivity Labels (7)\n\n| Tool                              | Method |\n| --------------------------------- | ------ |\n| `list-bitlocker-recovery-keys`    | GET    |\n| `list-threat-assessment-requests` | GET    |\n| `list-sensitivity-labels`         | GET    |\n| `get-sensitivity-label`           | GET    |\n| `list-sensitivity-sublabels`      | GET    |\n| `get-sensitivity-label-rights`    | GET    |\n| `get-protection-scopes`           | GET    |\n\n### SharePoint administration (25)\n\n| Tool                      | Method | Risk   |\n| ------------------------- | ------ | ------ |\n| `get-sharepoint-settings` | GET    |        |\n| `list-sharepoint-sites`   | GET    |        |\n| `get-sharepoint-site`     | GET    |        |\n| `update-sharepoint-site`  | PATCH  | medium |\n| `list-site-drives`        | GET    |        |\n| `get-site-default-drive`  | GET    |        |\n| `list-site-lists`         | GET    |        |\n| `get-site-list`           | GET    |        |\n| `create-site-list`        | POST   | low    |\n| `update-site-list`        | PATCH  | low    |\n| `delete-site-list`        | DELETE | high   |\n| `list-site-list-items`    | GET    |        |\n| `create-site-list-item`   | POST   | low    |\n| `update-site-list-item`   | PATCH  | low    |\n| `delete-site-list-item`   | DELETE | medium |\n| `list-site-list-columns`  | GET    |        |\n| `list-site-columns`       | GET    |        |\n| `list-site-content-types` | GET    |        |\n| `list-site-permissions`   | GET    |        |\n| `get-site-permission`     | GET    |        |\n| `create-site-permission`  | POST   | medium |\n| `update-site-permission`  | PATCH  | medium |\n| `delete-site-permission`  | DELETE | high   |\n| `get-site-analytics`      | GET    |        |\n| `list-site-subsites`      | GET    |        |\n\n### Records Management (9)\n\n| Tool                          | Method | Risk   |\n| ----------------------------- | ------ | ------ |\n| `list-file-plan-authorities`  | GET    |        |\n| `list-file-plan-categories`   | GET    |        |\n| `list-file-plan-citations`    | GET    |        |\n| `list-file-plan-departments`  | GET    |        |\n| `list-file-plan-references`   | GET    |        |\n| `get-retention-event`         | GET    |        |\n| `create-retention-event`      | POST   | medium |\n| `get-retention-event-type`    | GET    |        |\n| `create-retention-event-type` | POST   | medium |\n\nListing or reading `retentionLabels` themselves is **not exposed**: Microsoft Graph does not support it with application permissions. Use delegated access or Security & Compliance PowerShell for that. `list-retention-events` is under [Security advanced](#security-advanced-9).\n\n### Teams administration (30)\n\n| Tool                             | Method | Risk     |\n| -------------------------------- | ------ | -------- |\n| `list-teams`                     | GET    |          |\n| `create-team`                    | POST   | medium   |\n| `get-team`                       | GET    |          |\n| `update-team`                    | PATCH  | medium   |\n| `delete-team`                    | DELETE | critical |\n| `list-team-admin-channels`       | GET    |          |\n| `create-team-admin-channel`      | POST   | low      |\n| `get-team-admin-channel`         | GET    |          |\n| `delete-team-admin-channel`      | DELETE | high     |\n| `list-team-admin-members`        | GET    |          |\n| `add-team-admin-members`         | POST   | medium   |\n| `remove-team-admin-members`      | POST   | medium   |\n| `get-team-admin-member`          | GET    |          |\n| `list-team-installed-apps`       | GET    |          |\n| `archive-team`                   | POST   | medium   |\n| `unarchive-team`                 | POST   | low      |\n| `clone-team`                     | POST   | medium   |\n| `list-team-operations`           | GET    |          |\n| `list-team-permission-grants`    | GET    |          |\n| `get-teams-app-settings`         | GET    |          |\n| `update-teams-app-settings`      | PATCH  | high     |\n| `list-deleted-teams`             | GET    |          |\n| `list-teams-catalog-apps`        | GET    |          |\n| `get-teams-catalog-app`          | GET    |          |\n| `list-teams-app-definitions`     | GET    |          |\n| `get-teams-admin-settings`       | GET    |          |\n| `list-teams-user-configurations` | GET    |          |\n| `get-teams-admin-policy`         | GET    |          |\n| `list-teams-policy-assignments`  | GET    |          |\n| `list-teams-phone-assignments`   | GET    |          |\n\n### Intune reports (18) -- requires `--allow-writes` (POST endpoints)\n\n| Tool                                             | Method | Risk |\n| ------------------------------------------------ | ------ | ---- |\n| `intune-device-noncompliance-report`             | POST   | low  |\n| `intune-compliance-policy-noncompliance-report`  | POST   | low  |\n| `intune-compliance-policy-noncompliance-summary` | POST   | low  |\n| `intune-compliance-setting-noncompliance-report` | POST   | low  |\n| `intune-config-policy-noncompliance-report`      | POST   | low  |\n| `intune-config-policy-noncompliance-summary`     | POST   | low  |\n| `intune-config-setting-noncompliance-report`     | POST   | low  |\n| `intune-devices-without-compliance-report`       | POST   | low  |\n| `intune-noncompliant-devices-settings-report`    | POST   | low  |\n| `intune-policy-noncompliance-report`             | POST   | low  |\n| `intune-policy-noncompliance-summary`            | POST   | low  |\n| `intune-policy-noncompliance-metadata`           | POST   | low  |\n| `intune-setting-noncompliance-report`            | POST   | low  |\n| `intune-report-filters`                          | POST   | low  |\n| `intune-historical-report`                       | POST   | low  |\n| `intune-cached-report`                           | POST   | low  |\n| `list-intune-report-export-jobs`                 | GET    |      |\n| `intune-device-app-install-status-report`        | POST   | low  |\n\n### Intune partners & infrastructure (10)\n\n| Tool                                  | Method | Risk |\n| ------------------------------------- | ------ | ---- |\n| `list-compliance-management-partners` | GET    |      |\n| `list-device-management-partners`     | GET    |      |\n| `list-exchange-connectors`            | GET    |      |\n| `list-remote-assistance-partners`     | GET    |      |\n| `list-notification-message-templates` | GET    |      |\n| `list-intune-resource-operations`     | GET    |      |\n| `list-imported-autopilot-devices`     | GET    |      |\n| `list-windows-malware-info`           | GET    |      |\n| `list-intune-mobile-apps`             | GET    |      |\n| `list-intune-app-categories`          | GET    |      |\n\n### Intune app management (11)\n\n| Tool                               | Method | Risk |\n| ---------------------------------- | ------ | ---- |\n| `list-intune-app-configurations`   | GET    |      |\n| `list-managed-app-policies`        | GET    |      |\n| `list-managed-app-registrations`   | GET    |      |\n| `list-managed-app-statuses`        | GET    |      |\n| `list-android-app-protections`     | GET    |      |\n| `list-ios-app-protections`         | GET    |      |\n| `list-default-app-protections`     | GET    |      |\n| `list-targeted-app-configurations` | GET    |      |\n| `list-mdm-wip-policies`            | GET    |      |\n| `list-mam-wip-policies`            | GET    |      |\n| `list-vpp-tokens`                  | GET    |      |\n\n### Advanced policies (15)\n\n| Tool                                      | Method | Risk |\n| ----------------------------------------- | ------ | ---- |\n| `list-activity-timeout-policies`          | GET    |      |\n| `get-authorization-policy`                | GET    |      |\n| `get-auth-flows-policy`                   | GET    |      |\n| `list-claims-mapping-policies`            | GET    |      |\n| `list-conditional-access-policies-v2`     | GET    |      |\n| `get-default-app-management-policy`       | GET    |      |\n| `get-device-registration-policy`          | GET    |      |\n| `list-feature-rollout-policies`           | GET    |      |\n| `list-home-realm-discovery-policies`      | GET    |      |\n| `list-permission-grant-policies`          | GET    |      |\n| `list-role-management-policies`           | GET    |      |\n| `list-role-management-policy-assignments` | GET    |      |\n| `list-token-issuance-policies`            | GET    |      |\n| `list-token-lifetime-policies`            | GET    |      |\n| `get-cross-tenant-default-policy`         | GET    |      |\n\n### Identity Governance+ (11)\n\n| Tool                                     | Method | Risk |\n| ---------------------------------------- | ------ | ---- |\n| `list-entitlement-assignment-policies`   | GET    |      |\n| `list-entitlement-resources`             | GET    |      |\n| `list-entitlement-resource-environments` | GET    |      |\n| `list-lifecycle-workflow-templates`      | GET    |      |\n| `get-lifecycle-workflow-settings`        | GET    |      |\n| `list-lifecycle-custom-task-extensions`  | GET    |      |\n| `list-deleted-lifecycle-workflows`       | GET    |      |\n| `list-pim-group-assignment-requests`     | GET    |      |\n| `list-pim-group-assignment-instances`    | GET    |      |\n| `list-pim-group-eligibility-requests`    | GET    |      |\n| `list-pim-group-eligibility-instances`   | GET    |      |\n\n### PIM role management (6)\n\n| Tool                                  | Method | Risk |\n| ------------------------------------- | ------ | ---- |\n| `list-access-review-history`          | GET    |      |\n| `list-pim-role-assignment-requests`   | GET    |      |\n| `list-pim-role-assignment-schedules`  | GET    |      |\n| `list-pim-role-eligibility-requests`  | GET    |      |\n| `list-pim-role-eligibility-schedules` | GET    |      |\n| `list-role-resource-namespaces`       | GET    |      |\n\n### Identity Protection+ (1)\n\n| Tool                                     | Method | Risk |\n| ---------------------------------------- | ------ | ---- |\n| `list-service-principal-risk-detections` | GET    |      |\n\n### Security advanced (9)\n\n| Tool                                     | Method | Risk |\n| ---------------------------------------- | ------ | ---- |\n| `list-retention-events`                  | GET    |      |\n| `list-retention-event-types`             | GET    |      |\n| `list-subject-rights-requests`           | GET    |      |\n| `list-simulation-automations`            | GET    |      |\n| `list-simulation-trainings`              | GET    |      |\n| `list-simulation-payloads`               | GET    |      |\n| `list-simulation-end-user-notifications` | GET    |      |\n| `list-simulation-landing-pages`          | GET    |      |\n| `list-simulation-login-pages`            | GET    |      |\n\n### Defender for Identity (24)\n\nFull 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.\n\n| Tool                                        | Method | Risk     |\n| ------------------------------------------- | ------ | -------- |\n| `list-identity-health-issues`               | GET    |          |\n| `get-identity-health-issue`                 | GET    |          |\n| `list-sensor-health-issues`                 | GET    |          |\n| `get-sensor-health-issue`                   | GET    |          |\n| `list-identity-sensors`                     | GET    |          |\n| `get-identity-sensor`                       | GET    |          |\n| `update-identity-sensor`                    | PATCH  | medium   |\n| `get-sensor-deployment-access-key`          | GET    |          |\n| `get-sensor-deployment-package-uri`         | GET    |          |\n| `regenerate-sensor-deployment-access-key`   | POST   | high     |\n| `list-sensor-candidates`                    | GET    |          |\n| `get-sensor-candidate`                      | GET    |          |\n| `get-sensor-candidate-activation-config`    | GET    |          |\n| `update-sensor-candidate-activation-config` | PATCH  | medium   |\n| `activate-sensor-candidates`                | POST   | medium   |\n| `list-sensor-migrations`                    | GET    |          |\n| `get-sensor-migration`                      | GET    |          |\n| `migrate-sensors`                           | POST   | high     |\n| `get-identity-security-settings`            | GET    |          |\n| `get-auto-auditing-config`                  | GET    |          |\n| `update-auto-auditing-config`               | PATCH  | medium   |\n| `list-identity-accounts`                    | GET    |          |\n| `get-identity-account`                      | GET    |          |\n| `invoke-identity-account-action`            | POST   | critical |\n\nNotes:\n\n- **`invoke-identity-account-action`** is the highest-impact write — performs identity-response actions (disable, enable, forceP",
  "bytes": 60000,
  "sha": "9b3e58113cafce71c0e4b842da6c363193d52ea1aee88fb4c56a84eb3b51e7fc",
  "repo_slug": "okapi-ca/ms-365-admin-mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_okapi_ca_ms_365_admin_8ab59667/readme"
}