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's core drift-detection surface: baseline templates, tenant alignment scores, alignment details (the per-policy breakdown of a tenant against its assigned baseline), and reading deployed tenant policy state. Read-only.
$ npx -y skills add wyre-technology/msp-claude-plugins --skill baseline-alignment --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/baseline-alignmentContext preview
The summary Claude sees to decide when to auto-load this skill.
Inforcer's core drift-detection surface: baseline templates, tenant alignment scores, alignment details (the per-policy breakdown of a tenant against its assigned baseline), and reading deployed tenant policy state. Read-only.
name: "Inforcer Baseline Alignment" description: > Inforcer's core drift-detection surface: baseline templates, tenant alignment scores, alignment details (the per-policy breakdown of a tenant against its assigned baseline), and reading deployed tenant policy state. Read-only. when_to_use: >- When listing baseline templates, reading a tenant's alignment score, or inspecting per-policy drift against an assigned baseline. Use when: inforcer baseline, baseline template, tenant alignment, alignment score, alignment details, policy drift, drift detail, or tenant policies.
Inforcer's central idea: each managed tenant is measured against an assigned **security baseline** (a template of policy settings). The gap between the tenant's deployed state and that baseline is **drift**. This skill covers listing baselines, reading alignment scores, and — most importantly — pulling the **per-policy alignment details** that show exactly where a tenant has drifted.
Read [api-patterns](../api-patterns/SKILL.md) for headers, region, the envelope, and pagination, and [tenant-management](../tenant-management/SKILL.md) for resolving a tenant to its integer Client Tenant ID. Every alignment/policy call is tenant-scoped by that integer id.
remediate, or restore configuration; those exist only in the Inforcer UI. The M365 changes themselves are `cipp-users`, `cipp-security`, or `cipp-standards`, and CIPP's `Remediate`-mode standards are the auto-fix mechanism Inforcer lacks.
BPA measure a different template with different findings; the two scores are not comparable. Use `cipp-standards`.
drifted** — that classification lives in `inforcer-compliance-reporting`.
not history; use `inforcer-audit-events`.
List the security **baseline templates** defined in Inforcer. Returns baseline objects (id, name, and the policy settings each baseline prescribes). Baselines are the "golden" definition a tenant is compared against.
inforcer_baselines_list()
Read the **alignment score** for a tenant — the headline measure of how closely the tenant matches its assigned baseline.
inforcer_alignment_scores(clientTenantId=1423)
Use this for the at-a-glance "how aligned is this tenant?" answer. Score classification (aligned / semi-aligned / drifted) is threshold-driven — see [compliance-reporting](../compliance-reporting/SKILL.md).
Pull the **per-policy drift breakdown** — the detailed list of how each policy in the tenant compares to the baseline. This is where you see *which* policies are aligned and *which* have drifted, not just the aggregate score.
inforcer_alignment_details(clientTenantId=1423)
Returns, per policy, the baseline-expected state and the tenant's actual state so you can pinpoint exactly what diverged. This is the primary input to any drift report.
List the **deployed policy state** for a tenant (read-only). Shows what policies are actually in place on the tenant, independent of the baseline comparison.
inforcer_policies_list(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.
Use this to inspect the tenant's real configuration when an alignment detail is ambiguous, or to confirm what is actually deployed.
| Finding | Why it matters | |---------|----------------| | Low alignment score | The tenant has drifted materially from its baseline; investigate `inforcer_alignment_details` | | Policy present in baseline but absent on tenant | A required control was never deployed or was removed | | Policy deployed but with weaker settings than baseline | Silent weakening — looks "configured" but doesn't meet baseline | | Many small drifts vs one critical drift | Triage by control impact, not count — one missing MFA/identity control outweighs many cosmetic diffs | | Tenant with no assigned baseline | Nothing to measure against; alignment is meaningless until a baseline is assigned |
ctid = resolve("Acme") # integer Client Tenant ID
score = inforcer_alignment_scores(clientTenantId=ctid)
details = inforcer_alignment_details(clientTenantId=ctid)
drifted = [p for p in details if p['aligned'] is False]Start from the score for the headline, then read `alignment_details` to list the drifted policies. Cross-reference `inforcer_policies_list` when you need the tenant's actual deployed value for a policy.
For each tenant from `inforcer_tenants_list`, pull `inforcer_alignment_scores`, then drill into `inforcer_alignment_details` only for tenants below an alignment threshold. This keeps the sweep cheap while still surfacing the per-policy detail where it matters. Page `continuationToken` to completion on every list.
full detail, but you **cannot** deploy a policy, remediate the drift, or restore configuration through the API. Those actions exist only in the Inforcer UI — surface them as recommendations, never as something this plugin performs.
names such as `aligned` and the exact `alignment_details` shape are illustrative and credited to [`royklo/InforcerCommunity`](https://github.com/royklo/InforcerCommunity).
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…