Skip to main content
Glama

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.

Инструмент

Назначение

Аргументы

health

Состояние сервера, режим и количество разрешённых ресурсов

нет

uptime

Время работы Linux-хоста

нет

memory

Использование памяти в байтах

нет

disk_usage

Использование разрешённой точки монтирования

path (по умолчанию /)

service_status

Свойства разрешённого systemd-unit

service, например nginx.service

docker_containers

Все контейнеры через docker ps -a

нет

tail_logs

Последние строки разрешённого лог-файла

path, lines (по умолчанию 100)

evidence_snapshot

Только исходные свидетельства для инцидента

kind, опционально path, service

incident_report

Свидетельства, гипотезы, уверенность и план

kind, опционально path, service

propose_remediation

Текстовые предложения команд для ручного подтверждения

kind, evidence_json

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, а не утверждение о наличии уязвимости.

Конфигурация

Все списки — строки, разделённые запятыми. Изменение настроек требует перезапуска сервера.

Переменная

Назначение

Пример / значение по умолчанию

HOMELAB_ALLOWED_SERVICES

Точные имена разрешённых systemd units

ssh.service,nginx.service / ssh.service

HOMELAB_ALLOWED_LOGS

Точные канонические пути логов

/var/log/syslog

HOMELAB_ALLOWED_DISKS

Точные канонические пути дисков

/

HOMELAB_COMMAND_TIMEOUT_SECONDS

Таймаут одной команды

5

HOMELAB_MAX_OUTPUT_BYTES

Максимальный вывод команды

16384

HOMELAB_MAX_LOG_LINES

Максимум строк для tail_logs

200

HOMELAB_AUDIT_LOG

Путь JSONL-аудита; пусто — выключен

необязательно

HOMELAB_DISK_THRESHOLD_PERCENT

Порог заполнения для анализа диска

85

HOMELAB_DU_MAX_OUTPUT_BYTES

Лимит вывода анализа каталогов

16384

HOMELAB_BACKUP_MAX_AGE_HOURS

Допустимый возраст backup markers

24

HOMELAB_BACKUP_MARKERS

Файлы-маркеры резервных копий

необязательно

HOMELAB_CONFIG_FILES

Файлы для проверки конфигурации

необязательно

HOMELAB_CONFIG_MANIFEST

Манифест ожидаемых хэшей конфигурации

необязательно

HOMELAB_DEPLOYMENT_MANIFEST

Доверенный JSON-манифест deployment

необязательно

HOMELAB_WATCH_PACKAGES

Пакеты для локальной проверки advisory

например openssl

HOMELAB_ADVISORY_DB

Локальная 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 src

CI проверяет Python 3.10–3.13. Для изменений в разрешениях, путях или командах обязательно добавляйте тесты и проверяйте, что команды остаются read-only.

Лицензия

MIT — см. LICENSE.

Available Tools

10 tools
disk_usageB

Report disk usage for an exactly allowlisted mount path.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo/

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose one non-obvious trait beyond the schema: the path must be an 'exactly allowlisted' mount path, so arbitrary paths are rejected. However it never says where the allowlist comes from, how to discover valid entries, whether the tool is read-only, or what happens on a rejected path.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the resource stated first and the constraint second; nothing is wasted. It is perhaps too terse given the undefined allowlist, but that is a completeness issue rather than verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the tool has only one parameter. The remaining gap is the 'exactly allowlisted' constraint: an agent cannot tell how to choose a valid path, and the schema default of '/' may not be allowlisted. That ambiguity keeps it at minimum-viable completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the single 'path' parameter, so the description must compensate. It clarifies that the value is a mount path (not an arbitrary filesystem path) and that it must be exactly allowlisted, which adds real meaning over the bare schema. It still gives no format examples or a way to enumerate valid values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Report disk usage') plus a scope qualifier ('exactly allowlisted mount path'). That is far more precise than a tautology, and the sibling list (memory, service_status, uptime, etc.) covers different resources, so disambiguation is implicit. It stops short of an explicit contrast with a sibling, which is the only gap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for checking disk usage on a mount, and 'exactly allowlisted' functions as a usage constraint rather than a when-to-use rule. There is no statement of when this is preferable to a sibling tool or any alternative to use instead when the path is not allowlisted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

docker_containersA

List Docker containers. Returns a normal error result when Docker is absent.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It usefully discloses that a normal error result is returned when Docker is absent, which is genuine behavioral context. However, it says nothing about the read-only nature, output verbosity, or whether it lists all vs. running containers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no filler. The core purpose leads and the error-behavior caveat follows efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not explain return values, and it adds the Docker-absent error behavior. It is close to complete for a no-param list tool, only missing a note on all-vs-running containers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies. The description correctly implies no input is needed to list containers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (Docker containers) that an agent can immediately understand. It doesn't explicitly contrast with any sibling, but 'docker_containers' is distinct enough from disk_usage, memory, and service_status that differentiation is implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as service_status or health, nor any prerequisites (e.g., Docker must be running). The second sentence addresses error behavior, not usage selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

evidence_snapshotC

Return bounded raw evidence only for a fixed incident category.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
pathNo/
serviceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses only that output is 'bounded' and 'raw' (unprocessed), but says nothing about read-only safety, permissions, truncation limits, or cost — thin disclosure for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single front-loaded sentence with no filler, which is structurally clean. But the brevity is achieved by omission rather than efficiency — key nouns like 'fixed incident category' and 'bounded' are undefined, so terseness here borders on under-specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. Yet for a tool with three undocumented parameters and no annotations, the description should supply the missing semantics (what a 'kind' is, what 'bounded' means in practice); it does not.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters (kind, path, service), and the description mentions none of them. The critical 'kind' parameter's allowed values or meaning are left entirely undefined, so an agent cannot know what to pass.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Return' and resource 'raw evidence' are identifiable, and 'bounded' plus 'fixed incident category' hint at scope. However, 'fixed incident category' is never defined (the schema's 'kind' parameter presumably encodes it), and nothing distinguishes this from siblings like incident_report or tail_logs, which plausibly return overlapping diagnostic data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus incident_report, tail_logs, or propose_remediation, and no prerequisites or conditions are given. 'only for a fixed incident category' hints at a restriction but never tells the agent how to know whether its situation qualifies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

healthA

Return server health and the configured read-only capability count.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It implies a non-destructive read (a health probe returning a capability count), which is useful context, but it does not confirm read-only safety, permissions, or side effects explicitly. For a zero-parameter diagnostic this is adequate but thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that identifies both outputs with zero filler. Nothing could be trimmed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, and the description still names the two key outputs. For a simple health probe this is nearly complete; only the when-to-use angle is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline of 4 applies. The description adds no parameter meaning, but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (server health plus configured read-only capability count), which is more informative than the sibling 'uptime' or 'service_status'. It doesn't explicitly differentiate itself from those siblings, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus alternatives such as uptime, service_status, or memory, and no stated preconditions. The agent must infer that this is a broad health probe from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

incident_reportC

Turn read-only evidence into hypotheses; this tool never remediates.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
pathNo/
serviceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden, and it does deliver one meaningful non-obvious trait: this tool is non-mutating ('never remediates'). However, it says nothing about what it reads, whether it writes any report artifact, permission needs, or scope of evidence collection. The safety declaration is valuable, but the behavioral picture is incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single clause is tight and front-loads the core idea followed by the negative constraint. It is concise to the point of under-specification, so it earns its brevity but not a high mark for structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. But with no annotations and 0% parameter coverage, the definition leaves critical gaps: what 'kind' selects, how path/service narrow the evidence, and what the tool actually produces. For a three-parameter investigation tool, this is inadequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters (kind, path, service), and the description adds no information about any of them. An agent cannot tell what 'kind' accepts, what 'path' scopes against, or how 'service' filters, so the description fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description frames the tool as converting read-only evidence into hypotheses, which gestures at analysis but never states plainly that it produces an incident report or what evidence it consumes. It does distinguish itself negatively from the remediation path ('this tool never remediates'), which helps separate it from propose_remediation. Still, the purpose is stated metaphorically rather than concretely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use/when-not-to-use statement or naming of alternatives. The phrase 'this tool never remediates' implies the agent should reach for propose_remediation when action is needed, which is a weak but real routing signal. Usage remains largely inferred from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memoryB

Return Linux memory usage.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, yet it only says what is returned. It does not confirm the operation is a safe read, specify units or snapshot semantics, or note any auth requirements. The presence of an output schema covers the return shape, but the description itself adds little.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or redundancy. Perfectly sized for a zero-parameter read tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument read tool with a defined output schema, the description is largely sufficient since return values are covered elsewhere. It could be slightly more complete by clarifying scope (e.g., system-wide vs. per-process memory) or routing against siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to document. Baseline of 4 applies since the description need not compensate for anything.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Return Linux memory usage'), making the tool's function immediately clear. It does not, however, explicitly differentiate itself from siblings like disk_usage, health, or uptime, which an agent might reasonably confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this tool versus alternatives such as disk_usage or health, nor any mention of prerequisites or context. The agent must infer usage entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_remediationC

Propose text-only actions. No proposed command is ever executed here.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
evidence_jsonYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden. It does disclose one important trait: proposed commands are never executed, implying a safe, non-mutating proposal operation. However, it does not state whether the proposal is persisted, whether authentication is required, or any other side effect beyond non-execution.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, front-loaded sentences with no filler. Both sentences earn their place, though the overall terseness is a consequence of missing content rather than an efficient treatment of a well-understood tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 0% schema coverage, no annotations, and two required parameters, the description should do much more. It omits parameter meaning, usage context, and differentiation from siblings. An output schema exists, so return values need not be explained, but that alone does not compensate for the missing operational detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and both required parameters ('kind' and 'evidence_json') are completely undocumented. The description adds no meaning about valid values, expected format, or purpose for either parameter, leaving the agent unable to construct a correct call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description says 'Propose text-only actions,' which largely restates the name 'propose_remediation' in other words. It does not clarify what kind of remediation is proposed or distinguish this tool from siblings like incident_report or evidence_snapshot, so an agent gets little beyond the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, prerequisites, or alternatives are given. The statement 'No proposed command is ever executed here' is a safety note, not usage guidance, and it does not tell the agent when to choose this tool over the many other system/incident tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

service_statusB

Show selected systemd properties for an allowlisted service only.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses a meaningful non-obvious trait, that only allowlisted services are accepted, but says nothing about failure behavior for blocked services, output format, or any rate/permission limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with the scope constraint front-loaded alongside the action. Nothing is wasted, though it is arguably too terse given the undocumented parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained and the description is not expected to cover them. Still, for a tool with one required, entirely undocumented parameter, the definition leaves an agent guessing about valid input values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single required 'service' parameter has no documentation in either the schema or description. The description does not clarify whether the value is a bare unit name, a full unit name (e.g. with .service), or how it maps to the allowlist, leaving the agent to guess.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Show) and resource (systemd properties for a service), and the allowlist scope distinguishes it from broader diagnostics like health or uptime. The phrase 'selected properties' is vague about which properties are returned, but the core purpose is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (inspect a systemd service's status) and one guardrail: only allowlisted services can be queried. However, it never states when to prefer this over siblings like health, uptime, or tail_logs, nor what happens for non-allowlisted services.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tail_logsB

Read final lines of one exactly allowlisted log file; traversal is rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
linesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses a security behavior (allowlist enforcement, path traversal rejected), which is real value beyond the schema. However, it says nothing about error behavior on rejection, output size limits, or whether the allowlist is fixed or configurable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence with the key constraint front-loaded and no wasted words. It is arguably over-terse for a 2-param tool, but nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, which keeps the bar lower. Still, for a tool whose only parameters are undocumented, the description should cover how path is validated and how the line count is applied; those gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with two parameters. The phrase 'final lines' hints at the lines parameter but never names it, gives no default behavior, and the required path parameter is only indirectly referenced via the allowlist language. Documentation of parameters is left almost entirely to the untyped schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and resource (final lines of a log file) plus an important scope qualifier: one exactly allowlisted file. An agent can immediately tell this is a constrained log-reading tool, though it does not explicitly differentiate itself from siblings like health or service_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no mention of alternatives, and no stated preconditions beyond the allowlist constraint. The diagnostic context is only implied; the agent gets no help deciding between tail_logs and evidence_snapshot or service_status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

uptimeA

Return host uptime using the standard uptime command.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full load, and it does disclose the mechanism ('standard uptime command'), which implies a safe, read-only local invocation. However, it says nothing about required permissions, execution environment, or the fact that load-average semantics are platform-dependent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the returned resource and adds the one useful detail (the underlying command) with no padding. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because an output schema exists, the description need not spell out return fields, and the tool is trivially simple with no arguments. The only real omission is when to prefer it over the overlapping health tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to document; the baseline for a no-argument tool is 4. Nothing in the description misleads about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Return) and resource (host uptime), which cleanly distinguishes it from siblings like memory, disk_usage, and health. It does not explicitly contrast itself against the closest sibling (health), so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to reach for this tool versus alternatives such as health or evidence_snapshot, and no preconditions or context given. The description only states what it returns, not when it is the right choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.1.0
    • First observeddisk_usage
    • First observeddocker_containers
    • First observedevidence_snapshot
    • First observedhealth
    • First observedincident_report
    • First observedmemory
    • First observedpropose_remediation
    • First observedservice_status
    • First observedtail_logs
    • First observeduptime

TDQS

B3.2/5.0

Scored across 10 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only observability of a Linux host via MCP, exposing allowlisted systemd, docker, nginx, logs, disk, and cert info without shell access.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    A 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.
    8
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server to inspect allowlisted Docker containers, systemd services, JSONL logs, and HTTP health endpoints without arbitrary shell access.
    MIT