docker_get_containersLABSCO SUMMARY
Inventory-driven enums are the difference between usable and guesswork.
Without an inventory the tools still work, but you are typing hostnames from memory; with ANSIBLE_INVENTORY_PATH set, your real groups appear as choices and a wrong guess stops being a failure mode. The MCP Registry Inspector server is deprecated as of v2.3.0 and slated for removal in v3.0.0, since clients can now read those files directly — leave it out of new configurations.
What it is
A set of MCP servers for homelab infrastructure, shipped either as one unified process with namespaced tools or as seven individual servers. It reads container state across hosts, resolves hosts and groups from your Ansible inventory, checks Ollama and LiteLLM, reports Pi-hole DNS statistics, lists Unifi network devices and clients, and monitors UPS power through NUT. Point it at an inventory file and the tool parameters are populated with your actual group and host names instead of free-text fields.
What you get
- Containers across every configured Docker or Podman host: full listings, per-container stats, existence checks and label-based lookups —
docker_get_containers,docker_get_all_containers,docker_get_container_stats,docker_check_container,docker_find_containers_by_label,docker_get_container_labels - Your Ansible inventory as a queryable graph: hosts, groups, host details, group membership, search and a summary, with a reload that avoids restarting —
ansible_get_all_hosts,ansible_get_all_groups,ansible_get_host_details,ansible_get_group_details,ansible_get_hosts_by_group,ansible_search_hosts,ansible_get_inventory_summary,ansible_reload_inventory - Reachability checks against one host, a group, or everything in the inventory —
ping_host,ping_group,ping_all,list_groups - Local model infrastructure: which Ollama instances are up, what models they hold, and whether the LiteLLM proxy is healthy —
get_ollama_status,get_ollama_models,get_litellm_status - Pi-hole DNS statistics and status, and Unifi devices, clients and a network summary —
get_pihole_stats,get_pihole_status,get_network_devices,get_network_clients,get_network_summary,refresh_network_data - UPS power state through NUT: status, details, remaining battery runtime and recent power events across the UPS devices you have —
get_ups_status,get_ups_details,get_battery_runtime,get_power_events,list_ups_devices
Requirements
Python 3.10 or newer for the native install, or the published image bjeans/homelab-mcp — the Docker path is the one the README recommends for production. Credentials for each service go in a .env file the README asks you to keep out of version control, with a separate API key per service. ANSIBLE_INVENTORY_PATH points at your inventory and is what turns tool parameters into dropdowns; the enums are built once at startup, so changing the inventory means restarting the client. Unified mode runs all seven servers in one process with namespaced tool names; setting ENABLED_SERVERS selects individual ones instead. FastMCP gives it stdio by default plus HTTP and SSE transports. The README is blunt that Docker and Podman APIs are typically unauthenticated HTTP and must never be reachable from the internet — restrict them with firewall rules first.
Setup effort
One command plus a key — docker pull bjeans/homelab-mcp:latest, then supply credentials
USE CASES
Finding which host a container is actually on
List containers across every configured host at once, or look them up by label, instead of SSHing into each machine in turn.
Checking whether a group of machines is up
Ping a whole Ansible group by name after reading the inventory, rather than assembling the address list yourself.
Working out why a local model call is failing
Check each Ollama instance's status and the models it holds, then confirm the LiteLLM proxy in front of them is healthy.
Understanding a power event after the fact
Read UPS status and remaining runtime, then pull the recent power events to see what the batteries were doing when things went down.
33 tools
Listed in project docs. Your client may show a different list.
docker_get_all_containersdocker_get_container_statsdocker_check_containerdocker_find_containers_by_labeldocker_get_container_labelsget_ollama_statusget_ollama_modelsget_litellm_statusget_pihole_statsget_pihole_statusget_network_devicesget_network_clientsget_network_summaryrefresh_network_dataansible_get_all_hostsansible_get_all_groupsansible_get_host_detailsansible_get_group_detailsansible_get_hosts_by_groupansible_search_hostsansible_get_inventory_summaryansible_reload_inventoryping_hostping_groupping_alllist_groupsget_ups_statusget_ups_detailsget_battery_runtimeget_power_eventslist_ups_devicesreload_inventoryBEFORE YOU INSTALL
What to know first
Tools you get
33 tools named in the project's documentation.
Requires
- docker on PATH
- Python 3.10+
- PIHOLE_API_KEY_SERVER1 in your environment
- UNIFI_API_KEY in your environment
Where it runs
The documented client runs the server on your machine.
INSTALLATION
Connect your client
Server setup
docker pull bjeans/homelab-mcp:latestMCP Clients
Claude Desktop
{
"mcpServers": {
"homelab-unified": {
"command": "docker",
"args": [
"exec",
"-i",
"homelab-mcp",
"python",
"homelab_unified_mcp.py"
]
}
}
}The configuration on this page does not set PIHOLE_API_KEY_SERVER1, PIHOLE_API_KEY_SERVER2 and UNIFI_API_KEY; the project's instructions put them in a .env file. Check which folder the server reads that file from before you rely on it.