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),…
Datto RMM account-level and site-level variables: scoping and inheritance (site overrides account), naming conventions and reserved prefixes, CRUD operations, and referencing variables from component scripts.
$ npx -y skills add wyre-technology/msp-claude-plugins --skill variables --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/variablesContext preview
The summary Claude sees to decide when to auto-load this skill.
Datto RMM account-level and site-level variables: scoping and inheritance (site overrides account), naming conventions and reserved prefixes, CRUD operations, and referencing variables from component scripts.
name: "Datto RMM Variables" description: > Datto RMM account-level and site-level variables: scoping and inheritance (site overrides account), naming conventions and reserved prefixes, CRUD operations, and referencing variables from component scripts. when_to_use: >- When working with account-level and site-level variables for storing configuration data in Datto RMM variables. Use when: datto variable, rmm variable, account variable, site variable, script variable, component variable, or configuration variable.
Variables in Datto RMM store key-value configuration data at account or site level. They're used to customize component scripts, store configuration values, and maintain environment-specific settings. This skill covers variable management, scoping, and usage patterns.
supplied at execution time, not stored variables; use `datto-rmm-jobs`.
store again; use `datto-rmm-devices` or `autotask-configuration-items`.
| Scope | Description | Use Case | |-------|-------------|----------| | **Account** | Available to all sites | Global configuration | | **Site** | Available to specific site | Client-specific settings |
Account Variables (Global)
│
▼ (inherited by)
Site Variables
│
▼ (used in)
Jobs/ComponentsSite variables can override account variables with the same name.
All variables are stored as strings but can represent:
**Recommended Format:** `SCREAMING_SNAKE_CASE` (e.g. `BACKUP_PATH`, `ADMIN_EMAIL`, `LOG_RETENTION_DAYS`).
**Reserved prefixes** - names starting with these are rejected (400 `Invalid name`):
A `Variable` has `id`, `name`, `value`, optional `description`, `scope` (`account`|`site`), and `siteUid` when site-scoped. See [references/fields.md](references/fields.md) for the full interface.
Account variables can be overridden by site variables - check site scope first, then fall back to account:
async function getEffectiveVariable(client, siteUid, variableName) {
// Try site variable first
const siteVars = await client.request(`/api/v2/site/${siteUid}/variables`);
const siteVar = siteVars.variables?.find(v => v.name === variableName);
if (siteVar) {
return {
name: variableName,
value: siteVar.value,
scope: 'site',
source: `Site: ${siteUid}`
};
}
// Fall back to account variable
const accountVars = await client.request('/api/v2/account/variables');
const accountVar = accountVars.variables?.find(v => v.name === variableName);
if (accountVar) {
return {
name: variableName,
value: accountVar.value,
scope: 'account',
source: 'Account'
};
}
return {
name: variableName,
value: null,
error: 'Variable not found'
};
}Bulk site-variable setup, an account+site audit report, an override finder that scans every site for a given variable name, a template applier for standardized onboarding, and a create-or-update "safe set" helper are in [references/examples.md](references/examples.md).
See [references/api.md](references/api.md) for full request/response examples.
See [references/errors.md](references/errors.md) for the full variable API error table.
| Category | Examples | Purpose | |----------|----------|---------| | Backup | `BACKUP_PATH`, `BACKUP_RETENTION_DAYS` | Backup configuration | | Logging | `LOG_PATH`, `LOG_LEVEL` | Log settings | | Alerting | `ALERT_EMAIL`, `ALERT_THRESHOLD` | Alert configuration | | Security | `AV_SCAN_SCHEDULE`, `FIREWALL_ENABLED` | Security settings | | Client | `CLIENT_CODE`, `CLIENT_CONTACT` | Client identification |
Variables are referenced in component scripts as environment variables:
**PowerShell:**
$backupPath = $env:BACKUP_PATH
$retentionDays = $env:LOG_RETENTION_DAYS
# Use the variables
Get-ChildItem -Path $backupPath -Recurse |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$retentionDays) } |
Remove-Item**Bash:**
BACKUP_PATH="${BACKUP_PATH:-/backup}"
RETENTION_DAYS="${LOG_RETENTION_DAYS:-30}"
find "$BACKUP_PATH" -type f -mtime +$RETENTION_DAYS -deleteOne 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…