homelab-mcp
You can run safe, read-only Linux homelab diagnostics through MCP tools with allowlist enforcement and no automatic system changes.
Check server health and configured read-only capability count (
health).Get host uptime (
uptime) and Linux memory usage (memory).Check disk usage for exactly allowlisted mount paths (
disk_usage).Check selected systemd properties for allowlisted services (
service_status).List Docker containers without Docker socket access (
docker_containers).Read final lines of exactly allowlisted log files; traversal is rejected (
tail_logs).Collect bounded raw evidence for fixed incident categories such as disk, containers, service, backups, config, deployment, and vulnerabilities (
evidence_snapshot).Generate incident reports with evidence, hypotheses, confidence, recommended plan, confirmation-required commands, and limitations (
incident_report).Propose text-only remediation actions for manual confirmation; no proposed command is executed (
propose_remediation).It does not provide SSH, arbitrary shell, writes, service/container control, secrets access, auth, multi-tenant isolation, or secure Docker socket access.
Provides read-only Docker container diagnostics by listing containers with docker ps -a, allowing agents to inspect container state for homelab troubleshooting.
Provides read-only Linux homelab diagnostics, including uptime, memory, disk usage, allowlisted systemd service status, log tailing, and bounded incident evidence collection.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@homelab-mcprun an incident report for ssh.service"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
homelab-mcp — MCP-сервер для безопасной диагностики небольшого домашнего
Linux-сервера (homelab). Он подключается к MCP-клиенту через stdio и
предоставляет только ограниченный набор операций чтения.
Проект подходит, если нужно спрашивать у совместимого с MCP ассистента, например, «сколько места осталось на диске?» или «запущен ли nginx?», не выдавая ассистенту произвольный доступ к shell.
Важно: сервер не выполняет команды, предложенные моделью, не меняет состояние системы и не предоставляет SSH, shell или доступ к секретам.
Возможности
проверка состояния сервера и настроек allowlist;
загрузка uptime и использования памяти;
проверка места только на явно разрешённых точках монтирования;
проверка только разрешённых systemd-сервисов;
список Docker-контейнеров (без Docker socket);
чтение последних строк только из явно разрешённых лог-файлов;
сбор ограниченных свидетельств для разбора инцидентов;
формирование гипотез и плана действий без автоматического исправления;
необязательный минимальный JSONL-аудит вызовов.
Все внешние процессы запускаются с shell=False, ограничением времени и
ограничением размера вывода. Пути нормализуются перед сравнением с allowlist:
обход каталогов, соседние файлы и неразрешённые symlink-цели отклоняются.
Related MCP server: mcp-vpsobs
Как это выглядит
Ниже — примеры интерфейса и ответов. Значения на иллюстрациях демонстрационные: на реальном хосте ответ зависит от настроек allowlist и состояния системы.
Почему проект заслуживает внимания
Безопасность по умолчанию: только фиксированные read-only команды и точные allowlist.
Понятные выводы: отчёт разделяет факты, гипотезы, уверенность и план.
Без скрытой автоматизации: remediation-предложения возвращаются текстом и требуют человека.
Готовность к эксплуатации: таймауты, лимиты вывода, JSONL-аудит и Docker hardening.
Прозрачность: вся критичная логика небольшая, тестируемая и описана в репозитории.
Требования
Linux с доступными стандартными утилитами
uptime,free,df,tail;Python 3.10 или новее;
systemd — только если используется
service_statusили диагностика сервисов;Docker CLI — только если используется
docker_containers(отсутствие Docker считается обычной ошибкой инструмента);MCP-клиент, умеющий запускать stdio-серверы.
Быстрый запуск
git clone <URL-репозитория>
cd homelab-mcp
python3 -m venv .venv
. .venv/bin/activate
pip install -e '.[dev]'
# Пример минимальной конфигурации. Перечисляйте только действительно нужные пути.
export HOMELAB_ALLOWED_SERVICES='ssh.service,nginx.service'
export HOMELAB_ALLOWED_LOGS='/var/log/syslog'
export HOMELAB_ALLOWED_DISKS='/'
export HOMELAB_AUDIT_LOG="$PWD/audit/homelab-mcp.jsonl"
mkdir -p audit
homelab-mcpСервер ожидает MCP-сообщения в stdin и пишет ответы в stdout. Поэтому обычно его не запускают вручную в отдельном терминале, а указывают команду в конфигурации MCP-клиента. Не направляйте в stdout отладочные сообщения.
Пример конфигурации MCP-клиента
Названия поля могут отличаться в разных клиентах, но команда и переменные окружения выглядят так:
{
"command": "/полный/путь/homelab-mcp/.venv/bin/homelab-mcp",
"env": {
"HOMELAB_ALLOWED_SERVICES": "ssh.service,nginx.service",
"HOMELAB_ALLOWED_LOGS": "/var/log/syslog",
"HOMELAB_ALLOWED_DISKS": "/",
"HOMELAB_COMMAND_TIMEOUT_SECONDS": "5",
"HOMELAB_MAX_OUTPUT_BYTES": "16384",
"HOMELAB_AUDIT_LOG": "/var/lib/homelab-mcp/audit.jsonl"
}
}MCP SDK не загружает .env автоматически. Передавайте переменные окружения
через MCP-клиент, supervisor или systemd. Файл .env.example
содержит полный список параметров.
Инструменты MCP
Все инструменты возвращают JSON-объект. Обычно в нём есть ok, а для запуска
команды также returncode, stdout, stderr и error.
Инструмент | Назначение | Аргументы |
| Состояние сервера, режим и количество разрешённых ресурсов | нет |
| Время работы Linux-хоста | нет |
| Использование памяти в байтах | нет |
| Использование разрешённой точки монтирования |
|
| Свойства разрешённого systemd-unit |
|
| Все контейнеры через | нет |
| Последние строки разрешённого лог-файла |
|
| Только исходные свидетельства для инцидента |
|
| Свидетельства, гипотезы, уверенность и план |
|
| Текстовые предложения команд для ручного подтверждения |
|
disk_usage, service_status и tail_logs работают только с точными
значениями из соответствующего allowlist. Количество строк ограничивается
HOMELAB_MAX_LOG_LINES.
Диагностика инцидентов
kind для evidence_snapshot и incident_report может иметь одно из значений:
disk— заполнение диска и крупнейшие каталоги;containers— сведения о контейнерах и признаки перезапусков;service— состояние systemd и ограниченные данные journal для выбранного разрешённого сервиса;backups— возраст настроенных marker-файлов резервных копий;config— хэши настроенных конфигурационных файлов;deployment— diff доверенного JSON-манифеста развёртывания;vulnerabilities— сравнение настроенных пакетов с локальной offline-базой advisory.
Отчёт всегда разделяет evidence, hypothesis, confidence,
recommended_plan, commands_requiring_confirmation и limitations.
Рабочий процесс: свидетельства → гипотеза → план → подтверждение человека.
propose_remediation принимает JSON, но возвращает команды только как текст.
Эти команды никогда не передаются в CommandRunner и не выполняются сервером.
Отсутствующая или некорректная advisory-база даёт результат unknown, а не
утверждение о наличии уязвимости.
Конфигурация
Все списки — строки, разделённые запятыми. Изменение настроек требует перезапуска сервера.
Переменная | Назначение | Пример / значение по умолчанию |
| Точные имена разрешённых systemd units |
|
| Точные канонические пути логов |
|
| Точные канонические пути дисков |
|
| Таймаут одной команды |
|
| Максимальный вывод команды |
|
| Максимум строк для |
|
| Путь JSONL-аудита; пусто — выключен | необязательно |
| Порог заполнения для анализа диска |
|
| Лимит вывода анализа каталогов |
|
| Допустимый возраст backup markers |
|
| Файлы-маркеры резервных копий | необязательно |
| Файлы для проверки конфигурации | необязательно |
| Манифест ожидаемых хэшей конфигурации | необязательно |
| Доверенный JSON-манифест deployment | необязательно |
| Пакеты для локальной проверки advisory | например |
| Локальная JSON-база advisory | необязательно |
Дополнительные файлы (backup markers, конфигурации, манифесты и advisory DB)
задаются администратором во время развёртывания и не принимаются аргументами
MCP-инструментов. Deployment-манифест — только JSON до 64 KiB вида:
{"last_deploy":"2025-01-01T12:00:00Z","before":{},"after":{}}Безопасность и ограничения
Рекомендуется запускать сервер от отдельного непривилегированного пользователя, использовать локальный stdio и минимальные allowlist. Сервер не предоставляет:
аутентификацию, авторизацию и multi-tenant изоляцию;
SSH, произвольный shell и выполнение команд из ответа модели;
операции записи, управление сервисами или контейнерами;
управление секретами и credentials;
безопасный доступ через Docker socket (socket намеренно не подключается).
Аудит включается переменной HOMELAB_AUDIT_LOG и записывает только UTC-время,
фиксированное имя инструмента, успешность и необязательный код возврата. В него
не попадают аргументы, пути, вывод и ошибки. Ошибка записи аудита не ломает
ответ MCP и не печатается в stdout.
Подробнее о модели угроз, границах защиты и hardening см. в
SECURITY.md.
Docker (необязательно)
Compose — пример изолированного развёртывания, а не требование для локального
stdio. Перед запуском проверьте host mount paths и создайте каталог аудита,
доступный UID 10001:
mkdir -p audit
# при необходимости: sudo chown 10001:10001 audit
docker build -t homelab-mcp .
docker compose run --rm homelab-mcpКонфигурация Compose использует read-only root filesystem,
no-new-privileges, сброшенные capabilities, tmpfs и read-only mounts. Пути
монтирования хоста нужно адаптировать под свою систему. Docker socket намеренно
не монтируется, поэтому Docker-диагностика внутри контейнера может вернуть
ошибку отсутствующего или недоступного Docker CLI/daemon.
Разработка и тесты
pip install -e '.[dev]'
pytest -q
python -m compileall -q srcCI проверяет Python 3.10–3.13. Для изменений в разрешениях, путях или командах обязательно добавляйте тесты и проверяйте, что команды остаются read-only.
Лицензия
MIT — см. LICENSE.
Available Tools
10 toolsdisk_usageB
Report disk usage for an exactly allowlisted mount path.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | / |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
docker_containersA
List Docker containers. Returns a normal error result when Docker is absent.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
evidence_snapshotC
Return bounded raw evidence only for a fixed incident category.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| path | No | / | |
| service | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
healthA
Return server health and the configured read-only capability count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
incident_reportC
Turn read-only evidence into hypotheses; this tool never remediates.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| path | No | / | |
| service | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
memoryB
Return Linux memory usage.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
propose_remediationC
Propose text-only actions. No proposed command is ever executed here.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| evidence_json | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
service_statusB
Show selected systemd properties for an allowlisted service only.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
tail_logsB
Read final lines of one exactly allowlisted log file; traversal is rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| lines | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
uptimeA
Return host uptime using the standard uptime command.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
disk_usage - First observed
docker_containers - First observed
evidence_snapshot - First observed
health - First observed
incident_report - First observed
memory - First observed
propose_remediation - First observed
service_status - First observed
tail_logs - First observed
uptime
TDQS
Scored across 10 tools
Each tool targets a distinct homelab diagnostic or incident-response action, with no true duplicates. The incident workflow tools (evidence_snapshot, incident_report, propose_remediation) are separated by clear read-only, hypothesis, and proposal boundaries.
All names use snake_case, which keeps the set readable and predictable. However, the pattern is not uniformly verb_noun; many tools are noun-only or noun_phrase, so it is mostly consistent with minor deviations.
Ten tools is well-scoped for a homelab read-only diagnostic and incident-response server. Each tool earns its place without obvious redundancy or missing core actions.
The surface covers disk, memory, services, Docker, logs, uptime, health, evidence capture, incident reporting, and remediation proposals. Minor gaps remain, such as CPU/load, network, or process-level diagnostics, but the core read-only incident workflow is complete.
Maintenance
Related MCP Connectors
Read-only server insight: why a Linux server or K8s cluster is slow, failing or changed.
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
Network, domain and website diagnostics for AI clients via MCP.
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Related MCP Servers
- AlicenseBqualityFmaintenanceEnables explaining Linux incidents over SSH with baseline-aware MCP tooling, including live diagnostics, SQLite history, and review-first workflows.10141 npm2MIT
- AlicenseNot gradedqualityCmaintenanceEnables read-only observability of a Linux host via MCP, exposing allowlisted systemd, docker, nginx, logs, disk, and cert info without shell access.MIT
- AlicenseAqualityBmaintenanceA secure, local-first MCP server for read-only inspection and troubleshooting of development environments, exposing narrow, typed, auditable capabilities for repository inspection, log summarization, Docker review, and security scanning without granting unrestricted machine access.8MIT
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server to inspect allowlisted Docker containers, systemd services, JSONL logs, and HTTP health endpoints without arbitrary shell access.MIT