find-contact
Resolve a 3CX contact or extension by email, extension, or name
Add an action (note, update, or response) to an existing HaloPSA ticket
$ npx -y skills add wyre-technology/msp-claude-plugins --agent claude-codeHow it fires
How this command gets triggered: by you, by Claude, or both.
/add-actionContext preview
What this command does when you run it.
Add an action (note, update, or response) to an existing HaloPSA ticket
description: Add an action (note, update, or response) to an existing HaloPSA ticket argument-hint: "<ticket_id> <note> [action_type] [outcome] [hidden] [time_taken]" arguments: [ticket_id, note, action_type, outcome, hidden, time_taken]
Add an action (note, update, or response) to an existing HaloPSA ticket with configurable visibility and action type.
1. **Authenticate with OAuth 2.0**
# Get OAuth token
TOKEN=$(curl -s -X POST "{base_url}/auth/token?tenant={tenant}" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id={client_id}" \
-d "client_secret={client_secret}" \
-d "scope=all" | jq -r '.access_token')2. **Validate ticket exists**
# Verify ticket exists
curl -s -X GET "{base_url}/api/Tickets/{ticket_id}" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json"3. **Resolve action type**
# Get available action types
curl -s -X GET "{base_url}/api/ActionTypes" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json"4. **Create the action**
# Create action on ticket
curl -s -X POST "{base_url}/api/Actions" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '[
{
"ticket_id": <ticket_id>,
"note": "<note>",
"actiontype_id": <resolved_actiontype_id>,
"outcome": "<outcome>",
"hiddenfromuser": <hidden>,
"timetaken": <time_taken>,
"sendemail": false
}
]'5. **Return action confirmation**
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | ticket_id | integer | Yes | - | The HaloPSA ticket ID | | note | string | Yes | - | The action/note content | | action_type | string | No | note | note/update/email_response/phone | | outcome | string | No | - | Outcome code for the action | | hidden | boolean | No | false | Hide from client portal | | time_taken | integer | No | - | Time taken in minutes |
/add-action 12345 "Contacted customer, issue reproduced successfully"
/add-action 12345 "Called customer to discuss resolution options" --action_type phone --time_taken 15
/add-action 12345 "Internal troubleshooting notes - do not share with client" --hidden true
/add-action 12345 "Issue resolved, VPN connection restored" --action_type update --outcome "Resolved" --time_taken 30
/add-action 12345 "Sent password reset instructions to user" --action_type email_response
Action Added Successfully Action ID: 98765 Ticket: #12345 - Email not working Action Type: Note Hidden: No Time Logged: 15 minutes Ticket URL: https://yourcompany.halopsa.com/tickets?id=12345
Action Added Successfully Action ID: 98766 Ticket: #12345 - Email not working Action Type: Update Outcome: Resolved Hidden: No Time Logged: 30 minutes Ticket Status: The ticket status has been updated to "Resolved" Ticket URL: https://yourcompany.halopsa.com/tickets?id=12345
Ticket not found: #12345 Please verify the ticket ID and try again. Use /search-tickets to find the correct ticket ID.
Invalid action type: "invalid_type" Available action types: - note (default) - update - email_response - phone Use: /add-action 12345 "My note" --action_type note
Authentication failed Please verify your HaloPSA credentials: - HALOPSA_CLIENT_ID - HALOPSA_CLIENT_SECRET - HALOPSA_BASE_URL - HALOPSA_TENANT (for cloud-hosted) Ensure the API application has 'edit:tickets' permission.
Rate limited by HaloPSA API (429) HaloPSA allows 500 requests per 3 minutes. Retrying in 5 seconds...
Permission denied (403) Your API credentials do not have permission to add actions to tickets. Contact your HaloPSA administrator to grant 'edit:tickets' scope.
Creates a new action on a ticket.
**Request Body:**
[
{
"ticket_id": 12345,
"note": "Action content here",
"actiontype_id": 1,
"outcome": "In Progress",
"hiddenfromuser": false,
"timetaken": 15,
"sendemail": false
}
]**Response:**
{
"id": 98765,
"ticket_id": 12345,
"note": "Action content here",
"actiontype_id": 1,
"who": "Jane Tech",
"whenraw": "2024-02-15T10:30:00Z"
}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
Resolve a 3CX contact or extension by email, extension, or name
Search for specific threat patterns in Abnormal Security by sender, recipient, attack type, or keywords
Triage recent email threats detected by Abnormal Security by severity and attack type