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…
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.
Claude Code
$ npx -y skills add wyre-ai/msp-claude-plugins --skill time-entries --agent claude-code
Codex
$ npx skills add wyre-ai/msp-claude-plugins --skill time-entries -a codex -y
Cursor
$ npx skills add wyre-ai/msp-claude-plugins --skill time-entries -a cursor -y
Gemini CLI
$ npx skills add wyre-ai/msp-claude-plugins --skill time-entries -a gemini-cli -y
GitHub Copilot
$ npx skills add wyre-ai/msp-claude-plugins --skill time-entries -a github-copilot -y
OpenCode
$ npx skills add wyre-ai/msp-claude-plugins --skill time-entries -a opencode -y
Windsurf
$ npx skills add wyre-ai/msp-claude-plugins --skill time-entries -a windsurf -y
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`.
| Tool | Tier | Purpose | |------|------|---------| | `cw_search_time_entries` / `cw_get_time_entry` | read | Find and read time entries | | `cw_create_time_entry` | write | Log time against a ticket, project ticket or activity | | `cw_update_time_entry` | write | Correct hours, notes, work type or billable option on an existing entry | | `cw_delete_time_entry` | write | Remove a mistaken entry. Check it has not been invoiced first: deleting billed time leaves the invoice and the ticket disagreeing | | `cw_update_invoice` | write | Edit an invoice record (for example after time corrections), when the operator asks for it |
Prefer `cw_update_time_entry` over delete-and-recreate, so the entry keeps its ID and audit history.
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
3CX's native PBX MCP server: the per-PBX endpoint shape (every PBX is its own FQDN and its own OAuth authorization server — there…
3CX's live-operations surface: read-only visibility into active calls, recordings, voicemail, department and queue membership,…
3CX's read-only directory surface: resolving a caller by email or by exact extension, searching the PBX's own phonebooks,…
3CX's system-and-configuration surface: server time, PBX event log and application log search, service status, database schema…
Abnormal Security abuse mailbox cases: user-reported email submissions, case statuses and judgments, the case lifecycle, bulk and…
Abnormal Security message analysis: message retrieval, email header inspection, attachments, sender reputation, delivery context,…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.