@knowttl/mg-axi 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +149 -38
- package/dist/api.js +134 -8
- package/dist/bin/mg-axi-hook.js +31 -0
- package/dist/catalogue.js +390 -2
- package/dist/cli.js +116 -8
- package/dist/docs.js +45 -5
- package/dist/doctor.js +2 -2
- package/dist/entra-access-reviews.js +11 -4
- package/dist/entra-apps.js +13 -8
- package/dist/entra-audit-logs.js +8 -4
- package/dist/entra-auth-methods.js +8 -4
- package/dist/entra-certificate-auth.js +12 -8
- package/dist/entra-conditional-access.js +9 -4
- package/dist/entra-contacts.js +19 -12
- package/dist/entra-contracts.js +7 -4
- package/dist/entra-custom-security-attributes.js +19 -12
- package/dist/entra-data-policy-operations.js +7 -4
- package/dist/entra-delegated-admin.js +55 -6
- package/dist/entra-deleted-items.js +6 -4
- package/dist/entra-directory-objects.js +6 -4
- package/dist/entra-directory.js +19 -12
- package/dist/entra-domains.js +13 -8
- package/dist/entra-entitlement-management.js +12 -4
- package/dist/entra-group-pim.js +431 -0
- package/dist/entra-groups.js +13 -8
- package/dist/entra-lifecycle-workflows.js +136 -9
- package/dist/entra-organization.js +13 -8
- package/dist/entra-risk-prevention.js +436 -0
- package/dist/entra-risk.js +213 -5
- package/dist/entra-roles.js +10 -4
- package/dist/entra-subscriptions.js +6 -4
- package/dist/entra-users.js +7 -4
- package/dist/graph-session.js +29 -5
- package/dist/hook.js +84 -0
- package/dist/list-totals.js +52 -0
- package/dist/setup.js +5 -0
- package/docs/coverage.md +79 -13
- package/inventory/operations.json +2 -2
- package/package.json +4 -3
- package/skills/mg-axi/SKILL.md +56 -1
package/README.md
CHANGED
|
@@ -31,7 +31,8 @@ EXT-01n (contact membership) adds per-contact memberOf and transitiveMemberOf re
|
|
|
31
31
|
EXT-03 (identity providers) adds workforce identity-provider list/show/count/available-types reads with secret scrubbing through the same session.
|
|
32
32
|
EXT-01 (federation configurations) adds workforce directory federation-configuration list/show/count/available-types reads with default signing-certificate omission through the same session.
|
|
33
33
|
EXT-03 (data policy operations) adds workforce data-policy-operation list/show/count reads with storage-location redaction through the same session.
|
|
34
|
-
|
|
34
|
+
EXT-03 (risk prevention) adds workforce fraud-protection-provider, web-application-firewall-provider and web-application-firewall-verification list/show/count reads plus verification provider show with key-material scrubbing through the same delegated session.
|
|
35
|
+
READ-06 executes Entra risky-user, risk-detection, risky-service-principal (with per-principal history) and service-principal-risk-detection list/show through that session; risk usage follows the log usage below.
|
|
35
36
|
EXT-01 (organization) adds tenant-organization list/show, default sign-in branding metadata and locale branding reads through the same session.
|
|
36
37
|
EXT-04 (contracts) adds partner-tenant customer-contract list/show/count through the same session.
|
|
37
38
|
EXT-04 (delegated-admin) adds partner-tenant delegated-admin customer and relationship list/show through the same session.
|
|
@@ -79,7 +80,7 @@ The home view reports unavailable tenant summaries explicitly.
|
|
|
79
80
|
Text values longer than 500 characters are truncated, including strings in `businessPhones`; `--full` removes text truncation without lifting redaction or row caps.
|
|
80
81
|
Explicit null values stay null, missing properties stay absent, and denied reads return structured errors rather than empty results.
|
|
81
82
|
User lists accept `--filter` for an OData filter and default to a 100-row cap; `--limit` changes the cap, while the incompatible `--all` follows pages within request, byte and deadline budgets.
|
|
82
|
-
Partial lists report `
|
|
83
|
+
Partial lists report `complete: false` with a uniform `count` line (`1 users shown, more available`), a reason and an opaque `cursor` preserving unreturned rows.
|
|
83
84
|
Resume with `--cursor <cursor-from-output>` using the same profile, authentication scopes and API version; original `--select` and `--filter` values may be repeated or omitted, and conflicting values fail validation.
|
|
84
85
|
Repeat `--fields` and `--full` when the same local view is wanted; these are not saved in the cursor.
|
|
85
86
|
Delegated user reads default to `https://graph.microsoft.com/User.Read.All` with `--scopes` available for least-privilege basics; application profiles use the configured Graph `.default` audience and reject delegated scopes.
|
|
@@ -186,7 +187,10 @@ Execution reserves a journaled intent before the fresh read and records its outc
|
|
|
186
187
|
Relationship rows default to `id` and `displayName`; `--select` accepts only `id`, `displayName` and `mail`, and `--fields` must be a subset of that selection.
|
|
187
188
|
Returned `@odata.type` stays visible alongside any `--fields` projection.
|
|
188
189
|
Group lists return `groups`, member lists return `members`, parent-membership lists return `memberOf`, and single-group reads return `group`.
|
|
189
|
-
|
|
190
|
+
Group and relationship lists report uniform totals through the shared list-totals helper: `total` holds the server-supplied `@odata.count` when the query carries `$count` (filtered reads) and `null` otherwise, beside a `count` line such as `3 of 10 groups`, `3 groups` or, when the total is unknown and more pages remain, `3 groups shown, more available`.
|
|
191
|
+
The same helper covers the other wired core-directory lists: users, applications, service principals, owners, devices, administrative units and unit members, contacts, direct reports and memberships, directory roles, role assignments and PIM eligible/active assignments, group PIM assignment/eligibility schedules, instances and eligibility requests, directory objects, deleted items, domains and DNS records, contracts, organizations and branding localizations, subscriptions, access-review definitions, instances, decisions, contacted reviewers and stages, sign-ins and directory audits, authentication methods and registration reports, PKI configurations and certificate authorities, Conditional Access policies and named locations, attribute sets, custom-security-attribute definitions and allowed values, data-policy operations, delegated-admin customers, relationships and navigation lists, and entitlement catalogs, access packages, assignment policies, resource-role scopes, assignments and assignment requests. Remaining list families keep the previous `count: { returned, complete }` shape and follow the same helper in the next piece.
|
|
192
|
+
`complete` names pagination state, with `reason` and an opaque `cursor` on partial reads.
|
|
193
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to group and relationship reads.
|
|
190
194
|
Resume relationships with the same `--group` and direct or `--transitive` command, profile, scopes and API version; omit or repeat the original server query flags, and repeat local `--fields` and `--full` when wanted.
|
|
191
195
|
Help warns that hidden members are omitted without `Member.Read.Hidden`; completion describes pagination, not visibility.
|
|
192
196
|
Rows without non-null selected descriptive properties are preserved and reported as possibly limited by consent or unset properties; null properties stay null.
|
|
@@ -214,13 +218,43 @@ Use `entra pim active list` to classify those assignments as described below.
|
|
|
214
218
|
`entra pim active list` defaults to those properties plus `assignmentType` and covers both directly assigned (`assignmentType` Assigned) and activated eligible (`assignmentType` Activated) assignments; `memberType` names how the instance reaches the principal.
|
|
215
219
|
For built-in roles the unified `roleDefinitionId` matches the directory-role `roleTemplateId`.
|
|
216
220
|
`--select` requests properties from the [reviewed role property sets](src/entra-roles.ts); `--fields` must be a subset of the fetched selection.
|
|
217
|
-
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract; the named-list caps, `count
|
|
221
|
+
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract; the named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply.
|
|
218
222
|
Delegated directory-role and role-assignment reads default to `https://graph.microsoft.com/RoleManagement.Read.Directory`; eligible PIM reads default to `https://graph.microsoft.com/RoleEligibilitySchedule.Read.Directory` and active PIM reads to `https://graph.microsoft.com/RoleAssignmentSchedule.Read.Directory`, while application profiles use the configured `.default` audience.
|
|
219
223
|
Delegated callers additionally need a supported directory role per operation (for example Privileged Role Administrator, Global Reader or Security Reader for role reads, Directory Readers for assignments, Security Operator for PIM reads).
|
|
220
224
|
Denied reads name that role requirement instead of only the generic grant/role/licence cause.
|
|
221
225
|
Built-in roles are base inventory and custom role assignments need P1; PIM reads need P2 or ID Governance.
|
|
222
226
|
Role assignment, activation and every other PIM mutation belongs to later write slices, never to these reads.
|
|
223
227
|
|
|
228
|
+
Read PIM-for-Groups assignment and eligibility through ten views; delegated profiles first need explicit login with the read scopes:
|
|
229
|
+
|
|
230
|
+
```sh
|
|
231
|
+
mg-axi login --profile soc --scopes https://graph.microsoft.com/PrivilegedAssignmentSchedule.Read.AzureADGroup,https://graph.microsoft.com/PrivilegedEligibilitySchedule.Read.AzureADGroup
|
|
232
|
+
mg-axi entra pim group-assignment-schedule list --profile soc --filter "groupId eq '<group-id>'"
|
|
233
|
+
mg-axi entra pim group-assignment-schedule show --profile soc --id <assignment-schedule-id>
|
|
234
|
+
mg-axi entra pim group-assignment-instance list --profile soc --filter "principalId eq '<principal-id>'"
|
|
235
|
+
mg-axi entra pim group-assignment-instance show --profile soc --id <assignment-instance-id>
|
|
236
|
+
mg-axi entra pim group-eligibility-schedule list --profile soc --filter "groupId eq '<group-id>'"
|
|
237
|
+
mg-axi entra pim group-eligibility-schedule show --profile soc --id <eligibility-schedule-id>
|
|
238
|
+
mg-axi entra pim group-eligibility-instance list --profile soc --filter "groupId eq '<group-id>'"
|
|
239
|
+
mg-axi entra pim group-eligibility-instance show --profile soc --id <eligibility-instance-id>
|
|
240
|
+
mg-axi entra pim group-eligibility-request list --profile soc --filter "groupId eq '<group-id>'"
|
|
241
|
+
mg-axi entra pim group-eligibility-request show --profile soc --id <eligibility-request-id>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Assignment schedules govern group membership or ownership over time and instances are the provisioned windows, never the schedule itself.
|
|
245
|
+
Eligibility schedules govern who may activate and are not active grants, while eligibility instances are the provisioned eligibility windows and requests carry the ask plus its outcome.
|
|
246
|
+
Every list requires `--filter` with an `eq` clause on `groupId` or `principalId` scoping the list to one group or principal, and the requirement fails validation before credentials.
|
|
247
|
+
Assignment schedule and instance lists default to `id`, `principalId`, `groupId`, `accessId` and `assignmentType`; eligibility schedule and instance lists default to `id`, `principalId`, `groupId`, `accessId` and `memberType`; eligibility-request lists default to `id`, `action`, `status`, `principalId`, `groupId` and `accessId`.
|
|
248
|
+
Every show defaults to its full reviewed property set, except eligibility-request show omits `justification` unless an explicit `--select` names it.
|
|
249
|
+
`--select` requests properties from the [reviewed group PIM property sets](src/entra-group-pim.ts); `--fields` must be a subset of the fetched selection.
|
|
250
|
+
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract; these collections document no `$count`, so the uniform `count` totals name the returned rows with a `null` total unless a page carries a server total.
|
|
251
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply; resume a list with the same `--filter`, profile, scopes and API version.
|
|
252
|
+
Delegated assignment reads default to `https://graph.microsoft.com/PrivilegedAssignmentSchedule.Read.AzureADGroup` and eligibility reads to `https://graph.microsoft.com/PrivilegedEligibilitySchedule.Read.AzureADGroup`, while application profiles use the configured `.default` audience and reject `--scopes`.
|
|
253
|
+
Delegated callers additionally need owner or member of the group or a supported directory role scoped at directory level (Global Reader or Privileged Role Administrator for role-assignable groups; otherwise Global Reader, Directory Writer, Groups Administrator, Identity Governance Administrator or User Administrator).
|
|
254
|
+
Denied reads name that scope, role and licensing requirement instead of only the generic grant/role/licence cause.
|
|
255
|
+
PIM for Groups needs P2 or ID Governance, and delegated personal Microsoft accounts are not supported.
|
|
256
|
+
Assignment requests, approvals, `filterByCurrentUser` functions, group/principal navigation, resources, every count/ref/cast tail, beta and all mutations stay out; assignment requests stay out because their least privilege is the write scope `PrivilegedAssignmentSchedule.ReadWrite.AzureADGroup`.
|
|
257
|
+
|
|
224
258
|
Read access reviews through ten views; delegated profiles first need explicit login with the read scope:
|
|
225
259
|
|
|
226
260
|
```sh
|
|
@@ -250,7 +284,7 @@ Contacted-reviewer and stage `show` commands take `--definition`, `--instance` a
|
|
|
250
284
|
Decision reads are read-only: listing never approves, denies or applies anything, and submitting or stopping a review belongs to a later slice, never to these reads.
|
|
251
285
|
`--select` requests properties from the [reviewed access-review property sets](src/entra-access-reviews.ts); `--fields` must be a subset of the fetched selection.
|
|
252
286
|
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract; on definitions only `contains()` over the scope query and `eq` on status are documented, on stages only `eq` is documented.
|
|
253
|
-
The named-list caps, `count
|
|
287
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to access-review reads.
|
|
254
288
|
Resume any access-review list with `--cursor -` and supply the returned cursor on stdin, for example `mg-axi entra access-review definition list --profile soc --cursor - < cursor.txt`; small cursors can also use `--cursor <token>`.
|
|
255
289
|
Resume instance, decision, contacted-reviewer and stage lists with the same `--definition` (and `--instance`), profile, scopes and API version; a cursor from another definition or instance fails validation instead of returning foreign rows.
|
|
256
290
|
To replay a resumed result with `--full`, supply the original input cursor on stdin; the returned cursor continues after that result.
|
|
@@ -286,7 +320,7 @@ Access packages are the assignable bundles: `entra entitlement access-package li
|
|
|
286
320
|
Approval and subject reads carry personal data and belong to later parts, never to these reads; questions, custom-extension stages and the linked role/scope detail need `$expand` and belong to later slices.
|
|
287
321
|
`--select` requests properties from the [reviewed entitlement property sets](src/entra-entitlement-management.ts); `--fields` must be a subset of the fetched selection.
|
|
288
322
|
`--filter` passes through as plain `$filter` with no `$count` or `ConsistencyLevel` contract.
|
|
289
|
-
The named-list caps, `count
|
|
323
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to entitlement reads.
|
|
290
324
|
Resume any entitlement list with `--cursor -` and supply the returned cursor on stdin; resume policy and role-scope lists with the same `--access-package`, profile, scopes and API version.
|
|
291
325
|
Delegated reads default to `https://graph.microsoft.com/EntitlementManagement.Read.All`, while application profiles use the configured `.default` audience.
|
|
292
326
|
See the [entitlement-management scope decisions](docs/coverage.md#ext-02-entitlement-management-scope-decisions) for the scheduled personal-data part and deferred beta reads.
|
|
@@ -358,17 +392,37 @@ mg-axi entra lifecycle task-report task show --workflow <workflow-id> --report <
|
|
|
358
392
|
mg-axi entra lifecycle task-report task-definition show --workflow <workflow-id> --report <report-id> --profile soc
|
|
359
393
|
```
|
|
360
394
|
|
|
395
|
+
Read one run's user, subject and task processing results through nine views; run-nested reads share the reports scope:
|
|
396
|
+
|
|
397
|
+
```sh
|
|
398
|
+
mg-axi entra lifecycle run user-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10
|
|
399
|
+
mg-axi entra lifecycle run user-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --filter "processingStatus eq 'completed'"
|
|
400
|
+
mg-axi entra lifecycle run user-processing-result show --workflow <workflow-id> --run <run-id> --profile soc --id <result-id>
|
|
401
|
+
mg-axi entra lifecycle run user-processing-result count --workflow <workflow-id> --run <run-id> --profile soc
|
|
402
|
+
mg-axi entra lifecycle run subject-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10
|
|
403
|
+
mg-axi entra lifecycle run subject-processing-result show --workflow <workflow-id> --run <run-id> --profile soc --id <result-id>
|
|
404
|
+
mg-axi entra lifecycle run subject-processing-result count --workflow <workflow-id> --run <run-id> --profile soc
|
|
405
|
+
mg-axi entra lifecycle run task-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10
|
|
406
|
+
mg-axi entra lifecycle run task-processing-result show --workflow <workflow-id> --run <run-id> --profile soc --id <result-id>
|
|
407
|
+
mg-axi entra lifecycle run task-processing-result count --workflow <workflow-id> --run <run-id> --profile soc
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
`entra lifecycle run task-processing-result list` defaults to `id`, `processingStatus` and `failureReason`, and `entra lifecycle run task-processing-result show` defaults to the full reviewed scalar set including failure detail; task rows never carry subject, task or workflowSubject detail.
|
|
411
|
+
Run user results share the top-level user query contract (`--select` reviewed, `--filter` plain), while run subject rows always arrive whole like their top-level counterparts (Graph documents no `$select` on the list and `$expand` only on the get) and the run task single has no operation-level page, so both arrive whole and `--fields` projects them locally; `--select` is refused before credentials.
|
|
412
|
+
User, subject and task processing results are personal data: user and subject rows default to status and counts only (subject rows add `subjectType`), and the subject link is never requested.
|
|
413
|
+
Third-level processing results, reprocessed runs, subject and task sub-reads and the time-windowed summary functions belong to later slices.
|
|
414
|
+
|
|
361
415
|
`entra lifecycle task-report list` defaults to `id`, `runId`, `processingStatus`, `totalUsersCount`, `failedUsersCount` and `successfulUsersCount`, and `entra lifecycle task-report show` defaults to the full reviewed scalar set; report rows never carry task, task-definition or processing-result detail.
|
|
362
416
|
The task-report get and the taskReport-nested task and taskDefinition singles document no query parameters, so those rows always arrive whole and `--fields` projects them locally; `--select` is refused before credentials.
|
|
363
|
-
|
|
417
|
+
Third-level processing results, reprocessed runs, subject sub-reads and the time-windowed summary functions belong to later slices.
|
|
364
418
|
|
|
365
419
|
`entra lifecycle run list` defaults to `id`, `processingStatus`, `totalUsersCount`, `failedUsersCount` and `successfulUsersCount`, and `entra lifecycle run show` defaults to the full reviewed scalar set; run rows never carry processing results.
|
|
366
420
|
User and subject processing results are personal data: lists and singles default to status and counts only (subject lists add `subjectType`), and the subject link is never requested.
|
|
367
421
|
The subject list documents `$filter` but not `$select` and the subject get documents `$expand` only, so subject rows always arrive whole and `--fields` projects them locally; `--select` is refused before credentials.
|
|
368
|
-
|
|
422
|
+
Third-level processing results, taskProcessingResults sub-reads under a user or subject result, reprocessed runs, subject sub-reads and the time-windowed summary functions belong to later slices.
|
|
369
423
|
|
|
370
424
|
`entra lifecycle workflow list` defaults to `id`, `displayName`, `category`, `isEnabled` and `isSchedulingEnabled`, and `entra lifecycle workflow show --id <workflow-id>` defaults to the full reviewed scalar set.
|
|
371
|
-
Workflow rows never carry tasks, runs, processing results or task reports: tasks ride expanded by default on the get and are dropped in local projection, and
|
|
425
|
+
Workflow rows never carry tasks, runs, processing results or task reports: tasks ride expanded by default on the get and are dropped in local projection, and third-level processing results and summaries belong to later parts, never to these reads.
|
|
372
426
|
`entra lifecycle workflow-template list` defaults to `id`, `displayName` and `category`; the template get documents no query parameters, so `entra lifecycle workflow-template show --id <template-id>` takes no `--select` and always returns whole rows.
|
|
373
427
|
`entra lifecycle task-definition list` defaults to `id`, `displayName`, `category` and `version`, and `entra lifecycle task-definition show --id <task-definition-id>` defaults to the full reviewed parameter set.
|
|
374
428
|
`entra lifecycle settings show` returns the tenant schedule interval with the email and quarantine configuration; updating settings belongs to no read slice.
|
|
@@ -402,7 +456,7 @@ Unit show adds a licensing hint when the projected `membershipType` is `Dynamic`
|
|
|
402
456
|
See the [licence matrix](docs/graph-coverage.md#licence-matrix-by-area) for device and administrative-unit licensing requirements.
|
|
403
457
|
`entra administrative-unit member list --administrative-unit <administrative-unit-id>` lists member users, groups and devices with the same `id`/`displayName`/`mail` selection, `@odata.type` preservation, hidden-membership and limited-information behavior as group relationships.
|
|
404
458
|
Device and unit lists return `devices` and `administrativeUnits`, member lists return `members`, and single-object reads return `device` and `administrativeUnit`.
|
|
405
|
-
The named-list caps, `count
|
|
459
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to device and administrative-unit reads.
|
|
406
460
|
Resume unit-member lists with the same `--administrative-unit`, profile, scopes and API version; omit or repeat the original server query flags, and repeat local `--fields` and `--full` when wanted.
|
|
407
461
|
Delegated device reads default to `https://graph.microsoft.com/Device.Read.All` and unit reads to `https://graph.microsoft.com/AdministrativeUnit.Read.All`, while application profiles use the configured `.default` audience; hidden unit memberships need `Member.Read.Hidden`.
|
|
408
462
|
Denied directory reads return operation-specific permission, delegated-role and licensing guidance rather than empty results; HTTP 403 alone does not identify which prerequisite is missing.
|
|
@@ -431,7 +485,7 @@ A branding 404 may indicate unconfigured branding, a missing locale, or a missin
|
|
|
431
485
|
Delegated callers additionally need a supported Entra role (Directory Readers or Global Reader for organizations; Global Reader or Organizational Branding Administrator for branding); personal Microsoft accounts are not supported.
|
|
432
486
|
Organization and localization lists return `organizations` and `brandingLocalizations`, single-object reads return `organization`, `branding` and `brandingLocalization`.
|
|
433
487
|
Localization lists default to `id`, `signInPageText`, `usernameHintText` and `backgroundColor`; branding and localization show commands default to the full reviewed non-Stream field set.
|
|
434
|
-
The named-list caps, `count
|
|
488
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to organization and branding reads.
|
|
435
489
|
All five named reads default to `--api-version v1.0`; explicit `--api-version beta` requires a preview-enabled profile, with no automatic fallback.
|
|
436
490
|
Organization and localization lists offer no `--filter`: Graph documents `$select` only on these routes, so the flag is refused before credentials.
|
|
437
491
|
Denied organization and branding reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
@@ -492,7 +546,7 @@ Allowed-value lists and shows take `--definition <definition-id>`; definition li
|
|
|
492
546
|
Each `count` returns `count: { returned: <total>, complete: true }` from its text/plain `$count` route; only the definition count accepts `--filter` to narrow the total server-side, and no count takes `--select`, `--limit` or `--cursor`.
|
|
493
547
|
Raw `api get` supports `/directory/attributeSets`, `/directory/attributeSets/<set-id>`, `/directory/customSecurityAttributeDefinitions`, `/directory/customSecurityAttributeDefinitions/<definition-id>`, `/directory/customSecurityAttributeDefinitions/<definition-id>/allowedValues` and the single allowed-value route; the `$count` routes are available only through the named count commands.
|
|
494
548
|
Attribute-set lists return `attributeSets` and single-set reads return `attributeSet`; definition lists return `customSecurityAttributeDefinitions` and single-definition reads return `customSecurityAttributeDefinition`; allowed-value lists return `allowedValues` and single-value reads return `allowedValue`.
|
|
495
|
-
The named-list caps, `count
|
|
549
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to these reads.
|
|
496
550
|
All nine named reads support only `--api-version v1.0`; `--api-version beta` fails validation before credentials, including on preview-enabled profiles.
|
|
497
551
|
Delegated reads default to `https://graph.microsoft.com/CustomSecAttributeDefinition.Read.All`, while application profiles use the configured `.default` audience.
|
|
498
552
|
Delegated callers additionally need a custom-security-attribute role even for Global Administrators (Attribute Definition Reader or Attribute Definition Administrator work for every read; some reads also accept Attribute Assignment Reader or Attribute Assignment Administrator); personal Microsoft accounts are not supported.
|
|
@@ -515,7 +569,7 @@ Contract lists accept `--filter` as plain `$filter` without adding `$count=true`
|
|
|
515
569
|
`entra contract count` returns one scalar (`contractCount`) from the text/plain `$count` route and takes no `--filter`, `--select`, `--limit` or `--cursor`.
|
|
516
570
|
Raw `api get` supports `/contracts` and `/contracts/<contract-id>`; `/contracts/$count` is available only through the named count command.
|
|
517
571
|
Contract lists return `contracts` and single-contract reads return `contract`.
|
|
518
|
-
The named-list caps, `count
|
|
572
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to contract reads.
|
|
519
573
|
All three named reads support only `--api-version v1.0`; `--api-version beta` fails validation before credentials, including on preview-enabled profiles.
|
|
520
574
|
Delegated contract reads default to `https://graph.microsoft.com/Directory.Read.All`, while application profiles use the configured `.default` audience.
|
|
521
575
|
Delegated callers additionally need a supported Entra role (Directory Readers is the least-privileged role); personal Microsoft accounts are not supported.
|
|
@@ -538,21 +592,28 @@ mg-axi entra delegated-admin-relationship list-requests --profile soc --id <rela
|
|
|
538
592
|
mg-axi entra delegated-admin-relationship show-request --profile soc --id <relationship-id> --request-id <request-id>
|
|
539
593
|
mg-axi entra delegated-admin-customer list-service-management-details --profile soc --id <customer-id>
|
|
540
594
|
mg-axi entra delegated-admin-customer show-service-management-detail --profile soc --id <customer-id> --detail-id <detail-id>
|
|
595
|
+
mg-axi entra delegated-admin-customer count --profile soc
|
|
596
|
+
mg-axi entra delegated-admin-customer count-service-management-details --profile soc --id <customer-id>
|
|
597
|
+
mg-axi entra delegated-admin-relationship count --profile soc
|
|
598
|
+
mg-axi entra delegated-admin-relationship count-access-assignments --profile soc --id <relationship-id>
|
|
599
|
+
mg-axi entra delegated-admin-relationship count-operations --profile soc --id <relationship-id>
|
|
600
|
+
mg-axi entra delegated-admin-relationship count-requests --profile soc --id <relationship-id>
|
|
541
601
|
```
|
|
542
602
|
|
|
543
603
|
Delegated-admin reads run in the partner tenant; customer objects are created by the system when a relationship exists and deleted when none remain, so a non-partner tenant lists zero customers, which is an answer rather than an error.
|
|
544
604
|
`entra delegated-admin-customer list` defaults to compact properties (`id`, `displayName`, `tenantId`); `entra delegated-admin-relationship list` defaults to (`id`, `displayName`, `status`, `customer`, `endDateTime`); both top-level show commands default to the full reviewed property set.
|
|
545
605
|
`--select` requests properties from the reviewed delegated-admin field sets; `--fields` projects locally and must be a subset of the fetched selection.
|
|
546
606
|
Both top-level lists accept `--filter` as plain `$filter` without adding `$count=true` or `ConsistencyLevel`.
|
|
547
|
-
The named-list caps, `count
|
|
607
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to delegated-admin reads.
|
|
548
608
|
The access-assignment, operation and request navigation lists bind their parent relationship through `--id` and take `--assignment-id`, `--operation-id` and `--request-id` on their shows; the service-management-detail reads bind their parent customer through `--id` and take `--detail-id` on the show.
|
|
549
609
|
The navigation lists default to compact properties (`id`, `status`, `accessContainer`, `accessDetails` for assignments; `id`, `operationType`, `status`, `lastModifiedDateTime` for operations; `id`, `action`, `status`, `lastModifiedDateTime` for requests) while the service-management-detail reads always carry (`id`, `serviceName`, `serviceManagementUrl`); every show defaults to its full reviewed property set.
|
|
550
610
|
The access-assignment, operation and request lists accept `--filter` as plain `$filter` without adding `$count=true` or `ConsistencyLevel`; Graph documents no query parameters for service-management details, so those two reads take no `--select` or `--filter` and project `--fields` locally.
|
|
551
|
-
|
|
611
|
+
Each `count` returns one scalar (`delegatedAdminCustomerCount`, `delegatedAdminServiceManagementDetailCount`, `delegatedAdminRelationshipCount`, `delegatedAdminAccessAssignmentCount`, `delegatedAdminRelationshipOperationCount`, `delegatedAdminRelationshipRequestCount`) from its text/plain `$count` route and takes no `--filter`, `--select`, `--limit` or `--cursor`.
|
|
612
|
+
All eighteen named reads support only `--api-version v1.0`; `--api-version beta` fails validation before credentials, including on preview-enabled profiles.
|
|
552
613
|
Delegated delegated-admin reads default to `https://graph.microsoft.com/DelegatedAdminRelationship.Read.All`, while application profiles use the configured `.default` audience.
|
|
553
614
|
Personal Microsoft accounts are not supported.
|
|
554
615
|
No P1/P2 prerequisite is stated for delegated-admin reads; denied reads name the scope, partner-tenant and licensing guidance instead of only the generic cause.
|
|
555
|
-
No delegated-admin mutation lives here; the
|
|
616
|
+
No delegated-admin mutation lives here; the container root belongs to a later piece, while the multi-tenant-organization reads shipped in the next section and tenant-lookup functions ship as `entra tenant-information show` in the tenant-information usage below; see the [delegated-admin scope decisions](docs/coverage.md#ext-04-delegated-admin-scope-decisions) for deferred reads and later subfamilies.
|
|
556
617
|
|
|
557
618
|
Log in with `https://graph.microsoft.com/MultiTenantOrganization.Read.All`, then inspect the tenant multitenant organization:
|
|
558
619
|
|
|
@@ -615,7 +676,7 @@ DNS record lists accept `--filter` as plain `$filter`, without adding `$count=tr
|
|
|
615
676
|
Record rows carry `@odata.type` naming the derived record kind; derived-type detail (`mailExchange`, `preference`, `canonicalName`, SRV fields, `text`) needs an explicit `--select` naming the derived property.
|
|
616
677
|
Domain and record `--select` accept their [reviewed property sets](src/entra-domains.ts); `--fields` must be a subset of the fetched selection.
|
|
617
678
|
Domain lists return `domains` and single-domain reads return `domain`; record lists return `verificationDnsRecords`, `serviceConfigurationRecords` and `domainDnsRecords`, with single-record reads returning the singular key.
|
|
618
|
-
The named-list caps, `count
|
|
679
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to domain and DNS record reads.
|
|
619
680
|
Resume record lists with the same `--domain` where applicable, profile, scopes and API version; omit or repeat the original server query flags, and repeat local `--fields` and `--full` when wanted.
|
|
620
681
|
Delegated domain and DNS record reads default to `https://graph.microsoft.com/Domain.Read.All`, while application profiles use the configured `.default` audience.
|
|
621
682
|
Delegated callers additionally need a supported Entra role (Domain Name Administrator or Global Reader are least-privileged); personal Microsoft accounts are not supported.
|
|
@@ -642,7 +703,7 @@ Authority show commands also take `--pki <pki-id>` and require `--id <authority-
|
|
|
642
703
|
Authority entries carry public certificates only, but the base64 `certificate` blob (up to 8 KB per CA file) is omitted from every default select and needs an explicit `--select certificate`; explicitly selected blobs still truncate at 500 characters unless `--full` is passed.
|
|
643
704
|
PKI lists return `certificateAuthPkis` and single-PKI reads return `certificateAuthPki`; authority lists return `certificateAuthorities` with single-authority reads returning `certificateAuthority`.
|
|
644
705
|
Count commands return `count: { returned: <total>, complete: true }` and accept no `--select`, `--fields`, `--limit` or `--cursor`.
|
|
645
|
-
The named-list caps, `count
|
|
706
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to certificate-auth reads.
|
|
646
707
|
Delegated certificate-auth reads default to `https://graph.microsoft.com/PublicKeyInfrastructure.Read.All`, while application profiles use the configured `.default` audience.
|
|
647
708
|
Delegated callers additionally need Privileged Authentication Administrator or Authentication Administrator; personal Microsoft accounts are not supported.
|
|
648
709
|
No P1/P2 prerequisite is stated for certificate-auth reads; denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
@@ -663,7 +724,7 @@ All three subscription commands support only `--api-version v1.0`; `--api-versio
|
|
|
663
724
|
Subscription lists accept `--filter` as plain `$filter`, without adding `$count=true` or `ConsistencyLevel`; the show command documents `$select` only and the count command takes no `--filter`, `--select`, `--limit` or `--cursor`.
|
|
664
725
|
`entra subscription show --id <subscription-id>` defaults to the full reviewed companySubscription set; `entra subscription show --commerce-subscription-id <commerce-subscription-id>` serves the same object through the commerce-system alternate key, binding it only through the allowlisted session function-argument contract (validated, OData-quoted, encoded).
|
|
665
726
|
Subscription lists return `subscriptions` and single-subscription reads return `subscription`; count commands return `count: { returned: <total>, complete: true }`.
|
|
666
|
-
The named-list caps, `count
|
|
727
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to subscription reads.
|
|
667
728
|
Delegated subscription reads default to `https://graph.microsoft.com/Organization.Read.All`, while application profiles use the configured `.default` audience.
|
|
668
729
|
Delegated callers additionally need Global Reader, Directory Readers, or Dynamics 365 Business Central Administrator for read-only standard properties; personal Microsoft accounts are not supported.
|
|
669
730
|
No P1/P2 prerequisite is stated for subscription reads; denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
@@ -730,7 +791,7 @@ All three commands support only `--api-version v1.0`; `--api-version beta` fails
|
|
|
730
791
|
Neither list nor show offers `--filter`: Graph documents no List operation page for the collection, so strict input validation refuses the flag before credentials.
|
|
731
792
|
Lists return `directoryObjects`, single reads return `directoryObject`, and counts return `count` with the scalar total.
|
|
732
793
|
Rows are polymorphic: only the base-type properties are ever requested or projected (`$expand` is not offered), the discriminator rides along automatically without being selectable, and subtype secrets or credentials can never appear; subtype detail needs the subtype's named reads.
|
|
733
|
-
The named-list caps, cursors, null/missing preservation and 500-character text truncation described above also apply to directory-object reads.
|
|
794
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to directory-object reads.
|
|
734
795
|
Reads default to `https://graph.microsoft.com/Directory.Read.All` for delegated access, while application profiles use the configured `.default` audience.
|
|
735
796
|
No delegated role or P1/P2 prerequisite is stated for directory-object reads; personal Microsoft accounts are not supported, and denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
736
797
|
No directory-object mutation lives here; the delta sync, the POST lookup/validation actions and beta operations stay scheduled; see the [directory-objects scope decisions](docs/coverage.md#ext-01-directory-objects-scope-decisions).
|
|
@@ -754,7 +815,7 @@ Upstream requires the OData cast as part of the list URI, so untyped list/count
|
|
|
754
815
|
Rows are polymorphic: only the reviewed per-type properties are ever requested or projected, the discriminator rides along automatically without being selectable, and credential collections (`keyCredentials`, `passwordCredentials`) are never selectable, so secret values can never appear.
|
|
755
816
|
`appId` (client ID) is distinct from the object `id` on applications and service principals.
|
|
756
817
|
Soft-deleted security groups report `securityEnabled` false through a known upstream limitation; read `groupTypes` to name the real kind.
|
|
757
|
-
The named-list caps, cursors, null/missing preservation and 500-character text truncation described above also apply to deleted-item reads.
|
|
818
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to deleted-item reads.
|
|
758
819
|
List and count reads default to the type's least-privileged scope for delegated access (`User.Read.All`, `Group.Read.All`, `Application.Read.All` or `AdministrativeUnit.Read.All`, all read scopes already allowlisted), while application profiles use the configured `.default` audience.
|
|
759
820
|
No delegated role or P1/P2 prerequisite is stated for deleted-item reads; personal Microsoft accounts are not supported, and denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
760
821
|
No deleted-item mutation lives here; restore and permanent delete stay out entirely, and the POST lookup/validation actions and beta operations stay scheduled; see the [deleted-items scope decisions](docs/coverage.md#ext-01-deleted-items-scope-decisions).
|
|
@@ -781,7 +842,7 @@ All ten contact commands support only `--api-version v1.0`; `--api-version beta`
|
|
|
781
842
|
Direct-report reads take `$select` only; `$filter`, `$search` and `$top` stay unreviewed there.
|
|
782
843
|
Top-level `list` returns `contacts` and `show` returns `contact`; `show-manager` returns `manager`, `list-direct-reports` returns `directReports` and `show-direct-report` returns `directReport`, `list-member-of` returns `memberOf` and `show-member-of` returns `memberOf`, and counts return `count` with the scalar total; each count sends `ConsistencyLevel eventual` like the documented `$count` example.
|
|
783
844
|
Top-level list and show request and project only flat scalar properties (`$expand` is not offered, so navigation objects never appear there); navigation reads return directory objects through their own routes, and the nested phones/addresses collections need their own projection review.
|
|
784
|
-
The named-list caps, cursors, null/missing preservation and 500-character text truncation described above also apply to contact reads.
|
|
845
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to contact reads.
|
|
785
846
|
Reads default to `https://graph.microsoft.com/OrgContact.Read.All` for delegated access, while application profiles use the configured `.default` audience; transitive member-of reads additionally need `https://graph.microsoft.com/Group.Read.All`.
|
|
786
847
|
Delegated callers additionally need a supported Entra role (Directory Readers reads basic properties; Global Reader, Directory Writers, Intune Administrator or User Administrator also work); personal Microsoft accounts are not supported, and denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
787
848
|
No contact mutation lives here; the delta sync, the POST lookup actions and beta operations stay scheduled, and the error/sync navigation reads stay unavailable with no documented permission contract; see the [contacts scope decisions](docs/coverage.md#ext-01-contacts-scope-decisions).
|
|
@@ -852,13 +913,45 @@ List and show accept `--select` from the [reviewed operation property set](src/e
|
|
|
852
913
|
The list documents `$select` only, so no `--filter`; the `$count` route takes no `--filter`, `--select`, `--limit` or `--cursor`.
|
|
853
914
|
Operation lists return `dataPolicyOperations`, single-operation reads return `dataPolicyOperation`, and counts return `count` with the scalar total.
|
|
854
915
|
`storageLocation` always renders as `***redacted***`: export blob URLs and signed links never reach output, errors or logs.
|
|
855
|
-
Operation lists use the named-list caps, `count`
|
|
916
|
+
Operation lists use the named-list caps, uniform `count` totals and cursors described above.
|
|
856
917
|
List and show preserve null/missing properties and truncate text longer than 500 characters; `--full` restores complete text without lifting redaction or row caps.
|
|
857
918
|
Delegated operation reads default to `https://graph.microsoft.com/User.Export.All,https://graph.microsoft.com/User.Read.All`, while application profiles use the configured `.default` audience.
|
|
858
919
|
Delegated callers additionally need Company Administrator, the privileged role documented for export reads; personal Microsoft accounts are not supported.
|
|
859
920
|
No P1/P2 prerequisite is stated for these reads; denied reads name the scopes, role and licensing guidance instead of only the generic cause.
|
|
860
921
|
No export submission lives here; the `$count` scalar aside, beta operations stay scheduled (see the [data-policy-operations scope decisions](docs/coverage.md#ext-03-data-policy-operations-scope-decisions)).
|
|
861
922
|
|
|
923
|
+
Log in with `https://graph.microsoft.com/RiskPreventionProviders.Read.All`, then read workforce risk-prevention providers and verifications (delegated profiles only):
|
|
924
|
+
|
|
925
|
+
```sh
|
|
926
|
+
mg-axi login --profile soc --scopes https://graph.microsoft.com/RiskPreventionProviders.Read.All
|
|
927
|
+
mg-axi entra fraud-protection-provider list --profile soc
|
|
928
|
+
mg-axi entra fraud-protection-provider show --profile soc --id <provider-id>
|
|
929
|
+
mg-axi entra fraud-protection-provider count --profile soc
|
|
930
|
+
mg-axi entra web-application-firewall-provider list --profile soc
|
|
931
|
+
mg-axi entra web-application-firewall-provider show --profile soc --id <provider-id>
|
|
932
|
+
mg-axi entra web-application-firewall-provider count --profile soc
|
|
933
|
+
mg-axi entra web-application-firewall-verification list --profile soc
|
|
934
|
+
mg-axi entra web-application-firewall-verification show --profile soc --id <verification-id>
|
|
935
|
+
mg-axi entra web-application-firewall-verification count --profile soc
|
|
936
|
+
mg-axi entra web-application-firewall-verification provider show --profile soc --id <verification-id>
|
|
937
|
+
```
|
|
938
|
+
|
|
939
|
+
`entra fraud-protection-provider list` and `entra web-application-firewall-provider list` default to compact properties (`id`, `displayName`); `entra web-application-firewall-verification list` defaults to (`id`, `verifiedHost`, `providerType`); every `show` defaults to its full reviewed set.
|
|
940
|
+
All ten risk-prevention commands support only `--api-version v1.0`; `--api-version beta` fails validation before credentials, including on preview-enabled profiles.
|
|
941
|
+
List and show accept `--select` from the [reviewed risk-prevention property sets](src/entra-risk-prevention.ts); `--fields` must be a subset of the fetched selection.
|
|
942
|
+
The fraud list documents `$select` only, so no `--filter`; the WAF and verification lists accept `--filter` as plain `$filter`; every `$count` route takes no `--filter`, `--select`, `--limit` or `--cursor`.
|
|
943
|
+
Fraud lists return `fraudProtectionProviders`, WAF lists return `webApplicationFirewallProviders`, verification lists return `webApplicationFirewallVerifications`; single reads return `fraudProtectionProvider`, `webApplicationFirewallProvider` or `webApplicationFirewallVerification`; counts return `count` with the scalar total.
|
|
944
|
+
Verification rows never carry provider detail; `provider show --id <verification-id>` returns the owning `webApplicationFirewallProvider`.
|
|
945
|
+
Fraud and WAF rows carry `@odata.type` naming the provider kind (Arkose or HUMAN; Akamai or Cloudflare).
|
|
946
|
+
The reviewed fraud fields are `id`, `displayName`, `clientSubDomain`, `verifySubDomain` and `appId`; the reviewed WAF fields are `id`, `displayName`, `hostPrefix` and `zoneId`; the reviewed verification fields are `id`, `verifiedHost`, `providerType`, `verificationResult` and `verifiedDetails`.
|
|
947
|
+
Arkose `privateKey`/`publicKey`, HUMAN `serverToken`, Akamai `clientSecret`/`clientToken`/`accessToken` and Cloudflare `apiToken` are never selectable and any row carrying them is scrubbed before output, so key material can never reach stdout, errors or logs.
|
|
948
|
+
Risk-prevention lists use the named-list caps, `count` aggregate and cursors described above.
|
|
949
|
+
List and show preserve null/missing properties and truncate text longer than 500 characters; `--full` restores complete text without lifting redaction or row caps.
|
|
950
|
+
Delegated risk-prevention reads default to `https://graph.microsoft.com/RiskPreventionProviders.Read.All`; Graph documents no supported application permission, so application profiles are refused before credentials.
|
|
951
|
+
Delegated callers additionally need a directory role that can read risk-prevention configuration (Security Reader is the least-privileged read-only role); personal Microsoft accounts are not supported.
|
|
952
|
+
No per-operation licence prerequisite is stated for these reads; denied reads name the scope, role and licensing guidance instead of only the generic cause.
|
|
953
|
+
No provider create/update/delete and no verification submission live here; beta operations stay scheduled (see the [risk-prevention scope decisions](docs/coverage.md#ext-03-risk-prevention-scope-decisions)).
|
|
954
|
+
|
|
862
955
|
Log in with `https://graph.microsoft.com/Policy.Read.All`, then read Conditional Access policies and named locations as separate grammar:
|
|
863
956
|
|
|
864
957
|
```sh
|
|
@@ -875,8 +968,8 @@ mg-axi entra conditional-access named-location show --profile soc --id <named-lo
|
|
|
875
968
|
Policy `--select` accepts the [reviewed policy property set](src/entra-conditional-access.ts) and location `--select` accepts the [reviewed location property set](src/entra-conditional-access.ts); `--fields` must be a subset of the fetched selection in each family.
|
|
876
969
|
Returned `@odata.type` stays visible on named-location rows so IP and country locations stay distinguishable alongside any `--fields` projection.
|
|
877
970
|
Policy lists return `policies`, location lists return `namedLocations`, single-policy reads return `policy` and single-location reads return `namedLocation`.
|
|
878
|
-
Successful empty collections return an empty list with `count
|
|
879
|
-
The named-list caps, `count
|
|
971
|
+
Successful empty collections return an empty list with a uniform `count` line (`0 policies` or `0 named locations`, `total: null`) and absence guidance.
|
|
972
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply to Conditional Access reads, including nested condition values; every truncated value carries a `--full` hint.
|
|
880
973
|
Resume either Conditional Access list with `--cursor -` and supply the returned cursor on stdin, for example `mg-axi entra conditional-access policy list --profile soc --cursor - < cursor.txt`.
|
|
881
974
|
Small cursors can also use `--cursor <token>`; both forms enforce a 16 MB size ceiling.
|
|
882
975
|
Use `--full` when reasoning from complete condition or control text; `--select` and `--fields` still determine which properties are visible, and missing properties remain unknown.
|
|
@@ -923,7 +1016,7 @@ Method registration and deletion belong to no read slice and are never construct
|
|
|
923
1016
|
For methods, `--select` selects output properties locally from the [reviewed authentication property sets](src/entra-auth-methods.ts); no `$select` is sent to Graph.
|
|
924
1017
|
For the registration report, `--select` requests server properties; `--fields` must be a subset of the default or explicit selection for either command.
|
|
925
1018
|
Only the registration report supports `--filter`, passed through as plain `$filter` with no `$count` or `ConsistencyLevel` contract.
|
|
926
|
-
The named-list caps, `count
|
|
1019
|
+
The named-list caps, uniform `count` totals, cursors, null/missing preservation and 500-character text truncation described above also apply.
|
|
927
1020
|
Resume method lists with the same `--user` ID or UPN, profile, scopes and API version; omit or repeat the original `--select`, and repeat local `--fields` and `--full` when wanted.
|
|
928
1021
|
Delegated method reads default to `https://graph.microsoft.com/UserAuthenticationMethod.Read.All` (delegated self-reads may use `UserAuthenticationMethod.Read`) and registration reads default to `https://graph.microsoft.com/AuditLog.Read.All`, while application profiles use the configured `.default` audience.
|
|
929
1022
|
Delegated callers acting on another user additionally need Global Reader, Authentication Administrator or Privileged Authentication Administrator for methods, and Reports Reader, Security Reader, Security Administrator or Global Reader for the report.
|
|
@@ -965,31 +1058,40 @@ For consent grants, use the service-principal grant commands described above.
|
|
|
965
1058
|
Application lists return `applications`, service-principal lists return `servicePrincipals`, owner lists return `owners`, and single-object reads return `application` or `servicePrincipal`.
|
|
966
1059
|
App and service-principal `--select` accepts the [reviewed property sets](src/entra-apps.ts); `--fields` must be a subset of the fetched selection.
|
|
967
1060
|
Owner rows default to `id`, `displayName` and `mail`, the only selectable owner properties; rows without non-null descriptive properties are preserved with a hint about limited consent or unset properties.
|
|
968
|
-
The named-list caps, `count
|
|
1061
|
+
The named-list caps, uniform `count` totals, cursor resume rules and 500-character text truncation described above also apply to these reads; resume owner lists with the same `--application` or `--service-principal` object ID.
|
|
969
1062
|
Delegated application reads default to `https://graph.microsoft.com/Application.Read.All`, while application profiles use the configured `.default` audience.
|
|
970
1063
|
|
|
971
|
-
Log in with `https://graph.microsoft.com/IdentityRiskyUser.Read.All` and `https://graph.microsoft.com/
|
|
1064
|
+
Log in with `https://graph.microsoft.com/IdentityRiskyUser.Read.All`, `https://graph.microsoft.com/IdentityRiskEvent.Read.All` and `https://graph.microsoft.com/IdentityRiskyServicePrincipal.Read.All`, then triage risky users, risk detections, risky service principals and service-principal risk detections:
|
|
972
1065
|
|
|
973
1066
|
```sh
|
|
974
|
-
mg-axi login --profile soc --scopes https://graph.microsoft.com/IdentityRiskyUser.Read.All,https://graph.microsoft.com/IdentityRiskEvent.Read.All
|
|
1067
|
+
mg-axi login --profile soc --scopes https://graph.microsoft.com/IdentityRiskyUser.Read.All,https://graph.microsoft.com/IdentityRiskEvent.Read.All,https://graph.microsoft.com/IdentityRiskyServicePrincipal.Read.All
|
|
975
1068
|
mg-axi entra risky-user list --profile soc --limit 10
|
|
976
1069
|
mg-axi entra risky-user show --profile soc --id <risky-user-id>
|
|
977
1070
|
mg-axi entra risk-detection list --profile soc --since 2026-09-01T00:00:00Z --limit 10
|
|
978
1071
|
mg-axi entra risk-detection show --profile soc --id <risk-detection-id>
|
|
1072
|
+
mg-axi entra risky-service-principal list --profile soc --limit 10
|
|
1073
|
+
mg-axi entra risky-service-principal show --profile soc --id <risky-service-principal-id>
|
|
1074
|
+
mg-axi entra risky-service-principal history list --profile soc --service-principal <risky-service-principal-id>
|
|
1075
|
+
mg-axi entra risky-service-principal history show --profile soc --service-principal <risky-service-principal-id> --id <history-item-id>
|
|
1076
|
+
mg-axi entra service-principal-risk-detection list --profile soc --since 2026-09-01T00:00:00Z --limit 10
|
|
1077
|
+
mg-axi entra service-principal-risk-detection show --profile soc --id <service-principal-risk-detection-id>
|
|
979
1078
|
```
|
|
980
1079
|
|
|
981
|
-
Delegated risky-user reads default to `https://graph.microsoft.com/IdentityRiskyUser.Read.All`; risk-detection reads default to `https://graph.microsoft.com/IdentityRiskEvent.Read.All`.
|
|
1080
|
+
Delegated risky-user reads default to `https://graph.microsoft.com/IdentityRiskyUser.Read.All`; user and service-principal risk-detection reads default to `https://graph.microsoft.com/IdentityRiskEvent.Read.All`; risky-service-principal and history reads default to `https://graph.microsoft.com/IdentityRiskyServicePrincipal.Read.All`.
|
|
982
1081
|
`--scopes` overrides those defaults; application profiles use the configured Graph `.default` audience and reject delegated scopes.
|
|
983
|
-
`entra risky-user list`
|
|
1082
|
+
`entra risky-user list` and `entra risky-service-principal list` are state collections with an optional `--filter`; `entra risk-detection list` and `entra service-principal-risk-detection list` always carry an explicit time bound, so `--since` is required for a new query (with optional `--until` and `--filter` refinements) and resume reuses `--cursor` instead.
|
|
1083
|
+
`entra risky-service-principal history list` and `history show` always carry `--service-principal` naming the owning risky-service-principal object ID.
|
|
984
1084
|
Resume validates the saved detectedDateTime bounds; a cursor from an unbounded raw query is rejected, so start a new query with `--since`.
|
|
985
1085
|
Resume risk lists with `--cursor -` and supply the returned cursor on stdin, for example `mg-axi entra risk-detection list --profile soc --cursor - < cursor.txt`.
|
|
986
1086
|
`entra risky-user list` defaults to `id`, `userPrincipalName`, `riskLevel` and `riskState`; `entra risk-detection list` defaults to `id`, `detectedDateTime`, `userPrincipalName` and `riskLevel`.
|
|
987
|
-
|
|
1087
|
+
`entra risky-service-principal list` and `history list` default to `id`, `displayName`, `riskLevel` and `riskState`; `entra service-principal-risk-detection list` defaults to `id`, `detectedDateTime`, `servicePrincipalDisplayName` and `riskLevel`.
|
|
1088
|
+
All risk show commands default to the full reviewed property set.
|
|
988
1089
|
`--select` requests properties from the [supported risk property sets](src/entra-risk.ts); `--fields` projects locally and must be a subset of the fetched selection.
|
|
989
1090
|
Risk reads truncate text longer than 500 characters, including nested values such as `location` and the `additionalInfo` JSON string; `--full` restores complete text without lifting redaction, row caps or time bounds.
|
|
990
|
-
See the [access and licence contract](docs/graph-coverage.md#licence-matrix-by-area) for the riskyUsers P2 requirement
|
|
991
|
-
Limited views stay limited: a premium detection without P2 detail reports `riskEventType` generic, hidden risk levels report the licence boundary instead of the level, and a null detection `correlationId` means no sign-in is associated.
|
|
1091
|
+
See the [access and licence contract](docs/graph-coverage.md#licence-matrix-by-area) for the riskyUsers P2 requirement, risk-detection P1/P2 detail boundaries and the Workload Identities Premium requirement behind the workload-identity reads.
|
|
1092
|
+
Limited views stay limited: a premium detection without P2 detail reports `riskEventType` generic, hidden risk levels report the licence boundary instead of the level, service-principal detections report `riskDetail` and `riskLevel` hidden without Workload Identities Premium, and a null detection `correlationId` means no sign-in is associated.
|
|
992
1093
|
To correlate a detection to sign-ins, use `risk-detection show` or select `activityDateTime`, then filter the sign-in list above on the detection's `userPrincipalName` in that activity window; sign-in reads require the separate `AuditLog.Read.All` login above, and there is no riskySignIns endpoint.
|
|
1094
|
+
To correlate a workload detection, filter `service-principal-risk-detection list` on the principal's `servicePrincipalId` in the detection window, or list that principal's risk history with `risky-service-principal history list --service-principal <risky-service-principal-id>`; workload reads never confirm, dismiss or remediate risk.
|
|
993
1095
|
WRITE-05 adds a named write: `mg-axi entra risky-user dismiss --user <risky-user-id>` dismisses one user's risk through `POST /identityProtection/riskyUsers/dismiss` with a single-element `{ "userIds": [...] }` body.
|
|
994
1096
|
There is no bulk form: `--user` takes exactly one ID and a comma-separated list is a usage error.
|
|
995
1097
|
The command supports only `--api-version v1.0`; beta writes are rejected before credentials or HTTP.
|
|
@@ -1058,7 +1160,7 @@ Delegated raw reads require explicit `--scopes` from the supported read choices
|
|
|
1058
1160
|
Collections return `returned`, `complete` and `value`, default to 100 rows, and follow pages within budget under `--all`.
|
|
1059
1161
|
`--limit` and `--all` cannot be combined.
|
|
1060
1162
|
Completion describes pagination, not visibility of every directory object; group-member results include a warning for the [v1.0 service-principal limitation](docs/graph-coverage.md#licensing-and-completeness-findings), even when `complete` is true.
|
|
1061
|
-
Strings longer than
|
|
1163
|
+
Strings longer than 500 characters are truncated; `--full` removes string truncation without disabling redaction, reviewed-field filtering or row caps.
|
|
1062
1164
|
Partial results include a `cursor` preserving buffered rows and the next page.
|
|
1063
1165
|
Resume with `--cursor -` and supply the cursor token on stdin under the same collection path, profile and scopes, optionally with `--all` or a new `--limit`.
|
|
1064
1166
|
For example, `mg-axi api get /users --cursor - --all --scopes https://graph.microsoft.com/User.Read.All < cursor.txt` reads a saved token through stdin.
|
|
@@ -1104,7 +1206,7 @@ The service requests only `https://graph.microsoft.com/.default`, representing t
|
|
|
1104
1206
|
Ask an administrator to grant those permissions on the configured app registration; per-command delegated scopes cannot narrow the application token.
|
|
1105
1207
|
Acquisition failures return `AUTH_REQUIRED` with consent and certificate/federation guidance, without user or device-code fallback.
|
|
1106
1208
|
|
|
1107
|
-
Run `corepack pnpm build`, `corepack pnpm test` and `corepack pnpm lint` for shell validation.
|
|
1209
|
+
Run `corepack pnpm build`, `corepack pnpm test` (test files run at most 4 at a time via `--test-concurrency=4` in the `test` script) and `corepack pnpm lint` for shell validation.
|
|
1108
1210
|
The [CI workflow](.github/workflows/ci.yml) defines the platform/runtime matrix for shell build, test and lint checks, validates the Python inventory tooling separately, and rejects stale generated docs.
|
|
1109
1211
|
The [implementation plan](PLAN.md) remains the design authority.
|
|
1110
1212
|
|
|
@@ -1131,8 +1233,17 @@ Missing profiles, an unknown selected profile or invalid configuration fail befo
|
|
|
1131
1233
|
Read failures report per profile with rerun guidance and a nonzero exit.
|
|
1132
1234
|
|
|
1133
1235
|
The installable skill lives at [skills/mg-axi/SKILL.md](skills/mg-axi/SKILL.md).
|
|
1134
|
-
|
|
1135
|
-
mg-axi
|
|
1236
|
+
Agent discovery has two install paths, and either suffices alone.
|
|
1237
|
+
Install the skill explicitly with `npx skills add knowttl/mg-axi --skill mg-axi`; the setup command only shows guidance and does not install skills.
|
|
1238
|
+
For ambient context at every agent session start instead, install the CLI globally and opt into the session hook:
|
|
1239
|
+
```sh
|
|
1240
|
+
npm install --global @knowttl/mg-axi
|
|
1241
|
+
mg-axi setup hooks
|
|
1242
|
+
```
|
|
1243
|
+
This installs a `SessionStart` hook for Claude Code, Codex and OpenCode that prints a short local-only summary (configured profile names with tenant labels, auth-cache presence, write posture and version).
|
|
1244
|
+
The hook makes no network, Graph or sign-in call, and prints a short `not configured` record with exit 0 when unconfigured.
|
|
1245
|
+
Restart the agent session after running the installer.
|
|
1246
|
+
No other ordinary command installs hooks, plugins or configuration.
|
|
1136
1247
|
The skill file is generated in full from the template in [src/docs.ts](src/docs.ts) and the command catalogue; [docs/coverage.md](docs/coverage.md) also uses the discovery inventory.
|
|
1137
1248
|
After building, regenerate both with `corepack pnpm run docs:generate` and verify freshness with `corepack pnpm run docs:check`; CI runs the freshness check.
|
|
1138
1249
|
Critical journeys stay packaged offline: `test/pack.test.mjs` drives setup, doctor and the user, group, Conditional Access and sign-in reads through the packaged executable with fixture credentials and blocked networking.
|