LLMSkillHub
mirroredCopied from dinglebear-ai/unraid under MIT. dinglebear-ai has not claimed this page, and is not affiliated with LLM SkillHub.

dinglebear-ai / 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.

0
SKILL.md
21.4 KB
⚠This file contains 26 character(s) that do not render as themselves (U+FE0F). They are shown highlighted below.

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 live in the file
~/.unraid-mcp/.env; load it before running curl (see "HTTP Fallback Mode" below).
Do NOT use $CLAUDE_PLUGIN_OPTION_* in the Bash tool — Claude Code injects those vars
only into plugin subprocesses (hooks/MCP/LSP), not the Bash tool. The plugin's setup
hook reads them and materializes ~/.unraid-mcp/.env; the skill loads that file via
load-env.sh (which parses it, never executes it).


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

Setup

Credentials come from the plugin's configuration form (Unraid GraphQL API URL /
Unraid API Key) or a hand-edited ~/.unraid-mcp/.env. They are read once at server
startup, so after changing them you must restart the server / MCP client.

To check whether credentials are configured and the connection works:

unraid(action="health", subaction="setup")            # read-only status + instructions
unraid(action="health", subaction="test_connection")  # verify connectivity

setup does not prompt for or write credentials — it only reports the current status
and explains how to set them.

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
display_detailsDirect display root metadata: case, theme, temperature display settings, thresholds, locale
configSystem configuration
onlineQuick online status check
ownerServer owner information
settingsUser settings and preferences
server_detailsDirect server root details with owner and URLs; API key omitted
network_access_urlsDirect network.accessUrls entries with type, name, IPv4, and IPv6
flashUSB flash drive details
ups_devicesList all UPS devices
ups_deviceSingle UPS device (requires device_id)
ups_configUPS configuration
server_timeCurrent server time, time zone, and NTP config
timezonesAvailable IANA time-zone options

health — Diagnostics

SubactionDescription
checkComprehensive health check — connectivity, array, disks, containers, VMs, resources
test_connectionTest API connectivity and authentication
diagnoseDetailed diagnostic report with troubleshooting recommendations
setupReport credential status + setup instructions (read-only; does not write or prompt)

array — Array & Parity

SubactionDescription
parity_statusCurrent parity check progress and status
parity_historyHistorical parity check results
assignable_disksPhysical disks not yet in the array (discovery counterpart to add_disk)
parity_startStart a parity check (requires correct — True writes corrections, False checks only)
parity_pausePause a running parity check
parity_resumeResume a paused parity check
parity_cancelCancel a running parity check
start_arrayStart the array
stop_array⚠‹VARIATION SELECTOR U+FE0F› Stop the array (requires confirm=True)
add_diskAdd a disk to the array (requires slot, id)
remove_disk⚠‹VARIATION SELECTOR U+FE0F› Remove a disk (requires slot, confirm=True)
mount_diskMount a disk
unmount_diskUnmount a disk
clear_disk_stats⚠‹VARIATION SELECTOR U+FE0F› 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⚠‹VARIATION SELECTOR U+FE0F› 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; stop+start composite)
unpauseUnpause a paused container (requires container identifier)
remove_container⚠‹VARIATION SELECTOR U+FE0F› Remove a container (requires container identifier, confirm=True; optional with_image)
update_containerApply a pending image update to one container (requires container identifier)
update_containersApply image updates to several containers (requires container_ids)
update_all_containersApply all pending container image updates
update_autostartSet container autostart config (requires autostart_entries: [{id, autoStart, wait?}])
refresh_digestsRefresh image digests (recheck for available updates)
sync_template_pathsSync Docker template paths
reset_template_mappings⚠‹VARIATION SELECTOR U+FE0F› Reset template path mappings to defaults (requires confirm=True)
create_folderCreate an organizer folder (requires organizer_input: {name, parentId?, childrenIds?})
create_folder_with_itemsCreate a folder containing items (organizer_input: {name, parentId?, sourceEntryIds?, position?})
rename_folderRename a folder (organizer_input: {folderId, newName})
set_folder_childrenSet a folder's children (organizer_input: {childrenIds, folderId?})
delete_entries⚠‹VARIATION SELECTOR U+FE0F› Delete organizer entries (organizer_input: {entryIds}, confirm=True)
move_entries_to_folderMove entries into a folder (organizer_input: {sourceEntryIds, destinationFolderId})
move_items_to_positionMove items to a position (organizer_input: {sourceEntryIds, destinationFolderId, position})
update_view_preferencesUpdate organizer view prefs (organizer_input: {prefs, viewId?})
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⚠‹VARIATION SELECTOR U+FE0F› Force stop a VM (requires vm_id, confirm=True)
reset⚠‹VARIATION SELECTOR U+FE0F› Hard reset a VM (requires vm_id, confirm=True)

notification — Notifications

SubactionDescription
overviewNotification counts (unread, archived by type)
listList notifications (requires list_type: UNREAD/ARCHIVE; optional importance, 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⚠‹VARIATION SELECTOR U+FE0F› Delete a notification (requires notification_id, notification_type, confirm=True)
delete_archived⚠‹VARIATION SELECTOR U+FE0F› 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)
possible_rolesAll assignable roles
possible_permissionsAll grantable resource/action permissions
permissions_for_rolesPermissions implied by given roles
preview_permissionsEffective permissions for roles and/or permissions_input ([{resource, actions}])
auth_actionsAll available auth actions
creation_form_schemaJSON-schema form for key creation
createCreate a new key (requires name; optional roles, permissions)
updateUpdate a key (requires key_id)
delete⚠‹VARIATION SELECTOR U+FE0F› 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 (structured)
installed_unraidRaw installed .plg filenames
install_operationsList async plugin-install operations
install_operationStatus of one install operation (requires operation_id)
addInstall plugins (requires names — list of plugin names)
remove⚠‹VARIATION SELECTOR U+FE0F› Uninstall plugins (requires names — list of plugin names, confirm=True)
install⚠‹VARIATION SELECTOR U+FE0F› Async-install a .plg — runs code as root (requires url, confirm=True; optional plugin_name, forced) — poll via install_operation
install_language⚠‹VARIATION SELECTOR U+FE0F› Async-install a language pack — runs code as root (requires url, 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⚠‹VARIATION SELECTOR U+FE0F› Delete a remote (requires name, confirm=True)

setting — System Settings

SubactionDescription
updateUpdate system settings (requires settings_input object)
configure_ups⚠‹VARIATION SELECTOR U+FE0F› Configure UPS settings (requires confirm=True)
update_ssh⚠‹VARIATION SELECTOR U+FE0F› Update SSH daemon settings (requires config_input: {enabled, port}, confirm=True)
update_temperatureUpdate temperature sensor config (requires config_input)
update_system_time⚠‹VARIATION SELECTOR U+FE0F› Update timezone / NTP / manual time — can invalidate TLS certs (requires config_input, confirm=True)
update_server_identityUpdate server name/comment/model (requires name; optional comment, sys_model)

connect — Unraid Connect / Remote Access

All mutations change the server's cloud/remote-access posture and require confirm=True.

SubactionDescription
remote_accessCurrent remote-access settings (access/forward type, port)
cloudUnraid Connect / cloud status (relay, minigraph, API key validity)
statusDirect connect root status: dynamic remote access and settings schema; settings values omitted
update_api_settings⚠‹VARIATION SELECTOR U+FE0F› Update Connect API settings (requires connect_input: {accessType?, forwardType?, port?}, confirm=True)
sign_in⚠‹VARIATION SELECTOR U+FE0F› Sign the server in to Unraid Connect — registers with the cloud (requires connect_input: {apiKey, userInfo?}, confirm=True)
sign_out⚠‹VARIATION SELECTOR U+FE0F› Sign the server out of Unraid Connect (requires confirm=True)
setup_remote_access⚠‹VARIATION SELECTOR U+FE0F› Configure remote access — can expose the server (requires connect_input, confirm=True)
enable_dynamic_remote_access⚠‹VARIATION SELECTOR U+FE0F› Toggle dynamic remote access (requires connect_input: {url, enabled}, confirm=True)

customization — Theme & Appearance

SubactionDescription
public_themePublic-facing theme (also the server's current theme; or use system/display)
is_initial_setupWhether this is a fresh install (isFreshInstall)
sso_enabledCheck SSO status
detailsDirect customization root onboarding/language details; activation-code values omitted
set_themeUpdate theme (requires theme_name)
set_localeUpdate UI locale (requires locale)

Secret-sensitive fields are omitted by default: server.apikey, connect.settings.values, and raw activation-code values are not returned by the safe read subactions (system/server_details, connect/status, customization/details).

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)

onboarding — First-Boot / Setup State

Operate on the server's onboarding/setup state. Rarely needed on a configured
production server; the dangerous ones require confirm=True.

SubactionDescription
internal_boot_contextInternal boot / first-boot context (array stopped, boot eligibility, pools)
completeMark onboarding complete
openOpen the onboarding flow
closeClose the onboarding flow
resumeResume onboarding
bypassBypass onboarding
reset⚠‹VARIATION SELECTOR U+FE0F› Reset onboarding/setup state (requires confirm=True)
set_overrideSet an onboarding override (requires onboarding_input)
clear_overrideClear the onboarding override
refresh_internal_boot_contextRecompute the internal boot context
create_internal_boot_pool⚠‹VARIATION SELECTOR U+FE0F› Create an internal boot pool — FORMATS devices, may REBOOT (requires onboarding_input, confirm=True)

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
notifications_warningsLive warnings/alerts feed (filtered)
ownerLive owner info
server_statusLive server status
displayLive theme/display changes
docker_container_statsLive per-container CPU/memory/IO stats
temperatureLive temperature sensor readings
log_tailLive log tail stream
notification_feedLive notification feed
plugin_install_updatesLive plugin-install progress stream (requires operation_id)

Destructive Actions

All require confirm=True as an explicit parameter. Without it, the action is blocked: interactive MCP clients are asked to confirm (elicitation), and non-interactive callers get a ToolError — re-run with confirm=True.

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
settingupdate_sshCan cut off remote shell access (disable SSH / change port)
settingupdate_system_timeClock changes can invalidate TLS certs / break time-sensitive services
pluginremoveUninstalls a plugin
plugininstall / install_languageFetches and runs a .plg from a URL as root
connectsign_in / update_api_settingsRegisters with the cloud / changes internet reachability
dockerremove_containerRemoves a container (and optionally its image)
dockerreset_template_mappingsResets Docker template path mappings to defaults
dockerdelete_entriesDeletes Docker organizer entries
connectsign_outSigns the server out of Unraid Connect
connectsetup_remote_accessReconfigures remote access; can expose the server to the internet
connectenable_dynamic_remote_accessToggles dynamic remote access
onboardingresetResets onboarding/setup state
onboardingcreate_internal_boot_poolFormats devices and may reboot the server

Common Workflows

Verify credentials

unraid(action="health", subaction="setup")            # status + instructions (read-only)
unraid(action="health", subaction="test_connection")  # confirm connectivity

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="logs", container_id="plex", tail_lines=100)
unraid(action="docker", subaction="check_updates")
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: Use docker/logs with container_id and optional tail_lines
  • 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, query the GraphQL API directly with curl. Load the
credentials first — $CLAUDE_PLUGIN_OPTION_* is not set in the Bash tool, so read
~/.unraid-mcp/.env (which the plugin's setup hook materializes) instead. Source the
bundled load-env.sh library and call its loader (it parses the .env, never executes it):

# Load UNRAID_API_URL / UNRAID_API_KEY from ~/.unraid-mcp/.env
source "$CLAUDE_PLUGIN_ROOT/skills/unraid/load-env.sh"
load_unraid_credentials || exit 1

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

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

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

Or use the helper script, which sources load-env.sh automatically:

"$CLAUDE_PLUGIN_ROOT/skills/unraid/scripts/unraid-query.sh" -q "{ online }"