Install
openclaw skills install @mattiacirillo/openclaw-intune-skillManage Microsoft Intune and Entra ID device management via the Microsoft Graph API. Use this skill whenever the user mentions Intune, MDM, managed devices, device compliance, device sync/reboot/lock/wipe/retire, Autopilot, enrollment, compliance or configuration policies, Settings Catalog, Conditional Access, app deployment/assignment, App Protection (MAM), Endpoint Security (BitLocker, Defender, Firewall, ASR), Windows Update rings, Apple DEP/ADE/VPP/APNS, Android Enterprise, Intune audit logs, or asks anything like "zeig mir alle Geräte", "ist Gerät X compliant", "sync den Laptop von …", "wipe device", "create a compliance policy" — even if they don't say "Graph API" explicitly.
openclaw skills install @mattiacirillo/openclaw-intune-skillManage Microsoft Intune via Microsoft Graph: devices, policies, apps, Autopilot, Conditional Access, updates, Apple/Android platform config, reporting and audit.
Respond in the user's language. Format results as Markdown tables or short summaries — never dump raw JSON.
Always use the bundled wrapper — it handles auth, token caching, pagination, throttling and the read-only guard:
scripts/graph.sh GET "/deviceManagement/managedDevices?\$select=deviceName,complianceState"
scripts/graph.sh --confirm POST "/deviceManagement/managedDevices/{id}/syncDevice"
scripts/graph.sh --confirm POST "/deviceManagement/deviceCompliancePolicies" '{"@odata.type": "...", ...}'
scripts/graph.sh --confirm-name "DEVICE-NAME" POST "/deviceManagement/managedDevices/{id}/wipe"
https://graph.microsoft.com and default to v1.0.
Prefix with /beta/... to use the beta API.@odata.nextLink automatically and merges all pages,
retries on 429 honoring Retry-After, and adds
ConsistencyLevel: eventual for advanced /users and /groups queries.curl.get_token.sh only refreshes the protected token cache and returns its file
path. It never emits the bearer token itself.Required: INTUNE_TENANT_ID, INTUNE_CLIENT_ID, INTUNE_CLIENT_SECRET.
Multi-tenant (MSP): set INTUNE_PROFILE=<name> to use
INTUNE_<NAME>_TENANT_ID / _CLIENT_ID / _CLIENT_SECRET instead. If
several profiles exist and the user hasn't named a tenant, ask which one.
Every operation falls into exactly one tier. Catch-all: any non-GET request is at least Tier 2, even if a reference file doesn't mark it.
| Tier | Operations | Rule |
|---|---|---|
| 0 | All GET / read | Execute without confirmation |
| 1 | syncDevice, rebootNow, remoteLock, locateDevice, send test notification | One short confirmation ("Soll ich X syncen?") |
| 2 | All other POST/PATCH/PUT/DELETE: create/update/assign/delete policies, apps, groups, filters, categories, resetPasscode, pause/resume update rings | Show a summary of exactly what will change, then wait for explicit confirmation |
| 3 | wipe, retire, DELETE device, DELETE Autopilot identity, bypassActivationLock, DELETE Conditional Access policy | Explain consequences, then require the user to type back the exact device/policy name before executing |
Additional rules:
--confirm
for Tier 1/2 or --confirm-name "EXACT NAME" for Tier 3. The wrapper refuses
writes without the appropriate flag.INTUNE_READ_ONLY=true, refuse every non-GET
operation and say the skill is in read-only mode (the wrapper also
enforces this).INTUNE_CLIENT_SECRET (or
any *_CLIENT_SECRET) — not in commands, debug output or error messages.
Never paste a raw curl line containing the secret.references/troubleshooting.md.@odata.nextLink until exhausted before summarizing.
graph.sh does this automatically.Retry-After seconds and retry
(max 5 attempts). Don't report a 429 as a failure to the user.$filter/$search/$count on /users and
/groups need headers ConsistencyLevel: eventual plus $count=true.lastSyncDateTime lt 2026-06-06T00:00:00Z. Compute relative ranges
("letzte Woche") from today's date.v1.0. Some features exist only in /beta
(assignment filters, scope tags, health scripts, DEP, VPP, feature/driver
updates, export jobs, settings catalog search) — beta contracts can
change without notice; if a beta call 404s, check the reference file for
the v1.0 alternative.get_token.sh; only refresh on a
401, never per call.Read only the reference file(s) relevant to the current task:
| Task mentions … | Read |
|---|---|
| Devices, remote actions (sync/wipe/lock/…), device categories, PowerShell scripts, remediations | references/devices.md |
| Compliance policies, configuration profiles, Settings Catalog, Endpoint Security (BitLocker/Firewall/Defender/ASR), Conditional Access, assignment filters, scope tags | references/policies.md |
| Apps, app assignments, detected apps, App Protection / MAM | references/apps.md |
| Autopilot, enrollment config/ESP/Windows Hello, Apple DEP/ADE/APNS/VPP, Android Enterprise | references/platform.md |
| Wi-Fi/WLAN, VPN, certificates (SCEP/PKCS/root), Windows Update rings, feature/quality/driver updates | references/network-updates.md |
| Reports, compliance summary, stale devices, audit logs, sign-in logs, Settings Catalog search, GPO migration | references/reporting.md |
| Users, groups, memberships, RBAC roles, Terms & Conditions, notification templates | references/admin.md |
| Multi-step recipes: onboarding, offboarding, fleet reports, policy review | references/workflows.md |
| An API call failed | references/troubleshooting.md |
Typical routing examples:
devices.md, list + table.devices.md: find device by user, Tier 1
confirm, sync.policies.md: ask for
requirements, draft JSON, Tier 2 confirm, create.reporting.md: audit events with
date filter.reporting.md: Settings
Catalog search.workflows.md offboarding recipe.