Skip to content

Conditional Access Coverage Gaps

The question it answers: Which enabled accounts does no enforced Conditional Access MFA policy fully cover?

Which enabled accounts no MFA policy actually covers, and which policies leave holes: report-only mode, “MFA or compliant device”, location exclusions, or large exclusion groups.

Where in the appEntra ID › Conditional Access › Coverage Gaps
WorkloadEntra ID
KindTable · dashboard tile
DataBuilt from the tenant data IntensiveReports keeps in memory and refreshes in the background, so it opens at once.
LicenceMicrosoft Entra ID P1 (Conditional Access).
Report id (API and MCP)entra.security.ca-coverage-gaps
Tabs on its pageConditional Access Policy Gaps
ColumnKeyType
UserDisplayNameLink
UPNUserPrincipalNameText
CoverageCoverageStateStatus
AdminIsAdminYesNo
Covered byFullCoverageStringText
Only under conditionsPartialCoverageStringText
Excluded fromExcludedFromStringText
User typeUserTypeText
FilterKey (API)On when the page opens
Only users who are not fully coveredgapsYes
Members only (hide guests)members-onlyNo

Licence: Microsoft Entra ID P1 (Conditional Access).

Application permissions on the IntensiveReports app registration (all permissions):

PermissionAPIWhat it allowsNote
Policy.Read.AllMicrosoft GraphRead your organization’s policies
User.Read.AllMicrosoft GraphRead all users’ full profiles
User-LifeCycleInfo.Read.AllMicrosoft GraphRead all users’ lifecycle information
Group.Read.AllMicrosoft GraphRead all groups
RoleManagement.Read.DirectoryMicrosoft GraphRead all directory RBAC settings
AuditLog.Read.AllMicrosoft GraphRead all audit log data
Data sources it reads
  • GET /v1.0/identity/conditionalAccess/policies
  • GET /v1.0/groups/{id}/transitiveMembers
  • GET /v1.0/users
  • GET /v1.0/roleManagement/directory/roleAssignments
  • GET /v1.0/reports/authenticationMethods/userRegistrationDetails (admin flag)
GET /ir-api/v1/reports/entra.security.ca-coverage-gaps?size=100
GET /ir-api/v1/reports/entra.security.ca-coverage-gaps?filter=gaps

An AI assistant reads it with the MCP tool get_report and the id entra.security.ca-coverage-gaps. The client needs the Read grant for Entra ID. See Using the API.