Microsoft 365 Admin
Microsoft 365 administration via Graph API application permissions (read-only by default).
Open source Open in the app JSON README (API)
About
Microsoft 365 administration via Graph API application permissions (read-only by default).
Details
- Kind
- MCP servers
- Topic
- Productivity
- Publisher
- okapi-ca
- Origin
- official
- Category
- ferramentas
- Transport
- local
- Version
- 0.6.3
- Stars
- 12
- Forks
- 2
- Open pull requests
- 11
- Last push
- 2026-09-03T07:00:49Z
- Repository state
- ativo
- Language
- TypeScript
- License
- MIT
- Added
- 2026-08-29 04:00:58
- Updated
- 2026-08-29 04:00:58
- Origin id
io.github.okapi-ca/ms-365-admin
README
# ms-365-admin-mcp-server
[](https://github.com/okapi-ca/ms-365-admin-mcp-server/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/@okapi-ca/ms-365-admin-mcp-server)
[](LICENSE)
A [Model Context Protocol](https://modelcontextprotocol.io/) (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](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.
## Features
- **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
- **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](docs/USE_CASES.md) | 18 typical admin scenarios with sample prompts and tool lists |
| [docs/playbooks/](docs/playbooks/README.md) | End-to-end security incident response playbooks |
| [agent-skills/](agent-skills/README.md) | Drop-in skills for LLM agents (Claude Code et al.) with safety patterns |
| [docs/APP_REGISTRATION.md](docs/APP_REGISTRATION.md) | Step-by-step Azure AD app registration and permission consent |
| [docs/HTTP_DEPLOYMENT.md](docs/HTTP_DEPLOYMENT.md) | HTTP transport, JWT validation, Docker, Azure Container Apps |
| [docs/AZURE_DEPLOYMENT_SECURITY.md](docs/AZURE_DEPLOYMENT_SECURITY.md) | Threat model, required controls, and checklist for Azure production deploys |
| [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) | Common errors and how to diagnose them |
| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Internal architecture and code generation pipeline |
| [docs/RISK_MODEL.md](docs/RISK_MODEL.md) | Risk classification rubric for write tools |
| [CONTRIBUTING.md](CONTRIBUTING.md) | How to contribute new tools, presets, and fixes |
| [SECURITY.md](SECURITY.md) | Vulnerability reporting and operator hardening checklist |
| [CHANGELOG.md](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)
```bash
npm install -g @okapi-ca/ms-365-admin-mcp-server
ms-365-admin-mcp-server --help
```
### Docker
```bash
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
```bash
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.)
```json
{
"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`](.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:
```jsonc
{
"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+P` → `MCP: List Servers` → `Show 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`](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.
```bash
npx -p @okapi-ca/ms-365-admin-mcp-server@latest ms-365-admin-mcp-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](docs/TROUBLESHOOTING.md#oauth--browser-authentication-problems) 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
```bash
# 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
```bash
node dist/index.js --verify-login
```
## Available tools (641)
### 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 (9)
| 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 |
| `delete-user` | DELETE | critical |
| `assign-user-license` | POST | medium |
| `reprocess-user-license` | POST | low |
There 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.
### Devices (2)
| Tool | Method |
| -------------- | ------ |
| `list-devices` | GET |
| `get-device` | GET |
### Groups (11)
| 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 |
| `remove-group-member` | DELETE | medium |
| `add-group-owner` | POST | high |
| `remove-group-owner` | DELETE | high |
`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).
### Directory roles & PIM (9)
| 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 |
| `delete-role-assignment` | DELETE | critical |
| `remove-directory-role-member` | DELETE | critical |
`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.
### Administrative units (8)
| 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 |
| `remove-administrative-unit-member` | DELETE | high |
### Conditional access (3)
| Tool | Method |
| ---------------------------------- | ------ |
| `list-conditional-access-policies` | GET |
| `get-conditional-access-policy` | GET |
| `list-named-locations` | GET |
### Applications & app roles (11)
| 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 |
| `delete-oauth2-grant` | DELETE | high |
| `delete-sp-app-role-assignment` | DELETE | high |
| `delete-user-app-role-assignment` | DELETE | high |
`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.
### 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 (17) -- 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 |
| `delete-user-fido2-auth-method` | DELETE | high |
| `delete-user-authenticator-auth-method` | DELETE | high |
| `delete-user-software-oath-auth-method` | DELETE | high |
| `delete-user-windows-hello-auth-method` | DELETE | high |
| `delete-user-email-auth-method` | DELETE | high |
| `delete-user-temporary-access-pass-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 |
One 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.
### 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 (7) -- requires `--allow-writes`
| Tool | Method | Risk |
| ----------------------------------- | ------ | -------- |
| `list-conditional-access-templates` | 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 |
### OneDrive / user drive (DSAR enumeration) (4)
Read-only traversal of a user's personal drive, for subject-access requests. Content bytes are not exposed; these return metadata and download URLs.
| Tool | Method | Risk |
| --------------------- | ------ | ---- |
| `get-user-drive` | GET | |
| `get-drive-root` | GET | |
| `list-drive-children` | GET | |
| `get-drive-item` | GET | |
### Purview DSPM (protection scopes) (2)
| Tool | Method | Risk |
| ----------------------------------- | ------ | ---- |
| `get-data-security-governance-root` | GET | |
| `compute-protection-scopes` | POST | low |
`compute-protection-scopes` is a POST but computes rather than mutates — hence the `low` tier. It still needs `--allow-writes`.
### Teams online meeting attendance (4)
Attendance 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.
| Tool | Method | Risk |
| -------------------------------------- | ------ | ---- |
| `get-user-online-meeting` | GET | |
| `list-user-meeting-attendance-reports` | GET | |
| `get-user-meeting-attendance-report` | GET | |
| `list-user-meeting-attendance-records` | GET | |
### Teams deleted chats (3)
| Tool | Method | Risk |
| -------------------- | ------ | ------ |
| `list-deleted-chats` | GET | |
| `get-deleted-chat` | GET | |
| `undo-delete-chat` | POST | medium |
Administrative recovery flow for a chat a user deleted. The retention window is Microsoft's, not configurable here.
### Teams chat investigation reads (5)
Triage 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.
| Tool | Method | Risk |
| -------------------- | ------ | ---- |
| `list-user-chats` | GET | |
| `get-chat` | GET | |
| `list-chat-members` | GET | |
| `list-chat-messages` | GET | |
| `get-chat-message` | 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 (9)
| Tool | Method | Risk |
| ----------------------------- | ------ | ------ |
| `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 | |
| `get-retention-event` | GET | |
| `create-retention-event` | POST | medium |
| `get-retention-event-type` | GET | |
| `create-retention-event-type` | POST | medium |
Listing 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).
### 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+ (1)
| 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, forceP