@knowttl/mg-axi 0.1.2 → 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.
package/dist/api.js CHANGED
@@ -11,7 +11,9 @@ import { KNOWN_DATA_POLICY_FIELDS } from "./entra-data-policy-operations.js";
11
11
  import { KNOWN_FRAUD_FIELDS, KNOWN_WAF_FIELDS, KNOWN_VERIFICATION_FIELDS } from "./entra-risk-prevention.js";
12
12
  import { KNOWN_FEDERATION_FIELDS } from "./entra-federation-configurations.js";
13
13
  import { KNOWN_CA_FIELDS, KNOWN_PKI_FIELDS } from "./entra-certificate-auth.js";
14
+ import { KNOWN_AUTH_CONTEXT_FIELDS, KNOWN_COMBO_FIELDS, KNOWN_DELETED_LOCATION_FIELDS, KNOWN_DELETED_POLICY_FIELDS, KNOWN_MODE_FIELDS, KNOWN_STRENGTH_FIELDS, KNOWN_TEMPLATE_FIELDS as KNOWN_CA_TEMPLATE_FIELDS } from "./entra-conditional-access.js";
14
15
  import { KNOWN_SUBSCRIPTION_FIELDS } from "./entra-subscriptions.js";
16
+ import { KNOWN_TEMPLATE_FIELDS as KNOWN_ROLE_TEMPLATE_FIELDS, KNOWN_ROLE_MEMBER_FIELDS, KNOWN_SCOPED_MEMBER_FIELDS } from "./entra-roles.js";
15
17
  import { KNOWN_ASSIGNMENT_INSTANCE_FIELDS, KNOWN_ASSIGNMENT_SCHEDULE_FIELDS, KNOWN_ELIGIBILITY_INSTANCE_FIELDS, KNOWN_ELIGIBILITY_REQUEST_FIELDS, KNOWN_ELIGIBILITY_SCHEDULE_FIELDS } from "./entra-group-pim.js";
16
18
  import { KNOWN_SYNC_FIELDS } from "./entra-on-premises-synchronization.js";
17
19
  import { KNOWN_ACCEPTANCE_FIELDS, KNOWN_AGREEMENT_FIELDS } from "./entra-terms-of-use.js";
@@ -59,6 +61,7 @@ const AUTH_METHOD_FIELDS = ["id", "createdDateTime", "displayName", "phoneNumber
59
61
  const REGISTRATION_FIELDS = ["id", "userPrincipalName", "userDisplayName", "userType", "isAdmin", "isMfaRegistered", "isMfaCapable", "isPasswordlessCapable", "isSsprRegistered", "isSsprEnabled", "isSsprCapable", "userPreferredMethodForSecondaryAuthentication", "lastUpdatedDateTime"];
60
62
  const SIGNIN_FIELDS = ["id", "createdDateTime", "userId", "userPrincipalName", "userDisplayName", "appDisplayName", "appId", "ipAddress", "location", "status", "conditionalAccessStatus", "riskDetail", "riskLevelAggregated", "riskLevelDuringSignIn", "riskState", "resourceDisplayName", "resourceId", "clientAppUsed"];
61
63
  const AUDIT_FIELDS = ["id", "activityDateTime", "activityDisplayName", "category", "loggedByService", "operationType", "result", "resultReason", "correlationId", "initiatedBy", "targetResources"];
64
+ const PROVISIONING_FIELDS = ["id", "activityDateTime", "tenantId", "jobId", "cycleId", "changeId", "action", "durationInMilliseconds", "sourceSystem", "sourceIdentity", "targetSystem", "targetIdentity", "provisioningStatusInfo", "provisioningSteps", "modifiedProperties", "servicePrincipal", "initiatedBy"];
62
65
  const RISKY_USER_FIELDS = ["id", "userPrincipalName", "userDisplayName", "riskDetail", "riskLastUpdatedDateTime", "riskLevel", "riskState"];
63
66
  const RISK_DETECTION_FIELDS = ["id", "detectedDateTime", "activityDateTime", "userId", "userPrincipalName", "userDisplayName", "ipAddress", "location", "riskDetail", "riskLevel", "riskState", "riskEventType", "detectionTimingType", "lastUpdatedDateTime", "source"];
64
67
  const RISKY_SP_FIELDS = ["id", "displayName", "appId", "servicePrincipalType", "riskDetail", "riskLastUpdatedDateTime", "riskLevel", "riskState", "isEnabled", "isProcessing"];
@@ -68,6 +71,7 @@ const APP_FIELDS = ["id", "appId", "displayName", "createdDateTime", "signInAudi
68
71
  const SP_FIELDS = ["id", "appId", "displayName", "servicePrincipalType", "accountEnabled", "appOwnerOrganizationId", "appRoleAssignmentRequired", "preferredSingleSignOnMode", "loginUrl"];
69
72
  const GRANT_FIELDS = ["id", "clientId", "consentType", "principalId", "resourceId", "scope", "startTime", "expiryTime"];
70
73
  const APP_ROLE_FIELDS = ["id", "appRoleId", "principalId", "principalDisplayName", "principalType", "resourceId", "resourceDisplayName", "createdDateTime"];
74
+ const FEDERATED_FIELDS = ["id", "name", "issuer", "subject", "description", "audiences"];
71
75
  const ROLE_ASSIGNMENT_FIELDS = ["id", "principalId", "roleDefinitionId", "directoryScopeId", "appScopeId", "createdDateTime"];
72
76
  const PIM_INSTANCE_FIELDS = ["id", "roleDefinitionId", "principalId", "assignmentType", "memberType", "startDateTime", "endDateTime", "activatedUsing"];
73
77
  const DEVICE_FIELDS = ["id", "deviceId", "displayName", "operatingSystem", "operatingSystemVersion", "trustType", "isCompliant", "isManaged", "accountEnabled", "createdDateTime", "approximateLastSignInDateTime", "manufacturer", "model"];
@@ -109,6 +113,62 @@ export const REVIEWED_ROUTES = [
109
113
  { id: "v1.0:GET:/identity/conditionalAccess/namedLocations/{namedLocation-id}", kind: "single", query: SINGLE_QUERY, fields: NAMED_LOCATION_FIELDS,
110
114
  access: "D/A Policy.Read.All. Delegated callers pass it as --scopes; a supported administrator role (for example Security Reader) is also required.",
111
115
  sources: ["https://learn.microsoft.com/graph/api/countrynamedlocation-get?view=graph-rest-1.0"] },
116
+ { id: "v1.0:GET:/identity/conditionalAccess/authenticationStrength/policies", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_STRENGTH_FIELDS,
117
+ access: "D/A Policy.Read.AuthenticationMethod. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Security Administrator or Security Reader) is also required.",
118
+ note: "Conditional Access needs P1.",
119
+ sources: ["https://learn.microsoft.com/en-us/graph/api/authenticationstrengthroot-list-policies?view=graph-rest-1.0"] },
120
+ { id: "v1.0:GET:/identity/conditionalAccess/authenticationStrength/policies/{authenticationStrengthPolicy-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_STRENGTH_FIELDS,
121
+ access: "D/A Policy.Read.AuthenticationMethod. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Security Administrator or Security Reader) is also required.",
122
+ note: "Conditional Access needs P1.",
123
+ sources: ["https://learn.microsoft.com/en-us/graph/api/authenticationstrengthpolicy-get?view=graph-rest-1.0"] },
124
+ { id: "v1.0:GET:/identity/conditionalAccess/authenticationStrength/policies/{authenticationStrengthPolicy-id}/combinationConfigurations", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_COMBO_FIELDS, keepODataType: true,
125
+ access: "D/A Policy.Read.AuthenticationMethod. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Security Administrator or Security Reader) is also required.",
126
+ note: "Conditional Access needs P1. Rows are polymorphic: the @odata.type discriminator rides along automatically to name the configuration kind.",
127
+ sources: ["https://learn.microsoft.com/graph/api/authenticationstrengthpolicy-list-combinationconfigurations?view=graph-rest-1.0"] },
128
+ { id: "v1.0:GET:/identity/conditionalAccess/authenticationStrength/policies/{authenticationStrengthPolicy-id}/combinationConfigurations/{authenticationCombinationConfiguration-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_COMBO_FIELDS, keepODataType: true,
129
+ access: "D/A Policy.Read.AuthenticationMethod. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Security Administrator or Security Reader) is also required.",
130
+ note: "Conditional Access needs P1. Rows are polymorphic: the @odata.type discriminator rides along automatically to name the configuration kind.",
131
+ sources: ["https://learn.microsoft.com/graph/api/authenticationcombinationconfiguration-get?view=graph-rest-1.0"] },
132
+ { id: "v1.0:GET:/identity/conditionalAccess/authenticationStrength/authenticationMethodModes", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_MODE_FIELDS,
133
+ access: "D/A Policy.Read.AuthenticationMethod. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Security Administrator or Security Reader) is also required.",
134
+ note: "Conditional Access needs P1.",
135
+ sources: ["https://learn.microsoft.com/graph/api/authenticationstrengthroot-list-authenticationmethodmodes?view=graph-rest-1.0"] },
136
+ { id: "v1.0:GET:/identity/conditionalAccess/authenticationStrength/authenticationMethodModes/{authenticationMethodModeDetail-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_MODE_FIELDS,
137
+ access: "D/A Policy.Read.AuthenticationMethod. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Security Administrator or Security Reader) is also required.",
138
+ note: "Conditional Access needs P1.",
139
+ sources: ["https://learn.microsoft.com/en-us/graph/api/authenticationmethodmodedetail-get?view=graph-rest-1.0"] },
140
+ { id: "v1.0:GET:/identity/conditionalAccess/templates", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_CA_TEMPLATE_FIELDS,
141
+ access: "D/A Policy.Read.All. Delegated callers pass it as --scopes; a supported administrator role (for example Security Reader) is also required.",
142
+ note: "Conditional Access needs P1.",
143
+ sources: ["https://learn.microsoft.com/en-us/graph/api/conditionalaccessroot-list-templates?view=graph-rest-1.0"] },
144
+ { id: "v1.0:GET:/identity/conditionalAccess/templates/{conditionalAccessTemplate-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_CA_TEMPLATE_FIELDS,
145
+ access: "D/A Policy.Read.All. Delegated callers pass it as --scopes; a supported administrator role (for example Security Reader) is also required.",
146
+ note: "Conditional Access needs P1.",
147
+ sources: ["https://learn.microsoft.com/en-us/graph/api/conditionalaccesstemplate-get?view=graph-rest-1.0"] },
148
+ { id: "v1.0:GET:/identity/conditionalAccess/authenticationContextClassReferences", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_AUTH_CONTEXT_FIELDS,
149
+ access: "D/A AuthenticationContext.Read.All. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Global Reader, Global Secure Access Administrator, Security Administrator or Security Reader) is also required.",
150
+ note: "Conditional Access needs P1.",
151
+ sources: ["https://learn.microsoft.com/graph/api/conditionalaccessroot-list-authenticationcontextclassreferences?view=graph-rest-1.0"] },
152
+ { id: "v1.0:GET:/identity/conditionalAccess/authenticationContextClassReferences/{authenticationContextClassReference-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_AUTH_CONTEXT_FIELDS,
153
+ access: "D/A AuthenticationContext.Read.All. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Global Reader, Global Secure Access Administrator, Security Administrator or Security Reader) is also required.",
154
+ note: "The get page documents no optional query parameters; $select travels as the standard single-object projection. Conditional Access needs P1.",
155
+ sources: ["https://learn.microsoft.com/graph/api/authenticationcontextclassreference-get?view=graph-rest-1.0"] },
156
+ { id: "v1.0:GET:/identity/conditionalAccess/deletedItems/policies", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_DELETED_POLICY_FIELDS,
157
+ access: "D/A Policy.Read.All. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Global Reader, Global Secure Access Administrator, Security Administrator or Security Reader) is also required.",
158
+ note: "No v1.0 operation-level documentation page; access follows the beta policyDeletableItem contract for conditional-access objects with the conditionalAccessPolicy resource reference. Soft-deleted policies restore within 30 days; restore is beta-only and out of scope. Conditional Access needs P1.",
159
+ sources: ["https://learn.microsoft.com/en-us/graph/api/policydeletableitem-list?view=graph-rest-beta", "https://learn.microsoft.com/en-us/graph/api/resources/policydeletableitem?view=graph-rest-beta"] },
160
+ { id: "v1.0:GET:/identity/conditionalAccess/deletedItems/policies/{conditionalAccessPolicy-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_DELETED_POLICY_FIELDS,
161
+ access: "D/A Policy.Read.All. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Global Reader, Global Secure Access Administrator, Security Administrator or Security Reader) is also required.",
162
+ note: "No v1.0 operation-level documentation page; access follows the beta policyDeletableItem contract for conditional-access objects with the conditionalAccessPolicy resource reference. Soft-deleted policies restore within 30 days; restore is beta-only and out of scope. Conditional Access needs P1.",
163
+ sources: ["https://learn.microsoft.com/en-us/graph/api/policydeletableitem-get?view=graph-rest-beta", "https://learn.microsoft.com/en-us/graph/api/resources/policydeletableitem?view=graph-rest-beta"] },
164
+ { id: "v1.0:GET:/identity/conditionalAccess/deletedItems/namedLocations", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_DELETED_LOCATION_FIELDS, keepODataType: true,
165
+ access: "D/A Policy.Read.All. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Global Reader, Global Secure Access Administrator, Security Administrator or Security Reader) is also required.",
166
+ note: "No v1.0 operation-level documentation page; access follows the beta policyDeletableItem contract for conditional-access objects with the namedLocation resource reference. Rows are polymorphic: the @odata.type discriminator rides along automatically to name the location kind. Soft-deleted locations restore within 30 days; restore is beta-only and out of scope. Conditional Access needs P1.",
167
+ sources: ["https://learn.microsoft.com/en-us/graph/api/policydeletableitem-list?view=graph-rest-beta", "https://learn.microsoft.com/en-us/graph/api/resources/policydeletableitem?view=graph-rest-beta"] },
168
+ { id: "v1.0:GET:/identity/conditionalAccess/deletedItems/namedLocations/{namedLocation-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_DELETED_LOCATION_FIELDS, keepODataType: true,
169
+ access: "D/A Policy.Read.All. Delegated callers pass it as --scopes; a supported administrator role (Conditional Access Administrator, Global Reader, Global Secure Access Administrator, Security Administrator or Security Reader) is also required.",
170
+ note: "No v1.0 operation-level documentation page; access follows the beta policyDeletableItem contract for conditional-access objects with the namedLocation resource reference. Soft-deleted locations restore within 30 days; restore is beta-only and out of scope. Conditional Access needs P1.",
171
+ sources: ["https://learn.microsoft.com/en-us/graph/api/policydeletableitem-get?view=graph-rest-beta", "https://learn.microsoft.com/en-us/graph/api/resources/policydeletableitem?view=graph-rest-beta"] },
112
172
  { id: "v1.0:GET:/users/{user-id}/authentication/methods", kind: "collection", query: ["$select"], fields: AUTH_METHOD_FIELDS,
113
173
  access: "D/A UserAuthenticationMethod.Read.All for other users; delegated self UserAuthenticationMethod.Read. Dedicated administrator roles also apply.",
114
174
  note: "Targeted per-user inspection only; aggregate coverage belongs to the registration report, never to a scan across users.",
@@ -127,6 +187,10 @@ export const REVIEWED_ROUTES = [
127
187
  { id: "v1.0:GET:/auditLogs/directoryAudits", kind: "collection", query: COLLECTION_QUERY, fields: AUDIT_FIELDS,
128
188
  access: "D/A AuditLog.Read.All. Delegated callers pass it as --scopes.",
129
189
  sources: ["https://learn.microsoft.com/graph/api/directoryaudit-list?view=graph-rest-1.0"] },
190
+ { id: "v1.0:GET:/auditLogs/provisioning", kind: "collection", query: COLLECTION_QUERY, fields: PROVISIONING_FIELDS,
191
+ access: "D/A AuditLog.Read.All and Directory.Read.All. Delegated callers pass both as --scopes; Reports Reader is the least privileged directory role.",
192
+ note: "Entra ID P1/P2 licence prerequisite; retention is 30 days on premium and 7 days on free.",
193
+ sources: ["https://learn.microsoft.com/graph/api/provisioningobjectsummary-list?view=graph-rest-1.0"] },
130
194
  { id: "v1.0:GET:/identityProtection/riskyUsers", kind: "collection", query: COLLECTION_QUERY, fields: RISKY_USER_FIELDS,
131
195
  access: "D/A IdentityRiskyUser.Read.All. Delegated callers pass it as --scopes.",
132
196
  note: "Full investigation needs P2/Suite; limited results stay limited, never reinterpreted as empty.",
@@ -183,6 +247,34 @@ export const REVIEWED_ROUTES = [
183
247
  access: "D/A Application.Read.All. Delegated callers pass it as --scopes.",
184
248
  note: "Actual granted assignments; requested permissions are a separate contract.",
185
249
  sources: ["https://learn.microsoft.com/graph/api/serviceprincipal-list-approleassignments?view=graph-rest-1.0"] },
250
+ { id: "v1.0:GET:/servicePrincipals/{servicePrincipal-id}/appRoleAssignments/{appRoleAssignment-id}", kind: "single", query: SINGLE_QUERY, fields: APP_ROLE_FIELDS,
251
+ access: "D/A Application.Read.All. Delegated callers pass it as --scopes.",
252
+ note: "One granted assignment on the client service principal; requested permissions are a separate contract.",
253
+ sources: ["https://learn.microsoft.com/graph/api/approleassignment-get?view=graph-rest-1.0"] },
254
+ { id: "v1.0:GET:/servicePrincipals/{servicePrincipal-id}/appRoleAssignedTo", kind: "collection", query: COLLECTION_QUERY, fields: APP_ROLE_FIELDS,
255
+ access: "D/A Application.Read.All. Delegated callers pass it as --scopes.",
256
+ note: "Principals assigned to this resource service principal; the reverse view of appRoleAssignments.",
257
+ sources: ["https://learn.microsoft.com/graph/api/serviceprincipal-list-approleassignedto?view=graph-rest-1.0"] },
258
+ { id: "v1.0:GET:/servicePrincipals/{servicePrincipal-id}/appRoleAssignedTo/{appRoleAssignment-id}", kind: "single", query: SINGLE_QUERY, fields: APP_ROLE_FIELDS,
259
+ access: "D/A Application.Read.All. Delegated callers pass it as --scopes.",
260
+ note: "One principal assignment on the resource service principal; the reverse view of appRoleAssignments.",
261
+ sources: ["https://learn.microsoft.com/graph/api/approleassignment-get?view=graph-rest-1.0"] },
262
+ { id: "v1.0:GET:/applications/{application-id}/federatedIdentityCredentials", kind: "collection", query: COLLECTION_QUERY, fields: FEDERATED_FIELDS,
263
+ access: "D/A Application.Read.All. Delegated callers pass it as --scopes.",
264
+ note: "Workload-identity trust metadata only; GET never returns secret values and success redaction still applies.",
265
+ sources: ["https://learn.microsoft.com/graph/api/federatedidentitycredential-list?view=graph-rest-1.0"] },
266
+ { id: "v1.0:GET:/applications/{application-id}/federatedIdentityCredentials/{federatedIdentityCredential-id}", kind: "single", query: SINGLE_QUERY, fields: FEDERATED_FIELDS,
267
+ access: "D/A Application.Read.All. Delegated callers pass it as --scopes.",
268
+ note: "One workload-identity trust entry; metadata only, never secret values.",
269
+ sources: ["https://learn.microsoft.com/graph/api/federatedidentitycredential-get?view=graph-rest-1.0"] },
270
+ { id: "v1.0:GET:/servicePrincipals/{servicePrincipal-id}/federatedIdentityCredentials", kind: "collection", query: COLLECTION_QUERY, fields: FEDERATED_FIELDS,
271
+ access: "D/A Application.Read.All. Delegated callers pass it as --scopes.",
272
+ note: "Same federatedIdentityCredential resource contract as the application navigation; metadata only, never secret values.",
273
+ sources: ["https://learn.microsoft.com/graph/api/federatedidentitycredential-list?view=graph-rest-1.0", "https://learn.microsoft.com/graph/api/resources/federatedidentitycredential?view=graph-rest-1.0"] },
274
+ { id: "v1.0:GET:/servicePrincipals/{servicePrincipal-id}/federatedIdentityCredentials/{federatedIdentityCredential-id}", kind: "single", query: SINGLE_QUERY, fields: FEDERATED_FIELDS,
275
+ access: "D/A Application.Read.All. Delegated callers pass it as --scopes.",
276
+ note: "Same federatedIdentityCredential resource contract as the application navigation; metadata only, never secret values.",
277
+ sources: ["https://learn.microsoft.com/graph/api/federatedidentitycredential-get?view=graph-rest-1.0", "https://learn.microsoft.com/graph/api/resources/federatedidentitycredential?view=graph-rest-1.0"] },
186
278
  { id: "v1.0:GET:/oauth2PermissionGrants", kind: "collection", query: COLLECTION_QUERY, fields: GRANT_FIELDS,
187
279
  access: "D/A Directory.Read.All as the read choice. Delegated callers pass it as --scopes.",
188
280
  note: "Actual granted consent; requested permissions are a separate contract.",
@@ -202,6 +294,33 @@ export const REVIEWED_ROUTES = [
202
294
  access: "D/A RoleAssignmentSchedule.Read.Directory. Delegated callers pass it as --scopes.",
203
295
  note: "Active (including activated eligible) assignments; PIM needs P2 or ID Governance.",
204
296
  sources: ["https://learn.microsoft.com/graph/api/rbacapplication-list-roleassignmentscheduleinstances?view=graph-rest-1.0"] },
297
+ { id: "v1.0:GET:/directoryRoleTemplates", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_ROLE_TEMPLATE_FIELDS,
298
+ access: "D/A RoleManagement.Read.Directory. Delegated callers pass it as --scopes.",
299
+ note: "Templates describe every role; activation state lives on directoryRoles.",
300
+ sources: ["https://learn.microsoft.com/graph/api/directoryroletemplate-list?view=graph-rest-1.0"] },
301
+ { id: "v1.0:GET:/directoryRoleTemplates/{directoryRoleTemplate-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_ROLE_TEMPLATE_FIELDS,
302
+ access: "D/A RoleManagement.Read.Directory. Delegated callers pass it as --scopes.",
303
+ sources: ["https://learn.microsoft.com/graph/api/directoryroletemplate-get?view=graph-rest-1.0"] },
304
+ { id: "v1.0:GET:/directoryRoles/{directoryRole-id}/members", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_ROLE_MEMBER_FIELDS,
305
+ access: "D/A RoleManagement.Read.Directory. Delegated callers pass it as --scopes.",
306
+ note: "Members are the assigned principals; @odata.type names each member kind.",
307
+ sources: ["https://learn.microsoft.com/graph/api/directoryrole-list-members?view=graph-rest-1.0"] },
308
+ { id: "v1.0:GET:/directoryRoles/{directoryRole-id}/scopedMembers", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_SCOPED_MEMBER_FIELDS,
309
+ access: "D/A RoleManagement.Read.Directory. Delegated callers pass it as --scopes.",
310
+ note: "Scoped members bind one role to one principal within one directory scope; administrative-unit scopes need P1.",
311
+ sources: ["https://learn.microsoft.com/graph/api/directoryrole-list-scopedmembers?view=graph-rest-1.0"] },
312
+ { id: "v1.0:GET:/directoryRoles/{directoryRole-id}/scopedMembers/{scopedRoleMembership-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_SCOPED_MEMBER_FIELDS,
313
+ access: "D/A RoleManagement.Read.Directory. Delegated callers pass it as --scopes.",
314
+ note: "Administrative-unit scopes need P1.",
315
+ sources: ["https://learn.microsoft.com/graph/api/scopedrolemembership-get?view=graph-rest-1.0"] },
316
+ { id: "v1.0:GET:/scopedRoleMemberships", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_SCOPED_MEMBER_FIELDS,
317
+ access: "D/A RoleManagement.Read.Directory. Delegated callers pass it as --scopes.",
318
+ note: "Administrative-unit-scoped admin assignments; directory-wide assignments live on roleAssignments. Administrative-unit scopes need P1.",
319
+ sources: ["https://learn.microsoft.com/graph/api/scopedrolemembership-list?view=graph-rest-1.0"] },
320
+ { id: "v1.0:GET:/scopedRoleMemberships/{scopedRoleMembership-id}", kind: "single", query: SINGLE_QUERY, fields: KNOWN_SCOPED_MEMBER_FIELDS,
321
+ access: "D/A RoleManagement.Read.Directory. Delegated callers pass it as --scopes.",
322
+ note: "Administrative-unit scopes need P1.",
323
+ sources: ["https://learn.microsoft.com/graph/api/scopedrolemembership-get?view=graph-rest-1.0"] },
205
324
  { id: "v1.0:GET:/identityGovernance/privilegedAccess/group/assignmentSchedules", kind: "collection", query: COLLECTION_QUERY, fields: KNOWN_ASSIGNMENT_SCHEDULE_FIELDS,
206
325
  access: "D/A PrivilegedAssignmentSchedule.Read.AzureADGroup. Delegated callers pass it as --scopes.",
207
326
  note: "Assignment schedules govern group membership or ownership over time; PIM for Groups needs P2 or ID Governance; lists require $filter on groupId or principalId. AssignmentScheduleRequests stay out: their least privilege is the write scope PrivilegedAssignmentSchedule.ReadWrite.AzureADGroup.",
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" },
@@ -327,6 +335,22 @@ const caRead = {
327
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" },
328
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" },
329
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
+ };
330
354
  const providerRead = {
331
355
  filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter; unsupported combinations fail before credentials" },
332
356
  select: { value: "comma-separated-properties", description: "Request server properties from the reviewed identity-provider set; secret-bearing fields (clientSecret, certificateData) are never selectable" },
@@ -619,6 +643,72 @@ export const LEAVES = [
619
643
  full: roleRead.full,
620
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" },
621
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"] },
622
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: {
623
713
  ...common,
624
714
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1497,6 +1587,26 @@ export const LEAVES = [
1497
1587
  full: logRead.full,
1498
1588
  scopes: logRead.scopes,
1499
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"] },
1500
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: {
1501
1611
  ...common,
1502
1612
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1577,6 +1687,71 @@ export const LEAVES = [
1577
1687
  cursor: appRoleGrantRead.cursor,
1578
1688
  scopes: appRoleGrantRead.scopes,
1579
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"] },
1580
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: {
1581
1756
  ...common,
1582
1757
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1728,6 +1903,134 @@ export const LEAVES = [
1728
1903
  full: caRead.full,
1729
1904
  scopes: caRead.scopes,
1730
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"] },
1731
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: {
1732
2035
  ...common,
1733
2036
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },