unraid

This skill should be used when the user mentions Unraid, asks to check server health, monitor array or disk status, list or restart Docker containers, start or stop VMs, read system logs, check parity status, view notifications, manage API keys, configure rclone remotes, check UPS or power status, get live CPU or memory data, force stop a VM, check disk temperatures, or perform any operation on an Unraid NAS server. Also use when the user needs to set up or configure Unraid MCP credentials.

Unraid MCP Skill

Mode Detection

MCP mode (preferred): Use when mcp__unraid-mcp__unraid tool is available.

HTTP fallback: Use when MCP tools are unavailable. Credentials are in Bash subprocesses as $CLAUDE_PLUGIN_OPTION_UNRAID_API_URL and $CLAUDE_PLUGIN_OPTION_UNRAID_API_KEY. Do NOT attempt ${user_config.unraid_api_key} in curl — sensitive values only work as $CLAUDE_PLUGIN_OPTION_* in Bash subprocesses.

MCP URL: ${user_config.unraid_mcp_url}


Use the single unraid MCP tool with action (domain) + subaction (operation) for all Unraid operations.

Setup

First time? Run setup to configure credentials:

unraid(action="health", subaction="setup")

Credentials are stored at ~/.unraid-mcp/.env. Re-run setup any time to update or verify.

Calling Convention

unraid(action="<domain>", subaction="<operation>", [additional params])

Examples:

unraid(action="system",  subaction="overview")
unraid(action="docker",  subaction="list")
unraid(action="health",  subaction="check")
unraid(action="array",   subaction="parity_status")
unraid(action="disk",    subaction="disks")
unraid(action="vm",      subaction="list")
unraid(action="notification", subaction="overview")
unraid(action="live",    subaction="cpu")

All Domains and Subactions

system — Server Information

SubactionDescription
overviewComplete system summary (recommended starting point)
serverHostname, version, uptime
serversAll known Unraid servers
arrayArray status and disk list
networkNetwork interfaces and config
registrationLicense and registration status
variablesEnvironment variables
metricsReal-time CPU, memory, I/O usage
servicesRunning services status
displayDisplay settings
configSystem configuration
onlineQuick online status check
ownerServer owner information
settingsUser settings and preferences
flashUSB flash drive details
ups_devicesList all UPS devices
ups_deviceSingle UPS device (requires device_id)
ups_configUPS configuration

health — Diagnostics

SubactionDescription
checkComprehensive health check — connectivity, array, disks, containers, VMs, resources
test_connectionTest API connectivity and authentication
diagnoseDetailed diagnostic report with troubleshooting recommendations
setupConfigure credentials interactively (stores to ~/.unraid-mcp/.env)

array — Array & Parity

SubactionDescription
parity_statusCurrent parity check progress and status
parity_historyHistorical parity check results
parity_startStart a parity check
parity_pausePause a running parity check
parity_resumeResume a paused parity check
parity_cancelCancel a running parity check
start_arrayStart the array
stop_array⚠️ Stop the array (requires confirm=True)
add_diskAdd a disk to the array (requires slot, id)
remove_disk⚠️ Remove a disk (requires slot, confirm=True)
mount_diskMount a disk
unmount_diskUnmount a disk
clear_disk_stats⚠️ Clear disk statistics (requires confirm=True)

disk — Storage & Logs

SubactionDescription
sharesList network shares
disksAll physical disks with health and temperatures
disk_detailsDetailed info for a specific disk (requires disk_id)
log_filesList available log files
logsRead log content (requires log_path; optional tail_lines)
flash_backup⚠️ Trigger a flash backup (requires confirm=True)

docker — Containers

SubactionDescription
listAll containers with status, image, state
detailsSingle container details (requires container identifier)
startStart a container (requires container identifier)
stopStop a container (requires container identifier)
restartRestart a container (requires container identifier)
networksList Docker networks
network_detailsDetails for a specific network (requires network_id)

Container Identification: Name, ID, or partial name (fuzzy match supported).

vm — Virtual Machines

SubactionDescription
listAll VMs with state
detailsSingle VM details (requires vm_id)
startStart a VM (requires vm_id)
stopGracefully stop a VM (requires vm_id)
pausePause a VM (requires vm_id)
resumeResume a paused VM (requires vm_id)
rebootReboot a VM (requires vm_id)
force_stop⚠️ Force stop a VM (requires vm_id, confirm=True)
reset⚠️ Hard reset a VM (requires vm_id, confirm=True)

notification — Notifications

SubactionDescription
overviewNotification counts (unread, archived by type)
listList notifications (optional filter, limit, offset)
mark_unreadMark a notification as unread (requires notification_id)
createCreate a notification (requires title, subject, description, importance)
archiveArchive a notification (requires notification_id)
delete⚠️ Delete a notification (requires notification_id, notification_type, confirm=True)
delete_archived⚠️ Delete all archived (requires confirm=True)
archive_allArchive all unread notifications
archive_manyArchive multiple (requires ids list)
unarchive_manyUnarchive multiple (requires ids list)
unarchive_allUnarchive all archived notifications
recalculateRecalculate notification counts

key — API Keys

SubactionDescription
listAll API keys
getSingle key details (requires key_id)
createCreate a new key (requires name; optional roles, permissions)
updateUpdate a key (requires key_id)
delete⚠️ Delete a key (requires key_id, confirm=True)
add_roleAdd a role to a key (requires key_id, roles)
remove_roleRemove a role from a key (requires key_id, roles)

plugin — Plugins

SubactionDescription
listAll installed plugins
addInstall plugins (requires names — list of plugin names)
remove⚠️ Uninstall plugins (requires names — list of plugin names, confirm=True)

rclone — Cloud Storage

SubactionDescription
list_remotesList configured rclone remotes
config_formGet configuration form for a remote type
create_remoteCreate a new remote (requires name, provider_type, config_data)
delete_remote⚠️ Delete a remote (requires name, confirm=True)

setting — System Settings

SubactionDescription
updateUpdate system settings (requires settings_input object)
configure_ups⚠️ Configure UPS settings (requires confirm=True)

customization — Theme & Appearance

SubactionDescription
themeCurrent theme settings
public_themePublic-facing theme
is_initial_setupCheck if initial setup is complete
sso_enabledCheck SSO status
set_themeUpdate theme (requires theme parameters)

oidc — SSO / OpenID Connect

SubactionDescription
providersList configured OIDC providers
providerSingle provider details (requires provider_id)
configurationOIDC configuration
public_providersPublic-facing provider list
validate_sessionValidate current SSO session (requires token)

user — Current User

SubactionDescription
meCurrent authenticated user info

live — Real-Time Subscriptions

These use persistent WebSocket connections. Returns a "connecting" placeholder on the first call — retry momentarily for live data.

SubactionDescription
cpuLive CPU utilization
memoryLive memory usage
cpu_telemetryDetailed CPU telemetry
array_stateLive array state changes
parity_progressLive parity check progress
ups_statusLive UPS status
notifications_overviewLive notification counts
ownerLive owner info
server_statusLive server status
log_tailLive log tail stream
notification_feedLive notification feed

Destructive Actions

All require confirm=True as an explicit parameter. Without it, the action is blocked and elicitation is triggered.

DomainSubactionRisk
arraystop_arrayStops array while containers/VMs may use shares
arrayremove_diskRemoves disk from array
arrayclear_disk_statsClears disk statistics permanently
vmforce_stopHard kills VM without graceful shutdown
vmresetHard resets VM
notificationdeletePermanently deletes a notification
notificationdelete_archivedPermanently deletes all archived notifications
rclonedelete_remoteRemoves a cloud storage remote
keydeletePermanently deletes an API key
diskflash_backupTriggers flash backup operation
settingconfigure_upsModifies UPS configuration
pluginremoveUninstalls a plugin

Common Workflows

First-time setup

unraid(action="health", subaction="setup")
unraid(action="health", subaction="check")

System health overview

unraid(action="system", subaction="overview")
unraid(action="health", subaction="check")

Container management

unraid(action="docker", subaction="list")
unraid(action="docker", subaction="details", container_id="plex")
unraid(action="docker", subaction="restart", container_id="sonarr")

Array and disk status

unraid(action="array",  subaction="parity_status")
unraid(action="disk",   subaction="disks")
unraid(action="system", subaction="array")

Read logs

unraid(action="disk", subaction="log_files")
unraid(action="disk", subaction="logs", log_path="/var/log/syslog", tail_lines=50)

Live monitoring

unraid(action="live", subaction="cpu")
unraid(action="live", subaction="memory")
unraid(action="live", subaction="array_state")

VM operations

unraid(action="vm", subaction="list")
unraid(action="vm", subaction="start",      vm_id="<id>")
unraid(action="vm", subaction="force_stop", vm_id="<id>", confirm=True)

Notes

  • Rate limit: 100 requests / 10 seconds
  • Log path validation: Only /var/log/, /boot/logs/, /mnt/ prefixes accepted
  • Container logs: Docker container stdout/stderr are NOT accessible via API — use SSH + docker logs
  • arraySubscription: Known Unraid API bug — live/array_state may show "connecting" indefinitely
  • Event-driven subs (notifications_overview, owner, server_status, ups_status): Only populate cache on first real server event

HTTP Fallback Mode

When MCP tools are unavailable, use direct GraphQL queries via curl. Credentials are available as $CLAUDE_PLUGIN_OPTION_* environment variables in Bash subprocesses.

# System overview
curl -s "$CLAUDE_PLUGIN_OPTION_UNRAID_API_URL" \
  -H "x-api-key: $CLAUDE_PLUGIN_OPTION_UNRAID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"{ info { os { hostname uptime } } }"}'

# List Docker containers
curl -s "$CLAUDE_PLUGIN_OPTION_UNRAID_API_URL" \
  -H "x-api-key: $CLAUDE_PLUGIN_OPTION_UNRAID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"{ docker { containers { names state status } } }"}'

# Array status
curl -s "$CLAUDE_PLUGIN_OPTION_UNRAID_API_URL" \
  -H "x-api-key: $CLAUDE_PLUGIN_OPTION_UNRAID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"{ array { state capacity { kilobytes { free used total } } disks { name status temp } } }"}'