Provides read-only query access to Ansible inventory, enabling retrieval of hosts, groups, host details, and infrastructure configuration from Ansible inventory files.
Manages Docker and Podman containers across multiple hosts, providing tools to view containers, check stats, monitor container status, and query container labels.
Monitors and manages Ollama AI model instances across homelab infrastructure, enabling model listing, instance health checks, and LiteLLM proxy status verification.
Monitors Pi-hole DNS instances across multiple hosts, providing access to DNS statistics, query metrics, and instance availability status.
Manages Podman containers across multiple hosts, providing tools to view containers, check stats, monitor container status, and query container labels.
Monitors UPS devices using Network UPS Tools (NUT) protocol, providing real-time status, battery runtime estimates, power event detection, and device health information across multiple hosts.
Homelab MCP Servers
Model Context Protocol (MCP) servers for managing homelab infrastructure through Claude Desktop.
A collection of Model Context Protocol (MCP) servers for managing and monitoring your homelab infrastructure through Claude Desktop.
š Security Notice
ā ļø IMPORTANT: Please read
This project interacts with critical infrastructure (Docker APIs, DNS, network devices). Improper configuration can expose your homelab to security risks.
Key Security Requirements:
NEVER expose Docker/Podman APIs to the internet - Use firewall rules to restrict access
Keep - Contains API keys and should never be committed
Use unique API keys - Generate separate keys for each service
Review network security - Ensure proper VLAN segmentation and firewall rules
See SECURITY.md for comprehensive security guidance.
ļæ½ Documentation Overview
This project includes several documentation files for different audiences:
README.md (this file) - Installation, setup, and usage guide
MIGRATION.md - Migration guide for v2.0 unified server
PROJECT_INSTRUCTIONS.md - Copy into Claude project instructions for AI context
CLAUDE.md - Developer guide for AI assistants and contributors
SECURITY.md - Security policies and best practices
CONTRIBUTING.md - How to contribute to this project
CHANGELOG.md - Version history and changes
š„ For End Users: Follow this README + copy PROJECT_INSTRUCTIONS.md to Claude š Migrating from v1.x? See MIGRATION.md for unified server migration š¤ For AI Assistants: Read CLAUDE.md for complete development context š§ For Contributors: Start with CONTRIBUTING.md and CLAUDE.md
ļæ½š Important: Configure Claude Project Instructions
After setting up the MCP servers, create your personalized project instructions:
Copy the example template:
# Windows copy PROJECT_INSTRUCTIONS.example.md PROJECT_INSTRUCTIONS.md # Linux/Mac cp PROJECT_INSTRUCTIONS.example.md PROJECT_INSTRUCTIONS.mdEdit the file with your actual infrastructure details:
PROJECT_INSTRUCTIONS.md (for Claude Desktop project instructions):
Replace example IP addresses with your real network addresses
Add your actual server hostnames
Customize with your specific services and configurations
Keep this file private - it contains your network topology
CLAUDE_CUSTOM.md (for AI development work - contributors only):
Update repository URLs with your actual GitHub repository
Add your Notion workspace URLs if using task management
Customize infrastructure references
Keep this file private - contains your specific URLs and setup
Add to Claude Desktop:
Open Claude Desktop
Go to your project settings
Copy the contents of your customized
PROJECT_INSTRUCTIONS.mdPaste into the "Project instructions" field
What's included:
Detailed MCP server capabilities and usage patterns
Infrastructure overview and monitoring capabilities
Specific commands and tools available for each service
Troubleshooting and development guidance
This README covers installation and basic setup. The project instructions provide Claude with comprehensive usage context.
šÆ Deployment Options
Version 2.2.0 offers flexible deployment with two modes and two methods:
Deployment Modes
Choose how your MCP servers are organized:
1. Unified Server (Recommended)
Run all MCP servers in a single process with namespaced tools. This is the recommended approach for new installations and required for Docker deployments.
Advantages:
ā Single configuration entry
ā One Python process for all servers
ā Cleaner logs (no duplicate warnings)
ā All tools namespaced (e.g.,
docker_get_containers,ping_ping_host)ā Required for Docker deployments
ā Built-in health checks
ā Production-ready containerization
2. Individual Servers (Legacy, Fully Supported)
Run each MCP server as a separate process. This mode remains fully supported for backward compatibility and only available with native Python installation.
Advantages:
ā Granular control over each server
ā Can enable/disable servers individually
ā Original tool names (e.g.,
get_docker_containers,ping_host)ā Backward compatible with v1.x
Note: Tool names differ between modes. See MIGRATION.md for detailed migration instructions and tool name changes.
Deployment Methods
Choose how to install and run the servers:
1. Docker Container (Recommended for Production)
Pre-built images available on Docker Hub for immediate deployment. See š³ Docker Deployment for full setup instructions.
Quick Start:
Advantages:
ā No Python environment setup required
ā Pre-built, tested images
ā Automatic updates with image pulls
ā Multi-platform support (amd64, arm64)
ā Simplified configuration
ā Production-grade containerization
Limitations:
Unified server mode only
mcp-registry-inspector not available (deprecated)
2. Native Python Installation (Development & Legacy)
Install Python dependencies directly and run servers from source. See š¦ Installation for full setup instructions.
Quick Start:
Advantages:
ā Full access to source code
ā Easy debugging and development
ā Supports both unified and individual server modes
ā Can run on any Python-compatible platform
Requirements:
Python 3.10+ with pip
Manual dependency management
Environment configuration via .env file
Migration Guide: See MIGRATION.md for detailed instructions on switching between modes or methods.
š Quick Start
1. Clone the repository
2. Install security checks (recommended)
3. Set up configuration files
Environment variables:
Edit .env with your actual values:
Ansible inventory (if using):
Edit with your infrastructure details.
Project instructions:
Customize with your network topology and servers.
AI development guide customizations (optional):
Customize with your actual server names and infrastructure details. This file is gitignored and allows Claude to understand your specific homelab setup. See CLAUDE.md for more information about local customizations.
4. Install Python dependencies
5. Add to Claude Desktop config
Config file location:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Option A: Unified Server (Recommended)
Single entry for all homelab servers:
Note: The unified server includes 7 MCP servers: Ansible, Docker/Podman, Ollama, Pi-hole, Unifi, UPS, and Ping. The deprecated mcp-registry-inspector is not included.
Option B: Individual Servers (Legacy)
Separate entry for each server:
Note: Tool names differ between modes. See MIGRATION.md for details. The deprecated mcp-registry-inspector has been removed from this example. Ansible MCP server integration is tracked in #39.
6. Restart Claude Desktop
7. Add project instructions to Claude
Copy the contents of your customized
PROJECT_INSTRUCTIONS.mdPaste into your Claude project's "Project instructions" field
This gives Claude comprehensive context about your MCP capabilities
š³ Docker Deployment (Alternative)
Run the MCP servers in Docker containers for easier distribution, isolation, and production deployment.
Docker Hub: bjeans/homelab-mcp
Quick Start with Docker Hub (Easiest)
Pre-built images are automatically published to Docker Hub with multi-platform support (amd64/arm64):
Available on Docker Hub: https://hub.docker.com/r/bjeans/homelab-mcp/tags
Currently available tags:
latest- Latest stable release from main branch (recommended)edge- Latest development build from main branchmain-<git-sha>- Specific commit builds for traceability (e.g.,main-17bae01)
Semantic version tags (available after release):
Version tags like
2.2.0,2.2,2will be created when thev2.2.0Git release is publishedUntil then, use
latestfor the most recent stable build
Multi-platform support:
linux/amd64- x86_64 servers and workstationslinux/arm64- Raspberry Pi, ARM-based systems
Build from Source (Advanced)
Build the image locally if you need to customize:
Building from source (optional):
Docker Features
2.0.0 Docker Improvements:
ā Unified MCP server as default entrypoint (all 7 servers in one container)
ā Automatic unified mode detection (no ENABLED_SERVERS needed)
ā Built-in health checks (HEALTHCHECK configured)
ā Non-root user security (mcpuser UID 1000)
ā Proper signal handling and clean shutdown
ā Optimized layer caching for faster rebuilds
ā System dependencies included (iputils-ping for cross-platform support)
Configuration Methods
Method 1: Ansible Inventory (Recommended)
Method 2: Environment Variables (Marketplace Ready)
Legacy Mode: Individual Servers (Docker)
For backward compatibility, you can still run individual servers by setting ENABLED_SERVERS:
Available Servers
Unified Mode (Default):
ā All 7 servers in one process: Ansible, Docker, Ping, Ollama, Pi-hole, Unifi, UPS
ā Namespaced tools (e.g.,
ansible_get_all_hosts,docker_get_containers,ups_get_ups_status)ā Single configuration entry
ā Built-in health checks
Legacy Mode (Set
ā
ansible- Ansible inventory queriesā
docker- Docker/Podman container managementā
ping- Network ping utilitiesā
ollama- Ollama AI model managementā
pihole- Pi-hole DNS statisticsā
unifi- Unifi network device monitoringā
ups- UPS/NUT power monitoring
Docker Configuration
Two configuration methods supported:
Ansible Inventory (Recommended) - Mount as volume
Environment Variables - Pass via Docker
-eflags
See DOCKER.md for comprehensive Docker deployment guide including:
Detailed setup instructions
Network configuration options
Security best practices
Claude Desktop integration
Troubleshooting common issues
Integration with Claude Desktop
Unified Mode (Recommended):
Legacy Mode (Individual Servers):
Important: Use docker exec -i (not -it) for proper MCP stdio communication.
Testing Docker Containers
Quick verification test (using environment variables - marketplace ready):
Docker Compose testing:
For comprehensive Docker deployment guide, see DOCKER.md.
š¦ Available MCP Servers
⨠Dynamic Tool Parameter Enums (New in v2.1.0)
When you configure Ansible inventory, Claude Desktop will automatically show your infrastructure options in dropdown menus. No more guessing hostnames or group names!
What gets auto-populated:
Ping tools - Your Ansible groups appear in dropdown menus
Docker tools - Your Docker/Podman hosts shown in dropdowns
Ollama tools - Your Ollama server hostnames available for selection
UPS tools - Your NUT server hostnames shown in dropdowns
How it works:
Set
ANSIBLE_INVENTORY_PATHin your.envfileRestart Claude Desktop (required - enums load at startup)
When using tools, Claude shows your actual infrastructure in dropdown menus instead of requiring manual entry
Important Notes:
Restart Required: Changes to Ansible inventory require restarting Claude Desktop to update dropdown options
Performance: Enums generate once at startup - minimal impact even with large inventories (100+ hosts)
Graceful Degradation: If no Ansible inventory is configured, tools still work - you just won't see dropdown suggestions
Example before/after:
Before: "Which group should I ping?" ā User manually types "webservers" (or guesses)
After: "Which group should I ping?" ā User selects from dropdown: all, docker_hosts, webservers, databases, etc.
Troubleshooting:
Dropdowns not showing? Verify
ANSIBLE_INVENTORY_PATHis set and restart Claude DesktopWrong options showing? Check that your Ansible inventory is up-to-date and restart Claude Desktop
Performance issues? Enum generation happens once at startup - if slow, check inventory file size and Ansible installation
MCP Registry Inspector (ā ļø DEPRECATED)
Deprecation Notice (v2.3.0): This tool is deprecated. Claude Desktop now has native file system access, making this MCP server unnecessary. You can simply ask Claude to read your MCP server files or configuration directly.
Replacement: Use Claude's built-in file access:
"Read my claude_desktop_config.json file"
"Show me the source code for docker_mcp_podman.py"
"List all .py files in this directory"
For users with existing configurations: This server will continue to work but will not receive updates. It will be removed from documentation in v3.0.0. Consider removing it from your claude_desktop_config.json.
Tools:
get_claude_config- View Claude Desktop MCP configurationlist_mcp_servers- List all registered MCP serverslist_mcp_directory- Browse MCP development directoryread_mcp_file- Read MCP server source codewrite_mcp_file- Write/update MCP server filessearch_mcp_files- Search for files by name
Configuration:
Docker/Podman Container Manager
Manage Docker and Podman containers across multiple hosts.
š Security Warning: Docker/Podman APIs typically use unencrypted HTTP without authentication. See SECURITY.md for required firewall configuration.
Tools:
Individual server mode:
get_docker_containers- Get containers on a specific hostget_all_containers- Get all containers across all hostsget_container_stats- Get CPU and memory statscheck_container- Check if a specific container is runningfind_containers_by_label- Find containers by labelget_container_labels- Get all labels for a container
Unified server mode (namespaced):
docker_get_containers- Get containers on a specific hostdocker_get_all_containers- Get all containers across all hostsdocker_get_container_stats- Get CPU and memory statsdocker_check_container- Check if a specific container is runningdocker_find_containers_by_label- Find containers by labeldocker_get_container_labels- Get all labels for a container
Configuration Options:
Option 1: Using Ansible Inventory (Recommended)
Option 2: Using Environment Variables
Ollama AI Model Manager
Monitor and manage Ollama AI model instances across your homelab, plus check your LiteLLM proxy for unified API access.
What's Included
Ollama Monitoring:
Track multiple Ollama instances across different hosts
View available models and their sizes
Check instance health and availability
LiteLLM Proxy Integration:
LiteLLM provides a unified OpenAI-compatible API across all your Ollama instances
Enables load balancing and failover between multiple Ollama servers
Allows you to use OpenAI client libraries with your local models
The MCP server can verify your LiteLLM proxy is online and responding
Why use LiteLLM?
Load Balancing: Automatically distributes requests across multiple Ollama instances
Failover: If one Ollama server is down, requests route to healthy servers
OpenAI Compatibility: Use any OpenAI SDK/library with your local models
Centralized Access: Single endpoint (e.g.,
http://192.0.2.10:4000) for all modelsUsage Tracking: Monitor which models are being used most
Tools:
get_ollama_status- Check status of all Ollama instances and model countsget_ollama_models- Get detailed model list for a specific hostget_litellm_status- Verify LiteLLM proxy is online and responding
Configuration Options:
Option 1: Using Ansible Inventory (Recommended)
Option 2: Using Environment Variables
Setting Up LiteLLM (Optional):
If you want to use LiteLLM for unified access to your Ollama instances:
Install LiteLLM on one of your servers:
pip install litellm[proxy]Create configuration (
litellm_config.yaml):model_list: - model_name: llama3.2 litellm_params: model: ollama/llama3.2 api_base: http://server1:11434 - model_name: llama3.2 litellm_params: model: ollama/llama3.2 api_base: http://server2:11434 router_settings: routing_strategy: usage-based-routingStart LiteLLM proxy:
litellm --config litellm_config.yaml --port 4000Use the MCP tool to verify it's running:
In Claude: "Check my LiteLLM proxy status"
Example Usage:
"What Ollama instances do I have running?"
"Show me all models on my Dell-Server"
"Is my LiteLLM proxy online?"
"How many models are available across all servers?"
Pi-hole DNS Manager
Monitor Pi-hole DNS statistics and status.
š Security Note: Store Pi-hole API keys securely in .env file. Generate unique keys per instance.
Tools:
get_pihole_stats- Get DNS statistics from all Pi-hole instancesget_pihole_status- Check which Pi-hole instances are online
Configuration Options:
Option 1: Using Ansible Inventory (Recommended)
Option 2: Using Environment Variables
Getting Pi-hole API Keys:
Web UI: Settings ā API ā Show API Token
Or generate new:
pihole -a -pon Pi-hole server
Unifi Network Monitor
Monitor Unifi network infrastructure and clients with caching for performance.
š Security Note: Use a dedicated API key with minimal required permissions.
Tools:
get_network_devices- Get all network devices (switches, APs, gateways)get_network_clients- Get all active network clientsget_network_summary- Get network overviewrefresh_network_data- Force refresh from controller (bypasses cache)
Configuration:
Note: Data is cached for 5 minutes to improve performance. Use refresh_network_data to force update.
Ansible Inventory Inspector
Query Ansible inventory information (read-only). Available in both unified and standalone modes.
Unified Mode Tools (with ansible_ prefix):
ansible_get_all_hosts- Get all hosts in inventoryansible_get_all_groups- Get all groupsansible_get_host_details- Get detailed host informationansible_get_group_details- Get detailed group informationansible_get_hosts_by_group- Get hosts in specific groupansible_search_hosts- Search hosts by pattern or variableansible_get_inventory_summary- High-level inventory overviewansible_reload_inventory- Reload inventory from disk
Standalone Mode Tools (without prefix):
get_all_hosts- Get all hosts in inventoryget_all_groups- Get all groupsget_host_details- Get detailed host informationget_group_details- Get detailed group informationget_hosts_by_group- Get hosts in specific groupsearch_hosts- Search hosts by pattern or variableget_inventory_summary- High-level inventory overviewreload_inventory- Reload inventory from disk
Configuration:
Deployment:
ā Available in unified server mode
ā Available in Docker deployments
ā Available in standalone mode:
python ansible_mcp_server.py
Ping Network Connectivity Monitor
Test network connectivity and host availability using ICMP ping across your infrastructure.
Why use this?
Quick health checks during outages or after power events
Verify which hosts are reachable before querying service-specific MCPs
Simple troubleshooting tool to identify network issues
Baseline connectivity testing for your infrastructure
Tools:
ping_host- Ping a single host by name (resolved from Ansible inventory)ping_group- Ping all hosts in an Ansible group concurrentlyping_all- Ping all infrastructure hosts concurrentlylist_groups- List available Ansible groups for ping operations
Features:
ā Cross-platform support - Works on Windows, Linux, and macOS
ā Ansible integration - Automatically resolves hostnames/IPs from inventory
ā Concurrent pings - Test multiple hosts simultaneously for faster results
ā Detailed statistics - RTT min/avg/max, packet loss percentage
ā Customizable - Configure timeout and packet count
ā No dependencies - Uses system
pingcommand (no extra libraries needed)
Configuration:
Example Usage:
"Ping server1.example.local"
"Check connectivity to all Pi-hole servers"
"Ping all Ubuntu_Server hosts"
"Test connectivity to entire infrastructure"
"What groups can I ping?"
When to use:
After power outages - Quickly identify which hosts came back online
Before service checks - Verify host is reachable before checking specific services
Network troubleshooting - Isolate connectivity issues from service issues
Health monitoring - Regular checks to ensure infrastructure availability
UPS Monitoring (Network UPS Tools)
Monitor UPS (Uninterruptible Power Supply) devices across your infrastructure using Network UPS Tools (NUT) protocol.
Why use this?
Real-time visibility into power infrastructure status
Proactive alerts before battery depletion during outages
Monitor multiple UPS devices across different hosts
Track battery health and runtime estimates
Essential for critical infrastructure planning
Tools:
get_ups_status- Check status of all UPS devices across all NUT serversget_ups_details- Get detailed information for a specific UPS deviceget_battery_runtime- Get battery runtime estimates for all UPS devicesget_power_events- Check for recent power events (on battery, low battery)list_ups_devices- List all UPS devices configured in inventoryreload_inventory- Reload Ansible inventory after changes
Features:
ā NUT protocol support - Uses Network UPS Tools standard protocol (port 3493)
ā Ansible integration - Automatically discovers UPS from inventory
ā Multiple UPS per host - Support for servers with multiple UPS devices
ā Battery monitoring - Track charge level, runtime remaining, load percentage
ā Power event detection - Identify when UPS switches to battery or low battery
ā Cross-platform - Works with any NUT-compatible UPS (TrippLite, APC, CyberPower, etc.)
ā Flexible auth - Optional username/password authentication
Configuration:
Option 1: Using Ansible Inventory (Recommended)
Ansible inventory example:
Option 2: Using Environment Variables
Prerequisites:
Install NUT on servers with UPS devices:
# Debian/Ubuntu sudo apt install nut nut-client nut-server # RHEL/Rocky/CentOS sudo dnf install nut nut-clientConfigure NUT daemon (
[tripplite] driver = usbhid-ups port = auto desc = "TrippLite SMART1500LCDXL"Enable network monitoring (
LISTEN 0.0.0.0 3493Configure access (
[monuser] password = secret upsmon masterStart NUT services:
sudo systemctl enable nut-server nut-client sudo systemctl start nut-server nut-client
Example Usage:
"What's the status of all my UPS devices?"
"Show me battery runtime for the Dell server UPS"
"Check for any power events"
"Get detailed info about the TrippLite UPS"
"List all configured UPS devices"
When to use:
After power flickers - Verify UPS devices handled the event properly
Before maintenance - Check battery levels and estimated runtime
Regular monitoring - Track UPS health and battery condition
Capacity planning - Understand how long systems can run on battery
Common UPS Status Codes:
OL- Online (normal operation, AC power present)OB- On Battery (power outage, running on battery)LB- Low Battery (critically low battery, shutdown imminent)CHRG- Charging (battery is charging)RB- Replace Battery (battery needs replacement)
š Security
Automated Security Checks
This project includes automated security validation to prevent accidental exposure of sensitive data:
Install the pre-push git hook (recommended):
What it does:
Automatically runs
helpers/pre_publish_check.pybefore every git pushBlocks pushes that contain potential secrets or sensitive data
Protects against accidentally committing API keys, passwords, or personal information
Manual security check:
Bypass security check (use with extreme caution):
Critical Security Practices
Configuration Files:
ā DO use
.env.exampleas a templateā DO keep
.envfile permissions restrictive (chmod 600on Linux/Mac)ā NEVER commit
.envto version controlā NEVER commit
ansible_hosts.ymlwith real infrastructureā NEVER commit
PROJECT_INSTRUCTIONS.mdwith real network topology
API Security:
ā DO use unique API keys for each service
ā DO rotate API keys regularly (every 90 days recommended)
ā DO use strong, randomly-generated keys (32+ characters)
ā NEVER expose Docker/Podman APIs to the internet
ā NEVER reuse API keys between environments
Network Security:
ā DO use firewall rules to restrict API access
ā DO implement VLAN segmentation
ā DO enable TLS/HTTPS where possible
ā NEVER expose management interfaces publicly
For detailed security guidance, see
š Requirements
System Requirements
Python: 3.10 or higher
Claude Desktop: Latest version recommended
Network Access: Connectivity to homelab services
Python Dependencies
Install via requirements.txt:
Core dependencies:
mcp- Model Context Protocol SDKaiohttp- Async HTTP clientpyyaml- YAML parsing for Ansible inventory
Service Requirements
Docker/Podman: API enabled on monitored hosts
Pi-hole: v6+ with API enabled
Unifi Controller: API access enabled
Ollama: Running instances with API accessible
NUT (Network UPS Tools): Installed and configured on hosts with UPS devices
Ansible: Inventory file (optional but recommended)
š» Compatibility
Tested Platforms
Developed and tested on:
OS: Windows 11
Claude Desktop: Version 0.13.64
Python: Version 3.13.8
Cross-Platform Notes
Windows: Fully tested and supported ā macOS: Should work but untested ā ļø Linux: Should work but untested ā ļø
Known platform differences:
File paths in documentation are Windows-style
Path separators may need adjustment for Unix systems
.envfile permissions should be set on Unix (chmod 600 .env)
Contributions for other platforms welcome!
š ļø Development
š First time contributing? Read CLAUDE.md for complete development guidance including architecture patterns, security requirements, and AI assistant workflows.
Getting Started
Install security git hook (required for contributors):
python helpers/install_git_hook.pySet up development environment:
pip install -r requirements.txt cp .env.example .env # Edit .env with your test values
Testing MCP Servers Locally
Before submitting a PR, test your MCP server changes locally using the MCP Inspector tool.
Quick start:
This opens a web-based debugger at http://localhost:5173 where you can:
See all available tools for the MCP server
Test each tool with sample arguments
Verify responses are properly formatted
Debug issues before submitting PRs
For detailed testing instructions, see the Testing MCP Servers Locally section in CONTRIBUTING.md.
Helper Scripts
The helpers/ directory contains utility scripts for development and deployment:
install_git_hook.py- Installs git pre-push hook for automatic security checkspre_publish_check.py- Security validation script (runs automatically via git hook)
Usage:
Project Structure
Adding a New MCP Server
Create the server file
#!/usr/bin/env python3 """ My Service MCP Server Description of what it does """ import asyncio from mcp.server import Server # ... implement tools ...Add configuration to
# My Service Configuration MY_SERVICE_HOST=192.168.1.100 MY_SERVICE_API_KEY=your-api-keyUpdate documentation
Add server details to this README
Update
PROJECT_INSTRUCTIONS.example.mdUpdate
CLAUDE.mdif adding new patterns or capabilitiesAdd security notes if applicable
Test thoroughly
Test with real infrastructure
Verify error handling
Check for sensitive data leaks
Review security implications
Environment Variables
All MCP servers support two configuration methods:
1. Environment Variables (
Simple key=value pairs
Loaded automatically by each MCP server
Good for simple setups or testing
2. Ansible Inventory (recommended for production)
Centralized infrastructure definition
Supports complex host groupings
Better for multi-host environments
Set
ANSIBLE_INVENTORY_PATHin.env
Coding Standards
Python 3.10+ syntax and features
Async/await for all I/O operations
Type hints where beneficial
Error handling for network operations
Logging to stderr for debugging
Security: Validate inputs, sanitize outputs
Testing Checklist
Before committing changes:
Security git hook installed (
python helpers/install_git_hook.py)Manual security check passes (
python helpers/pre_publish_check.py)No sensitive data in code or commits
Environment variables for all configuration
Error handling for network failures
Logging doesn't expose secrets
Documentation updated
Security implications reviewed
.gitignoreupdated if needed
š Troubleshooting
MCP Servers Not Appearing in Claude
Check Claude Desktop config:
# Windows type %APPDATA%\Claude\claude_desktop_config.json # Mac/Linux cat ~/.config/Claude/claude_desktop_config.jsonVerify Python path is correct in config
Restart Claude Desktop completely
Check logs - MCP servers log to stderr
Connection Errors
Docker/Podman API:
Pi-hole API:
Ollama:
Understanding Error Messages
Error Message Format (v2.2.0+):
All MCP servers now provide detailed, actionable error messages in this format:
Common Error Types:
1. Authentication Failed (401)
Example:
How to Fix:
Check your
.envfile for the correct API key variableVerify the API key matches the service's admin panel
For Pi-hole: Settings > API > Show API token
For Unifi: Settings > Admins > API > Generate key
2. Connection Failed
Example:
How to Fix:
Verify the service is running:
systemctl status [service-name]Test network connectivity with
ncortelnetCheck firewall rules allow access to the port
Verify the hostname/IP is correct in your configuration
3. Timeout Errors
Example:
How to Fix:
Check if the service is running:
systemctl status ollamaLook for performance issues in service logs
Verify network latency:
ping [hostname]Consider increasing timeout values if service is legitimately slow
4. Invalid/Expired Credentials (403)
Example:
How to Fix:
Check account permissions in the service admin panel
Ensure the API key has admin/full access rights
Regenerate API key if permissions were recently changed
5. Unifi Exporter Errors
Before (v2.1.0):
After (v2.2.0):
How to Fix:
Log into Unifi controller
Navigate to Settings > Admins > API
Verify or regenerate API key
Update
UNIFI_API_KEYin.envfileRestart Claude Desktop to reload configuration
6. Service Unavailable (503)
How to Fix:
Check if the service is running
Look for service startup errors in logs
Verify all dependencies are available
Consider restarting the service
Debugging Tips
Enable Detailed Logging:
All errors are logged to stderr with full context. Check Claude Desktop logs:
Windows:
%APPDATA%\Claude\logs\Mac:
~/Library/Logs/Claude/Linux:
~/.config/Claude/logs/
Test API Endpoints Directly:
Use curl or httpie to test API endpoints outside of MCP:
Check Configuration:
Import Errors
If you get Python import errors:
Permission Errors
On Linux/Mac:
š Additional Resources
MCP Protocol
Related Projects
š License
MIT License - See LICENSE file for details
Copyright (c) 2025 Barnaby Jeans
š¤ Contributing
Contributions are welcome! Please see CONTRIBUTING.md for detailed guidelines.
For AI Assistants & Developers
š Read - This file contains:
Complete project architecture and development patterns
Security requirements and common pitfalls to avoid
Specific workflows for adding features and fixing bugs
AI assistant-specific guidance for working with this codebase
Quick Start for Contributors
Install security git hook (
python helpers/install_git_hook.py)Review security guidelines in SECURITY.md
No sensitive data in commits (hook will block automatically)
All configuration uses environment variables or Ansible
Update documentation for any changes
Test thoroughly with real infrastructure
Pull Request Process
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Make your changes
Test with your homelab setup
Update README and other docs as needed
Commit with clear messages (
git commit -m 'Add amazing feature')Push to your fork (
git push origin feature/amazing-feature)Open a Pull Request
Code Review Criteria
Security best practices followed
No hardcoded credentials or IPs
Proper error handling
Code follows existing patterns
Documentation is clear and complete
Changes are tested
š Acknowledgments
Anthropic for Claude and MCP
The homelab community for inspiration
Contributors and testers
š Support
Issues: GitHub Issues
Discussions: GitHub Discussions
Security: See SECURITY.md for reporting vulnerabilities
Remember: This project handles critical infrastructure. Always prioritize security and test changes in a safe environment first!