AgentSkillsCN

Assets

当您需要管理SuperOps.ai资产时,可使用此技能:查询库存、查看资产详情、运行脚本、监控补丁更新,并管理客户/站点的关联关系。本技能覆盖资产字段、状态、软件库存、磁盘使用率,以及通过RMM集成实现的活动追踪,是MSP技术人员通过SuperOps.ai管理终端设备的得力助手。

SKILL.md
--- frontmatter
description: >
  Use this skill when working with SuperOps.ai assets - querying inventory,
  viewing asset details, running scripts, monitoring patches, and managing
  client/site associations. Covers asset fields, statuses, software inventory,
  disk usage, and activity tracking through the RMM integration.
  Essential for MSP technicians managing endpoints through SuperOps.ai.
triggers:
  - superops asset
  - asset inventory
  - list assets superops
  - asset status
  - asset details
  - run script asset
  - patch status
  - software inventory
  - disk usage
  - asset activity
  - rmm superops
  - endpoint management

SuperOps.ai Asset Management

Overview

SuperOps.ai RMM provides comprehensive asset management capabilities. Assets represent managed endpoints (workstations, servers, network devices) with rich telemetry including hardware specs, software inventory, patch status, and activity history. This skill covers querying, managing, and automating actions on assets.

Asset Status Values

StatusDescriptionIndicator
OnlineAgent connected and reportingGreen
OfflineAgent not respondingRed
MaintenanceIn maintenance modeYellow

Asset Platform Types

PlatformDescription
WindowsWindows workstations and servers
macOSApple Mac computers
LinuxLinux distributions

Key Asset Fields

Core Fields

FieldTypeDescription
assetIdIDUnique identifier
nameStringComputer/device name
statusEnumOnline, Offline, Maintenance
platformEnumWindows, macOS, Linux
lastSeenDateTimeLast check-in time
agentVersionStringRMM agent version

Network Fields

FieldTypeDescription
ipAddressStringPrimary IP address
macAddressStringMAC address
publicIpStringExternal IP
hostnameStringNetwork hostname

Hardware Fields

FieldTypeDescription
manufacturerStringHardware manufacturer
modelStringDevice model
serialNumberStringSerial number
processorNameStringCPU model
processorCoresIntCPU core count
totalMemoryLongRAM in bytes
totalDiskSpaceLongTotal disk space
freeDiskSpaceLongAvailable disk space

Operating System Fields

FieldTypeDescription
osNameStringOperating system name
osVersionStringOS version
osBuildStringOS build number
architectureString32-bit or 64-bit

Association Fields

FieldTypeDescription
clientClientAssociated client
siteSiteAssociated site
tags[String]Asset tags
customFields[CustomField]Custom field values

GraphQL Operations

List Assets

graphql
query getAssetList($input: ListInfoInput!) {
  getAssetList(input: $input) {
    assets {
      assetId
      name
      status
      platform
      lastSeen
      ipAddress
      osName
      osVersion
      client {
        accountId
        name
      }
      site {
        id
        name
      }
      patchStatus {
        pendingCount
        installedCount
        failedCount
      }
    }
    listInfo {
      totalCount
      hasNextPage
      endCursor
    }
  }
}

Variables - All Online Assets:

json
{
  "input": {
    "first": 100,
    "filter": {
      "status": "Online"
    },
    "orderBy": {
      "field": "name",
      "direction": "ASC"
    }
  }
}

Variables - Filter by Client and Platform:

json
{
  "input": {
    "first": 50,
    "filter": {
      "client": {
        "accountId": "client-uuid"
      },
      "platform": "Windows",
      "status": "Online"
    }
  }
}

Get Asset Details

graphql
query getAsset($input: AssetIdentifierInput!) {
  getAsset(input: $input) {
    assetId
    name
    status
    platform
    lastSeen

    # Network
    ipAddress
    macAddress
    publicIp
    hostname

    # Hardware
    manufacturer
    model
    serialNumber
    processorName
    processorCores
    totalMemory

    # OS
    osName
    osVersion
    osBuild
    architecture

    # Disk
    totalDiskSpace
    freeDiskSpace

    # Associations
    client {
      accountId
      name
    }
    site {
      id
      name
      address
    }
    tags
    customFields {
      name
      value
    }

    # Agent
    agentVersion
    agentInstallDate
  }
}

Variables:

json
{
  "input": {
    "assetId": "asset-uuid-here"
  }
}

Get Asset Software List

graphql
query getAssetSoftwareList($input: AssetSoftwareListInput!) {
  getAssetSoftwareList(input: $input) {
    software {
      name
      version
      publisher
      installDate
      size
    }
    listInfo {
      totalCount
      hasNextPage
      endCursor
    }
  }
}

Variables:

json
{
  "input": {
    "assetId": "asset-uuid",
    "first": 100,
    "filter": {
      "name": "Microsoft"
    }
  }
}

Get Asset Disk Details

graphql
query getAssetDiskDetails($input: AssetIdentifierInput!) {
  getAssetDiskDetails(input: $input) {
    disks {
      driveLetter
      volumeName
      fileSystem
      totalSpace
      freeSpace
      usedPercentage
    }
  }
}

Get Asset Patch Details

graphql
query getAssetPatchDetails($input: AssetPatchInput!) {
  getAssetPatchDetails(input: $input) {
    patches {
      patchId
      title
      severity
      status
      releaseDate
      kbNumber
      category
    }
    summary {
      pendingCount
      installedCount
      failedCount
      lastScanDate
    }
  }
}

Variables:

json
{
  "input": {
    "assetId": "asset-uuid",
    "filter": {
      "status": "Pending",
      "severity": ["Critical", "Important"]
    }
  }
}

Get Asset Activity

graphql
query getAssetActivity($input: AssetActivityInput!) {
  getAssetActivity(input: $input) {
    activities {
      activityId
      type
      description
      timestamp
      performedBy {
        id
        name
      }
      result
    }
    listInfo {
      totalCount
      hasNextPage
    }
  }
}

Run Script on Asset

graphql
mutation runScriptOnAsset($input: RunScriptInput!) {
  runScriptOnAsset(input: $input) {
    actionConfigId
    script {
      scriptId
      name
    }
    arguments {
      name
      value
    }
    status
    scheduledTime
  }
}

Variables:

json
{
  "input": {
    "assetId": "asset-uuid",
    "scriptId": "script-uuid",
    "arguments": [
      {
        "name": "param1",
        "value": "value1"
      }
    ],
    "runAs": "System",
    "priority": "Normal"
  }
}

Bulk Script Execution

graphql
mutation runScriptOnAssets($input: RunScriptOnAssetsInput!) {
  runScriptOnAssets(input: $input) {
    batchId
    assetsCount
    status
    scheduledTime
  }
}

Variables:

json
{
  "input": {
    "assetIds": ["asset-1", "asset-2", "asset-3"],
    "scriptId": "script-uuid",
    "runAs": "System"
  }
}

Common Workflows

Asset Health Check

graphql
# Query assets with low disk space
query getLowDiskAssets($input: ListInfoInput!) {
  getAssetList(input: $input) {
    assets {
      assetId
      name
      freeDiskSpace
      totalDiskSpace
      client { name }
    }
  }
}

Variables:

json
{
  "input": {
    "filter": {
      "status": "Online",
      "diskSpacePercentFree": {
        "lt": 10
      }
    }
  }
}

Patch Compliance Report

graphql
query getPatchCompliance($input: ListInfoInput!) {
  getAssetList(input: $input) {
    assets {
      assetId
      name
      client { name }
      patchStatus {
        pendingCount
        installedCount
        failedCount
        lastScanDate
      }
    }
  }
}

Variables:

json
{
  "input": {
    "filter": {
      "patchStatus": {
        "hasPending": true,
        "severity": ["Critical"]
      }
    }
  }
}

Software Audit

graphql
# Find assets with specific software
query findAssetsWithSoftware($input: ListInfoInput!) {
  getAssetList(input: $input) {
    assets {
      assetId
      name
      client { name }
    }
  }
}

Variables:

json
{
  "input": {
    "filter": {
      "software": {
        "name": "TeamViewer"
      }
    }
  }
}

Error Handling

Common Errors

ErrorCauseResolution
Asset not foundInvalid asset IDVerify asset exists
Asset offlineAgent not respondingCheck network connectivity
Script failedExecution errorCheck script logs
Permission deniedInsufficient accessCheck user permissions
Rate limit exceededOver 800 req/minImplement backoff

Asset Status Checks

javascript
// Check if asset is available for remote actions
function canRunRemoteAction(asset) {
  if (asset.status !== 'Online') {
    return {
      canRun: false,
      reason: `Asset is ${asset.status}. Last seen: ${asset.lastSeen}`
    };
  }

  const lastSeenMinutes = (Date.now() - new Date(asset.lastSeen)) / 60000;
  if (lastSeenMinutes > 5) {
    return {
      canRun: false,
      reason: `Asset hasn't checked in for ${Math.round(lastSeenMinutes)} minutes`
    };
  }

  return { canRun: true };
}

Best Practices

  1. Filter queries - Always use filters to limit result sets
  2. Check status first - Verify asset is online before running scripts
  3. Use pagination - Handle large asset lists with cursor pagination
  4. Cache static data - Cache client/site associations locally
  5. Monitor execution - Track script execution results
  6. Set appropriate timeouts - Long-running scripts need adequate timeouts
  7. Log activities - Document remote actions for audit trails

Related Skills