Files
unraid-mcp/docs/unraid-schema.graphql

1382 lines
23 KiB
GraphQL

# Unraid GraphQL API Schema (SDL)
# Extracted from live introspection of the Unraid API.
# Used for offline validation of MCP tool queries and mutations.
# ============================================================================
# Custom Scalars
# ============================================================================
scalar BigInt
scalar DateTime
scalar JSON
scalar PrefixedID
scalar Port
# ============================================================================
# Enums
# ============================================================================
enum ArrayState {
DISABLE_DISK
INVALID_EXPANSION
NEW_ARRAY
NEW_DISK_TOO_SMALL
NO_DATA_DISKS
PARITY_NOT_BIGGEST
RECON_DISK
STARTED
STOPPED
SWAP_DSBL
TOO_MANY_MISSING_DISKS
}
enum ArrayStateInputState {
START
STOP
}
enum ArrayDiskFsColor {
BLUE_BLINK
BLUE_ON
GREEN_BLINK
GREEN_ON
GREY_OFF
RED_OFF
RED_ON
YELLOW_BLINK
YELLOW_ON
}
enum ArrayDiskStatus {
DISK_DSBL
DISK_DSBL_NEW
DISK_INVALID
DISK_NEW
DISK_NP
DISK_NP_DSBL
DISK_NP_MISSING
DISK_OK
DISK_WRONG
}
enum ArrayDiskType {
CACHE
DATA
FLASH
PARITY
}
enum AuthAction {
CREATE_ANY
CREATE_OWN
DELETE_ANY
DELETE_OWN
READ_ANY
READ_OWN
UPDATE_ANY
UPDATE_OWN
}
enum ContainerPortType {
TCP
UDP
}
enum ContainerState {
EXITED
RUNNING
}
enum ConfigErrorState {
INELIGIBLE
INVALID
NO_KEY_SERVER
UNKNOWN_ERROR
WITHDRAWN
}
enum DiskFsType {
BTRFS
EXT4
NTFS
VFAT
XFS
ZFS
}
enum DiskInterfaceType {
PCIE
SAS
SATA
UNKNOWN
USB
}
enum DiskSmartStatus {
OK
UNKNOWN
}
enum NotificationImportance {
ALERT
INFO
WARNING
}
enum NotificationType {
ARCHIVE
UNREAD
}
enum ParityCheckStatus {
CANCELLED
COMPLETED
FAILED
NEVER_RUN
PAUSED
RUNNING
}
enum Resource {
ACTIVATION_CODE
API_KEY
ARRAY
CLOUD
CONFIG
CONNECT
CONNECT__REMOTE_ACCESS
CUSTOMIZATIONS
DASHBOARD
DISK
DISPLAY
DOCKER
FLASH
INFO
LOGS
ME
NETWORK
NOTIFICATIONS
ONLINE
OS
OWNER
PERMISSION
REGISTRATION
SERVERS
SERVICES
SHARE
VARS
VMS
WELCOME
}
enum Role {
ADMIN
CONNECT
GUEST
VIEWER
}
enum RegistrationState {
BASIC
EBLACKLISTED
EBLACKLISTED1
EBLACKLISTED2
EEXPIRED
EGUID
EGUID1
ENOCONN
ENOFLASH
ENOFLASH1
ENOFLASH2
ENOFLASH3
ENOFLASH4
ENOFLASH5
ENOFLASH6
ENOFLASH7
ENOKEYFILE
ENOKEYFILE1
ENOKEYFILE2
ETRIAL
LIFETIME
PLUS
PRO
STARTER
TRIAL
UNLEASHED
}
enum registrationType {
BASIC
INVALID
LIFETIME
PLUS
PRO
STARTER
TRIAL
UNLEASHED
}
enum ServerStatus {
NEVER_CONNECTED
OFFLINE
ONLINE
}
enum Temperature {
CELSIUS
FAHRENHEIT
}
enum ThemeName {
azure
black
gray
white
}
enum UpdateStatus {
REBUILD_READY
UNKNOWN
UPDATE_AVAILABLE
UP_TO_DATE
}
enum VmState {
CRASHED
IDLE
NOSTATE
PAUSED
PMSUSPENDED
RUNNING
SHUTDOWN
SHUTOFF
}
enum UPSCableType {
CUSTOM
ETHER
SIMPLE
SMART
USB
}
enum UPSKillPower {
NO
YES
}
enum UPSServiceState {
DISABLE
ENABLE
}
enum UPSType {
APCSMART
DUMB
MODBUS
NET
PCNET
SNMP
USB
}
# ============================================================================
# Interfaces
# ============================================================================
interface Node {
id: PrefixedID!
}
# ============================================================================
# Input Types
# ============================================================================
input AddPermissionInput {
actions: [AuthAction!]!
resource: Resource!
}
input ArrayDiskInput {
id: PrefixedID!
slot: Int
}
input ArrayStateInput {
desiredState: ArrayStateInputState!
}
input CreateApiKeyInput {
description: String
name: String!
overwrite: Boolean
permissions: [AddPermissionInput!]
roles: [Role!]
}
input UpdateApiKeyInput {
description: String
id: PrefixedID!
name: String
permissions: [AddPermissionInput!]
roles: [Role!]
}
input DeleteApiKeyInput {
ids: [PrefixedID!]!
}
# Alias used in keys.py (deleteApiKeys at root level)
input DeleteApiKeysInput {
ids: [PrefixedID!]!
}
input CreateRCloneRemoteInput {
name: String!
parameters: JSON!
type: String!
}
input DeleteRCloneRemoteInput {
name: String!
}
input RCloneConfigFormInput {
parameters: JSON
providerType: String
showAdvanced: Boolean
}
input NotificationFilter {
importance: NotificationImportance
limit: Int!
offset: Int!
type: NotificationType!
}
input NotificationData {
description: String!
importance: NotificationImportance!
link: String
subject: String!
title: String!
}
# Alias used in notifications.py create mutation
input CreateNotificationInput {
description: String!
importance: NotificationImportance!
link: String
subject: String!
title: String!
}
input UPSConfigInput {
batteryLevel: Int
customUpsCable: String
device: String
killUps: UPSKillPower
minutes: Int
overrideUpsCapacity: Int
service: UPSServiceState
timeout: Int
upsCable: UPSCableType
upsType: UPSType
}
# ============================================================================
# Object Types
# ============================================================================
type Capacity {
free: String!
total: String!
used: String!
}
type ArrayCapacity {
disks: Capacity!
kilobytes: Capacity!
}
type ArrayDisk implements Node {
id: PrefixedID!
idx: Int!
name: String
device: String
size: BigInt
status: ArrayDiskStatus
rotational: Boolean
temp: Int
numReads: BigInt
numWrites: BigInt
numErrors: BigInt
fsSize: BigInt
fsFree: BigInt
fsUsed: BigInt
exportable: Boolean
type: ArrayDiskType!
warning: Int
critical: Int
fsType: String
comment: String
format: String
transport: String
color: ArrayDiskFsColor
isSpinning: Boolean
}
type UnraidArray implements Node {
id: PrefixedID!
state: ArrayState!
capacity: ArrayCapacity!
boot: ArrayDisk
parities: [ArrayDisk!]!
disks: [ArrayDisk!]!
caches: [ArrayDisk!]!
parityCheckStatus: ParityCheck!
}
type ParityCheck {
correcting: Boolean
date: DateTime
duration: Int
errors: Int
paused: Boolean
progress: Int
running: Boolean
speed: String
status: ParityCheckStatus!
}
type ParityCheckMutations {
start(correct: Boolean): JSON!
pause: JSON!
resume: JSON!
cancel: JSON!
}
type ArrayMutations {
addDiskToArray(input: ArrayDiskInput!): UnraidArray!
clearArrayDiskStatistics(id: PrefixedID!): Boolean!
mountArrayDisk(id: PrefixedID!): ArrayDisk!
removeDiskFromArray(input: ArrayDiskInput!): UnraidArray!
setState(input: ArrayStateInput!): UnraidArray!
unmountArrayDisk(id: PrefixedID!): ArrayDisk!
}
type Config implements Node {
id: PrefixedID!
valid: Boolean
error: String
}
type CoreVersions {
api: String
unraid: String
}
type PackageVersions {
docker: String
git: String
nginx: String
node: String
npm: String
php: String
pm2: String
}
type InfoVersions implements Node {
id: PrefixedID!
core: CoreVersions!
packages: PackageVersions
}
type InfoOs implements Node {
id: PrefixedID!
platform: String
distro: String
release: String
codename: String
arch: String
hostname: String
logofile: String
serial: String
build: String
uptime: String
fqdn: String
servicepack: String
uefi: Boolean
}
type InfoCpu implements Node {
id: PrefixedID!
manufacturer: String
brand: String
vendor: String
family: String
model: String
stepping: Int
revision: String
voltage: String
speed: Float
speedmin: Float
speedmax: Float
threads: Int
cores: Int
processors: Int
socket: String
cache: JSON
flags: [String!]
packages: CpuPackages!
topology: [[[Int!]!]!]!
}
type CpuLoad {
percentGuest: Float!
percentIdle: Float!
percentIrq: Float!
percentNice: Float!
percentSteal: Float!
percentSystem: Float!
percentTotal: Float!
percentUser: Float!
}
type CpuPackages implements Node {
id: PrefixedID!
power: [Float!]!
temp: [Float!]!
totalPower: Float!
}
type CpuUtilization implements Node {
id: PrefixedID!
cpus: [CpuLoad!]!
percentTotal: Float!
}
type MemoryLayout implements Node {
id: PrefixedID!
bank: String
type: String
clockSpeed: Int
formFactor: String
manufacturer: String
partNum: String
serialNum: String
size: BigInt!
voltageConfigured: Int
voltageMax: Int
voltageMin: Int
}
type InfoMemory implements Node {
id: PrefixedID!
layout: [MemoryLayout!]!
}
type MemoryUtilization implements Node {
id: PrefixedID!
active: BigInt!
available: BigInt!
buffcache: BigInt!
free: BigInt!
percentSwapTotal: Float!
percentTotal: Float!
swapFree: BigInt!
swapTotal: BigInt!
swapUsed: BigInt!
total: BigInt!
used: BigInt!
}
type InfoBaseboard implements Node {
id: PrefixedID!
manufacturer: String
model: String
version: String
serial: String
assetTag: String
memMax: Float
memSlots: Float
}
type InfoSystem implements Node {
id: PrefixedID!
manufacturer: String
model: String
version: String
serial: String
uuid: String
sku: String
virtual: Boolean
}
type InfoGpu implements Node {
id: PrefixedID!
blacklisted: Boolean!
class: String!
productid: String!
type: String!
typeid: String!
vendorname: String
}
type InfoNetwork implements Node {
id: PrefixedID!
iface: String!
mac: String
model: String
speed: String
vendor: String
virtual: Boolean
dhcp: Boolean
}
type InfoPci implements Node {
id: PrefixedID!
blacklisted: String!
class: String!
productid: String!
productname: String
type: String!
typeid: String!
vendorid: String!
vendorname: String
}
type InfoUsb implements Node {
id: PrefixedID!
bus: String
device: String
name: String!
}
type InfoDevices implements Node {
id: PrefixedID!
gpu: [InfoGpu!]
network: [InfoNetwork!]
pci: [InfoPci!]
usb: [InfoUsb!]
}
type InfoDisplayCase implements Node {
id: PrefixedID!
base64: String!
error: String!
icon: String!
url: String!
}
type InfoDisplay implements Node {
id: PrefixedID!
case: InfoDisplayCase!
critical: Int!
hot: Int!
locale: String
max: Int
resize: Boolean!
scale: Boolean!
tabs: Boolean!
text: Boolean!
theme: ThemeName!
total: Boolean!
unit: Temperature!
usage: Boolean!
warning: Int!
wwn: Boolean!
}
type Info implements Node {
id: PrefixedID!
os: InfoOs!
cpu: InfoCpu!
memory: InfoMemory!
baseboard: InfoBaseboard!
system: InfoSystem!
versions: InfoVersions!
devices: InfoDevices!
display: InfoDisplay!
machineId: ID
time: DateTime!
}
type MetricsCpu {
percentTotal: Float!
cpus: [CPULoad!]!
}
type MetricsMemory {
used: Float
total: Float
}
type Metrics implements Node {
id: PrefixedID!
cpu: MetricsCpu
memory: MetricsMemory
}
type Service implements Node {
id: PrefixedID!
name: String
online: Boolean
uptime: Uptime
version: String
}
type Uptime {
timestamp: String
}
type AccessUrl {
type: String
name: String
ipv4: String
ipv6: String
}
type Network implements Node {
id: PrefixedID!
accessUrls: [AccessUrl!]
}
type KeyFile {
contents: String
location: String
}
type Registration implements Node {
id: PrefixedID!
type: registrationType
keyFile: KeyFile
state: RegistrationState
expiration: String
updateExpiration: String
}
type Owner {
username: String!
avatar: String!
url: String!
}
type ProfileModel implements Node {
id: PrefixedID!
avatar: String!
url: String!
username: String!
}
type Server implements Node {
id: PrefixedID!
name: String!
status: ServerStatus!
description: String
ip: String
port: Int
guid: String!
apikey: String!
lanip: String!
localurl: String!
remoteurl: String!
owner: ProfileModel!
wanip: String!
}
type Flash implements Node {
id: PrefixedID!
guid: String!
product: String!
vendor: String!
size: BigInt
}
type Vars implements Node {
id: PrefixedID!
version: String
name: String
timeZone: String
comment: String
security: String
workgroup: String
domain: String
domainShort: String
hideDotFiles: Boolean
localMaster: Boolean
enableFruit: String
useNtp: Boolean
domainLogin: String
sysModel: String
sysFlashSlots: Int
useSsl: Boolean
port: Int
portssl: Int
localTld: String
bindMgt: Boolean
useTelnet: Boolean
porttelnet: Int
useSsh: Boolean
portssh: Int
startPage: String
startArray: Boolean
shutdownTimeout: Int
shareSmbEnabled: Boolean
shareNfsEnabled: Boolean
shareAfpEnabled: Boolean
shareCacheEnabled: Boolean
shareAvahiEnabled: Boolean
safeMode: Boolean
startMode: String
configValid: Boolean
configError: ConfigErrorState
joinStatus: String
deviceCount: Int
flashGuid: String
flashProduct: String
flashVendor: String
mdState: String
mdVersion: String
shareCount: Int
shareSmbCount: Int
shareNfsCount: Int
shareAfpCount: Int
shareMoverActive: Boolean
csrfToken: String
}
type ApiConfig {
extraOrigins: [String!]!
plugins: [String!]!
sandbox: Boolean
ssoSubIds: [String!]!
version: String!
}
type SsoSettings implements Node {
id: PrefixedID!
oidcProviders: [OidcProvider!]!
}
type OidcProvider {
id: PrefixedID!
name: String!
clientId: String!
clientSecret: String
issuer: String
authorizationEndpoint: String
tokenEndpoint: String
jwksUri: String
scopes: [String!]!
buttonText: String
buttonIcon: String
buttonStyle: String
buttonVariant: String
authorizationRuleMode: String
authorizationRules: [JSON!]
}
type UnifiedSettings implements Node {
id: PrefixedID!
dataSchema: JSON!
uiSchema: JSON!
values: JSON!
}
type Settings implements Node {
id: PrefixedID!
api: ApiConfig!
sso: SsoSettings!
unified: UnifiedSettings!
}
type UPSBattery {
chargeLevel: Int!
estimatedRuntime: Int!
health: String!
}
type UPSPower {
inputVoltage: Float!
loadPercentage: Int!
outputVoltage: Float!
}
type UPSDevice {
id: ID!
model: String!
name: String!
status: String!
battery: UPSBattery!
power: UPSPower!
# Flattened fields used by MCP tool queries
runtime: Int
charge: Int
load: Int
voltage: Float
frequency: Float
temperature: Float
}
type UPSConfiguration {
enabled: Boolean
mode: String
cable: String
driver: String
port: String
batteryLevel: Int
customUpsCable: String
device: String
killUps: String
minutes: Int
modelName: String
netServer: String
nisIp: String
overrideUpsCapacity: Int
service: String
timeout: Int
upsCable: String
upsName: String
upsType: String
}
type Share implements Node {
id: PrefixedID!
name: String
free: BigInt
used: BigInt
size: BigInt
include: [String!]
exclude: [String!]
cache: Boolean
nameOrig: String
comment: String
allocator: String
splitLevel: String
floor: String
cow: String
color: String
luksStatus: String
}
type Disk implements Node {
id: PrefixedID!
device: String!
name: String!
serialNum: String!
size: Float!
temperature: Float
bytesPerSector: Float!
firmwareRevision: String!
interfaceType: DiskInterfaceType!
isSpinning: Boolean!
partitions: [DiskPartition!]!
sectorsPerTrack: Float!
smartStatus: DiskSmartStatus!
totalCylinders: Float!
totalHeads: Float!
totalSectors: Float!
totalTracks: Float!
tracksPerCylinder: Float!
type: String!
vendor: String!
}
type DiskPartition {
fsType: DiskFsType!
name: String!
size: Float!
}
type UnassignedDevice {
id: PrefixedID!
device: String
name: String
size: BigInt
type: String
}
type LogFile {
name: String!
path: String!
size: Int!
modifiedAt: DateTime!
}
type LogFileContent {
path: String!
content: String!
totalLines: Int!
startLine: Int
}
type ContainerPort {
ip: String
privatePort: Port
publicPort: Port
type: ContainerPortType!
}
type ContainerHostConfig {
networkMode: String!
}
type DockerContainer implements Node {
id: PrefixedID!
names: [String!]!
image: String!
imageId: String!
command: String!
created: Int!
ports: [ContainerPort!]!
sizeRootFs: BigInt
labels: JSON
state: ContainerState!
status: String!
hostConfig: ContainerHostConfig
networkSettings: JSON
mounts: [JSON!]
autoStart: Boolean!
}
type PortConflict {
containerName: String
port: Int
conflictsWith: String
}
type ExplicitStatusItem {
name: String!
updateStatus: UpdateStatus!
}
type ContainerUpdateStatus {
id: PrefixedID!
name: String
updateAvailable: Boolean
currentVersion: String
latestVersion: String
}
type DockerMutations {
start(id: PrefixedID!): DockerContainer!
stop(id: PrefixedID!): DockerContainer!
pause(id: PrefixedID!): DockerContainer!
unpause(id: PrefixedID!): DockerContainer!
removeContainer(id: PrefixedID!): Boolean!
updateContainer(id: PrefixedID!): DockerContainer!
updateAllContainers: [DockerContainer!]!
logs(id: PrefixedID!, tail: Int): String
}
type DockerNetwork implements Node {
id: PrefixedID!
name: String!
driver: String!
scope: String!
containers: JSON!
attachable: Boolean!
configFrom: JSON!
configOnly: Boolean!
created: String!
enableIPv6: Boolean!
ingress: Boolean!
internal: Boolean!
ipam: JSON!
labels: JSON!
options: JSON!
}
type Docker implements Node {
id: PrefixedID!
containers(skipCache: Boolean! = false): [DockerContainer!]!
networks(skipCache: Boolean! = false): [DockerNetwork!]!
portConflicts: [PortConflict!]
containerUpdateStatuses: [ContainerUpdateStatus!]
logs(id: PrefixedID!, tail: Int): String
}
type VmDomain implements Node {
id: PrefixedID!
name: String
state: VmState!
uuid: String
}
type VmMutations {
start(id: PrefixedID!): Boolean!
stop(id: PrefixedID!): Boolean!
pause(id: PrefixedID!): Boolean!
resume(id: PrefixedID!): Boolean!
forceStop(id: PrefixedID!): Boolean!
reboot(id: PrefixedID!): Boolean!
reset(id: PrefixedID!): Boolean!
}
type Vms implements Node {
id: PrefixedID!
domain: [VmDomain!]
domains: [VmDomain!]
}
type Permission {
actions: [AuthAction!]!
resource: Resource!
}
type ApiKey implements Node {
id: PrefixedID!
name: String!
key: String!
roles: JSON
permissions: JSON
createdAt: String!
description: String
}
type ApiKeyMutations {
create(input: CreateApiKeyInput!): ApiKey!
update(input: UpdateApiKeyInput!): ApiKey!
delete(input: DeleteApiKeyInput!): Boolean!
addRole(input: JSON!): Boolean!
removeRole(input: JSON!): Boolean!
}
type NotificationCounts {
info: Int!
warning: Int!
alert: Int!
total: Int!
}
type NotificationOverview {
unread: NotificationCounts!
archive: NotificationCounts!
}
type Notification implements Node {
id: PrefixedID!
title: String!
subject: String!
description: String!
importance: NotificationImportance!
link: String
type: NotificationType!
timestamp: String
formattedTimestamp: String
}
type Notifications implements Node {
id: PrefixedID!
overview: NotificationOverview!
list(filter: NotificationFilter!): [Notification!]!
warningsAndAlerts: [Notification!]
# Mutation-like fields used by MCP notification mutations
createNotification(input: CreateNotificationInput!): Notification
archiveNotification(id: PrefixedID!): Boolean
unreadNotification(id: PrefixedID!): Boolean
deleteNotification(id: PrefixedID!, type: NotificationType!): Boolean
deleteArchivedNotifications: Boolean
archiveAll(importance: NotificationImportance): Boolean
}
type UserAccount implements Node {
id: PrefixedID!
name: String!
description: String!
roles: [Role!]!
permissions: [Permission!]
}
type RCloneRemote {
name: String!
type: String!
parameters: JSON!
config: JSON!
}
type RCloneDrive {
name: String!
options: JSON!
}
type RCloneBackupConfigForm {
id: ID!
dataSchema: JSON!
uiSchema: JSON!
}
type RCloneBackupSettings {
remotes: [RCloneRemote!]!
drives: [RCloneDrive!]!
configForm(formOptions: RCloneConfigFormInput): RCloneBackupConfigForm!
}
type RCloneMutations {
createRCloneRemote(input: CreateRCloneRemoteInput!): RCloneRemote!
deleteRCloneRemote(input: DeleteRCloneRemoteInput!): Boolean!
}
type Theme {
name: ThemeName!
headerBackgroundColor: String
headerPrimaryTextColor: String
headerSecondaryTextColor: String
showBannerGradient: Boolean!
showBannerImage: Boolean!
showHeaderDescription: Boolean!
}
type FlashBackupStatus {
jobId: String
status: String!
}
type UpdateSettingsResponse {
restartRequired: Boolean!
values: JSON!
warnings: [String!]
}
# ============================================================================
# Root Query Type
# ============================================================================
type Query {
# Array
array: UnraidArray!
parityHistory: [ParityCheck!]!
# Config
config: Config!
# Disks
disk(id: PrefixedID!): Disk!
disks: [Disk!]!
# Docker
docker: Docker!
dockerNetwork(id: PrefixedID!): DockerNetwork
dockerNetworks: [DockerNetwork!]
# Flash
flash: Flash!
# Info
info: Info!
# Logs
logFile(path: String!, lines: Int, startLine: Int): LogFileContent!
logFiles: [LogFile!]!
# Metrics
metrics: Metrics!
# Notifications
notifications: Notifications!
# Online
online: Boolean!
# Owner
owner: Owner!
# API Keys
apiKey(id: PrefixedID!): ApiKey
apiKeys: [ApiKey!]!
# RClone
rclone: RCloneBackupSettings!
# Registration
registration: Registration
# Servers
server: Server
servers: [Server!]!
# Services
services: [Service!]!
# Settings
settings: Settings!
# Shares
shares: [Share!]!
# Unassigned devices
unassignedDevices: [UnassignedDevice!]
# UPS
upsConfiguration: UPSConfiguration!
upsDeviceById(id: PrefixedID!): UPSDevice
upsDevices: [UPSDevice!]!
# User
me: UserAccount!
# Vars
vars: Vars!
# VMs
vms: Vms!
# Network (used by MCP tool)
network: Network
}
# ============================================================================
# Root Mutation Type
# ============================================================================
type Mutation {
# Array
array: ArrayMutations!
# Parity
parityCheck: ParityCheckMutations!
# Docker
docker: DockerMutations!
# Notifications (root-level)
createNotification(input: NotificationData!): Notification!
archiveNotification(id: PrefixedID!): Notification!
archiveAll(importance: NotificationImportance): NotificationOverview!
deleteNotification(id: PrefixedID!, type: NotificationType!): NotificationOverview!
deleteArchivedNotifications: NotificationOverview!
unreadNotification(id: PrefixedID!): Notification!
# Also accessible as nested (used by MCP tools)
notifications: Notifications!
# API Keys (root-level aliases used by keys.py)
createApiKey(input: CreateApiKeyInput!): ApiKey!
updateApiKey(input: UpdateApiKeyInput!): ApiKey!
deleteApiKeys(input: DeleteApiKeysInput!): Boolean!
# Nested API key mutations
apiKey: ApiKeyMutations!
# RClone
rclone: RCloneMutations!
# VM
vm: VmMutations!
# Settings
updateSettings(input: JSON!): UpdateSettingsResponse!
# UPS
configureUps(config: UPSConfigInput!): Boolean!
}
# ============================================================================
# Root Subscription Type
# ============================================================================
type Subscription {
arraySubscription: UnraidArray!
logFile(path: String!): LogFileContent!
notificationAdded: Notification!
notificationsOverview: NotificationOverview!
ownerSubscription: Owner!
parityHistorySubscription: ParityCheck!
serversSubscription: Server!
systemMetricsCpu: CpuUtilization!
systemMetricsCpuTelemetry: CpuPackages!
systemMetricsMemory: MemoryUtilization!
upsUpdates: UPSDevice!
}