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),…
QuickBooks Online financial reporting: the report catalog (Profit & Loss, Balance Sheet, A/R and A/P Aging, General Ledger, Customer Sales, Cash Flow, Tax Summary), report parameters, date macros, column customization, the nested row response structure, and MSP analysis patterns
$ npx -y skills add wyre-technology/msp-claude-plugins --skill reports --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/reportsContext preview
The summary Claude sees to decide when to auto-load this skill.
QuickBooks Online financial reporting: the report catalog (Profit & Loss, Balance Sheet, A/R and A/P Aging, General Ledger, Customer Sales, Cash Flow, Tax Summary), report parameters, date macros, column customization, the nested row response structure, and MSP analysis patterns
name: "QuickBooks Online Reports" description: > QuickBooks Online financial reporting: the report catalog (Profit & Loss, Balance Sheet, A/R and A/P Aging, General Ledger, Customer Sales, Cash Flow, Tax Summary), report parameters, date macros, column customization, the nested row response structure, and MSP analysis patterns like client profitability and aged receivables for collections. when_to_use: >- When generating or parsing QuickBooks Online financial reports. Use when: quickbooks report, qbo report, profit and loss, balance sheet, accounts receivable aging, accounts payable aging, general ledger, financial report, p&l report, ar aging, ap aging, aged receivables, or client profitability.
QuickBooks Online provides a comprehensive set of financial reports accessible via the API. For MSPs, the most critical reports are Accounts Receivable Aging (tracking which clients owe money and how overdue), Profit & Loss (measuring overall and per-client profitability), Balance Sheet (financial position), and Accounts Payable Aging (tracking vendor obligations). Reports are read-only API calls that return structured data suitable for dashboards, alerts, and automated analysis.
nested row structure and their own rounding. Pulling one invoice, payment, or bill out of a report is the wrong path; use `qbo-invoices`, `qbo-payments`, or `qbo-expenses`.
produce "P&L" and "aged receivables" under those exact names.
distributor and the revenue side in QBO; reconciling them is `shared-skills-billing-reconciliation`, not a single report.
utilisation are PSA reporting, not accounting; use the PSA's skills.
| Category | Reports | MSP Relevance | |----------|---------|---------------| | **Profit & Loss** | ProfitAndLoss, ProfitAndLossDetail | Revenue and expense by period | | **Balance Sheet** | BalanceSheet, BalanceSheetDetail | Financial position snapshot | | **A/R Aging** | AgedReceivables, AgedReceivableDetail | Client collections tracking | | **A/P Aging** | AgedPayables, AgedPayableDetail | Vendor payment obligations | | **General Ledger** | GeneralLedger, GeneralLedgerDetail | Transaction-level audit trail | | **Sales** | CustomerSales, CustomerIncome, ItemSales | Revenue by customer/item | | **Expenses** | ExpensesByVendor | Cost tracking by vendor | | **Tax** | TaxSummary | Sales tax obligations | | **Cash Flow** | CashFlow | Cash inflows and outflows |
All reports are served from `/v3/company/{realmId}/reports/{ReportName}`. See [references/api.md](references/api.md) for the complete endpoint catalog with per-report request examples.
All reports support common parameters for filtering and customization:
| Parameter | Description | Example | |-----------|-------------|---------| | `start_date` | Period start | `2026-01-01` | | `end_date` | Period end | `2026-01-31` | | `accounting_method` | Accrual or Cash | `Accrual` | | `date_macro` | Preset period | `Last Month`, `This Fiscal Year` | | `summarize_column_by` | Column grouping | `Month`, `Quarter`, `Year`, `Customers` | | `customer` | Filter by customer ID | `123` | | `department` | Filter by department | `1` |
| Macro | Description | |-------|-------------| | `Today` | Current day | | `This Week` | Current week | | `This Month` | Current month | | `This Fiscal Quarter` | Current fiscal quarter | | `This Fiscal Year` | Current fiscal year | | `Last Month` | Previous month | | `Last Fiscal Quarter` | Previous quarter | | `Last Fiscal Year` | Previous fiscal year | | `This Fiscal Year-to-date` | Year to date |
All reports return a common structure:
{
"Header": {
"ReportName": "ProfitAndLoss",
"DateMacro": "Last Month",
"StartPeriod": "2026-01-01",
"EndPeriod": "2026-01-31",
"Currency": "USD",
"Option": [
{ "Name": "AccountingMethod", "Value": "Accrual" }
]
},
"Columns": {
"Column": [
{ "ColTitle": "", "ColType": "Account" },
{ "ColTitle": "Total", "ColType": "Money" }
]
},
"Rows": {
"Row": [...]
}
}| Column | Description | |--------|-------------| | Current | Not yet due | | 1-30 | 1-30 days past due | | 31-60 | 31-60 days past due | | 61-90 | 61-90 days past due | | 91 and over | 91+ days past due |
`Rows.Row` is a recursive tree, not a flat list. A row is either a `type: "Section"` node — carrying `Header.ColData` (the section label), a nested `Rows.Row` array, and a `Summary.ColData` totals row — or a leaf data row carrying only `ColData`. Any parser must recurse into `Rows.Row` and handle both shapes; the totals you usually want live on `Summary`, not on the child data rows.
See [references/examples.md](references/examples.md) for the nested row JSON and a recursive parser implementation.
Fetch ProfitAndLoss, AgedReceivables, AgedPayables, and CustomerSales concurrently for the target month, then parse each into a single summary object.
Run ProfitAndLoss with `summarize_column_by=Customers`. Each customer becomes a column; read `Columns.Column[].ColTitle` for client names and pull the `Income`, `Expenses`, and `Net Income` section summaries.
Run AgedReceivableDetail with `date_macro=Today`, walk the customer sections, and flag invoices past a days-overdue and amount threshold.
Run ProfitAndLoss over a multi-month range with `summarize_column_by=Month`, then read the `Income`
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…