homelab-mcp
MCP server giving AI assistants full control of a Proxmox homelab, enabling management of VMs, containers, Docker projects, media stack, and monitoring via natural language.
README
homelab-mcp
<br>
<img src="assets/banner.png" alt="homelab-mcp banner" width="800">
MCP server that gives AI assistants full control of a Proxmox homelab — manage VMs and containers, deploy Docker projects, monitor services, control the media stack, and check storage health, all from conversation.
65+ tools across 17 domains. Modular architecture designed for AI-assisted extensibility.
AI Setup
No manual config needed. The server includes an AI-native setup wizard. Just connect it to your MCP client and say:
"Set up my homelab" or "Configure the MCP server"
The setup wizard scans your configuration, guides you through each setting interactively, saves your answers, and verifies connectivity — all through conversation. Credentials are never exposed to the AI; the wizard masks passwords, API keys, and tokens before returning any results.
Quick start
Prerequisites
- Node.js 20+
- A Proxmox VE host reachable over the network
- A devbox (any SSH-accessible Linux host running Docker)
- (Optional) Media services: Plex, Radarr, Sonarr, SABnzbd, Overseerr, Prowlarr
- (Optional) Monitoring: Prometheus, Grafana, Uptime Kuma
Install
From npm (recommended):
npm install -g homelab-mcp
# Or locally in your project:
npm install homelab-mcp
From source (for contributors):
git clone https://github.com/Nainounen/homelab-mcp.git
cd homelab-mcp
npm install
npm run build
Docker (optional)
A Dockerfile is provided for containerized deployments:
npm run build
cp .env.example .env # edit with your credentials
docker compose up -d
For most users, running directly with Node.js (no Docker) is simpler — the MCP server communicates over stdio.
Connect to your MCP client
Add to your MCP client's config file. For Claude Code, that's ~/.claude/claude_mcp_config.json:
{
"mcpServers": {
"homelab": {
"command": "npx",
"args": ["homelab-mcp"],
"cwd": "/path/to/your/homelab-config"
}
}
}
Place your .env file in the cwd directory (copy .env.example from this repo as a starting point). No secrets go in the MCP config — the server loads .env from its working directory.
Then just say "set up my homelab" — the AI-native setup wizard will guide you through the rest.
Configuration
All settings live in .env. See .env.example for the full template. The server starts with the services you configure — any service whose env vars are missing is skipped with a warning.
Required (server won't start without these)
| Variable | Description |
|---|---|
PROXMOX_HOST, PROXMOX_PORT, PROXMOX_USER, PROXMOX_NODE |
Proxmox API access |
PROXMOX_PASSWORD or PROXMOX_KEY_PATH |
Proxmox auth |
DEVBOX_HOST, DEVBOX_USER |
Devbox SSH access |
DEVBOX_PASSWORD or DEVBOX_KEY_PATH |
Devbox SSH auth |
RADARR_URL, RADARR_API_KEY |
Radarr API |
SONARR_URL, SONARR_API_KEY |
Sonarr API |
PROWLARR_URL, PROWLARR_API_KEY |
Prowlarr API |
SABNZBD_URL, SABNZBD_API_KEY |
SABnzbd API |
OVERSEERR_URL, OVERSEERR_API_KEY |
Overseerr API |
Optional (skipped with a warning if missing)
| Variable | Service |
|---|---|
QNAP_HOST, QNAP_USER, QNAP_PASSWORD or QNAP_KEY_PATH |
QNAP NAS |
PLEX_URL, PLEX_TOKEN |
Plex |
TAUTULLI_URL, TAUTULLI_API_KEY |
Tautulli analytics |
BAZARR_URL, BAZARR_API_KEY |
Bazarr subtitles |
ADGUARD_URL, ADGUARD_USER, ADGUARD_PASSWORD |
AdGuard Home |
PBS_URL, PBS_TOKEN_ID, PBS_TOKEN_SECRET |
Proxmox Backup Server |
LIDARR_URL, LIDARR_API_KEY |
Lidarr music |
READARR_URL, READARR_API_KEY |
Readarr books |
UPTIME_KUMA_URL, UPTIME_KUMA_USER, UPTIME_KUMA_PASSWORD |
Uptime Kuma |
PROMETHEUS_URL |
Prometheus API |
GRAFANA_URL, GRAFANA_TOKEN |
Grafana API |
TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID |
Telegram notifications |
Security settings
| Variable | Default | Description |
|---|---|---|
SSH_STRICT_HOST_KEY |
false |
Set to true to enable known_hosts verification |
PROXMOX_TLS_VERIFY |
false |
Set to true to validate Proxmox TLS certificates |
PBS_TLS_VERIFY |
false |
Set to true to validate PBS TLS certificates |
Tools reference
Infrastructure
| Tool | Description |
|---|---|
proxmox_list_nodes |
List Proxmox nodes with CPU, RAM, uptime |
proxmox_list_vms |
List all VMs and LXC containers |
proxmox_start_vm |
Start a VM or container |
proxmox_stop_vm |
Stop a VM or container |
proxmox_restart_vm |
Restart a VM or container |
proxmox_get_metrics |
Detailed metrics for one VM/CT |
proxmox_get_node_metrics |
Node-level CPU, RAM, disk, load |
proxmox_create_ct |
Create a new Debian 12 LXC container |
proxmox_get_logs |
Tail task log for a VM/CT |
proxmox_exec |
Run a shell command on Proxmox host (dangerous commands blocked) |
Devbox & Docker
| Tool | Description |
|---|---|
devbox_exec |
Run a shell command on the devbox (dangerous commands blocked) |
devbox_read_file |
Read a file (max 100 KB) |
devbox_write_file |
Write a file, auto-creates parent dirs (max 1 MB) |
devbox_list_dir |
List directory contents |
devbox_docker_ps |
Show running Docker containers |
devbox_docker_compose |
Run compose up/down/restart/pull/logs |
devbox_git |
Git status, pull, log, or clone a repo |
devbox_project_deploy |
Deploy: git pull → compose pull → compose up → status |
devbox_project_status |
Health check for a deployed project |
devbox_project_list |
Scan a base path for compose projects |
Media — download & library
| Tool | Description |
|---|---|
radarr_search_movie |
Search for a movie by title |
radarr_add_movie |
Add a movie and trigger download search |
radarr_list_movies |
List all movies with download status |
radarr_remove_movie |
Remove a movie (optionally delete files) |
radarr_get_queue |
Active movie downloads with progress |
radarr_force_search |
Re-search indexers for a movie |
radarr_get_history |
Recent download history |
radarr_check_releases |
Show available releases and rejections |
radarr_clear_queue |
Remove all items from download queue |
radarr_clear_blocklist |
Clear the release blocklist |
radarr_blocklist_release |
Blocklist a bad release and retry |
radarr_list_path_mappings |
List remote path mappings |
radarr_set_path_mapping |
Add/update a path mapping |
sonarr_search_series |
Search for a TV series by title |
sonarr_add_series |
Add a series and trigger download |
sonarr_list_series |
List all series with episode progress |
sonarr_remove_series |
Remove a series (optionally delete files) |
sonarr_get_queue |
Active episode downloads with progress |
sonarr_force_search |
Re-search for missing episodes |
sonarr_season_search |
Search for a specific season |
sonarr_check_releases |
Show releases and rejections for a season |
sonarr_blocklist_release |
Blocklist and retry a failed download |
sonarr_clear_queue |
Clear the download queue |
sonarr_clear_blocklist |
Clear the release blocklist |
sonarr_list_path_mappings |
List remote path mappings |
sonarr_set_path_mapping |
Add/update a path mapping |
sabnzbd_get_status |
Download speed, ETA, disk space, queue size |
sabnzbd_list_queue |
Active NZB downloads with progress |
sabnzbd_get_history |
Recent download history |
sabnzbd_pause_queue |
Pause downloads |
sabnzbd_resume_queue |
Resume downloads |
sabnzbd_delete_item |
Delete a queue item by NZO ID |
prowlarr_list_indexers |
List indexers with status |
prowlarr_sync_apps |
Sync indexers to Radarr/Sonarr |
prowlarr_test_indexers |
Test all (or one) indexer |
lidarr_search_artist |
Search for a music artist |
lidarr_add_artist |
Add an artist to Lidarr |
lidarr_list_artists |
List all artists with album counts |
lidarr_remove_artist |
Remove an artist |
lidarr_get_queue |
Active music downloads |
readarr_search_book |
Search for a book |
readarr_add_book |
Add a book to Readarr |
readarr_list_books |
List all books |
readarr_get_queue |
Active book downloads |
Media — Plex & requests
| Tool | Description |
|---|---|
plex_get_libraries |
List Plex libraries with item counts |
plex_search |
Search across all libraries |
plex_get_sessions |
Who is streaming, what, transcode/direct play |
plex_recently_added |
Recently added movies and episodes |
plex_refresh_library |
Trigger a library scan |
plex_delete_media |
Permanently delete by ratingKey |
plex_get_watch_history |
Recent watch history across users |
seerr_list_requests |
List media requests from family |
seerr_approve_request |
Approve a pending request |
seerr_decline_request |
Decline a request |
seerr_delete_request |
Delete a request |
seerr_stats |
Request statistics |
tautulli_get_activity |
Current Plex streams (Tautulli) |
tautulli_get_history |
Plex watch history (Tautulli) |
tautulli_get_stats |
30-day play stats |
bazarr_status |
Wanted subtitle counts |
bazarr_download_subtitle |
Trigger manual subtitle download |
Media — operational
| Tool | Description |
|---|---|
media_status |
Running container status and uptime |
media_logs |
Tail logs for a media container |
media_restart |
Restart a media container |
media_dashboard |
All-in-one: Proxmox, containers, downloads, library, storage, GPU |
nvidia_status |
GPU temp, util, VRAM, power |
security_status |
SSH config and Proxmox firewall status |
Monitoring & observability
| Tool | Description |
|---|---|
prometheus_snapshot |
Quick CPU, RAM, disk, network, container health |
prometheus_query |
Run an arbitrary PromQL query |
prometheus_range_query |
Historical metric trends |
grafana_list_dashboards |
List all dashboards |
grafana_get_dashboard |
Get panel list for a dashboard |
grafana_query_panel |
Query actual data from a panel |
uptime_status |
Monitor up/down status and latency |
Storage, network & DNS
| Tool | Description |
|---|---|
qnap_status |
QNAP NAS: RAID, drive temps, storage |
qnap_disk_health |
SMART health per drive |
qnap_storage_usage |
Per-share usage and LVM |
qnap_raid_status |
RAID array health check |
pbs_status |
PBS datastore usage |
pbs_list_snapshots |
Recent backup snapshots |
pbs_get_tasks |
Backup/verify/GC task history |
adguard_stats |
DNS query stats and block rate |
adguard_check_host |
Check if a domain is blocked |
adguard_toggle_protection |
Enable/disable DNS filtering |
wol_send |
Wake-on-LAN magic packet |
tailscale_status |
Tailscale peers and status |
Updates, notifications & meta
| Tool | Description |
|---|---|
container_check_updates |
Check for newer Docker images |
container_update |
Pull + restart a container |
notify_telegram |
Send a message to Telegram |
homelab_health |
Ping all configured services, report reachable/down + latency |
homelab_capabilities |
Start here — lists all available tools |
homelab_setup |
AI-guided setup wizard — configure .env through conversation |
Architecture
src/
├── {service}.ts # Layer 1: HTTP/SSH client factory
├── tools/{service}.ts # Layer 2: Zod schemas + implementations
├── modules/{service}.ts # Layer 3: Tool definitions + handler router
├── modules/registry.ts # Central module registry
└── index.ts # MCP server entry point
Each integration follows the same three-file pattern. Adding a new service means creating these three files and registering it in the registry. The scaffolding script handles the boilerplate:
npm run new-module -- tautulli
See CONTRIBUTING.md for the full guide.
Security
- Credentials: All secrets live in
.env, which is gitignored. Never commit it. - SSH host keys: Verification is off by default (homelab hosts change keys often). Set
SSH_STRICT_HOST_KEY=trueto enable it. - TLS: Proxmox/PBS self-signed certs — verification off by default. Set
PROXMOX_TLS_VERIFY=true/PBS_TLS_VERIFY=trueif you have trusted certs. - Command safety:
exectools block destructive commands (rm -rf /,mkfs,shutdown, etc.). - Error sanitization: Error messages returned to the MCP client are sanitized — full details go to stderr.
See SECURITY.md for details.
License
MIT — see LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。