@knowttl/mg-axi 0.1.1 → 0.1.3

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.
Files changed (48) hide show
  1. package/README.md +251 -77
  2. package/dist/api.js +253 -8
  3. package/dist/bin/mg-axi-hook.js +31 -0
  4. package/dist/catalogue.js +693 -2
  5. package/dist/cli.js +155 -17
  6. package/dist/docs.js +175 -46
  7. package/dist/doctor.js +2 -2
  8. package/dist/entra-access-reviews.js +11 -4
  9. package/dist/entra-apps.js +171 -14
  10. package/dist/entra-audit-logs.js +101 -16
  11. package/dist/entra-auth-methods.js +8 -4
  12. package/dist/entra-certificate-auth.js +12 -8
  13. package/dist/entra-conditional-access.js +425 -15
  14. package/dist/entra-contacts.js +19 -12
  15. package/dist/entra-contracts.js +7 -4
  16. package/dist/entra-custom-security-attributes.js +19 -12
  17. package/dist/entra-data-policy-operations.js +7 -4
  18. package/dist/entra-delegated-admin.js +55 -6
  19. package/dist/entra-deleted-items.js +6 -4
  20. package/dist/entra-directory-objects.js +6 -4
  21. package/dist/entra-directory.js +19 -12
  22. package/dist/entra-domains.js +13 -8
  23. package/dist/entra-entitlement-management.js +12 -4
  24. package/dist/entra-federation-configurations.js +7 -4
  25. package/dist/entra-grants.js +8 -4
  26. package/dist/entra-group-lifecycle.js +13 -8
  27. package/dist/entra-group-pim.js +431 -0
  28. package/dist/entra-groups.js +13 -8
  29. package/dist/entra-identity-providers.js +7 -4
  30. package/dist/entra-lifecycle-workflows.js +152 -13
  31. package/dist/entra-multi-tenant-organization.js +7 -4
  32. package/dist/entra-on-premises-synchronization.js +6 -4
  33. package/dist/entra-organization.js +13 -8
  34. package/dist/entra-risk-prevention.js +442 -0
  35. package/dist/entra-risk.js +224 -9
  36. package/dist/entra-roles.js +204 -12
  37. package/dist/entra-subscriptions.js +6 -4
  38. package/dist/entra-terms-of-use.js +13 -8
  39. package/dist/entra-users.js +7 -4
  40. package/dist/graph-session.js +30 -5
  41. package/dist/hook.js +84 -0
  42. package/dist/list-totals.js +52 -0
  43. package/dist/setup.js +9 -1
  44. package/docs/coverage.md +743 -610
  45. package/inventory/operations.json +2 -2
  46. package/inventory/schema.json +1 -1
  47. package/package.json +4 -3
  48. package/skills/mg-axi/SKILL.md +86 -1
package/dist/catalogue.js CHANGED
@@ -91,6 +91,14 @@ const appRoleGrantRead = {
91
91
  cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
92
92
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to Application.Read.All; reads never request write-consent scopes" },
93
93
  };
94
+ const federatedRead = {
95
+ filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter; unsupported combinations fail before credentials" },
96
+ select: { value: "comma-separated-properties", description: "Request server properties from id, name, issuer, subject, description, audiences; rows carry metadata only, never secret material" },
97
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
98
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
99
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
100
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to Application.Read.All" },
101
+ };
94
102
  const roleRead = {
95
103
  filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter; unsupported combinations fail before credentials" },
96
104
  select: { value: "comma-separated-properties", description: "Request server properties from the reviewed role property set" },
@@ -99,6 +107,22 @@ const roleRead = {
99
107
  cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
100
108
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to the operation's least-privileged read scope" },
101
109
  };
110
+ const groupAssignmentRead = {
111
+ filter: { value: "odata-filter", description: "Required OData $filter with an eq clause on groupId or principalId scoping the list; unsupported combinations fail before credentials" },
112
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed group PIM assignment set" },
113
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
114
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
115
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
116
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to PrivilegedAssignmentSchedule.Read.AzureADGroup; delegated callers also need owner/member of the group or a supported directory role; PIM for Groups needs P2 or ID Governance" },
117
+ };
118
+ const groupEligibilityRead = {
119
+ filter: groupAssignmentRead.filter,
120
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed group PIM eligibility set; request justification text rides only behind an explicit --select" },
121
+ fields: groupAssignmentRead.fields,
122
+ full: groupAssignmentRead.full,
123
+ cursor: groupAssignmentRead.cursor,
124
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to PrivilegedEligibilitySchedule.Read.AzureADGroup; delegated callers also need owner/member of the group or a supported directory role; PIM for Groups needs P2 or ID Governance" },
125
+ };
102
126
  const deviceRead = {
103
127
  filter: { value: "odata-filter", description: "OData $filter passed to Graph with ConsistencyLevel eventual; unsupported combinations fail before credentials" },
104
128
  select: { value: "comma-separated-properties", description: "Request server properties; directory-device reads need Device.Read.All" },
@@ -311,6 +335,22 @@ const caRead = {
311
335
  cursor: { value: "opaque-cursor|-", description: "Resume a capped collection losslessly; - reads the token from stdin (16 MB ceiling for either input); repeat the original query flags or omit them" },
312
336
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to Policy.Read.All" },
313
337
  };
338
+ const caStrengthRead = {
339
+ filter: { value: "odata-filter", description: "OData $filter passed to Graph; unsupported combinations fail before credentials" },
340
+ select: { value: "comma-separated-properties", description: "Request server properties; authentication-strength detail needs Policy.Read.AuthenticationMethod in both modes plus a supported Conditional Access role for delegated access" },
341
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
342
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
343
+ cursor: { value: "opaque-cursor|-", description: "Resume a capped collection losslessly; - reads the token from stdin (16 MB ceiling for either input); repeat the original query flags or omit them" },
344
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to Policy.Read.AuthenticationMethod" },
345
+ };
346
+ const caAuthContextRead = {
347
+ filter: { value: "odata-filter", description: "OData $filter passed to Graph; unsupported combinations fail before credentials" },
348
+ select: { value: "comma-separated-properties", description: "Request server properties; authentication-context detail needs AuthenticationContext.Read.All in both modes plus a supported Conditional Access role for delegated access" },
349
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
350
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
351
+ cursor: { value: "opaque-cursor|-", description: "Resume a capped collection losslessly; - reads the token from stdin (16 MB ceiling for either input); repeat the original query flags or omit them" },
352
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to AuthenticationContext.Read.All" },
353
+ };
314
354
  const providerRead = {
315
355
  filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter; unsupported combinations fail before credentials" },
316
356
  select: { value: "comma-separated-properties", description: "Request server properties from the reviewed identity-provider set; secret-bearing fields (clientSecret, certificateData) are never selectable" },
@@ -341,6 +381,29 @@ const dataPolicyRead = {
341
381
  cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
342
382
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to User.Export.All, User.Read.All" },
343
383
  };
384
+ const riskPreventionFraudRead = {
385
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed fraud-protection-provider set; API keys, client secrets and other key material are never selectable; reads need delegated RiskPreventionProviders.Read.All plus a supported Entra role and refuse application profiles" },
386
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
387
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
388
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
389
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RiskPreventionProviders.Read.All" },
390
+ };
391
+ const riskPreventionWafRead = {
392
+ filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter with no $count or ConsistencyLevel contract; unsupported combinations fail before credentials" },
393
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed WAF-provider set; API keys, client secrets and other key material are never selectable; reads need delegated RiskPreventionProviders.Read.All plus a supported Entra role and refuse application profiles" },
394
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
395
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
396
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
397
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RiskPreventionProviders.Read.All" },
398
+ };
399
+ const riskPreventionVerificationRead = {
400
+ filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter with no $count or ConsistencyLevel contract; unsupported combinations fail before credentials" },
401
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed WAF-verification set; reads need delegated RiskPreventionProviders.Read.All plus a supported Entra role and refuse application profiles" },
402
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
403
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
404
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
405
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RiskPreventionProviders.Read.All" },
406
+ };
344
407
  const accessReviewRead = {
345
408
  filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter; on definitions only contains() over the scope query and eq on status are documented; unsupported combinations fail before credentials" },
346
409
  filterReviewer: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter with no $count or ConsistencyLevel; unsupported combinations fail before credentials" },
@@ -415,6 +478,25 @@ const lifecycleTaskReportSubRead = {
415
478
  full: lifecycleWorkflowRead.full,
416
479
  scopes: lifecycleReportsRead.scopes,
417
480
  };
481
+ const lifecycleRunReportsRead = {
482
+ workflow: { value: "workflow-id", required: true, description: "Parent lifecycle workflow ID owning the run" },
483
+ run: { value: "run-id", required: true, description: "Parent lifecycle workflow run ID owning the processing result" },
484
+ filter: lifecycleWorkflowRead.filter,
485
+ select: lifecycleReportsRead.select,
486
+ fields: lifecycleWorkflowRead.fields,
487
+ full: lifecycleWorkflowRead.full,
488
+ cursor: lifecycleWorkflowRead.cursor,
489
+ scopes: lifecycleReportsRead.scopes,
490
+ };
491
+ const lifecycleRunSubjectRead = {
492
+ workflow: { value: "workflow-id", required: true, description: "Parent lifecycle workflow ID owning the run" },
493
+ run: { value: "run-id", required: true, description: "Parent lifecycle workflow run ID owning the subject processing result" },
494
+ filter: lifecycleWorkflowRead.filter,
495
+ fields: lifecycleSubjectRead.fields,
496
+ full: lifecycleWorkflowRead.full,
497
+ cursor: lifecycleWorkflowRead.cursor,
498
+ scopes: lifecycleSubjectRead.scopes,
499
+ };
418
500
  export const LEAVES = [
419
501
  { path: "home", description: "Show local profile status without authenticating", flags: { profile: common.profile }, examples: ["mg-axi", "mg-axi home --profile soc"] },
420
502
  { path: "profile create", description: "Create a dedicated-app profile without signing in", flags: {
@@ -437,6 +519,7 @@ export const LEAVES = [
437
519
  scopes: { value: "comma-separated-Graph-scopes", required: true, description: "Explicit delegated permissions using full https://graph.microsoft.com/ scope names" },
438
520
  }, examples: ["mg-axi login --profile soc --scopes https://graph.microsoft.com/User.Read", "mg-axi login --profile soc --method device-code --scopes https://graph.microsoft.com/User.Read"] },
439
521
  { path: "setup", description: "Show installation, configuration and capability guidance without signing in or writing anything", flags: {}, examples: ["mg-axi setup", "mg-axi setup --help"] },
522
+ { path: "setup hooks", description: "Install or repair agent SessionStart hooks for mg-axi ambient context", flags: {}, examples: ["mg-axi setup hooks", "mg-axi setup hooks --help"] },
440
523
  { path: "doctor", description: "Check each selected profile with one bounded user-list read; never signs in interactively, installs nothing, enables no writes", flags: {
441
524
  profile: common.profile,
442
525
  }, examples: ["mg-axi doctor", "mg-axi doctor --profile soc", "mg-axi doctor --help"] },
@@ -560,6 +643,72 @@ export const LEAVES = [
560
643
  full: roleRead.full,
561
644
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleManagement.Read.Directory; delegated callers also need a supported directory role" },
562
645
  }, examples: ["mg-axi entra directory-role show --id <role-id> --profile soc", "mg-axi entra directory-role show --id <role-id> --profile soc --full"] },
646
+ { path: "entra directory-role-template list", description: "List directory-role templates (id, displayName, description); templates exist whether or not the role is activated", operation: "GET:/directoryRoleTemplates", flags: {
647
+ ...common,
648
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
649
+ all: { description: "Follow pages within request, byte and deadline budgets" },
650
+ filter: roleRead.filter,
651
+ select: roleRead.select,
652
+ fields: roleRead.fields,
653
+ full: roleRead.full,
654
+ cursor: roleRead.cursor,
655
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleManagement.Read.Directory; delegated callers also need a supported directory role" },
656
+ }, examples: ["mg-axi entra directory-role-template list --profile soc", "mg-axi entra directory-role-template list --profile soc --filter \"displayName eq 'Helpdesk Administrator'\""] },
657
+ { path: "entra directory-role-template show", description: "Show one directory-role template with richer default properties", operation: "GET:/directoryRoleTemplates/{directoryRoleTemplate-id}", flags: {
658
+ ...common, id: { value: "template-id", required: true, description: "Directory-role template object ID" },
659
+ select: roleRead.select,
660
+ fields: roleRead.fields,
661
+ full: roleRead.full,
662
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleManagement.Read.Directory; delegated callers also need a supported directory role" },
663
+ }, examples: ["mg-axi entra directory-role-template show --id <template-id> --profile soc", "mg-axi entra directory-role-template show --id <template-id> --profile soc --full"] },
664
+ { path: "entra directory-role member list", description: "List the members of one activated directory role (id, displayName); @odata.type names each member kind", operation: "GET:/directoryRoles/{directoryRole-id}/members", flags: {
665
+ ...common, role: { value: "role-id", required: true, description: "Activated directory-role object ID whose members are listed" },
666
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
667
+ all: { description: "Follow pages within request, byte and deadline budgets" },
668
+ filter: roleRead.filter,
669
+ select: roleRead.select,
670
+ fields: roleRead.fields,
671
+ full: roleRead.full,
672
+ cursor: roleRead.cursor,
673
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleManagement.Read.Directory; delegated callers also need a supported directory role" },
674
+ }, examples: ["mg-axi entra directory-role member list --role <role-id> --profile soc", "mg-axi entra directory-role member list --role <role-id> --profile soc --filter \"displayName eq 'Adele Vance'\""] },
675
+ { path: "entra directory-role scoped-member list", description: "List the scoped members of one activated directory role (id, principalId, roleId, directoryScopeId); administrative-unit scopes need P1", operation: "GET:/directoryRoles/{directoryRole-id}/scopedMembers", flags: {
676
+ ...common, role: { value: "role-id", required: true, description: "Activated directory-role object ID whose scoped members are listed" },
677
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
678
+ all: { description: "Follow pages within request, byte and deadline budgets" },
679
+ filter: roleRead.filter,
680
+ select: roleRead.select,
681
+ fields: roleRead.fields,
682
+ full: roleRead.full,
683
+ cursor: roleRead.cursor,
684
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleManagement.Read.Directory; delegated callers also need a supported directory role; administrative-unit scopes need P1" },
685
+ }, examples: ["mg-axi entra directory-role scoped-member list --role <role-id> --profile soc", "mg-axi entra directory-role scoped-member list --role <role-id> --profile soc --filter \"principalId eq '<principal-id>'\""] },
686
+ { path: "entra directory-role scoped-member show", description: "Show one scoped member of an activated directory role with richer default properties", operation: "GET:/directoryRoles/{directoryRole-id}/scopedMembers/{scopedRoleMembership-id}", flags: {
687
+ ...common, role: { value: "role-id", required: true, description: "Activated directory-role object ID owning the scoped member" },
688
+ id: { value: "scoped-membership-id", required: true, description: "Scoped membership object ID" },
689
+ select: roleRead.select,
690
+ fields: roleRead.fields,
691
+ full: roleRead.full,
692
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleManagement.Read.Directory; delegated callers also need a supported directory role; administrative-unit scopes need P1" },
693
+ }, examples: ["mg-axi entra directory-role scoped-member show --role <role-id> --id <scoped-membership-id> --profile soc", "mg-axi entra directory-role scoped-member show --role <role-id> --id <scoped-membership-id> --profile soc --full"] },
694
+ { path: "entra scoped-role-membership list", description: "List administrative-unit-scoped role memberships (id, principalId, roleId, directoryScopeId); directory-wide assignments live on roleAssignments", operation: "GET:/scopedRoleMemberships", flags: {
695
+ ...common,
696
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
697
+ all: { description: "Follow pages within request, byte and deadline budgets" },
698
+ filter: roleRead.filter,
699
+ select: roleRead.select,
700
+ fields: roleRead.fields,
701
+ full: roleRead.full,
702
+ cursor: roleRead.cursor,
703
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleManagement.Read.Directory; delegated callers also need a supported directory role; administrative-unit scopes need P1" },
704
+ }, examples: ["mg-axi entra scoped-role-membership list --profile soc", "mg-axi entra scoped-role-membership list --profile soc --filter \"roleId eq '<role-id>'\""] },
705
+ { path: "entra scoped-role-membership show", description: "Show one administrative-unit-scoped role membership with richer default properties", operation: "GET:/scopedRoleMemberships/{scopedRoleMembership-id}", flags: {
706
+ ...common, id: { value: "scoped-membership-id", required: true, description: "Scoped membership object ID" },
707
+ select: roleRead.select,
708
+ fields: roleRead.fields,
709
+ full: roleRead.full,
710
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleManagement.Read.Directory; delegated callers also need a supported directory role; administrative-unit scopes need P1" },
711
+ }, examples: ["mg-axi entra scoped-role-membership show --id <scoped-membership-id> --profile soc", "mg-axi entra scoped-role-membership show --id <scoped-membership-id> --profile soc --full"] },
563
712
  { path: "entra role-assignment list", description: "List current role assignments (id, principalId, roleDefinitionId, directoryScopeId), including direct and PIM-activated assignments; use pim active list for assignmentType Assigned versus Activated", operation: "GET:/roleManagement/directory/roleAssignments", flags: {
564
713
  ...common,
565
714
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -593,6 +742,96 @@ export const LEAVES = [
593
742
  cursor: roleRead.cursor,
594
743
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleAssignmentSchedule.Read.Directory; delegated callers also need a supported PIM read role; PIM needs P2 or ID Governance" },
595
744
  }, examples: ["mg-axi entra pim active list --profile soc", "mg-axi entra pim active list --profile soc --filter \"assignmentType eq 'Activated'\""] },
745
+ { path: "entra pim group-assignment-schedule list", description: "List PIM-for-Groups assignment schedules scoped to one group or principal (id, principalId, groupId, accessId, assignmentType); --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/assignmentSchedules", flags: {
746
+ ...common,
747
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
748
+ all: { description: "Follow pages within request, byte and deadline budgets" },
749
+ filter: { ...groupAssignmentRead.filter, required: true },
750
+ select: groupAssignmentRead.select,
751
+ fields: groupAssignmentRead.fields,
752
+ full: groupAssignmentRead.full,
753
+ cursor: groupAssignmentRead.cursor,
754
+ scopes: groupAssignmentRead.scopes,
755
+ }, examples: ["mg-axi entra pim group-assignment-schedule list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-assignment-schedule list --profile soc --filter \"principalId eq '<principal-id>'\""] },
756
+ { path: "entra pim group-assignment-schedule show", description: "Show one PIM-for-Groups assignment schedule with the full reviewed property set", operation: "GET:/identityGovernance/privilegedAccess/group/assignmentSchedules/{privilegedAccessGroupAssignmentSchedule-id}", flags: {
757
+ ...common, id: { value: "assignment-schedule-id", required: true, description: "Assignment schedule ID" },
758
+ select: groupAssignmentRead.select,
759
+ fields: groupAssignmentRead.fields,
760
+ full: groupAssignmentRead.full,
761
+ scopes: groupAssignmentRead.scopes,
762
+ }, examples: ["mg-axi entra pim group-assignment-schedule show --id <assignment-schedule-id> --profile soc", "mg-axi entra pim group-assignment-schedule show --id <assignment-schedule-id> --profile soc --full"] },
763
+ { path: "entra pim group-assignment-instance list", description: "List provisioned PIM-for-Groups assignment windows scoped to one group or principal (id, principalId, groupId, accessId, assignmentType); --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/assignmentScheduleInstances", flags: {
764
+ ...common,
765
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
766
+ all: { description: "Follow pages within request, byte and deadline budgets" },
767
+ filter: { ...groupAssignmentRead.filter, required: true },
768
+ select: groupAssignmentRead.select,
769
+ fields: groupAssignmentRead.fields,
770
+ full: groupAssignmentRead.full,
771
+ cursor: groupAssignmentRead.cursor,
772
+ scopes: groupAssignmentRead.scopes,
773
+ }, examples: ["mg-axi entra pim group-assignment-instance list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-assignment-instance list --profile soc --filter \"principalId eq '<principal-id>'\""] },
774
+ { path: "entra pim group-assignment-instance show", description: "Show one provisioned PIM-for-Groups assignment window with the full reviewed property set", operation: "GET:/identityGovernance/privilegedAccess/group/assignmentScheduleInstances/{privilegedAccessGroupAssignmentScheduleInstance-id}", flags: {
775
+ ...common, id: { value: "assignment-instance-id", required: true, description: "Assignment schedule instance ID" },
776
+ select: groupAssignmentRead.select,
777
+ fields: groupAssignmentRead.fields,
778
+ full: groupAssignmentRead.full,
779
+ scopes: groupAssignmentRead.scopes,
780
+ }, examples: ["mg-axi entra pim group-assignment-instance show --id <assignment-instance-id> --profile soc", "mg-axi entra pim group-assignment-instance show --id <assignment-instance-id> --profile soc --full"] },
781
+ { path: "entra pim group-eligibility-schedule list", description: "List PIM-for-Groups eligibility schedules scoped to one group or principal (id, principalId, groupId, accessId, memberType); --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilitySchedules", flags: {
782
+ ...common,
783
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
784
+ all: { description: "Follow pages within request, byte and deadline budgets" },
785
+ filter: { ...groupEligibilityRead.filter, required: true },
786
+ select: groupEligibilityRead.select,
787
+ fields: groupEligibilityRead.fields,
788
+ full: groupEligibilityRead.full,
789
+ cursor: groupEligibilityRead.cursor,
790
+ scopes: groupEligibilityRead.scopes,
791
+ }, examples: ["mg-axi entra pim group-eligibility-schedule list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-eligibility-schedule list --profile soc --filter \"principalId eq '<principal-id>'\""] },
792
+ { path: "entra pim group-eligibility-schedule show", description: "Show one PIM-for-Groups eligibility schedule with the full reviewed property set", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilitySchedules/{privilegedAccessGroupEligibilitySchedule-id}", flags: {
793
+ ...common, id: { value: "eligibility-schedule-id", required: true, description: "Eligibility schedule ID" },
794
+ select: groupEligibilityRead.select,
795
+ fields: groupEligibilityRead.fields,
796
+ full: groupEligibilityRead.full,
797
+ scopes: groupEligibilityRead.scopes,
798
+ }, examples: ["mg-axi entra pim group-eligibility-schedule show --id <eligibility-schedule-id> --profile soc", "mg-axi entra pim group-eligibility-schedule show --id <eligibility-schedule-id> --profile soc --full"] },
799
+ { path: "entra pim group-eligibility-instance list", description: "List provisioned PIM-for-Groups eligibility windows scoped to one group or principal (id, principalId, groupId, accessId, memberType); --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilityScheduleInstances", flags: {
800
+ ...common,
801
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
802
+ all: { description: "Follow pages within request, byte and deadline budgets" },
803
+ filter: { ...groupEligibilityRead.filter, required: true },
804
+ select: groupEligibilityRead.select,
805
+ fields: groupEligibilityRead.fields,
806
+ full: groupEligibilityRead.full,
807
+ cursor: groupEligibilityRead.cursor,
808
+ scopes: groupEligibilityRead.scopes,
809
+ }, examples: ["mg-axi entra pim group-eligibility-instance list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-eligibility-instance list --profile soc --filter \"principalId eq '<principal-id>'\""] },
810
+ { path: "entra pim group-eligibility-instance show", description: "Show one provisioned PIM-for-Groups eligibility window with the full reviewed property set", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilityScheduleInstances/{privilegedAccessGroupEligibilityScheduleInstance-id}", flags: {
811
+ ...common, id: { value: "eligibility-instance-id", required: true, description: "Eligibility schedule instance ID" },
812
+ select: groupEligibilityRead.select,
813
+ fields: groupEligibilityRead.fields,
814
+ full: groupEligibilityRead.full,
815
+ scopes: groupEligibilityRead.scopes,
816
+ }, examples: ["mg-axi entra pim group-eligibility-instance show --id <eligibility-instance-id> --profile soc", "mg-axi entra pim group-eligibility-instance show --id <eligibility-instance-id> --profile soc --full"] },
817
+ { path: "entra pim group-eligibility-request list", description: "List PIM-for-Groups eligibility requests scoped to one group or principal (id, action, status, principalId, groupId, accessId); justification text rides only behind an explicit --select; --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilityScheduleRequests", flags: {
818
+ ...common,
819
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
820
+ all: { description: "Follow pages within request, byte and deadline budgets" },
821
+ filter: { ...groupEligibilityRead.filter, required: true },
822
+ select: groupEligibilityRead.select,
823
+ fields: groupEligibilityRead.fields,
824
+ full: groupEligibilityRead.full,
825
+ cursor: groupEligibilityRead.cursor,
826
+ scopes: groupEligibilityRead.scopes,
827
+ }, examples: ["mg-axi entra pim group-eligibility-request list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-eligibility-request list --profile soc --filter \"groupId eq '<group-id>'\" --select id,action,status,justification"] },
828
+ { path: "entra pim group-eligibility-request show", description: "Show one PIM-for-Groups eligibility request with the reviewed ask-plus-outcome set; justification text rides only behind an explicit --select", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilityScheduleRequests/{privilegedAccessGroupEligibilityScheduleRequest-id}", flags: {
829
+ ...common, id: { value: "eligibility-request-id", required: true, description: "Eligibility schedule request ID" },
830
+ select: groupEligibilityRead.select,
831
+ fields: groupEligibilityRead.fields,
832
+ full: groupEligibilityRead.full,
833
+ scopes: groupEligibilityRead.scopes,
834
+ }, examples: ["mg-axi entra pim group-eligibility-request show --id <eligibility-request-id> --profile soc", "mg-axi entra pim group-eligibility-request show --id <eligibility-request-id> --profile soc --select id,action,status,justification --full"] },
596
835
  { path: "entra device list", description: "List directory devices with compact properties (id, displayName, operatingSystem, accountEnabled). Directory-device scope only; Intune managed devices are a separately authorized surface", operation: "GET:/devices", flags: {
597
836
  ...common,
598
837
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1248,6 +1487,30 @@ export const LEAVES = [
1248
1487
  full: delegatedAdminQuerylessRead.full,
1249
1488
  scopes: delegatedAdminQuerylessRead.scopes,
1250
1489
  }, examples: ["mg-axi entra delegated-admin-customer show-service-management-detail --id <customer-id> --detail-id <detail-id> --profile soc"] },
1490
+ { path: "entra delegated-admin-customer count", description: "Count delegated-admin customers of the partner tenant as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminCustomers/$count", flags: {
1491
+ ...common,
1492
+ scopes: delegatedAdminRead.scopes,
1493
+ }, examples: ["mg-axi entra delegated-admin-customer count --profile soc"] },
1494
+ { path: "entra delegated-admin-customer count-service-management-details", description: "Count one customer's service-management details as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminCustomers/{delegatedAdminCustomer-id}/serviceManagementDetails/$count", flags: {
1495
+ ...common, id: { value: "customer-id", required: true, description: "Delegated-admin customer identifier" },
1496
+ scopes: delegatedAdminRead.scopes,
1497
+ }, examples: ["mg-axi entra delegated-admin-customer count-service-management-details --id <customer-id> --profile soc"] },
1498
+ { path: "entra delegated-admin-relationship count", description: "Count partner-tenant delegated-admin relationships as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminRelationships/$count", flags: {
1499
+ ...common,
1500
+ scopes: delegatedAdminRead.scopes,
1501
+ }, examples: ["mg-axi entra delegated-admin-relationship count --profile soc"] },
1502
+ { path: "entra delegated-admin-relationship count-access-assignments", description: "Count one relationship's delegated-admin access assignments as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminRelationships/{delegatedAdminRelationship-id}/accessAssignments/$count", flags: {
1503
+ ...common, id: { value: "relationship-id", required: true, description: "Delegated-admin relationship identifier" },
1504
+ scopes: delegatedAdminRead.scopes,
1505
+ }, examples: ["mg-axi entra delegated-admin-relationship count-access-assignments --id <relationship-id> --profile soc"] },
1506
+ { path: "entra delegated-admin-relationship count-operations", description: "Count one relationship's long-running delegated-admin operations as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminRelationships/{delegatedAdminRelationship-id}/operations/$count", flags: {
1507
+ ...common, id: { value: "relationship-id", required: true, description: "Delegated-admin relationship identifier" },
1508
+ scopes: delegatedAdminRead.scopes,
1509
+ }, examples: ["mg-axi entra delegated-admin-relationship count-operations --id <relationship-id> --profile soc"] },
1510
+ { path: "entra delegated-admin-relationship count-requests", description: "Count one relationship's delegated-admin requests as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminRelationships/{delegatedAdminRelationship-id}/requests/$count", flags: {
1511
+ ...common, id: { value: "relationship-id", required: true, description: "Delegated-admin relationship identifier" },
1512
+ scopes: delegatedAdminRead.scopes,
1513
+ }, examples: ["mg-axi entra delegated-admin-relationship count-requests --id <relationship-id> --profile soc"] },
1251
1514
  { path: "entra multi-tenant-organization show", description: "Show the tenant multitenant organization with the full reviewed property set (createdDateTime, description, displayName, id, state); at most one exists per tenant and state inactive means no membership", operation: "GET:/tenantRelationships/multiTenantOrganization", flags: {
1252
1515
  ...common,
1253
1516
  select: multiTenantOrganizationRead.select,
@@ -1324,6 +1587,26 @@ export const LEAVES = [
1324
1587
  full: logRead.full,
1325
1588
  scopes: logRead.scopes,
1326
1589
  }, examples: ["mg-axi entra directory-audit show --id <directory-audit-id> --profile soc", "mg-axi entra directory-audit show --id <directory-audit-id> --profile soc --full"] },
1590
+ { path: "entra provisioning list", description: "List provisioning-log events in a bounded time window (AuditLog.Read.All and Directory.Read.All; delegated callers also need Global Reader, Reports Reader, Security Administrator, Security Operator or Security Reader; Entra ID P1/P2 licence prerequisite)", operation: "GET:/auditLogs/provisioning", flags: {
1591
+ ...common,
1592
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1593
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1594
+ since: { ...logRead.since, description: "Required for a new query (resume with --cursor instead): earliest activityDateTime bounding the server time range" },
1595
+ until: logRead.until,
1596
+ filter: logRead.filter,
1597
+ select: { value: "comma-separated-properties", description: "Request server properties from the supported provisioning-log property set" },
1598
+ fields: logRead.fields,
1599
+ full: logRead.full,
1600
+ cursor: logRead.cursor,
1601
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to AuditLog.Read.All,Directory.Read.All" },
1602
+ }, examples: ["mg-axi entra provisioning list --profile soc --since 2026-09-01T00:00:00Z", "mg-axi entra provisioning list --profile soc --since 2026-09-01T00:00:00Z --filter \"provisioningStatusInfo/status eq 'failure'\" --limit 10", "mg-axi entra provisioning list --profile soc --since 2026-09-01T00:00:00Z --until 2026-09-08T00:00:00Z --all"] },
1603
+ { path: "entra provisioning show", description: "Show one provisioning-log event with the full reviewed property set", operation: "GET:/auditLogs/provisioning/{provisioningObjectSummary-id}", flags: {
1604
+ ...common, id: { value: "provisioning-id", required: true, description: "Provisioning-log event object ID" },
1605
+ select: { value: "comma-separated-properties", description: "Request server properties from the supported provisioning-log property set" },
1606
+ fields: logRead.fields,
1607
+ full: logRead.full,
1608
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to AuditLog.Read.All,Directory.Read.All" },
1609
+ }, examples: ["mg-axi entra provisioning show --id <provisioning-id> --profile soc", "mg-axi entra provisioning show --id <provisioning-id> --profile soc --full"] },
1327
1610
  { path: "entra application list", description: "List applications with compact properties (id, appId, displayName); appId is the client ID, distinct from the object id", operation: "GET:/applications", flags: {
1328
1611
  ...common,
1329
1612
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1404,6 +1687,71 @@ export const LEAVES = [
1404
1687
  cursor: appRoleGrantRead.cursor,
1405
1688
  scopes: appRoleGrantRead.scopes,
1406
1689
  }, examples: ["mg-axi entra service-principal app-role-assignment list --service-principal <service-principal-object-id> --profile soc"] },
1690
+ { path: "entra service-principal app-role-assignment show", description: "Show one app-only role assignment granted to a client service principal", operation: "GET:/servicePrincipals/{servicePrincipal-id}/appRoleAssignments/{appRoleAssignment-id}", flags: {
1691
+ ...common, "service-principal": { value: "service-principal-object-id", required: true, description: "Client service-principal object ID holding the assignment" },
1692
+ id: { value: "assignment-object-id", required: true, description: "App role assignment object ID" },
1693
+ select: appRoleGrantRead.select,
1694
+ fields: appRoleGrantRead.fields,
1695
+ full: appRoleGrantRead.full,
1696
+ scopes: appRoleGrantRead.scopes,
1697
+ }, examples: ["mg-axi entra service-principal app-role-assignment show --service-principal <service-principal-object-id> --id <assignment-object-id> --profile soc"] },
1698
+ { path: "entra service-principal app-role-assigned-to list", description: "List principals assigned to one resource service principal; rows are granted assignments, distinct from the application's requested permissions", operation: "GET:/servicePrincipals/{servicePrincipal-id}/appRoleAssignedTo", flags: {
1699
+ ...common, "service-principal": { value: "service-principal-object-id", required: true, description: "Resource service-principal object ID whose assignees are listed" },
1700
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1701
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1702
+ filter: appRoleGrantRead.filter,
1703
+ select: appRoleGrantRead.select,
1704
+ fields: appRoleGrantRead.fields,
1705
+ full: appRoleGrantRead.full,
1706
+ cursor: appRoleGrantRead.cursor,
1707
+ scopes: appRoleGrantRead.scopes,
1708
+ }, examples: ["mg-axi entra service-principal app-role-assigned-to list --service-principal <service-principal-object-id> --profile soc"] },
1709
+ { path: "entra service-principal app-role-assigned-to show", description: "Show one principal assignment on a resource service principal", operation: "GET:/servicePrincipals/{servicePrincipal-id}/appRoleAssignedTo/{appRoleAssignment-id}", flags: {
1710
+ ...common, "service-principal": { value: "service-principal-object-id", required: true, description: "Resource service-principal object ID holding the assignment" },
1711
+ id: { value: "assignment-object-id", required: true, description: "App role assignment object ID" },
1712
+ select: appRoleGrantRead.select,
1713
+ fields: appRoleGrantRead.fields,
1714
+ full: appRoleGrantRead.full,
1715
+ scopes: appRoleGrantRead.scopes,
1716
+ }, examples: ["mg-axi entra service-principal app-role-assigned-to show --service-principal <service-principal-object-id> --id <assignment-object-id> --profile soc"] },
1717
+ { path: "entra application federated-credential list", description: "List federated identity credentials of one application; rows carry issuer, subject and audience metadata only, never secret material", operation: "GET:/applications/{application-id}/federatedIdentityCredentials", flags: {
1718
+ ...common, application: { value: "application-object-id", required: true, description: "Application object ID whose federated credentials are listed" },
1719
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1720
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1721
+ filter: federatedRead.filter,
1722
+ select: federatedRead.select,
1723
+ fields: federatedRead.fields,
1724
+ full: federatedRead.full,
1725
+ cursor: federatedRead.cursor,
1726
+ scopes: federatedRead.scopes,
1727
+ }, examples: ["mg-axi entra application federated-credential list --application <application-object-id> --profile soc"] },
1728
+ { path: "entra application federated-credential show", description: "Show one federated identity credential of an application; metadata only, never secret material", operation: "GET:/applications/{application-id}/federatedIdentityCredentials/{federatedIdentityCredential-id}", flags: {
1729
+ ...common, application: { value: "application-object-id", required: true, description: "Application object ID holding the credential" },
1730
+ id: { value: "credential-object-id", required: true, description: "Federated identity credential object ID" },
1731
+ select: federatedRead.select,
1732
+ fields: federatedRead.fields,
1733
+ full: federatedRead.full,
1734
+ scopes: federatedRead.scopes,
1735
+ }, examples: ["mg-axi entra application federated-credential show --application <application-object-id> --id <credential-object-id> --profile soc"] },
1736
+ { path: "entra service-principal federated-credential list", description: "List federated identity credentials of one service principal; rows carry issuer, subject and audience metadata only, never secret material", operation: "GET:/servicePrincipals/{servicePrincipal-id}/federatedIdentityCredentials", flags: {
1737
+ ...common, "service-principal": { value: "service-principal-object-id", required: true, description: "Service-principal object ID whose federated credentials are listed" },
1738
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1739
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1740
+ filter: federatedRead.filter,
1741
+ select: federatedRead.select,
1742
+ fields: federatedRead.fields,
1743
+ full: federatedRead.full,
1744
+ cursor: federatedRead.cursor,
1745
+ scopes: federatedRead.scopes,
1746
+ }, examples: ["mg-axi entra service-principal federated-credential list --service-principal <service-principal-object-id> --profile soc"] },
1747
+ { path: "entra service-principal federated-credential show", description: "Show one federated identity credential of a service principal; metadata only, never secret material", operation: "GET:/servicePrincipals/{servicePrincipal-id}/federatedIdentityCredentials/{federatedIdentityCredential-id}", flags: {
1748
+ ...common, "service-principal": { value: "service-principal-object-id", required: true, description: "Service-principal object ID holding the credential" },
1749
+ id: { value: "credential-object-id", required: true, description: "Federated identity credential object ID" },
1750
+ select: federatedRead.select,
1751
+ fields: federatedRead.fields,
1752
+ full: federatedRead.full,
1753
+ scopes: federatedRead.scopes,
1754
+ }, examples: ["mg-axi entra service-principal federated-credential show --service-principal <service-principal-object-id> --id <credential-object-id> --profile soc"] },
1407
1755
  { path: "entra risky-user list", description: "List at-risk users with compact risk state (IdentityRiskyUser.Read.All; delegated callers also need Global Reader, Security Operator, Security Reader or Security Administrator; the riskyUsers API requires P2)", operation: "GET:/identityProtection/riskyUsers", flags: {
1408
1756
  ...common,
1409
1757
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1448,6 +1796,65 @@ export const LEAVES = [
1448
1796
  full: riskRead.full,
1449
1797
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskEvent.Read.All" },
1450
1798
  }, examples: ["mg-axi entra risk-detection show --id <risk-detection-id> --profile soc", "mg-axi entra risk-detection show --id <risk-detection-id> --profile soc --full"] },
1799
+ { path: "entra risky-service-principal list", description: "List at-risk service principals with compact risk state (IdentityRiskyServicePrincipal.Read.All; delegated callers also need Global Reader, Security Operator, Security Reader or Security Administrator; the riskyServicePrincipals API requires a Microsoft Entra Workload Identities Premium licence)", operation: "GET:/identityProtection/riskyServicePrincipals", flags: {
1800
+ ...common,
1801
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1802
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1803
+ filter: riskRead.filter,
1804
+ select: riskRead.select,
1805
+ fields: riskRead.fields,
1806
+ full: riskRead.full,
1807
+ cursor: riskRead.cursor,
1808
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskyServicePrincipal.Read.All" },
1809
+ }, examples: ["mg-axi entra risky-service-principal list --profile soc", "mg-axi entra risky-service-principal list --profile soc --filter \"riskState eq 'atRisk'\" --limit 10", "mg-axi entra risky-service-principal list --profile soc --all"] },
1810
+ { path: "entra risky-service-principal show", description: "Show one at-risk service principal with the full reviewed property set and detection/history correlation guidance; this read never confirms compromise, dismisses or remediates risk", operation: "GET:/identityProtection/riskyServicePrincipals/{riskyServicePrincipal-id}", flags: {
1811
+ ...common, id: { value: "risky-service-principal-id", required: true, description: "Risky service principal object ID" },
1812
+ select: riskRead.select,
1813
+ fields: riskRead.fields,
1814
+ full: riskRead.full,
1815
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskyServicePrincipal.Read.All" },
1816
+ }, examples: ["mg-axi entra risky-service-principal show --id <risky-service-principal-id> --profile soc", "mg-axi entra risky-service-principal show --id <risky-service-principal-id> --profile soc --full"] },
1817
+ { path: "entra risky-service-principal history list", description: "List one service principal's risk history with compact risk state (IdentityRiskyServicePrincipal.Read.All; same roles and Workload Identities Premium licence as the parent risky-service-principal read)", operation: "GET:/identityProtection/riskyServicePrincipals/{riskyServicePrincipal-id}/history", flags: {
1818
+ ...common,
1819
+ "service-principal": { value: "risky-service-principal-id", required: true, description: "Risky-service-principal object ID owning this history" },
1820
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1821
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1822
+ filter: riskRead.filter,
1823
+ select: riskRead.select,
1824
+ fields: riskRead.fields,
1825
+ full: riskRead.full,
1826
+ cursor: riskRead.cursor,
1827
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskyServicePrincipal.Read.All" },
1828
+ }, examples: ["mg-axi entra risky-service-principal history list --service-principal <risky-service-principal-id> --profile soc"] },
1829
+ { path: "entra risky-service-principal history show", description: "Show one service-principal risk-history item with the full reviewed property set and detection correlation guidance", operation: "GET:/identityProtection/riskyServicePrincipals/{riskyServicePrincipal-id}/history/{riskyServicePrincipalHistoryItem-id}", flags: {
1830
+ ...common,
1831
+ "service-principal": { value: "risky-service-principal-id", required: true, description: "Risky-service-principal object ID owning this history" },
1832
+ id: { value: "history-item-id", required: true, description: "Risk-history item object ID" },
1833
+ select: riskRead.select,
1834
+ fields: riskRead.fields,
1835
+ full: riskRead.full,
1836
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskyServicePrincipal.Read.All" },
1837
+ }, examples: ["mg-axi entra risky-service-principal history show --service-principal <risky-service-principal-id> --id <history-item-id> --profile soc"] },
1838
+ { path: "entra service-principal-risk-detection list", description: "List service-principal risk detections in a bounded time window (IdentityRiskEvent.Read.All; delegated callers also need Global Reader, Security Operator, Security Reader or Security Administrator; Workload Identities Premium, with riskDetail and riskLevel hidden without it)", operation: "GET:/identityProtection/servicePrincipalRiskDetections", flags: {
1839
+ ...common,
1840
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1841
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1842
+ since: { ...logRead.since, description: "Required for a new query (resume with --cursor instead): earliest detectedDateTime bounding the server time range" },
1843
+ until: logRead.until,
1844
+ filter: logRead.filter,
1845
+ select: riskRead.select,
1846
+ fields: riskRead.fields,
1847
+ full: riskRead.full,
1848
+ cursor: riskRead.cursor,
1849
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskEvent.Read.All" },
1850
+ }, examples: ["mg-axi entra service-principal-risk-detection list --profile soc --since 2026-09-01T00:00:00Z", "mg-axi entra service-principal-risk-detection list --profile soc --since 2026-09-01T00:00:00Z --filter \"riskState eq 'atRisk'\" --limit 10", "mg-axi entra service-principal-risk-detection list --profile soc --since 2026-09-01T00:00:00Z --all"] },
1851
+ { path: "entra service-principal-risk-detection show", description: "Show one service-principal risk detection with the full reviewed property set; a null correlationId means no sign-in is associated", operation: "GET:/identityProtection/servicePrincipalRiskDetections/{servicePrincipalRiskDetection-id}", flags: {
1852
+ ...common, id: { value: "service-principal-risk-detection-id", required: true, description: "Service-principal risk detection object ID" },
1853
+ select: riskRead.select,
1854
+ fields: riskRead.fields,
1855
+ full: riskRead.full,
1856
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskEvent.Read.All" },
1857
+ }, examples: ["mg-axi entra service-principal-risk-detection show --id <service-principal-risk-detection-id> --profile soc", "mg-axi entra service-principal-risk-detection show --id <service-principal-risk-detection-id> --profile soc --full"] },
1451
1858
  { path: "entra conditional-access policy list", description: "List Conditional Access policies with compact properties (id, displayName, state)", operation: "GET:/identity/conditionalAccess/policies", flags: {
1452
1859
  ...common,
1453
1860
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1496,6 +1903,134 @@ export const LEAVES = [
1496
1903
  full: caRead.full,
1497
1904
  scopes: caRead.scopes,
1498
1905
  }, examples: ["mg-axi entra conditional-access named-location show --id <named-location-id> --profile soc", "mg-axi entra conditional-access named-location show --id <named-location-id> --profile soc --full"] },
1906
+ { path: "entra conditional-access auth-strength-policy list", description: "List authentication-strength policies with compact properties (id, displayName, policyType)", operation: "GET:/identity/conditionalAccess/authenticationStrength/policies", flags: {
1907
+ ...common,
1908
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1909
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1910
+ filter: caStrengthRead.filter,
1911
+ select: caStrengthRead.select,
1912
+ fields: caStrengthRead.fields,
1913
+ full: caStrengthRead.full,
1914
+ cursor: caStrengthRead.cursor,
1915
+ scopes: caStrengthRead.scopes,
1916
+ }, examples: ["mg-axi entra conditional-access auth-strength-policy list --profile soc", "mg-axi entra conditional-access auth-strength-policy list --profile soc --limit 10", "mg-axi entra conditional-access auth-strength-policy list --profile soc --filter \"policyType eq 'builtIn'\" --select id,displayName,policyType"] },
1917
+ { path: "entra conditional-access auth-strength-policy show", description: "Show one authentication-strength policy with the full reviewed property set", operation: "GET:/identity/conditionalAccess/authenticationStrength/policies/{authenticationStrengthPolicy-id}", flags: {
1918
+ ...common, id: { value: "auth-strength-policy-id", required: true, description: "Authentication-strength policy object ID" },
1919
+ select: caStrengthRead.select,
1920
+ fields: caStrengthRead.fields,
1921
+ full: caStrengthRead.full,
1922
+ scopes: caStrengthRead.scopes,
1923
+ }, examples: ["mg-axi entra conditional-access auth-strength-policy show --id <auth-strength-policy-id> --profile soc", "mg-axi entra conditional-access auth-strength-policy show --id <auth-strength-policy-id> --profile soc --full"] },
1924
+ { path: "entra conditional-access combination-configuration list", description: "List the combination configurations of one authentication-strength policy", operation: "GET:/identity/conditionalAccess/authenticationStrength/policies/{authenticationStrengthPolicy-id}/combinationConfigurations", flags: {
1925
+ ...common,
1926
+ policy: { value: "auth-strength-policy-id", required: true, description: "Authentication-strength policy object ID owning the combination configurations" },
1927
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1928
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1929
+ filter: caStrengthRead.filter,
1930
+ select: caStrengthRead.select,
1931
+ fields: caStrengthRead.fields,
1932
+ full: caStrengthRead.full,
1933
+ cursor: caStrengthRead.cursor,
1934
+ scopes: caStrengthRead.scopes,
1935
+ }, examples: ["mg-axi entra conditional-access combination-configuration list --policy <auth-strength-policy-id> --profile soc", "mg-axi entra conditional-access combination-configuration list --policy <auth-strength-policy-id> --profile soc --limit 10"] },
1936
+ { path: "entra conditional-access combination-configuration show", description: "Show one combination configuration of an authentication-strength policy; @odata.type names the configuration kind", operation: "GET:/identity/conditionalAccess/authenticationStrength/policies/{authenticationStrengthPolicy-id}/combinationConfigurations/{authenticationCombinationConfiguration-id}", flags: {
1937
+ ...common, policy: { value: "auth-strength-policy-id", required: true, description: "Authentication-strength policy object ID owning the combination configuration" },
1938
+ id: { value: "combination-configuration-id", required: true, description: "Combination configuration object ID" },
1939
+ select: caStrengthRead.select,
1940
+ fields: caStrengthRead.fields,
1941
+ full: caStrengthRead.full,
1942
+ scopes: caStrengthRead.scopes,
1943
+ }, examples: ["mg-axi entra conditional-access combination-configuration show --policy <auth-strength-policy-id> --id <combination-configuration-id> --profile soc", "mg-axi entra conditional-access combination-configuration show --policy <auth-strength-policy-id> --id <combination-configuration-id> --profile soc --full"] },
1944
+ { path: "entra conditional-access auth-method-mode list", description: "List authentication method modes with compact properties (id, displayName)", operation: "GET:/identity/conditionalAccess/authenticationStrength/authenticationMethodModes", flags: {
1945
+ ...common,
1946
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1947
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1948
+ filter: caStrengthRead.filter,
1949
+ select: caStrengthRead.select,
1950
+ fields: caStrengthRead.fields,
1951
+ full: caStrengthRead.full,
1952
+ cursor: caStrengthRead.cursor,
1953
+ scopes: caStrengthRead.scopes,
1954
+ }, examples: ["mg-axi entra conditional-access auth-method-mode list --profile soc", "mg-axi entra conditional-access auth-method-mode list --profile soc --limit 10"] },
1955
+ { path: "entra conditional-access auth-method-mode show", description: "Show one authentication method mode with the full reviewed property set", operation: "GET:/identity/conditionalAccess/authenticationStrength/authenticationMethodModes/{authenticationMethodModeDetail-id}", flags: {
1956
+ ...common, id: { value: "auth-method-mode-id", required: true, description: "Authentication method mode object ID" },
1957
+ select: caStrengthRead.select,
1958
+ fields: caStrengthRead.fields,
1959
+ full: caStrengthRead.full,
1960
+ scopes: caStrengthRead.scopes,
1961
+ }, examples: ["mg-axi entra conditional-access auth-method-mode show --id <auth-method-mode-id> --profile soc", "mg-axi entra conditional-access auth-method-mode show --id <auth-method-mode-id> --profile soc --full"] },
1962
+ { path: "entra conditional-access template list", description: "List Conditional Access templates with compact properties (id, name)", operation: "GET:/identity/conditionalAccess/templates", flags: {
1963
+ ...common,
1964
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1965
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1966
+ filter: caRead.filter,
1967
+ select: caRead.select,
1968
+ fields: caRead.fields,
1969
+ full: caRead.full,
1970
+ cursor: caRead.cursor,
1971
+ scopes: caRead.scopes,
1972
+ }, examples: ["mg-axi entra conditional-access template list --profile soc", "mg-axi entra conditional-access template list --profile soc --limit 10"] },
1973
+ { path: "entra conditional-access template show", description: "Show one Conditional Access template with the full reviewed property set", operation: "GET:/identity/conditionalAccess/templates/{conditionalAccessTemplate-id}", flags: {
1974
+ ...common, id: { value: "template-id", required: true, description: "Conditional Access template object ID" },
1975
+ select: caRead.select,
1976
+ fields: caRead.fields,
1977
+ full: caRead.full,
1978
+ scopes: caRead.scopes,
1979
+ }, examples: ["mg-axi entra conditional-access template show --id <template-id> --profile soc", "mg-axi entra conditional-access template show --id <template-id> --profile soc --full"] },
1980
+ { path: "entra conditional-access auth-context list", description: "List authentication context class references with compact properties (id, displayName)", operation: "GET:/identity/conditionalAccess/authenticationContextClassReferences", flags: {
1981
+ ...common,
1982
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1983
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1984
+ filter: caAuthContextRead.filter,
1985
+ select: caAuthContextRead.select,
1986
+ fields: caAuthContextRead.fields,
1987
+ full: caAuthContextRead.full,
1988
+ cursor: caAuthContextRead.cursor,
1989
+ scopes: caAuthContextRead.scopes,
1990
+ }, examples: ["mg-axi entra conditional-access auth-context list --profile soc", "mg-axi entra conditional-access auth-context list --profile soc --limit 10"] },
1991
+ { path: "entra conditional-access auth-context show", description: "Show one authentication context class reference with the full reviewed property set", operation: "GET:/identity/conditionalAccess/authenticationContextClassReferences/{authenticationContextClassReference-id}", flags: {
1992
+ ...common, id: { value: "auth-context-id", required: true, description: "Authentication context class reference object ID" },
1993
+ select: caAuthContextRead.select,
1994
+ fields: caAuthContextRead.fields,
1995
+ full: caAuthContextRead.full,
1996
+ scopes: caAuthContextRead.scopes,
1997
+ }, examples: ["mg-axi entra conditional-access auth-context show --id <auth-context-id> --profile soc", "mg-axi entra conditional-access auth-context show --id <auth-context-id> --profile soc --full"] },
1998
+ { path: "entra conditional-access deleted-policy list", description: "List soft-deleted Conditional Access policies with compact properties (id, displayName, state, deletedDateTime); restore stays out of scope", operation: "GET:/identity/conditionalAccess/deletedItems/policies", flags: {
1999
+ ...common,
2000
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2001
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2002
+ filter: caRead.filter,
2003
+ select: caRead.select,
2004
+ fields: caRead.fields,
2005
+ full: caRead.full,
2006
+ cursor: caRead.cursor,
2007
+ scopes: caRead.scopes,
2008
+ }, examples: ["mg-axi entra conditional-access deleted-policy list --profile soc", "mg-axi entra conditional-access deleted-policy list --profile soc --limit 10"] },
2009
+ { path: "entra conditional-access deleted-policy show", description: "Show one soft-deleted Conditional Access policy with the full reviewed property set; restore stays out of scope", operation: "GET:/identity/conditionalAccess/deletedItems/policies/{conditionalAccessPolicy-id}", flags: {
2010
+ ...common, id: { value: "deleted-policy-id", required: true, description: "Soft-deleted Conditional Access policy object ID" },
2011
+ select: caRead.select,
2012
+ fields: caRead.fields,
2013
+ full: caRead.full,
2014
+ scopes: caRead.scopes,
2015
+ }, examples: ["mg-axi entra conditional-access deleted-policy show --id <deleted-policy-id> --profile soc", "mg-axi entra conditional-access deleted-policy show --id <deleted-policy-id> --profile soc --full"] },
2016
+ { path: "entra conditional-access deleted-named-location list", description: "List soft-deleted Conditional Access named locations with compact properties (id, displayName, deletedDateTime); restore stays out of scope", operation: "GET:/identity/conditionalAccess/deletedItems/namedLocations", flags: {
2017
+ ...common,
2018
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2019
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2020
+ filter: caRead.filter,
2021
+ select: caRead.select,
2022
+ fields: caRead.fields,
2023
+ full: caRead.full,
2024
+ cursor: caRead.cursor,
2025
+ scopes: caRead.scopes,
2026
+ }, examples: ["mg-axi entra conditional-access deleted-named-location list --profile soc", "mg-axi entra conditional-access deleted-named-location list --profile soc --limit 10"] },
2027
+ { path: "entra conditional-access deleted-named-location show", description: "Show one soft-deleted Conditional Access named location with the full reviewed property set; restore stays out of scope", operation: "GET:/identity/conditionalAccess/deletedItems/namedLocations/{namedLocation-id}", flags: {
2028
+ ...common, id: { value: "deleted-named-location-id", required: true, description: "Soft-deleted named location object ID" },
2029
+ select: caRead.select,
2030
+ fields: caRead.fields,
2031
+ full: caRead.full,
2032
+ scopes: caRead.scopes,
2033
+ }, examples: ["mg-axi entra conditional-access deleted-named-location show --id <deleted-named-location-id> --profile soc", "mg-axi entra conditional-access deleted-named-location show --id <deleted-named-location-id> --profile soc --full"] },
1499
2034
  { path: "entra identity-provider list", description: "List workforce identity providers with compact properties (id, displayName); rows carry @odata.type naming the provider kind; client secrets and key material are never returned", operation: "GET:/identity/identityProviders", flags: {
1500
2035
  ...common,
1501
2036
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1648,6 +2183,78 @@ export const LEAVES = [
1648
2183
  ...common,
1649
2184
  scopes: dataPolicyRead.scopes,
1650
2185
  }, examples: ["mg-axi entra data-policy-operation count --profile soc"] },
2186
+ { path: "entra fraud-protection-provider list", description: "List workforce fraud-protection providers with compact properties (id, displayName); rows carry @odata.type naming the provider kind; API keys, client secrets and other key material are never returned; Graph documents $select only, so no --filter", operation: "GET:/identity/riskPrevention/fraudProtectionProviders", flags: {
2187
+ ...common,
2188
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2189
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2190
+ select: riskPreventionFraudRead.select,
2191
+ fields: riskPreventionFraudRead.fields,
2192
+ full: riskPreventionFraudRead.full,
2193
+ cursor: riskPreventionFraudRead.cursor,
2194
+ scopes: riskPreventionFraudRead.scopes,
2195
+ }, examples: ["mg-axi entra fraud-protection-provider list --profile soc", "mg-axi entra fraud-protection-provider list --profile soc --limit 10"] },
2196
+ { path: "entra fraud-protection-provider show", description: "Show one workforce fraud-protection provider with the full reviewed property set; API keys, client secrets and other key material are never returned", operation: "GET:/identity/riskPrevention/fraudProtectionProviders/{fraudProtectionProvider-id}", flags: {
2197
+ ...common, id: { value: "provider-id", required: true, description: "Fraud-protection-provider ID" },
2198
+ select: riskPreventionFraudRead.select,
2199
+ fields: riskPreventionFraudRead.fields,
2200
+ full: riskPreventionFraudRead.full,
2201
+ scopes: riskPreventionFraudRead.scopes,
2202
+ }, examples: ["mg-axi entra fraud-protection-provider show --id <provider-id> --profile soc", "mg-axi entra fraud-protection-provider show --id <provider-id> --profile soc --full"] },
2203
+ { path: "entra fraud-protection-provider count", description: "Count workforce fraud-protection providers as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identity/riskPrevention/fraudProtectionProviders/$count", flags: {
2204
+ ...common,
2205
+ scopes: riskPreventionFraudRead.scopes,
2206
+ }, examples: ["mg-axi entra fraud-protection-provider count --profile soc"] },
2207
+ { path: "entra web-application-firewall-provider list", description: "List workforce web-application-firewall providers with compact properties (id, displayName); rows carry @odata.type naming the provider kind; API keys, client secrets and other key material are never returned", operation: "GET:/identity/riskPrevention/webApplicationFirewallProviders", flags: {
2208
+ ...common,
2209
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2210
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2211
+ filter: riskPreventionWafRead.filter,
2212
+ select: riskPreventionWafRead.select,
2213
+ fields: riskPreventionWafRead.fields,
2214
+ full: riskPreventionWafRead.full,
2215
+ cursor: riskPreventionWafRead.cursor,
2216
+ scopes: riskPreventionWafRead.scopes,
2217
+ }, examples: ["mg-axi entra web-application-firewall-provider list --profile soc", "mg-axi entra web-application-firewall-provider list --profile soc --limit 10", "mg-axi entra web-application-firewall-provider list --profile soc --filter \"displayName eq 'Example'\""] },
2218
+ { path: "entra web-application-firewall-provider show", description: "Show one workforce web-application-firewall provider with the full reviewed property set; API keys, client secrets and other key material are never returned", operation: "GET:/identity/riskPrevention/webApplicationFirewallProviders/{webApplicationFirewallProvider-id}", flags: {
2219
+ ...common, id: { value: "provider-id", required: true, description: "Web-application-firewall-provider ID" },
2220
+ select: riskPreventionWafRead.select,
2221
+ fields: riskPreventionWafRead.fields,
2222
+ full: riskPreventionWafRead.full,
2223
+ scopes: riskPreventionWafRead.scopes,
2224
+ }, examples: ["mg-axi entra web-application-firewall-provider show --id <provider-id> --profile soc", "mg-axi entra web-application-firewall-provider show --id <provider-id> --profile soc --full"] },
2225
+ { path: "entra web-application-firewall-provider count", description: "Count workforce web-application-firewall providers as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identity/riskPrevention/webApplicationFirewallProviders/$count", flags: {
2226
+ ...common,
2227
+ scopes: riskPreventionWafRead.scopes,
2228
+ }, examples: ["mg-axi entra web-application-firewall-provider count --profile soc"] },
2229
+ { path: "entra web-application-firewall-verification list", description: "List workforce web-application-firewall verifications with compact properties (id, verifiedHost, providerType); rows never carry provider detail, which has its own sub-read", operation: "GET:/identity/riskPrevention/webApplicationFirewallVerifications", flags: {
2230
+ ...common,
2231
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2232
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2233
+ filter: riskPreventionVerificationRead.filter,
2234
+ select: riskPreventionVerificationRead.select,
2235
+ fields: riskPreventionVerificationRead.fields,
2236
+ full: riskPreventionVerificationRead.full,
2237
+ cursor: riskPreventionVerificationRead.cursor,
2238
+ scopes: riskPreventionVerificationRead.scopes,
2239
+ }, examples: ["mg-axi entra web-application-firewall-verification list --profile soc", "mg-axi entra web-application-firewall-verification list --profile soc --limit 10", "mg-axi entra web-application-firewall-verification list --profile soc --filter \"providerType eq 'cloudflare'\""] },
2240
+ { path: "entra web-application-firewall-verification show", description: "Show one workforce web-application-firewall verification with the full reviewed property set; the row never carries provider detail, which has its own sub-read", operation: "GET:/identity/riskPrevention/webApplicationFirewallVerifications/{webApplicationFirewallVerificationModel-id}", flags: {
2241
+ ...common, id: { value: "verification-id", required: true, description: "Web-application-firewall-verification ID" },
2242
+ select: riskPreventionVerificationRead.select,
2243
+ fields: riskPreventionVerificationRead.fields,
2244
+ full: riskPreventionVerificationRead.full,
2245
+ scopes: riskPreventionVerificationRead.scopes,
2246
+ }, examples: ["mg-axi entra web-application-firewall-verification show --id <verification-id> --profile soc", "mg-axi entra web-application-firewall-verification show --id <verification-id> --profile soc --full"] },
2247
+ { path: "entra web-application-firewall-verification count", description: "Count workforce web-application-firewall verifications as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identity/riskPrevention/webApplicationFirewallVerifications/$count", flags: {
2248
+ ...common,
2249
+ scopes: riskPreventionVerificationRead.scopes,
2250
+ }, examples: ["mg-axi entra web-application-firewall-verification count --profile soc"] },
2251
+ { path: "entra web-application-firewall-verification provider show", description: "Show the web-application-firewall provider behind one verification with the full reviewed provider set; API keys, client secrets and other key material are never returned", operation: "GET:/identity/riskPrevention/webApplicationFirewallVerifications/{webApplicationFirewallVerificationModel-id}/provider", flags: {
2252
+ ...common, id: { value: "verification-id", required: true, description: "Web-application-firewall-verification ID owning the provider" },
2253
+ select: riskPreventionWafRead.select,
2254
+ fields: riskPreventionWafRead.fields,
2255
+ full: riskPreventionWafRead.full,
2256
+ scopes: riskPreventionWafRead.scopes,
2257
+ }, examples: ["mg-axi entra web-application-firewall-verification provider show --id <verification-id> --profile soc"] },
1651
2258
  { path: "entra access-review definition list", description: "List access-review definitions with compact properties (id, displayName, status); definitions are review schedules (a series), never their occurrences", operation: "GET:/identityGovernance/accessReviews/definitions", flags: {
1652
2259
  ...common,
1653
2260
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -2084,14 +2691,98 @@ export const LEAVES = [
2084
2691
  full: lifecycleTaskReportSubRead.full,
2085
2692
  scopes: lifecycleTaskReportSubRead.scopes,
2086
2693
  }, examples: ["mg-axi entra lifecycle task-report task-definition show --workflow <workflow-id> --report <report-id> --profile soc"] },
2087
- { path: "api get", description: "Reviewed read-only raw Graph GET (API-01, v1.0 only): users, groups, conditional access, authentication methods, audit/sign-in, risk, apps, roles/PIM, devices, administrative units, domains, domain DNS records, identity providers, organizations, branding, access reviews, entitlement catalogs and access packages, lifecycle workflows, workflow templates, task definitions, lifecycle settings, workflow runs, user/subject processing results and task reports, and partner contracts; unreviewed, secret-value, mail/file-content, beta and write routes are refused before credentials", positional: { name: "path", description: "Server-relative Graph path, e.g. /users" }, flags: {
2694
+ { path: "entra lifecycle run user-processing-result list", description: "List user processing results of one lifecycle workflow run with minimal personal-data properties (id, processingStatus, task counts); the subject link is never requested", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/userProcessingResults", flags: {
2695
+ ...common,
2696
+ workflow: lifecycleRunReportsRead.workflow,
2697
+ run: lifecycleRunReportsRead.run,
2698
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2699
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2700
+ filter: lifecycleRunReportsRead.filter,
2701
+ select: lifecycleRunReportsRead.select,
2702
+ fields: lifecycleRunReportsRead.fields,
2703
+ full: lifecycleRunReportsRead.full,
2704
+ cursor: lifecycleRunReportsRead.cursor,
2705
+ scopes: lifecycleRunReportsRead.scopes,
2706
+ }, examples: ["mg-axi entra lifecycle run user-processing-result list --workflow <workflow-id> --run <run-id> --profile soc", "mg-axi entra lifecycle run user-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10"] },
2707
+ { path: "entra lifecycle run user-processing-result show", description: "Show one run user processing result with minimal personal-data properties; the subject link stays out", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/userProcessingResults/{userProcessingResult-id}", flags: {
2708
+ ...common,
2709
+ workflow: lifecycleRunReportsRead.workflow,
2710
+ run: lifecycleRunReportsRead.run,
2711
+ id: { value: "user-processing-result-id", required: true, description: "User processing result ID" },
2712
+ select: lifecycleRunReportsRead.select,
2713
+ fields: lifecycleRunReportsRead.fields,
2714
+ full: lifecycleRunReportsRead.full,
2715
+ scopes: lifecycleRunReportsRead.scopes,
2716
+ }, examples: ["mg-axi entra lifecycle run user-processing-result show --workflow <workflow-id> --run <run-id> --id <result-id> --profile soc"] },
2717
+ { path: "entra lifecycle run user-processing-result count", description: "Count user processing results of one lifecycle workflow run as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/userProcessingResults/$count", flags: {
2718
+ ...common,
2719
+ workflow: lifecycleRunReportsRead.workflow,
2720
+ run: lifecycleRunReportsRead.run,
2721
+ scopes: lifecycleRunReportsRead.scopes,
2722
+ }, examples: ["mg-axi entra lifecycle run user-processing-result count --workflow <workflow-id> --run <run-id> --profile soc"] },
2723
+ { path: "entra lifecycle run subject-processing-result list", description: "List subject processing results of one lifecycle workflow run with minimal personal-data properties; Graph documents no $select here so rows always arrive whole", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/subjectProcessingResults", flags: {
2724
+ ...common,
2725
+ workflow: lifecycleRunSubjectRead.workflow,
2726
+ run: lifecycleRunSubjectRead.run,
2727
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2728
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2729
+ filter: lifecycleRunSubjectRead.filter,
2730
+ fields: lifecycleRunSubjectRead.fields,
2731
+ full: lifecycleRunSubjectRead.full,
2732
+ cursor: lifecycleRunSubjectRead.cursor,
2733
+ scopes: lifecycleRunSubjectRead.scopes,
2734
+ }, examples: ["mg-axi entra lifecycle run subject-processing-result list --workflow <workflow-id> --run <run-id> --profile soc", "mg-axi entra lifecycle run subject-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10"] },
2735
+ { path: "entra lifecycle run subject-processing-result show", description: "Show one run subject processing result with minimal personal-data properties; the get documents $expand only so the row always arrives whole and the subject navigation stays out", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/subjectProcessingResults/{subjectProcessingResult-id}", flags: {
2736
+ ...common,
2737
+ workflow: lifecycleRunSubjectRead.workflow,
2738
+ run: lifecycleRunSubjectRead.run,
2739
+ id: { value: "subject-processing-result-id", required: true, description: "Subject processing result ID" },
2740
+ fields: lifecycleRunSubjectRead.fields,
2741
+ full: lifecycleRunSubjectRead.full,
2742
+ scopes: lifecycleRunSubjectRead.scopes,
2743
+ }, examples: ["mg-axi entra lifecycle run subject-processing-result show --workflow <workflow-id> --run <run-id> --id <result-id> --profile soc"] },
2744
+ { path: "entra lifecycle run subject-processing-result count", description: "Count subject processing results of one lifecycle workflow run as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/subjectProcessingResults/$count", flags: {
2745
+ ...common,
2746
+ workflow: lifecycleRunSubjectRead.workflow,
2747
+ run: lifecycleRunSubjectRead.run,
2748
+ scopes: lifecycleRunSubjectRead.scopes,
2749
+ }, examples: ["mg-axi entra lifecycle run subject-processing-result count --workflow <workflow-id> --run <run-id> --profile soc"] },
2750
+ { path: "entra lifecycle run task-processing-result list", description: "List task processing results of one lifecycle workflow run with compact properties (id, processingStatus, failureReason); rows never carry subject, task or workflowSubject detail", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/taskProcessingResults", flags: {
2751
+ ...common,
2752
+ workflow: lifecycleRunReportsRead.workflow,
2753
+ run: lifecycleRunReportsRead.run,
2754
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2755
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2756
+ filter: lifecycleRunReportsRead.filter,
2757
+ select: lifecycleRunReportsRead.select,
2758
+ fields: lifecycleRunReportsRead.fields,
2759
+ full: lifecycleRunReportsRead.full,
2760
+ cursor: lifecycleRunReportsRead.cursor,
2761
+ scopes: lifecycleRunReportsRead.scopes,
2762
+ }, examples: ["mg-axi entra lifecycle run task-processing-result list --workflow <workflow-id> --run <run-id> --profile soc", "mg-axi entra lifecycle run task-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10"] },
2763
+ { path: "entra lifecycle run task-processing-result show", description: "Show one run task processing result with the full reviewed scalar set including failure detail; Graph documents no query parameters here so the row always arrives whole and subject, task and workflowSubject detail belongs to later slices", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/taskProcessingResults/{taskProcessingResult-id}", flags: {
2764
+ ...common,
2765
+ workflow: lifecycleRunReportsRead.workflow,
2766
+ run: lifecycleRunReportsRead.run,
2767
+ id: { value: "task-processing-result-id", required: true, description: "Task processing result ID" },
2768
+ fields: lifecycleRunReportsRead.fields,
2769
+ full: lifecycleRunReportsRead.full,
2770
+ scopes: lifecycleRunReportsRead.scopes,
2771
+ }, examples: ["mg-axi entra lifecycle run task-processing-result show --workflow <workflow-id> --run <run-id> --id <result-id> --profile soc"] },
2772
+ { path: "entra lifecycle run task-processing-result count", description: "Count task processing results of one lifecycle workflow run as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/taskProcessingResults/$count", flags: {
2773
+ ...common,
2774
+ workflow: lifecycleRunReportsRead.workflow,
2775
+ run: lifecycleRunReportsRead.run,
2776
+ scopes: lifecycleRunReportsRead.scopes,
2777
+ }, examples: ["mg-axi entra lifecycle run task-processing-result count --workflow <workflow-id> --run <run-id> --profile soc"] },
2778
+ { path: "api get", description: "Reviewed read-only raw Graph GET (API-01, v1.0 only): users, groups, conditional access, authentication methods, audit/sign-in, risk, apps, roles/PIM, devices, administrative units, domains, domain DNS records, identity providers, organizations, branding, access reviews, entitlement catalogs and access packages, lifecycle workflows, workflow templates, task definitions, lifecycle settings, workflow runs, user/subject processing results, task reports and run user/subject/task processing results, and partner contracts; unreviewed, secret-value, mail/file-content, beta and write routes are refused before credentials", positional: { name: "path", description: "Server-relative Graph path, e.g. /users" }, flags: {
2088
2779
  ...common,
2089
2780
  odata: { value: "k=v&k2=v2", description: "OData query reviewed per route ($select/$filter/$top/$orderby on collections; $select on singles); defaults to reviewed fields" },
2090
2781
  cursor: { value: "token|-", description: "Resume a partial collection; - reads the token from stdin (16 MB ceiling for either input); use the same path, profile and scopes, and omit --odata to reuse its query" },
2091
2782
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit full https://graph.microsoft.com/ scope names; application profiles use the .default audience" },
2092
2783
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; use --all to follow pages within budget" },
2093
2784
  all: { description: "Follow @odata.nextLink pages within the request budget" },
2094
- full: { description: "Disable 4000-character string truncation; never disables redaction or row caps" },
2785
+ full: { description: "Disable 500-character string truncation; never disables redaction or row caps" },
2095
2786
  }, examples: ["mg-axi api get /users --scopes https://graph.microsoft.com/User.Read.All", "mg-axi api get /groups --odata '$filter=securityEnabled eq true&$top=5' --scopes https://graph.microsoft.com/GroupMember.Read.All", "mg-axi api get /users --cursor - --all --scopes https://graph.microsoft.com/User.Read.All < cursor.txt"] },
2096
2787
  ];
2097
2788
  export function leafHelp(leaf) {