api-patterns
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there is no shared mcp.3cx.com),…
Inforcer compliance and posture reporting: per-tenant Microsoft 365 secure scores, combining them with alignment scores, and the alignedThreshold / semiAlignedThreshold settings that classify each tenant or policy as aligned, semi-aligned, or drifted. Covers portfolio posture
$ npx -y skills add wyre-technology/msp-claude-plugins --skill compliance-reporting --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/compliance-reportingContext preview
The summary Claude sees to decide when to auto-load this skill.
Inforcer compliance and posture reporting: per-tenant Microsoft 365 secure scores, combining them with alignment scores, and the alignedThreshold / semiAlignedThreshold settings that classify each tenant or policy as aligned, semi-aligned, or drifted. Covers portfolio posture
name: "Inforcer Compliance Reporting" description: > Inforcer compliance and posture reporting: per-tenant Microsoft 365 secure scores, combining them with alignment scores, and the alignedThreshold / semiAlignedThreshold settings that classify each tenant or policy as aligned, semi-aligned, or drifted. Covers portfolio posture roll-ups across the MSP's managed tenants. when_to_use: >- When producing Inforcer security posture or compliance reports for one tenant or the whole portfolio. Use when: inforcer secure score, compliance report, posture report, aligned threshold, semi-aligned, drifted classification, portfolio posture, or secure score per tenant.
This skill turns Inforcer's raw signals — secure scores and alignment — into a posture report. The headline output is a per-tenant classification (aligned / semi-aligned / drifted) rolled up across the portfolio, suitable for monthly internal reviews and QBRs.
Read [api-patterns](../api-patterns/SKILL.md) for headers, region, the envelope, and pagination, and [tenant-management](../tenant-management/SKILL.md) for resolving tenants to integer Client Tenant IDs. Alignment mechanics live in [baseline-alignment](../baseline-alignment/SKILL.md).
and the roll-up; *which* controls diverged is `inforcer-baseline-alignment`.
domain health are a separate baseline with separate findings; use `cipp-standards`. Do not blend CIPP and Inforcer scores into one number.
means triggering an assessment run, the one write in this plugin; use `inforcer-assessments`.
Read the Microsoft 365 **secure score** for a tenant — Microsoft's own security posture measure for the M365 environment.
inforcer_secure_scores_get(tenant="Acme")
The `tenant` argument accepts a friendly name, a DNS name, an Azure AD tenant GUID, or the numeric Client Tenant ID; the server resolves the first three to the numeric id before calling Inforcer.
Secure score is complementary to alignment: alignment says "does this tenant match *our* baseline?", secure score says "what does Microsoft think of this tenant's posture overall?". A strong report uses both.
Read the tenant's alignment score against its assigned baseline (the other half of the posture picture). See [baseline-alignment](../baseline-alignment/SKILL.md) for details.
inforcer_alignment_scores(clientTenantId=1423)
Alignment classification is **threshold-driven**. Two configurable settings define the bands:
A tenant (or an individual policy) is classified by comparing its alignment value against those thresholds:
| Classification | Condition | |----------------|-----------| | **aligned** | value `>= alignedThreshold` | | **semi-aligned** | value `>= semiAlignedThreshold` **and** `< alignedThreshold` | | **drifted** | value `< semiAlignedThreshold` |
So the bands are: at or above `alignedThreshold` is **aligned**; in the window `[semiAlignedThreshold, alignedThreshold)` is **semi-aligned**; below `semiAlignedThreshold` is **drifted**. Always state the threshold values you used in the report — a tenant's band is meaningless without the thresholds that produced it, and changing the thresholds reclassifies tenants without anything actually changing on the tenant.
def classify(value, aligned_threshold, semi_aligned_threshold):
if value >= aligned_threshold:
return "aligned"
if value >= semi_aligned_threshold:
return "semi-aligned"
return "drifted"For a fleet report:
1. `inforcer_tenants_list` — enumerate managed tenants (page to completion). 2. For each tenant's integer Client Tenant ID, pull `inforcer_alignment_scores` and `inforcer_secure_scores_get`. 3. Apply the `alignedThreshold` / `semiAlignedThreshold` classification to the alignment value. 4. Sort tenants drifted-first, then semi-aligned, then aligned, so the MSP triages the worst posture first. 5. Summarize: counts per band, lowest secure scores, and the tenants that are both drifted **and** low secure score (the priority list).
| Column | Source | |--------|--------| | Alignment score + band | `inforcer_alignment_scores` + thresholds | | Secure score | `inforcer_secure_scores_get` | | Classification | computed (aligned / semi-aligned / drifted) |
remediate it, deploy policies, or restore configuration via the API — those are UI-only. Report findings as recommendations.
field names for secure score, alignment value, and the threshold settings are illustrative and credited to [`royklo/InforcerCommunity`](https://github.com/royklo/InforcerCommunity).
configured differently between runs, a tenant can "change band" with no real posture change — note the thresholds for reproducibility.
them. A high secure score with low alignment means Microsoft is happy but the tenant diverges from the MSP baseline (and vice versa).
One command to supercharge Claude Code for MSP workflows. Then restart Claude Code. That's it. Documentation: mcp.wyre.ai
Repo: wyre-technology/msp-claude-plugins
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there is no shared mcp.3cx.com),…
3CX's live-operations surface: read-only visibility into active calls, recordings, voicemail, department and queue membership, and forwarding/presence…
3CX's read-only directory surface: resolving a caller by email or by exact extension, searching the PBX's own phonebooks, searching contacts synced from an…
3CX's system-and-configuration surface: server time, PBX event log and application log search, service status, database schema and the read-only SELECT-only…
Abnormal Security abuse mailbox cases: user-reported email submissions, case statuses and judgments, the case lifecycle, bulk and remediation actions, and…
Abnormal Security message analysis: message retrieval, email header inspection, attachments, sender reputation, delivery context, and SPF/DKIM/DMARC…