From superops-ai
Manages SuperOps.ai tickets for creating, updating, searching, and service desk operations including statuses, priorities, assignments, notes, time entries, and MSP workflow automations via GraphQL API.
npx claudepluginhub wyre-technology/msp-claude-plugins --plugin superopsThis skill uses the workspace's default tool permissions.
SuperOps.ai tickets are the core unit of service delivery in the PSA. Every client request, incident, and service task flows through the ticketing system. This skill covers comprehensive ticket management including creation, updates, notes, time entries, and workflow automation using the GraphQL API.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Generates or updates index.md listing all files and subdirectories in a target folder with 3-10 word descriptions from file contents. Use for indexing documentation directories.
SuperOps.ai tickets are the core unit of service delivery in the PSA. Every client request, incident, and service task flows through the ticketing system. This skill covers comprehensive ticket management including creation, updates, notes, time entries, and workflow automation using the GraphQL API.
| Status | Description | Business Logic |
|---|---|---|
| Open | Newly created or reopened | Default for new tickets |
| In Progress | Actively being worked | Technician assigned |
| Pending | Waiting for external action | SLA clock may pause |
| Resolved | Issue addressed | Awaiting confirmation |
| Closed | Ticket complete | No further action |
| Priority | Description | Typical Response |
|---|---|---|
| Critical | Business-stopping issue | Immediate response |
| High | Major productivity impact | 1-2 hours |
| Medium | Single user/workaround exists | 4-8 hours |
| Low | Minor issue/enhancement | Next business day |
| Field | Type | Required | Description |
|---|---|---|---|
ticketId | ID | System | Auto-generated unique identifier |
ticketNumber | String | System | Human-readable ticket number |
subject | String | Yes | Brief issue summary |
description | String | No | Detailed description |
ticketType | Enum | No | Incident, Service Request, Problem, Change |
requestType | Enum | No | Classification type |
source | Enum | No | How ticket was created (email, portal, phone) |
| Field | Type | Required | Description |
|---|---|---|---|
client | ClientIdentifier | Yes | Client/account reference |
site | SiteIdentifier | No | Site within client |
requester | RequesterIdentifier | No | Person who reported |
assignee | TechnicianIdentifier | No | Assigned technician |
techGroup | TechGroupIdentifier | No | Technician group |
| Field | Type | Required | Description |
|---|---|---|---|
priority | Enum | No | Critical, High, Medium, Low |
impact | Enum | No | Impact level |
urgency | Enum | No | Urgency level |
category | CategoryIdentifier | No | Service category |
mutation createTicket($input: CreateTicketInput!) {
createTicket(input: $input) {
ticketId
ticketNumber
subject
status
priority
createdTime
client {
accountId
name
}
assignee {
id
name
}
}
}
Variables:
{
"input": {
"subject": "Unable to access email - Outlook disconnected",
"description": "User reports Outlook showing disconnected status since 9am. Webmail works fine.",
"client": {
"accountId": "abc123"
},
"priority": "HIGH",
"requester": {
"email": "john.smith@acme.com"
},
"techGroup": {
"name": "Service Desk"
},
"category": {
"name": "Email"
}
}
}
query getTicketList($input: ListInfoInput!) {
getTicketList(input: $input) {
tickets {
ticketId
ticketNumber
subject
status
priority
createdTime
lastUpdatedTime
client {
accountId
name
}
assignee {
id
name
}
requester {
id
name
email
}
}
listInfo {
totalCount
hasNextPage
endCursor
}
}
}
Variables with Filters:
{
"input": {
"first": 50,
"filter": {
"status": ["Open", "In Progress"],
"priority": ["Critical", "High"],
"client": {
"accountId": "abc123"
}
},
"orderBy": {
"field": "createdTime",
"direction": "DESC"
}
}
}
query getTicket($input: TicketIdentifierInput!) {
getTicket(input: $input) {
ticketId
ticketNumber
subject
description
status
priority
impact
urgency
createdTime
lastUpdatedTime
client {
accountId
name
}
site {
id
name
}
requester {
id
name
email
phone
}
assignee {
id
name
email
}
techGroup {
id
name
}
category {
id
name
}
customFields {
name
value
}
}
}
Variables:
{
"input": {
"ticketId": "ticket-uuid-here"
}
}
mutation updateTicket($input: UpdateTicketInput!) {
updateTicket(input: $input) {
ticketId
ticketNumber
status
priority
assignee {
id
name
}
lastUpdatedTime
}
}
Variables - Assign and Change Status:
{
"input": {
"ticketId": "ticket-uuid-here",
"status": "In Progress",
"assignee": {
"id": "tech-uuid"
},
"priority": "HIGH"
}
}
Variables - Resolve Ticket:
{
"input": {
"ticketId": "ticket-uuid-here",
"status": "Resolved",
"resolution": "Cleared Outlook cache and repaired Office installation. Email flow restored."
}
}
mutation addTicketNote($input: AddTicketNoteInput!) {
addTicketNote(input: $input) {
noteId
content
createdTime
isPublic
createdBy {
id
name
}
}
}
Variables - Internal Note:
{
"input": {
"ticketId": "ticket-uuid-here",
"content": "Checked event logs - found KB5034441 update correlation. Known Outlook cache issue.",
"isPublic": false
}
}
Variables - Public Note (visible to client):
{
"input": {
"ticketId": "ticket-uuid-here",
"content": "We've identified the cause of the issue. A technician is working on the fix and will have it resolved within the hour.",
"isPublic": true
}
}
mutation addTicketTimeEntry($input: AddTimeEntryInput!) {
addTicketTimeEntry(input: $input) {
timeEntryId
ticketId
duration
description
technician {
id
name
}
createdTime
}
}
Variables:
{
"input": {
"ticketId": "ticket-uuid-here",
"duration": 30,
"description": "Troubleshooting Outlook connectivity, cleared cache, repaired Office installation",
"workType": "Remote Support",
"billable": true
}
}
# 1. Get unassigned tickets
query getUnassignedTickets($input: ListInfoInput!) {
getTicketList(input: $input) {
tickets {
ticketId
ticketNumber
subject
priority
client { name }
createdTime
}
}
}
Variables:
{
"input": {
"filter": {
"status": ["Open"],
"assignee": null
},
"orderBy": {
"field": "priority",
"direction": "DESC"
}
}
}
mutation escalateTicket($input: UpdateTicketInput!) {
updateTicket(input: $input) {
ticketId
status
priority
techGroup { name }
}
}
Variables:
{
"input": {
"ticketId": "ticket-uuid",
"priority": "CRITICAL",
"techGroup": {
"name": "Tier 2 Support"
},
"escalationReason": "Complex Exchange hybrid configuration issue"
}
}
| Error | Cause | Resolution |
|---|---|---|
| Client not found | Invalid client ID | Verify client exists |
| Invalid status transition | Workflow rule violation | Check allowed transitions |
| Required field missing | Missing subject/client | Add required fields |
| Permission denied | Insufficient access | Check user permissions |
| Rate limit exceeded | Over 800 req/min | Implement backoff |
// Validate before creating ticket
function validateTicketInput(input) {
const errors = [];
if (!input.subject || input.subject.trim().length === 0) {
errors.push('Subject is required');
}
if (!input.client?.accountId) {
errors.push('Client is required');
}
if (input.priority && !['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'].includes(input.priority)) {
errors.push('Invalid priority level');
}
return errors;
}