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),…
ConnectWise PSA time entry management: charge-to types (tickets, projects, charge codes), billable vs non-billable time, work types and work roles, time sheets, and the time entry approval workflow.
$ npx -y skills add wyre-technology/msp-claude-plugins --skill time-entries --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/time-entriesContext preview
The summary Claude sees to decide when to auto-load this skill.
ConnectWise PSA time entry management: charge-to types (tickets, projects, charge codes), billable vs non-billable time, work types and work roles, time sheets, and the time entry approval workflow.
name: "ConnectWise Manage Time Entries" description: > ConnectWise PSA time entry management: charge-to types (tickets, projects, charge codes), billable vs non-billable time, work types and work roles, time sheets, and the time entry approval workflow. when_to_use: >- When creating, updating, searching, or managing time tracking. Use when: connectwise time entry, time tracking connectwise, log time connectwise, billable time, non-billable time, work type, work role, time sheet, time approval, or hours logged.
Time entries in ConnectWise PSA track time spent on tickets, projects, and other activities. Accurate time tracking is essential for billing, resource management, and profitability analysis. This skill covers time entry CRUD operations, work types, work roles, billing settings, and approval workflows.
note (`cw_add_ticket_note`); only billable duration belongs in a time entry. Use `connectwise-psa-tickets`.
ticket has to be located first; use `connectwise-psa-projects`.
Base: /time/entries
Time can be logged against different record types:
| Charge To Type | Description | |----------------|-------------| | `ServiceTicket` | Time against service tickets | | `ProjectTicket` | Time against project tickets | | `ChargeCode` | Time against charge codes (internal) | | `Activity` | Time against activities |
See [references/fields.md](references/fields.md) for the complete time entry field reference.
Work types categorize the nature of work performed.
| Type | Description | Typical Billing | |------|-------------|-----------------| | Regular | Normal work hours | Billable | | Overtime | After-hours work | 1.5x rate | | Training | Training time | Non-billable | | Travel | Travel time | Varies | | Remote | Remote support | Billable | | On-site | On-site work | Billable | | Administrative | Admin tasks | Non-billable |
Query `GET /time/workTypes` for the configured list.
Work roles determine billing rates based on skill level.
| Role | Description | Typical Rate | |------|-------------|--------------| | Level 1 Tech | Help desk | $75-100/hr | | Level 2 Tech | Desktop support | $100-125/hr | | Level 3 Tech | Systems admin | $125-150/hr | | Engineer | Senior engineer | $150-200/hr | | Consultant | Expert consultant | $200-250/hr | | Project Manager | PM work | $125-175/hr |
Query `GET /time/workRoles` for the configured list.
| Option | Description | |--------|-------------| | `Billable` | Time is billable at standard rate | | `DoNotBill` | Time excluded from billing | | `NoCharge` | Time shows on invoice at $0 | | `NoDefault` | Use ticket/agreement default |
Precedence order, first match wins:
1. Time entry `billableOption` (if set) 2. Ticket `billTime` setting 3. Agreement billing rules 4. Company default
POST /time/entries
Content-Type: application/json
{
"chargeToId": 54321,
"chargeToType": "ServiceTicket",
"member": {"id": 123},
"timeStart": "2024-02-15T09:00:00Z",
"timeEnd": "2024-02-15T10:30:00Z",
"workType": {"id": 1},
"workRole": {"id": 2},
"billableOption": "Billable",
"notes": "Diagnosed email delivery issue. Identified blocked sender.",
"addToDetailDescriptionFlag": true
}`actualHours` can be used instead of `timeStart`/`timeEnd`. Logging against a `ChargeCode` requires the `company` field explicitly, since there's no ticket to infer it from. See [references/api.md](references/api.md) for the actual-hours and charge-code variants plus get/update/delete/search examples.
1. Time entry created — `Open` 2. Time sheet submitted — `Submitted` 3. Manager approves or rejects — `Approved` or `Rejected` (with `internalNotes` explaining what to fix) 4. Approved time is invoiced — `Billed`
Approve/reject and bulk-approval requests, plus time sheet get/submit requests, are in [references/api.md](references/api.md).
Common query conditions for time entries:
**Time entries for a ticket:**
conditions=chargeToId=54321 and chargeToType="ServiceTicket"
**Time entries by member:**
conditions=member/id=123
**Time entries by date range:**
conditions=timeStart>=[2024-02-01] and timeStart<[2024-03-01]
**Unbilled time entries:**
conditions=status="Open" and billableOption="Billable"
**Approved time waiting for billing:**
conditions=status="Approved" and billableOption="Billable"
Charge codes are used for non-ticket time (meetings, training, etc.). Query `GET /time/chargeCodes` for the configured list.
| Code | Description | Billable | |------|-------------|----------| | MTNG | Internal meetings | No | | TRNG | Training | No | | ADMIN | Administrative | No | | PTO | Paid time off | No | | PROJ | Project work | Yes | | ONCALL | On-call time | Varies |
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…