MCP Hub
Back to servers

claude-homelab

Comprehensive Claude Code skills and agents for homelab service management - media automation, infrastructure monitoring, document management, and more

GitHub
Stars
20
Forks
2
Updated
Apr 5, 2026
Validated
Apr 6, 2026

Claude Homelab

Current release: 1.4.0.

Homelab plugin hub for Claude Code, Codex, and Gemini. This repository is the source of truth for the homelab-core plugin, bundled skill-only integrations, agents, commands, and shared credential bootstrapping.

Overview

claude-homelab serves three roles at once:

  • The homelab-core plugin published through the Claude marketplace
  • The canonical mono-repo for 16 bundled skill-only service integrations
  • The source for Codex and Gemini extension manifests that mirror the same workflow surface

The repo root is the plugin root. Do not edit generated copies in ~/.claude/ or ~/.claude/plugins/cache/ directly.

Installation

Claude marketplace

/plugin marketplace add jmagar/claude-homelab
/plugin install homelab-core @jmagar-claude-homelab

After install, Claude Code downloads the plugin into ~/.claude/plugins/cache/. No symlinks are created on this path.

Bash / symlink install

curl -sSL https://raw.githubusercontent.com/jmagar/claude-homelab/main/scripts/install.sh | bash

Or, if you already have the repo cloned:

./scripts/install.sh

The installer:

  1. Checks prerequisites (git, jq, curl)
  2. Clones the repo to ~/claude-homelab (or pulls if it exists)
  3. Runs setup-creds.sh — creates ~/.claude-homelab/.env from .env.example with chmod 600
  4. Runs setup-symlinks.sh — symlinks skills, agents, and commands into ~/.claude/
  5. Runs verify.sh — confirms every symlink and required file is in place
  6. Prints next steps

Credential Model

All credentials for every service live in a single file:

~/.claude-homelab/.env

This file is created from .env.example at install time and is never committed. Set it up interactively after install:

# Interactive wizard (preferred)
# Open Claude Code and run:
/homelab-core:setup

# Or configure manually
$EDITOR ~/.claude-homelab/.env

Security requirements:

  • ~/.claude-homelab/.env must have chmod 600 (owner read/write only)
  • Never commit .env — it is gitignored
  • Never log credentials, even in debug mode
  • Use .env.example as the template (tracked in git, placeholder values only)

All service scripts load credentials via scripts/load-env.sh:

source "${CLAUDE_PLUGIN_ROOT:-$HOME/claude-homelab}/scripts/load-env.sh"
load_env_file || exit 1
validate_env_vars "SERVICE_URL" "SERVICE_API_KEY"

Environment Variable Reference

Variables are grouped by service. Copy .env.example to ~/.claude-homelab/.env and replace placeholder values.

Media

VariableRequiredDescription
PLEX_URLyesPlex server base URL
PLEX_TOKENyesPlex authentication token
OVERSEERR_URLyesOverseerr base URL (skill)
OVERSEERR_API_KEYyesOverseerr API key (skill)
RADARR_URLyesRadarr base URL
RADARR_API_KEYyesRadarr API key
RADARR_DEFAULT_QUALITY_PROFILEnoDefault quality profile ID (default: 1)
SONARR_URLyesSonarr base URL
SONARR_API_KEYyesSonarr API key
SONARR_DEFAULT_QUALITY_PROFILEnoDefault quality profile ID (default: 1)
PROWLARR_URLyesProwlarr base URL
PROWLARR_API_KEYyesProwlarr API key
TAUTULLI_URLyesTautulli base URL
TAUTULLI_API_KEYyesTautulli API key

Downloads

VariableRequiredDescription
SABNZBD_URLyesSABnzbd base URL
SABNZBD_API_KEYyesSABnzbd API key
QBITTORRENT_URLyesqBittorrent WebUI URL
QBITTORRENT_USERNAMEyesqBittorrent username
QBITTORRENT_PASSWORDyesqBittorrent password

Infrastructure

VariableRequiredDescription
UNRAID_SERVER1_NAMEyesDisplay name for first Unraid server
UNRAID_SERVER1_URLyesUnraid GraphQL endpoint (skill)
UNRAID_SERVER1_API_KEYyesUnraid API key (skill)
UNRAID_SERVER2_NAMEnoDisplay name for second Unraid server
UNRAID_SERVER2_URLnoSecond Unraid GraphQL endpoint
UNRAID_SERVER2_API_KEYnoSecond Unraid API key
UNIFI_URLyesUniFi controller URL (skill)
UNIFI_USERNAMEyesUniFi username
UNIFI_PASSWORDyesUniFi password
UNIFI_SITEnoUniFi site name (default: default)
TAILSCALE_API_KEYyesTailscale API key
TAILSCALE_TAILNETyesTailscale tailnet name or -
ZFS_HOSTyesHost where ZFS commands run
SWAG_HOSTyesSWAG reverse proxy host
SWAG_CONTAINER_NAMEnoSWAG container name (default: swag)
SWAG_APPDATA_PATHnoSWAG appdata path
SWAG_COMPOSE_PATHnoSWAG compose file path

Utilities and Document Management

VariableRequiredDescription
LINKDING_URLyesLinkding bookmark manager URL
LINKDING_API_KEYyesLinkding API token
MEMOS_URLyesMemos server URL
MEMOS_API_TOKENyesMemos API token
BYTESTASH_URLyesByteStash snippet manager URL
BYTESTASH_API_KEYyesByteStash API key
PAPERLESS_URLyesPaperless-ngx base URL
PAPERLESS_API_TOKENyesPaperless-ngx API token
RADICALE_URLyesRadicale CalDAV/CardDAV URL
RADICALE_USERNAMEyesRadicale username
RADICALE_PASSWORDyesRadicale password
GOTIFY_URLyesGotify push notification URL (skill)
GOTIFY_TOKENyesGotify app token (skill)

Research and Dev Tools

VariableRequiredDescription
NOTEBOOKLM_COOKIEyesNotebookLM session cookie
NOTEBOOKLM_AUTH_JSONnoFull auth JSON blob (alternative to cookie)
NOTEBOOKLM_LOG_LEVELnoLog verbosity (default: INFO)
GITHUB_TOKENyesGitHub personal access token (gh-address-comments)
GLANCES_URLnoGlances web interface URL
GLANCES_USERNAMEnoGlances username (if auth enabled)
GLANCES_PASSWORDnoGlances password (if auth enabled)

MCP Server Variables

Each external MCP plugin has its own block of server-config vars. See .env.example for the full list. Key patterns:

PatternDescription
*_MCP_TOKENBearer token for MCP server auth
*_MCP_HOSTBind host (default: 0.0.0.0)
*_MCP_PORTListen port
*_MCP_TRANSPORTTransport protocol (streamable-http or http)
*_MCP_NO_AUTHDisable auth (set true for local-only installs)
*_MCP_ALLOW_DESTRUCTIVEAllow destructive operations (default: false)
ALLOW_DESTRUCTIVEShared fallback for MCP repos that read this directly
ALLOW_YOLOShared fallback — skip confirmation prompts
DOCKER_NETWORKShared Docker network name
LOG_LEVELShared log verbosity

Commands

Root Commands

CommandArgumentDescription
/check[instructions]Read the latest screenshot from ~/Pictures/Screenshots and describe it. Pass optional instructions (e.g., "extract the text", "what error is shown").
/deploy[plugin-name]Build and start MCP plugin containers via docker compose up --build -d. Deploys all external plugins by default. Pass a plugin name to deploy only that one. Reads compose files from ~/.claude/plugins/cache/claude-homelab/<name>/<version>/. Skips tests/ subdirs. Reports a status table with notes on failures.
/quick-pushStandardized commit-and-push workflow. Checks branch (creates feature branch if on main), bumps version in all manifests, updates CHANGELOG.md, stages all changes, commits with co-authorship signature, pushes, then invokes save-to-md and writes Neo4j commit graph entries.
/save-to-md[output-path]Document the full session as a Markdown file. Defaults to docs/sessions/YYYY-MM-DD-description.md. Embeds the file in Qdrant via Axon. Creates Neo4j entities and relations for files, services, features, and bugs touched in the session.
/validate-plan<plan-file-or-text>Audit a technical implementation plan against homelab standards. Checks for exposed secrets, correct credential loading pattern (scripts/load-env.sh), required docs (README.md, SKILL.md, references), confirm=True gate on destructive actions, and standard directory structure. Outputs a compliance table and required changes list.

/homelab:* Commands

CommandDescription
/homelab:system-resourcesSnapshot CPU, RAM, temperatures, and load average. Identifies high-CPU processes, memory pressure, temperature anomalies, and provides optimization recommendations. Uses uptime, free, top, and sensors.
/homelab:docker-healthAudit all Docker containers. Flags unexpected exits, restart loops, unhealthy containers, and resource over-use (CPU > 80%, memory > 90%). Provides per-container recommendations.
/homelab:disk-spaceAnalyze disk usage across all mount points. Identifies filesystems above 80% or 95% usage, space hogs, log rotation issues, Docker volume orphans, and suggests cleanup targets.
/homelab:zfs-healthFull ZFS health check. Reports pool state (ONLINE/DEGRADED/FAULTED), device errors, checksum errors, resilvering, scrub status, ARC hit ratio, snapshot accumulation, and per-dataset usage. Outputs a health score and prioritized action list.

/notebooklm:* Commands

CommandArgumentDescription
/notebooklm:create"Title" [url1] [url2] ...Create a new NotebookLM notebook. Optionally add URLs, PDFs, Google Docs, YouTube links, audio, video, or image files as sources. Reports the new notebook ID.
/notebooklm:ask"question"Chat with NotebookLM about the current notebook. Options: --json for source citations, -n <id> to target a specific notebook.
/notebooklm:sourceadd <url|file> | list | wait <id> | fulltext <id> | add-research "query"Manage notebook sources. Add a URL or file, list current sources, wait for a source to finish processing, retrieve full text, or trigger web research. Supports -n <id> for targeting.
/notebooklm:generate<type> ["instructions"]Generate an artifact. Types: audio, video, quiz, report, mind-map, flashcards, slide-deck, infographic, data-table. Each type has format, length, style, and difficulty options.
/notebooklm:download<type> [output-path]Download a generated artifact to a local file. Supports --all and --format json|md|html. Artifact must be fully generated first.
/notebooklm:list[notebooks|sources|artifacts]List notebooks (default), sources in the current notebook, or generated artifacts. Presents results in a table with IDs, names, and status.
/notebooklm:research"query" [--mode fast|deep]Run web research and import results as notebook sources. Fast mode: 30 seconds to 2 minutes. Deep mode: 15 to 30+ minutes, use --no-wait and follow up with notebooklm research wait --import-all.

/notebooklm:generate Type Reference

TypeKey OptionsApproximate Time
audio (podcast)--format deep-dive|brief|critique|debate, --length short|default|long10–20 min
video--format explainer|brief, --style auto|classic|whiteboard|kawaii|...15–45 min
slide-deck--format detailed|presenter, --length default|short5–15 min
infographic--orientation landscape|portrait|square, --detail concise|standard|detailed5–15 min
report--format briefing-doc|study-guide|blog-post|custom5–15 min
mind-mapInstant
data-tabledescription required5–15 min
quiz--difficulty easy|medium|hard, --quantity fewer|standard|more5–15 min
flashcards--difficulty easy|medium|hard, --quantity fewer|standard|more5–15 min

All types support -s/--source, --language, --json, and --retry N.

Skills

18 skill directories live under skills/. Each is an independent unit with a SKILL.md (Claude-facing) and typically a README.md, scripts/, and references/ directory.

Core Skills (2)

SkillInvocationPurpose
homelab-setup/homelab-core:setupInteractive credential setup wizard. Guides through configuring ~/.claude-homelab/.env for each service the user runs. Creates the file from .env.example if missing.
homelab-health/homelab-core:healthUnified service health dashboard. Runs scripts/check-health.sh to curl-check every configured service and outputs a JSON health summary.

Service Skills (16)

SkillCategoryPurpose
plexmediaBrowse Plex libraries, search media, check active sessions and streams, view recently added content
radarrmediaManage Radarr movie library — search, add, monitor, and track download status
sonarrmediaManage Sonarr TV library — search, add series, monitor seasons and episodes
prowlarrmediaManage Prowlarr indexers — search across all indexers, test connectivity, view stats
tautullimediaQuery Tautulli play history, user activity, library stats, and notification logs
sabnzbddownloadsMonitor SABnzbd queue, speed, and history; manage download jobs
qbittorrentdownloadsManage qBittorrent torrents — list, add, pause, resume, and remove downloads
tailscaleinfrastructureQuery Tailscale network status, list devices, check connectivity, and manage ACLs
zfsinfrastructureZFS pool and dataset management — status, snapshots, scrubs, and space reporting
linkdingutilitiesManage Linkding bookmarks — search, add, tag, and organize saved links
memosutilitiesCreate and query Memos notes — add quick notes, search by tag or content
bytestashutilitiesManage ByteStash code snippets — save, search, and retrieve frequently-used code
paperless-ngxutilitiesSearch and manage Paperless-ngx document archive — query by content, tag, or correspondent
radicaleutilitiesInteract with Radicale CalDAV/CardDAV — list calendars and contacts, query events
notebooklmresearchNotebookLM CLI wrapper for deep AI research, source management, Q&A, and artifact generation
gh-address-commentsdev-toolsAddress GitHub PR review comments — fetch, triage, and resolve review feedback

Agents

notebooklm-specialist

File: agents/notebooklm-specialist.md

Color: magenta

Tools: Bash, Read, Write, SendMessage

Memory: user (persistent across sessions)

The notebooklm-specialist is a research analyst agent for deep AI-powered research workflows. It is spawned by an orchestrator with a pre-created notebook ID, output directory, and research brief. The agent:

  1. Starts deep web research immediately (notebooklm source add-research --mode deep --no-wait) — this is always the first action since it takes 15–30+ minutes
  2. Adds source URLs relayed from the orchestrator as they arrive (max 50 per notebook)
  3. Waits for deep research to complete and auto-imports discovered sources
  4. Conducts an extensive Q&A session (10–20 questions across overview, comparison, technical, critical, practical, and future-directions categories)
  5. Uses --json flag to capture citation data with every answer
  6. Writes findings to {output_dir}/findings/notebooklm-findings.md
  7. Signals completion to the orchestrator via SendMessage

Critical constraint: Always use -n <notebook_id> or --notebook <notebook_id>. Never use notebooklm use <id> — that command modifies shared state and is unsafe in parallel workflows.

The agent maintains persistent memory of effective research query patterns, timing benchmarks, and NotebookLM-specific quirks across sessions.

Marketplace Scope

The .claude-plugin/marketplace.json catalog covers 27 plugins total.

1 core plugin

PluginSourceDescription
homelab-corethis repoAgents, commands, setup/health skills, and the bundled skill library

10 external MCP repos

PluginRepoCategory
overseerr-mcpjmagar/overseerr-mcpmedia
unraid-mcpjmagar/unraid-mcpinfrastructure
unifi-mcpjmagar/unifi-mcpinfrastructure
gotify-mcpjmagar/gotify-mcputilities
swag-mcpjmagar/swag-mcpinfrastructure
synapse-mcpjmagar/synapse-mcpinfrastructure
arcane-mcpjmagar/arcane-mcpinfrastructure
syslog-mcpjmagar/syslog-mcpinfrastructure
plugin-labjmagar/plugin-labdev-tools
axonjmagar/axonresearch

16 bundled skill-only plugins

bytestash, gh-address-comments, linkding, memos, notebooklm, paperless-ngx, plex, prowlarr, qbittorrent, radarr, radicale, sabnzbd, sonarr, tailscale, tautulli, zfs

These are listed individually in the marketplace catalog so users can discover them, but they are sourced from ./skills/* within this repo. A bundled skill graduates to its own external repo when it gains additional plugin surface area (agents, commands, hooks, MCP servers, output styles, or channels).

Symlink Architecture

The bash install path creates symlinks from this repo into ~/.claude/ so Claude Code discovers all skills, agents, and commands. The plugin path uses ~/.claude/plugins/cache/ instead and requires no symlinks.

~/.claude/
├── agents/
│   └── notebooklm-specialist.md → ~/claude-homelab/agents/notebooklm-specialist.md
├── skills/
│   ├── bytestash/               → ~/claude-homelab/skills/bytestash/
│   ├── gh-address-comments/     → ~/claude-homelab/skills/gh-address-comments/
│   ├── homelab-health/          → ~/claude-homelab/skills/homelab-health/
│   ├── homelab-setup/           → ~/claude-homelab/skills/homelab-setup/
│   ├── linkding/                → ~/claude-homelab/skills/linkding/
│   ├── memos/                   → ~/claude-homelab/skills/memos/
│   ├── notebooklm/              → ~/claude-homelab/skills/notebooklm/
│   ├── paperless-ngx/           → ~/claude-homelab/skills/paperless-ngx/
│   ├── plex/                    → ~/claude-homelab/skills/plex/
│   ├── prowlarr/                → ~/claude-homelab/skills/prowlarr/
│   ├── qbittorrent/             → ~/claude-homelab/skills/qbittorrent/
│   ├── radarr/                  → ~/claude-homelab/skills/radarr/
│   ├── radicale/                → ~/claude-homelab/skills/radicale/
│   ├── sabnzbd/                 → ~/claude-homelab/skills/sabnzbd/
│   ├── sonarr/                  → ~/claude-homelab/skills/sonarr/
│   ├── tailscale/               → ~/claude-homelab/skills/tailscale/
│   ├── tautulli/                → ~/claude-homelab/skills/tautulli/
│   └── zfs/                     → ~/claude-homelab/skills/zfs/
└── commands/
    ├── check.md                 → ~/claude-homelab/commands/check.md
    ├── deploy.md                → ~/claude-homelab/commands/deploy.md
    ├── quick-push.md            → ~/claude-homelab/commands/quick-push.md
    ├── save-to-md.md            → ~/claude-homelab/commands/save-to-md.md
    ├── validate-plan.md         → ~/claude-homelab/commands/validate-plan.md
    ├── homelab/                 → ~/claude-homelab/commands/homelab/
    └── notebooklm/              → ~/claude-homelab/commands/notebooklm/

~/.claude-homelab/
├── .env                         # Credentials (chmod 600, never committed)
└── load-env.sh                  # Copied from scripts/load-env.sh at install

How Slash Commands Work

Slash commands are created by placing .md files in ~/.claude/commands/. Claude Code discovers them automatically.

  • commands/proxy.md/proxy
  • commands/homelab/docker-health.md/homelab:docker-health

The directory name becomes the namespace prefix. The file name becomes the command after the colon.

Configuration System

Command Files (commands/)

Each command is a Markdown file with a YAML frontmatter block:

---
description: Short description shown in autocomplete
argument-hint: <required> [optional]
allowed-tools: Bash(tool:*), mcp__plugin_name__tool
---

Task instruction using $ARGUMENTS

Key fields:

  • description — shown in autocomplete menu
  • argument-hint — hint text for expected arguments
  • allowed-tools — pre-approved tools (no permission prompts at runtime)
  • $ARGUMENTS — replaced with user input after the command name
  • !`command` — dynamic context injection: runs the shell command and injects its output at load time

Prompts Sidecar System (prompts/)

Command prompt bodies can be extracted to .toml sidecar files in prompts/, keeping command metadata (frontmatter, description) separate from the prompt content. When populated, the directory mirrors the commands/ structure:

  • prompts/check.toml — prompt body for /check
  • prompts/homelab/docker-health.toml — prompt body for /homelab:docker-health

Format:

name = "command-name"
description = "Short description"
prompt = """
Prompt body with instructions and dynamic context injection.
"""

The prompts/ directory is not present by default. Create it if you extract prompts out of command .md files.

Output Styles (output-styles/)

The output-styles/ directory is reserved for custom response format definitions. It is currently empty (.gitkeep placeholder). Add output style files here when commands need to enforce a specific response structure.

Development

Adding a New Service Skill

  1. Create the skill directory:

    mkdir -p skills/service-name/{scripts,references,examples}
    
  2. Create SKILL.md with frontmatter (name, description), a mandatory invocation section, command documentation, and workflow decision trees.

  3. Create README.md for user-facing setup instructions.

  4. Implement scripts in scripts/. All scripts must:

    • Use source "$REPO_ROOT/scripts/load-env.sh" for credentials
    • Return JSON output
    • Handle errors gracefully
    • Support --help
  5. Add reference docs in references/ (api-endpoints.md, quick-reference.md, troubleshooting.md).

  6. Create the symlink (bash path):

    ln -sf ~/claude-homelab/skills/service-name ~/.claude/skills/service-name
    

    Or re-run ./scripts/setup-symlinks.sh to pick it up automatically.

  7. Add the skill to the marketplace catalog if it should be discoverable:

    • Edit .claude-plugin/marketplace.json
    • Add a bundled entry pointing to ./skills/service-name
  8. Update this README's Skills table.

Adding a New Command

Single command (/new-command):

touch commands/new-command.md
ln -sf ~/claude-homelab/commands/new-command.md ~/.claude/commands/new-command.md

Namespaced command (/service:action):

mkdir -p commands/service-name
touch commands/service-name/action.md
ln -sf ~/claude-homelab/commands/service-name ~/.claude/commands/service-name

Credential Pattern

All scripts must source scripts/load-env.sh (see Credential Model above for the full pattern and variable naming conventions).

Verification

Run after any structural change:

./scripts/verify.sh

The verify script checks:

  • All required symlinks exist and point to valid targets
  • ~/.claude-homelab/.env exists

Additional checks:

# Run all Justfile validation targets
just validate

# Spot-check section headers across key docs
rtk rg -n "^## " README.md AGENTS.md CLAUDE.md

Repository Layout

agents/                 Top-level specialist agents
commands/               Slash command definitions (.md files)
commands/homelab/       /homelab:* command definitions
commands/notebooklm/    /notebooklm:* command definitions
docs/                   Session logs and reference documentation
docs/references/        Shared reference docs (security-patterns.md)
hooks/                  Reserved for future Claude Code hook definitions
output-styles/          Reserved for custom response format definitions
scripts/                Install, setup, credential loading, and verification helpers
skills/                 18 service and core skill directories
.claude-plugin/         Claude marketplace manifest (plugin.json, marketplace.json)
.codex-plugin/          Codex plugin manifest
gemini-extension.json   Gemini extension manifest
AGENTS.md               Repo-wide development instructions
CLAUDE.md               Claude-facing project instructions
CHANGELOG.md            Release history
.env.example            Shared credential template (tracked, no secrets)
Justfile                Validation and maintenance recipes

Related Files

  • AGENTS.md — canonical development and repo-structure guidance
  • CLAUDE.md — Claude-facing project instructions including symlink architecture, command format, and skill development workflow
  • .env.example — shared credential template for all 16 services and 10 MCP repos
  • .claude-plugin/marketplace.json — marketplace source of truth (27 plugin entries)
  • .claude-plugin/plugin.jsonhomelab-core plugin manifest
  • CHANGELOG.md — release history
  • docs/references/security-patterns.md — reusable patterns for input sanitization, injection prevention, and API key protection

Related plugins

PluginCategoryDescription
overseerr-mcpmediaSearch movies and TV shows, submit requests, and monitor failed requests via Overseerr.
unraid-mcpinfrastructureQuery, monitor, and manage Unraid servers: Docker, VMs, array, parity, and live telemetry.
unifi-mcpinfrastructureMonitor and manage UniFi devices, clients, firewall rules, and network health.
gotify-mcputilitiesSend and manage push notifications via a self-hosted Gotify server.
swag-mcpinfrastructureCreate, edit, and manage SWAG nginx reverse proxy configurations.
synapse-mcpinfrastructureDocker management (Flux) and SSH remote operations (Scout) across homelab hosts.
arcane-mcpinfrastructureManage Docker environments, containers, images, volumes, networks, and GitOps via Arcane.
syslog-mcpinfrastructureReceive, index, and search syslog streams from all homelab hosts via SQLite FTS5.
plugin-labdev-toolsScaffold, review, align, and deploy homelab MCP plugins with agents and canonical templates.
axonresearchSelf-hosted web crawl, ingest, embed, and RAG pipeline with MCP tooling.

License

MIT

Reviews

No reviews yet

Sign in to write a review