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…
Read-only access to a tenant's Conditional Access policy graph and named locations through CIPP: policy state semantics, the findings that matter in a CA review, portfolio drift detection, and why CA writes are absent from the MCP surface.
Claude Code
$ npx -y skills add wyre-ai/msp-claude-plugins --skill security --agent claude-code
Codex
$ npx skills add wyre-ai/msp-claude-plugins --skill security -a codex -y
Cursor
$ npx skills add wyre-ai/msp-claude-plugins --skill security -a cursor -y
Gemini CLI
$ npx skills add wyre-ai/msp-claude-plugins --skill security -a gemini-cli -y
GitHub Copilot
$ npx skills add wyre-ai/msp-claude-plugins --skill security -a github-copilot -y
OpenCode
$ npx skills add wyre-ai/msp-claude-plugins --skill security -a opencode -y
Windsurf
$ npx skills add wyre-ai/msp-claude-plugins --skill security -a windsurf -y
name: "cipp-security" description: "Read-only access to a tenant's Conditional Access policy graph and named locations through CIPP: policy state semantics, the findings that matter in a CA review, portfolio drift detection, and why CA writes are absent from the MCP surface." when_to_use: >- When auditing conditional access policies or named locations across managed tenants for security posture review. Use when: conditional access, ca policy, named locations, trusted ips, cipp security, mfa enforcement, security posture, or location based access.
Read-only access to a tenant's Conditional Access policy graph and named-location list. Use as input to security posture reviews and to detect tenants drifting from MSP baseline policies. CIPP doesn't expose CA write operations through MCP — apply policy changes via CIPP standards or the CIPP UI.
write tool here; policy rollout goes through `cipp-standards` or the CIPP UI.
not what users have *enrolled*; `cipp_list_mfa_users` in `cipp-users` answers the enrolment question.
credentials for** — that is the `m365` plugin's `Microsoft 365 Security`; this skill is CSP-delegated and CA-only.
baseline template is `cipp-standards` or `inforcer-compliance-reporting`.
cipp_list_conditional_access_policies(tenantFilter='contoso.onmicrosoft.com')
Returns every CA policy with `displayName`, `state` (`enabled` / `disabled` / `enabledForReportingButNotEnforced`), `conditions` (users, apps, locations, platforms, sign-in risk), and `grantControls` (MFA, compliant device, terms of use, etc).
cipp_list_named_locations(tenantFilter='contoso.onmicrosoft.com')
Returns named locations: IP ranges (trusted/untrusted) and country-based locations. These are the building blocks CA policies reference for location-based controls.
cipp_list_enterprise_apps(tenantFilter='contoso.onmicrosoft.com', includeBuiltIn=False)
Third-party enterprise applications (service principals) customers have connected through OAuth. Review for unfamiliar apps with broad permissions; consent phishing shows up here. Admin-tier in Conduit.
cipp_list_user_signin_logs(tenantFilter, userId='alice@contoso.com', top=100) # top defaults to 50, max 1000
One user's recent interactive sign-ins, newest first: time, app, IP, location, result and failure reason. Use it for "was this account compromised?" alongside `cipp_bec_check`. One tenant per call; admin-tier in Conduit.
| Finding | Why it matters | |---------|----------------| | Zero policies in `enabled` state | Tenant has no CA enforcement at all — a baseline `enabledForReportingButNotEnforced` doesn't block anything | | MFA not required for "All cloud apps" | A baseline policy is missing or scoped too narrowly | | Policies excluding the entire admin role | Common configuration mistake; admins should require *more* MFA, not less | | Trusted location includes home/coffee-shop IPs | Named-location bloat creates exception paths for attackers | | `legacy authentication` not blocked | Basic auth bypasses MFA entirely; should be blocked tenant-wide | | Reporting-only policies older than 30 days | Should have been promoted to `enabled` or removed |
policies = cipp_list_conditional_access_policies(tenantFilter)
enabled = [p for p in policies if p['state'] == 'enabled']
mfa_for_all_apps = any(
p for p in enabled
if 'mfa' in p.get('grantControls', {}).get('builtInControls', [])
and 'All' in p.get('conditions', {}).get('applications', {}).get('includeApplications', [])
)If `mfa_for_all_apps` is false, the tenant lacks the baseline "MFA for everything" policy that every MSP should ship as a standard.
Run `cipp_list_conditional_access_policies` per tenant and compare the policy fingerprint (display names + `state` + grant controls) against the MSP's golden baseline. Flag tenants where any baseline policy is missing or disabled.
One command to supercharge Claude Code for MSP workflows. Then restart Claude Code. That's it. Documentation: mcp.wyre.ai
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there…
3CX's live-operations surface: read-only visibility into active calls, recordings, voicemail, department and queue membership,…
3CX's read-only directory surface: resolving a caller by email or by exact extension, searching the PBX's own phonebooks,…
3CX's system-and-configuration surface: server time, PBX event log and application log search, service status, database schema…
Abnormal Security abuse mailbox cases: user-reported email submissions, case statuses and judgments, the case lifecycle, bulk and…
Abnormal Security message analysis: message retrieval, email header inspection, attachments, sender reputation, delivery context,…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.