Source profileQuality 98/100

WYRE-AI/msp-claude-plugins/msp-claude-plugins/connectwise/automate/skills/alerts/SKILL.md

ConnectWise Automate Alerts

ConnectWise Automate alert management: alert sources (monitors, scripts, events), severity levels, lifecycle states, acknowledgment, resolution, history tracking, and PSA ticket creation from alerts.

Source repository stars
42
Declared platforms
0
Static risk flags
0
Last source update
2026-08-28
Source checked
2026-08-28

Decision brief

What it does: where it fits

ConnectWise Automate alert management: alert sources (monitors, scripts, events), severity levels, lifecycle states, acknowledgment, resolution, history tracking, and PSA ticket creation from alerts.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/connectwise/automate/skills/alerts"
    Safe inspection promptEditorial

    Inspect the Agent Skill "ConnectWise Automate Alerts" from https://github.com/WYRE-AI/msp-claude-plugins/blob/5005f73ba2f52cd299f58aa6bb79f4e70ae87103/msp-claude-plugins/connectwise/automate/skills/alerts/SKILL.md at commit 5005f73ba2f52cd299f58aa6bb79f4e70ae87103. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Acknowledge and Create Ticket Workflow

      Review the “Acknowledge and Create Ticket Workflow” section in the pinned source before continuing.

      Review and apply the “Acknowledge and Create Ticket Workflow” source section.
    2. 02

      Anti-triggers

      The rule that produced the alert — thresholds, templates and

      The rule that produced the alert — thresholds, templates andThe PSA ticket raised from an alert — this skill covers dispatchingAnother RMM's alerts — Datto RMM, NinjaOne, Atera and Auvik all use
    3. 03

      Key Concepts

      See references/fields.md for the complete Alert and AlertHistory field reference.

      See references/fields.md for the complete Alert and AlertHistory field reference.
    4. 04

      Alert Sources

      Review the “Alert Sources” section in the pinned source before continuing.

      Review and apply the “Alert Sources” source section.
    5. 05

      Alert Severity Levels

      Review the “Alert Severity Levels” section in the pinned source before continuing.

      Review and apply the “Alert Severity Levels” source section.

    Permission review

    Static risk signals and limitations

    No configured static risk pattern was detected

    This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score98/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars42SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    WYRE-AI/msp-claude-plugins
    Skill path
    msp-claude-plugins/connectwise/automate/skills/alerts/SKILL.md
    Commit
    5005f73ba2f52cd299f58aa6bb79f4e70ae87103
    License
    Apache-2.0
    Collected
    2026-08-28
    Default branch
    main
    View the original SKILL.md

    ConnectWise Automate Alert Management

    Overview

    Alerts in ConnectWise Automate are notifications generated by monitors, scripts, or system events that require attention. This skill covers alert listing, acknowledgment, history tracking, and ticket creation workflows.

    Anti-triggers

    • The rule that produced the alert — thresholds, templates and assignment are monitor configuration; use connectwise-automate-monitors.
    • The PSA ticket raised from an alert — this skill covers dispatching it; the ticket's board, status, priority and SLA clock live in ConnectWise PSA. Use connectwise-psa-tickets.
    • Another RMM's alerts — Datto RMM, NinjaOne, Atera and Auvik all use the word; use datto-rmm-alerts, ninjaone-alerts, atera-alerts or auvik-alerts.

    Key Concepts

    Alert Sources

    SourceDescriptionExample
    MonitorGenerated by monitor thresholdCPU > 90%
    ScriptGenerated by script executionBackup failed
    Event LogWindows Event Log triggerSecurity event
    SystemAutomate system eventsAgent offline
    ManualUser-created alertsMaintenance note

    Alert Severity Levels

    LevelValueDescriptionResponse Time
    Information1Informational onlyReview at convenience
    Warning2Potential issueInvestigate within hours
    Error3Failure detectedRespond within SLA
    Critical4Severe/emergencyImmediate response

    Alert Lifecycle

    Generated → Active → Acknowledged → Resolved
                  │           │
                  │           └── Ticket Created
                  │
                  └── Auto-Cleared (if condition clears)
    

    Alert Status

    StatusDescription
    NewJust generated, unread
    ActiveOpen, unacknowledged
    AcknowledgedSomeone is working on it
    ResolvedIssue fixed, alert closed
    ClearedCondition auto-cleared
    SuppressedTemporarily hidden

    See references/fields.md for the complete Alert and AlertHistory field reference.

    API Patterns

    Alerts are managed through /cwa/api/v1/Alerts endpoints using a SQL-like condition query parameter for filtering (not standard REST query params):

    GET /cwa/api/v1/Alerts?condition=Status in ('New','Active')&pageSize=100
    Authorization: Bearer {token}
    

    Action endpoints (Acknowledge, Resolve, Suppress, CreateTicket) are POST requests to /Alerts/{alertID}/{Action} and most require a Notes field in the body. A bulk acknowledgment endpoint exists at /Alerts/BulkAcknowledge for handling related alerts together.

    See references/api.md for the complete endpoint catalog with request/response examples (list, filter by client/severity, acknowledge, resolve, add note, create ticket, get history, suppress, bulk acknowledge).

    Workflows

    Get Critical Alerts Dashboard

    async function getCriticalAlertsDashboard(client) {
      const criticalAlerts = await client.request(
        `/Alerts?condition=Severity >= 3 and Status in ('New','Active')&pageSize=100`
      );
    
      const dashboard = {
        totalCritical: criticalAlerts.length,
        byClient: {},
        byCategory: {},
        oldest: null
      };
    
      for (const alert of criticalAlerts) {
        // Group by client
        const clientName = alert.ClientName || 'Unknown';
        if (!dashboard.byClient[clientName]) {
          dashboard.byClient[clientName] = [];
        }
        dashboard.byClient[clientName].push({
          id: alert.AlertID,
          subject: alert.Subject,
          computer: alert.ComputerName,
          severity: alert.Severity,
          age: getAlertAge(alert.TimeGenerated)
        });
    
        // Group by category
        const category = alert.Category || 'Uncategorized';
        dashboard.byCategory[category] = (dashboard.byCategory[category] || 0) + 1;
    
        // Track oldest
        if (!dashboard.oldest || new Date(alert.TimeGenerated) < new Date(dashboard.oldest.TimeGenerated)) {
          dashboard.oldest = alert;
        }
      }
    
      return dashboard;
    }
    
    function getAlertAge(timeGenerated) {
      const now = new Date();
      const generated = new Date(timeGenerated);
      const diffMs = now - generated;
      const diffMins = Math.floor(diffMs / 60000);
    
      if (diffMins < 60) return `${diffMins} minutes`;
      if (diffMins < 1440) return `${Math.floor(diffMins / 60)} hours`;
      return `${Math.floor(diffMins / 1440)} days`;
    }
    

    Acknowledge and Create Ticket Workflow

    async function acknowledgeAndCreateTicket(client, alertId, options = {}) {
      const {
        notes = 'Acknowledged and ticket created',
        priority = 2,
        boardId = 1
      } = options;
    
      // Get alert details
      const alert = await client.request(`/Alerts/${alertId}`);
    
      // Acknowledge the alert
      await client.request(`/Alerts/${alertId}/Acknowledge`, {
        method: 'POST',
        body: JSON.stringify({ Notes: notes })
      });
    
      // Create ticket
      const ticketResponse = await client.request(`/Alerts/${alertId}/CreateTicket`, {
        method: 'POST',
        body: JSON.stringify({
          TicketSubject: alert.Subject,
          Priority: alert.Severity >= 3 ? 1 : priority,
          BoardID: boardId,
          Notes: `Auto-created from Automate alert\n\n${alert.Message}`
        })
      });
    
      return {
        alert: {
          id: alertId,
          subject: alert.Subject,
          status: 'Acknowledged'
        },
        ticket: {
          id: ticketResponse.TicketID,
          number: ticketResponse.TicketNumber
        }
      };
    }
    

    Alert Triage by Client

    async function triageAlertsByClient(client, clientId) {
      const alerts = await client.request(
        `/Alerts?condition=ClientID = ${clientId} and Status in ('New','Active')&pageSize=200`
      );
    
      const triage = {
        client: clientId,
        total: alerts.length,
        critical: [],
        error: [],
        warning: [],
        info: []
      };
    
      for (const alert of alerts) {
        const summary = {
          id: alert.AlertID,
          subject: alert.Subject,
          computer: alert.ComputerName,
          source: alert.SourceName,
          age: getAlertAge(alert.TimeGenerated)
        };
    
        switch (alert.Severity) {
          case 4: triage.critical.push(summary); break;
          case 3: triage.error.push(summary); break;
          case 2: triage.warning.push(summary); break;
          default: triage.info.push(summary);
        }
      }
    
      return triage;
    }
    

    Bulk Alert Resolution

    async function bulkResolveAlerts(client, alertIds, notes) {
      const results = [];
    
      for (const alertId of alertIds) {
        try {
          await client.request(`/Alerts/${alertId}/Resolve`, {
            method: 'POST',
            body: JSON.stringify({ Notes: notes })
          });
          results.push({ alertId, status: 'resolved' });
        } catch (error) {
          results.push({ alertId, status: 'failed', error: error.message });
        }
    
        // Respect rate limits
        await sleep(100);
      }
    
      return {
        resolved: results.filter(r => r.status === 'resolved').length,
        failed: results.filter(r => r.status === 'failed').length,
        details: results
      };
    }
    

    Alert Escalation Check

    async function checkAlertEscalation(client) {
      const alerts = await client.request(
        `/Alerts?condition=Status = 'Active' and Severity >= 2&pageSize=500`
      );
    
      const escalations = [];
      const now = new Date();
    
      for (const alert of alerts) {
        const generated = new Date(alert.TimeGenerated);
        const ageMinutes = (now - generated) / 60000;
    
        // Escalation rules based on severity and age
        let shouldEscalate = false;
        let reason = '';
    
        switch (alert.Severity) {
          case 4: // Critical
            if (ageMinutes > 15) {
              shouldEscalate = true;
              reason = 'Critical alert unacknowledged for 15+ minutes';
            }
            break;
          case 3: // Error
            if (ageMinutes > 60) {
              shouldEscalate = true;
              reason = 'Error alert unacknowledged for 1+ hour';
            }
            break;
          case 2: // Warning
            if (ageMinutes > 240) {
              shouldEscalate = true;
              reason = 'Warning alert unacknowledged for 4+ hours';
            }
            break;
        }
    
        if (shouldEscalate) {
          escalations.push({
            alertId: alert.AlertID,
            subject: alert.Subject,
            client: alert.ClientName,
            computer: alert.ComputerName,
            severity: alert.Severity,
            ageMinutes: Math.round(ageMinutes),
            reason
          });
        }
      }
    
      return escalations;
    }
    

    Error Handling

    Common Alert API Errors

    ErrorStatusCauseResolution
    Alert not found404Invalid AlertIDVerify alert exists
    Already resolved400Alert already closedCheck current status
    Permission denied403No access to alertCheck user permissions
    Invalid status400Invalid status transitionFollow lifecycle rules
    Ticket creation failed400PSA integration errorCheck ticket board config

    See references/examples.md for a sample error response, a safe-resolve helper that checks status before resolving, and a full multi-step alert response workflow template.

    Best Practices

    1. Acknowledge promptly - Shows someone is working on it
    2. Add meaningful notes - Document investigation steps
    3. Create tickets for tracking - Long-running issues need tickets
    4. Use bulk operations - Handle related alerts together
    5. Set up escalation rules - Don't let alerts age
    6. Filter by severity - Focus on critical first
    7. Review alert history - Understand recurring patterns and audit old/stale alerts
    8. Suppress during maintenance - Avoid alert fatigue
    9. Link to documentation - Reference runbooks in notes

    Related Skills

    Frequently asked questions

    What to verify before installation and use

    What does the ConnectWise Automate Alerts source document cover?

    ConnectWise Automate alert management: alert sources (monitors, scripts, events), severity levels, lifecycle states, acknowledgment, resolution, history tracking, and PSA ticket creation from alerts.

    How do I install ConnectWise Automate Alerts?

    The source record exposes this install command: npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/connectwise/automate/skills/alerts". Inspect the command and pinned source before running it.

    Alternatives

    Compare before choosing

    Computed 10029,236

    garrytan/gbrain

    bulk-ingestion

    End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.

    Computed 10025,136

    alirezarezvani/claude-skills

    app-store-optimization

    App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist

    Computed 1005,277

    dotnet/skills

    migrate-vstest-to-mtp

    Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing

    Computed 100147

    oaustegard/claude-skills

    featuring

    Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre