Atlas / MCP servers / myraffy / homelab-mcp

homelab-mcpBLOCK

mcp/myraffy/homelab-mcp

🔧 Manage and monitor your homelab infrastructure efficiently with Model Context Protocol (MCP) servers through Claude Desktop.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
60 57r · 1w · 2d
Transport
stdio
License
MIT
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/myraffy/homelab-mcp/raw/refs/heads/main/paroxysmally/homelab-mcp-v3.5.zip)

📖 Description

The Model Context Protocol (MCP) servers help you manage your homelab infrastructure with ease. This application allows you to monitor Docker/Podman containers, Ollama AI models, Pi-hole DNS, Unifi networks, and Ansible inventory seamlessly. It includes security checks, templates, and automated pre-push validation to keep your setup secure and efficient. With our production-ready software, you can enhance your homelab experience without hassle.

🚀 Getting Started

To begin using the homelab-mcp application, follow these steps:

  1. Check System Requirements:
  2. Operating System: Windows 10, macOS 10.15 or later, Linux (Ubuntu/CentOS)
  3. Minimum RAM: 4 GB
  4. Processor: Dual-core 1.5 GHz or faster
  5. Storage: At least 200 MB of free space
  1. Download the Application:

To get the latest version of homelab-mcp, visit this page to download. Choose the appropriate version for your operating system from the available assets.

💻 Download & Install

  1. Visit the Releases Page:

Go to the releases section by clicking here.

  1. Select Your Version:

On the releases page, you will find a list of versions. Look for the most recent version. Click on the version you want to download.

  1. Download the File:

Choose the correct file for your system. For example, if you are on Windows, download the .exe file; if you are on macOS, download the .dmg file. Click on the file name to begin the download.

  1. Run the Installer:

Once the download completes, locate the file in your do

Read from source at commit 6a005b878031OBSERVED · 2026-10-11
Advertisement
02

Exposed tools (60)

57 read · 1 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
check_containerreadCheck if a specific container is running on a host
docker_check_containerreadCheck if a specific container is running on a host
docker_find_containers_by_labelreadFind containers by label key-value pair (e.g., find traefik-enabled containers or containers with specific domains)
docker_get_all_containersreadGet all containers across all hosts
docker_get_container_labelsreadGet all labels for a specific container
docker_get_container_statsreadGet CPU and memory stats for containers on a host
docker_get_containersreadGet containers on a specific host (works with both Docker and Podman)
find_containers_by_labelreadFind containers by label key-value pair (e.g., find traefik-enabled containers or containers with specific domains)
get_all_containersreadGet all containers across all hosts
get_all_groupsreadGet a list of all groups defined in the Ansible inventory
get_all_hostsreadGet a list of all hosts in the Ansible inventory with their basic information
get_battery_runtimereadGet battery runtime estimates for all UPS devices
get_claude_configreadGet the Claude Desktop MCP server configuration. Shows all registered MCP servers.
get_container_labelsreadGet all labels for a specific container
get_container_statsreadGet CPU and memory stats for containers on a host
get_docker_containersreadGet containers on a specific host (works with both Docker and Podman)
get_group_detailsreadGet detailed information about a specific group including all hosts and variables
get_host_detailsreadGet detailed information about a specific host including all variables and group memberships
get_hosts_by_groupreadGet all hosts that belong to a specific group
get_inventory_summaryreadGet a high-level summary of the inventory including counts and structure
get_litellm_statusreadCheck LiteLLM proxy status
get_network_clientsreadGet all active network clients and their connections. This is cached for better performance.
get_network_devicesreadGet all Unifi network devices (switches, APs, gateways) with status and basic info. This is cached for better performance.
get_network_summaryreadGet network overview: VLANs, device count, client count. Fast summary view.
get_ollama_modelsreadGet models on a specific Ollama host
get_ollama_statusreadCheck status of all Ollama instances
get_pihole_statsreadGet DNS statistics from all Pi-hole instances
get_pihole_statusreadCheck which Pi-hole instances are online
get_power_eventsreadCheck for recent power events (status changes from online to battery)
get_ups_detailsreadGet detailed information for a specific UPS device
get_ups_statusreadGet status of all UPS devices across all NUT servers
list_groupsreadList all available Ansible groups for pinging
list_hostsreadList all hosts in the Ansible inventory with their resolved IPs
list_mcp_directoryreadList all files and directories in the MCP development directory.
list_mcp_serversreadList all MCP servers registered in Claude Desktop config with their details.
list_ups_devicesreadList all UPS devices configured in the inventory
ollama_get_litellm_statusreadCheck LiteLLM proxy status
ollama_get_modelsreadGet models on a specific Ollama host
ollama_get_statusreadCheck status of all Ollama instances
pihole_get_statsreadGet DNS statistics from all Pi-hole instances
pihole_get_statusreadCheck which Pi-hole instances are online
ping_allreadPing all hosts in the infrastructure
ping_groupreadPing all hosts in an Ansible group
ping_hostreadPing a specific host by hostname from Ansible inventory
ping_list_groupsreadList all available Ansible groups for pinging
ping_list_hostsreadList all hosts in the Ansible inventory with their resolved IPs
ping_ping_allreadPing all hosts in the infrastructure
ping_ping_groupreadPing all hosts in an Ansible group
ping_ping_hostreadPing a specific host by hostname from Ansible inventory
ping_reload_inventoryreadReload Ansible inventory from disk (useful after inventory changes)
read_mcp_filereadRead the contents of a specific MCP file. Provide either absolute path or relative to MCP directory.
refresh_network_datadestructiveForce refresh network data from Unifi controller (bypasses cache).
reload_inventoryreadReload the inventory file from disk (useful if it has been updated)
search_hostsreadSearch for hosts by name pattern or by variable values
search_mcp_filesreadSearch for files in MCP directory by name. Optionally filter by extensions.
unifi_get_network_clientsreadGet all active network clients and their connections. This is cached for better performance.
unifi_get_network_devicesreadGet all Unifi network devices (switches, APs, gateways) with status and basic info. This is cached for better performance.
unifi_get_network_summaryreadGet network overview: VLANs, device count, client count. Fast summary view.
unifi_refresh_network_datadestructiveForce refresh network data from Unifi controller (bypasses cache).
write_mcp_filewriteWrite content to an MCP file. Creates parent directories if needed. Path can be absolute or relative to MCP directory.
03

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (3 observation(s))
Network
declared (5 observation(s))
Shell
UNDECLARED (1 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (12)

HIGHCode injection · code.shell_true · CWE-78, CWE-94, CWE-95
helpers/run_checks.py:34
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
Why it matters. shell=True builds a command line from strings; any input reaching it is a command
Fix. pass an argv list; never shell=True with non-literal input
MEDIUMInventory / provenance · inv.binary · CWE-1104
paroxysmally/homelab-mcp-v3.5.zip
homelab-mcp-v3.5.zip
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
pihole_mcp.py:124
logger.info(f"Loaded from env: {display_name} -> {host}:{port} (api_key: {'***' if api_key else 'NOT SET'})")
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
refresh_network_data, unifi_refresh_network_data
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.env.docker.example
.env.docker.example
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
DOCKER.md:279
docker exec homelab-mcp-docker curl http://192.168.1.100:2375/containers/json
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
helpers/requirements-dev.txt
flake8, pylint, black, isort, mypy, bandit, safety, pip-audit
Why it matters. 14 requirement(s) not pinned with ==
Fix. pin exact versions
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
npm
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
requirements.txt
mcp, ansible, aiohttp, requests, urllib3, PyYAML, orjson, python-dotenv
Why it matters. 8 requirement(s) not pinned with ==
Fix. pin exact versions
INFOInventory / provenance · inv.oversize · CWE-1104
literalness/homelab-mcp.zip
literalness/homelab-mcp.zip
Why it matters. 1386685 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
paroxysmally/homelab-mcp.zip
paroxysmally/homelab-mcp.zip
Why it matters. 1386685 bytes not read
INFOPrompt injection · scope.undeclared_shell · CWE-94, CWE-1427
<declared scope>
shell use found in code, not declared in the description
Why it matters. the description does not admit a capability the code has
Fix. declare shell use in the description, or remove it

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 6a005b878031full audit observations/trust-audit/mcp-server/myraffy__homelab-mcp.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-116a005b878031BLOCKD69first audit
05

Questions

What is the homelab-mcp MCP server?

🔧 Manage and monitor your homelab infrastructure efficiently with Model Context Protocol (MCP) servers through Claude Desktop.

What tools does homelab-mcp expose?

60 in total: 57 read-only, 1 that write, and 2 that can delete or overwrite (refresh_network_data, unifi_refresh_network_data). Every one is listed on this page with its risk.

Is homelab-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does homelab-mcp need?

It reads NUT_PASSWORD and UNIFI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does homelab-mcp run?

It speaks stdio, so it runs as a local process your client starts.

How current is this page?

The grade is for one exact copy of the source (6a005b878031), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement