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),…
HaloPSA contract management: contract types (recurring, prepaid hours, ad-hoc, project, warranty), statuses, billing and coverage fields, recurring invoice items, prepaid hour balances and deduction, SLA association, renewal and billing-reconciliation workflows.
$ npx -y skills add wyre-technology/msp-claude-plugins --skill contracts --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/contractsContext preview
The summary Claude sees to decide when to auto-load this skill.
HaloPSA contract management: contract types (recurring, prepaid hours, ad-hoc, project, warranty), statuses, billing and coverage fields, recurring invoice items, prepaid hour balances and deduction, SLA association, renewal and billing-reconciliation workflows.
name: "HaloPSA Contracts" description: > HaloPSA contract management: contract types (recurring, prepaid hours, ad-hoc, project, warranty), statuses, billing and coverage fields, recurring invoice items, prepaid hour balances and deduction, SLA association, renewal and billing-reconciliation workflows. when_to_use: >- When managing service agreements, recurring billing, prepaid hours, and contract renewals. Use when: halopsa contract, halo contract, service agreement halopsa, recurring billing halopsa, prepaid hours halo, contract renewal halopsa, halopsa billing, managed services agreement halo, halopsa msa, or contract management halo.
Contracts in HaloPSA define the service relationship with clients - what services you provide, how you bill for them, and what service levels apply. Contracts control how time, expenses, and recurring charges flow to invoices and are critical for MSP financial management.
A HaloPSA contract is the commercial agreement — coverage, rates, and the SLA you committed to. It is not the helpdesk configuration that computes a deadline, and it is not the bill.
business-hours calendars in the helpdesk are `freshdesk-sla-business-hours`; the contract states the commitment, the helpdesk approximates it, and the two can legitimately disagree.
are `halopsa-invoices` (read-only) and `xero-invoices` for the books.
differ materially; use `autotask-contracts`.
links are `halopsa-assets`.
| Type | Description | Billing Method | |------|-------------|----------------| | **Recurring** | Monthly/annual managed services | Fixed recurring fee | | **Prepaid Hours** | Block hours/time bank | Deduct from balance | | **Ad-Hoc** | Pay as you go (T&M) | Bill actual time | | **Project** | Fixed-price project | Milestone billing | | **Warranty** | Coverage period | No direct billing |
| Status | Description | Billing | |--------|-------------|---------| | Active | In effect | Billable | | Pending | Not yet started | Not billable | | Expired | Past end date | Not billable | | Cancelled | Terminated early | Not billable | | On Hold | Temporarily paused | Not billable |
A contract minimally needs `ref` (reference/name), `client_id`, `startdate`, `status`, and `type`. Billing behavior comes from `billingfrequency` and `invoiceday`; coverage from `sla_id`, `includesallsites`, and `includesallassets`; financials from `value`, `setupfee`, and `renewalvalue`.
See [references/fields.md](references/fields.md) for the complete field reference (contract, billing, coverage, financial, recurring-item, and prepaid fields).
Contracts live at `/api/ClientContract`; recurring line items at `/api/RecurringInvoiceItem`. As elsewhere in HaloPSA, POST bodies are arrays, and an update is a POST that includes the record's `id`.
Two non-obvious expansion flags control what a GET returns:
| Query flag | Effect | |------------|--------| | `includerecurringinvoiceitems=true` | Returns the contract's recurring line items | | `includehoursummary=true` | Returns prepaid hour totals, used, and remaining |
Date-range searches use `enddate_before` / `enddate_after` (combine with `status=Active` to find contracts that are expiring rather than already lapsed).
See [references/api.md](references/api.md) for full create/search/update request and response bodies, recurring-item payloads, prepaid contract creation, SLA linking, and renewal calls.
Recurring items are the line items that generate recurring invoices. Each item belongs to a contract (`contract_id`) and carries a `description`, `quantity`, and `unitprice`. An item can override the contract's `billingfrequency` and can have its own `startdate`/`enddate`, so mid-term additions (e.g. five new workstations) bill only from the date they start.
Prepaid contracts carry a purchased hour allocation (`prepaid_hours`) and an `hourlyrate`. Time entries logged against tickets linked to the contract automatically deduct from the balance - the ticket's time entry must carry `contract_id` for the deduction to happen. Query the balance with `includehoursummary=true` and alert before the remaining hours run out.
Setting `sla_id` on a contract makes tickets under that contract inherit:
1. **Create contract**
2. **Add recurring items**
3. **Link to assets** (optional)
4. **Configure billing**
1. **Identify expiring contracts** - search `status=Active` with `enddate_before` set to your renewal horizon 2. **Review performance** - ticket volume, SLA compliance, hours used, profitability against contract value 3. **Generate renewal** - create a new contract in `Pending` status with the new term dates and `renewalvalue` 4. **Expire old contract** - set the prior contract's `status` to `Expired` once the renewal starts
Poll `prepaid_hours_remaining` against a low-balance threshold (commonly 10 hours) and raise a replenishment quote before the block is exhausted, otherwise time silently accrues as unbilled.
For a billing period, compare expected recurring totals against invoiced
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…