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),…
The top-level CIPP scope: enumerating managed M365 tenants, retrieving tenant detail, and the accepted `tenantFilter` identifier formats (default domain, custom domain, GUID, `allTenants`). Also covers stale-cache detection and the two common tenant-resolution failure modes.
$ npx -y skills add wyre-technology/msp-claude-plugins --skill tenants --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/tenantsContext preview
The summary Claude sees to decide when to auto-load this skill.
The top-level CIPP scope: enumerating managed M365 tenants, retrieving tenant detail, and the accepted `tenantFilter` identifier formats (default domain, custom domain, GUID, `allTenants`). Also covers stale-cache detection and the two common tenant-resolution failure modes.
name: "cipp-tenants" description: "The top-level CIPP scope: enumerating managed M365 tenants, retrieving tenant detail, and the accepted `tenantFilter` identifier formats (default domain, custom domain, GUID, `allTenants`). Also covers stale-cache detection and the two common tenant-resolution failure modes." when_to_use: >- When listing managed M365 tenants, looking up tenant IDs/domains, or scoping operations across the MSP portfolio. Use when: cipp tenant, list tenants, m365 tenant, tenant details, which tenants, all tenants, cipp portfolio, or msp tenant list.
Tenants are the top-level scope in CIPP. Every operational tool — users, mailboxes, standards, security — takes a `tenantFilter` parameter that scopes the call to one tenant or to `allTenants`. Knowing how to enumerate tenants and resolve a friendly name to its tenant ID is the first step in almost every CIPP workflow.
but keys them by an *integer* Client Tenant ID, not a domain or GUID. A `tenantFilter` value from here will not work there; use `inforcer-tenant-management`.
GDAP delegation chain, not the tenant record; use `cipp-ops`.
resolves and describes the tenant itself; use `cipp-licenses`, `cipp-standards`, or `cipp-security`.
List every tenant CIPP manages. Returns a list of tenant objects with `customerId`, `defaultDomainName`, `displayName`, and onboarding status.
cipp_list_tenants()
Use this whenever a user refers to a client by name — the response gives you the `defaultDomainName` (or `customerId`) needed for `tenantFilter` on every other tool.
Retrieve detailed information for one tenant: license count, domain list, GDAP relationship status, last refresh time.
cipp_get_tenant_details(tenantFilter='contoso.onmicrosoft.com')
Use `tenantFilter='allTenants'` to get a portfolio-wide aggregate — useful for fleet reports.
Most CIPP tools accept any of these in `tenantFilter`:
| Format | Example | Notes | |--------|---------|-------| | Default domain | `contoso.onmicrosoft.com` | Most readable, recommended | | Custom domain | `contoso.com` | Works if CIPP has it cached | | Tenant GUID | `00000000-0000-0000-0000-000000000000` | Most stable but opaque | | `allTenants` | `allTenants` | Portfolio-wide; only some tools support it |
When a user says "Acme", always run `cipp_list_tenants` first and resolve to the canonical `defaultDomainName` before calling other tools. Never guess the tenant identifier.
**Resolve a friendly name → tenant filter**
tenants = cipp_list_tenants() acme = next(t for t in tenants if 'acme' in t['displayName'].lower()) tenant_filter = acme['defaultDomainName']
**Audit which tenants are stale in CIPP cache**
`cipp_get_tenant_details` returns `lastRefresh`. Tenants not refreshed in >24h often signal a broken GDAP relationship or revoked consent — flag them before running standards or BPA checks against them.
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…