Skip to main content
Glama

mia-assist

An MCP server and CLI (mia) that runs a fleet of Linux servers from your own machine over the system ssh and Tailscale — "a small Ansible you can talk to". From Claude Code (or straight from the terminal) you see the state of every host, what changed on it since last time, and you run routine operations: always as a dry run first, then an explicit apply of exactly that plan, one host at a time, with a journal.

It was built for a fleet of proxy nodes running Remnawave / Xray, but most of it is generic: any Ubuntu/Debian host with docker, systemd, UFW and fail2ban, plus home servers (compose/systemd services, Jellyfin and Tdarr through their APIs). The Remnawave panel itself is only read here (to match hosts to panel nodes and show who is connected); panel changes belong to a separate MCP server (mcp-remnawave), which the runbooks can drive step by step.

Runtime

Node.js 22+, the system ssh, Tailscale on the machine that runs it (optional)

Hosts

Ubuntu 22.04 / 24.04 (the audit baseline assumes nodes built with vps-edge-run.sh; override it in policy)

Tools

63 MCP tools (28 read-only) — full list in docs/TOOLS.md

Prompts

8 MCP prompts (morning_check, node_down, rolling_update, …)

Runbooks

xray_rules, fleet_update (engine for your own in src/scenarios)

UI

MCP (English tool descriptions), terminal console and a local web page (Russian UI text)

Safety model

This is the point of the project. Nothing changes a host unless you saw the exact plan and said yes.

  • Two-step plan → apply. Every tool that changes something, called without apply, returns the exact plan per host (commands, packages, files, current state) and a planHash. Only the same call with apply: true and that planHash runs it. The hash covers the inputs and a fingerprint of the live state: if the host changed between plan and apply, the apply is refused and a fresh plan is shown. A planHash is single-use; two concurrent applies of one plan cannot both run.

  • Rolling, one host at a time. Disruptive actions (restarts, reboots, upgrades, firewall) default to batch: 1: each host must come back (ssh answers, the service runs, the panel node is connected) before the next one starts; the first failure stops the rollout. Cheap actions (host_exec, disk_cleanup, cert_renew, geo/blacklist updates) default to 10 at a time; pass batch: 1 to go slower.

  • Blockers and warnings. Plans carry blockers (the host is unreachable, a busy runner, a non-apt system…) and warnings (users online on a node you are about to restart). Irreversible actions in the console must be confirmed by typing the host count or name, not by Enter.

  • Journal. Every apply is written to a local journal (journal_list) with the plan, the result per host and the time; snapshots (fleet_snapshot, fleet_changes) keep a history of what changed on each host, including changes made by hand outside mia.

  • Read-only mode. MIA_READONLY=true makes every write tool refuse to apply. Start with it.

  • Secrets stay local. ssh keys, API keys (~/.config/mia/secrets.env, mode 600, op:// references allowed) and the journal stay on your machine. Every known secret value and common secret shapes (tokens, WireGuard/PEM keys, subscription links, shadow hashes) are masked in all output. Remote scripts are sent over stdin; inputs go through quoted env vars, never interpolated into code.

  • No automatic reboots. Upgrades report which hosts want a reboot; rebooting is a separate, explicit action.

  • Web UI binds to 127.0.0.1 only, with a per-run token cookie, a Host check and a custom header required on anything that starts work.

Related MCP server: Flotilla

Install

git clone https://github.com/akadorkin/mia-assist.git && cd mia-assist
npm install && npm run build

mkdir -p ~/.config/mia && cp fleet.example.yaml ~/.config/mia/fleet.yaml   # then edit it
node dist/cli.js --demo        # a made-up fleet of 7 hosts: nothing leaves this machine
MIA_READONLY=true node dist/cli.js status

npm link gives you a plain mia command. Optional API keys are stored once with mia secrets set TAILSCALE_API_KEY (values are never echoed); see .env.example for every setting.

Plug into Claude Code

claude mcp add mia -s user \
  -e MIA_INVENTORY=$HOME/.config/mia/fleet.yaml \
  -e MIA_READONLY=true \
  -e REMNAWAVE_BASE_URL=https://panel.example.com \
  -e REMNAWAVE_API_TOKEN=<token> \
  -- node /path/to/mia-assist/dist/cli.js mcp

Then ask: "what's wrong with the fleet?", "why did nl-1 drop out of the panel?", "update remnanode on all nodes one by one", "what changed on the servers this week?". Remove MIA_READONLY once the status and audit tell the truth about your hosts.

Inventory example

~/.config/mia/fleet.yaml (full annotated version: fleet.example.yaml; the real file is git-ignored):

defaults:
  user: ops                   # ssh user with NOPASSWD sudo

policy:                       # audit baseline, global or per host
  publicPorts: ["80/tcp", "443/tcp", "443/udp"]
  certWarnDays: 21

groups:
  eu: [nl-1, de-1]
  hands-off: [nas]            # fleet_update never touches these

hosts:
  nl-1:
    address: nl-1             # Tailscale MagicDNS name, tailnet IP or ~/.ssh/config alias
    roles: [remnanode]        # edge baseline + remnanode/certbot/geo checks
    domain: nl1.example.com
    tags: [prod]
    bootstrap: { address: 203.0.113.10, user: root }   # used before Tailscale exists
  panel:
    address: panel
    roles: [panel]
    services:
      - name: remnawave
        compose: /opt/remnawave/docker-compose.yml
  home:
    address: home
    roles: [docker]
    apps:
      jellyfin: { url: http://127.0.0.1:8096, apiKey: env:JELLYFIN_API_KEY, container: jellyfin }

Targets everywhere: all | host | glob | group | role:remnanode | tag:x, comma-separated, !x excludes. fleet_discover cross-checks the inventory with the tailnet and the panel and prints ready YAML for missing hosts; host_services_discover does the same for services on one host.

Tools

Generated by npm run docs:tools into docs/TOOLS.md. By area (RO = read-only):

Area

Tools

Fleet

fleet_hosts RO, fleet_discover RO, fleet_status RO, fleet_audit RO, fleet_host_edit

One host

host_inspect, host_logs, host_ports, host_firewall, host_docker, host_file_read, host_net_check, host_connections (all RO), host_exec, host_file_edit, host_copy

History

fleet_snapshot, fleet_changes, snapshots_list, journal_list, job_status (all RO)

Actions

service_action, remnanode_update, cert_renew, geo_update, blacklist_update, updates_policy, apt_upgrade, host_reboot, disk_cleanup, tuning_status RO, tuning_apply, ufw_rule, fail2ban_unban, node_bootstrap

Scheduling

fleet_schedule RO, schedule_toggle, cron_logging

Your scripts

repo_script (run a script from a local repo checkout, the plan shows commit and file hash)

Network

ru_probe RO (reachability from a vantage host inside a censored network, per ISP, with a datacenter control), tailnet_devices RO, tailnet_device_remove, tailnet_join, dns_records RO, dns_change (Cloudflare)

Integrations

gitea_runners RO, gitea_runner_register, gitea_runner_remove, beszel_systems RO, beszel_system_edit

Home media

host_services_discover RO, jellyfin_status RO, jellyfin_library_add_path, jellyfin_library_create, jellyfin_scan, jellyfin_task_run, tdarr_status RO, tdarr_library_add, tdarr_scan, tdarr_pause

Runbooks

scenario_list RO, scenario_start, scenario_step

Runbooks

A runbook is an ordered, resumable list of steps (src/core/scenario.ts): check (read-only, may poll), mia (a write tool: dry run → planHash → apply), panel (an mcp-remnawave tool, same two-step gate), manual (something only you can do, answered with "done"), inventory (a fleet.yaml edit that keeps layout and comments) and local (git/files in your checkouts, shown before they run). Checks run by themselves; every change waits for an explicit apply. Runs are saved and can be continued later. A failed gate check cannot be skipped past: only its rollback step runs.

Included:

  • fleet_update — security (or all) updates host by host, canary first; after each host: back over the tailnet, dpkg --audit clean, panel node connected; never a reboot, never the hands-off group.

  • xray_rules — add/remove domains or IPs in a routing rule, change an outbound, insert a rule, one config profile at a time through mcp-remnawave; each profile's nodes must reconnect before the next.

The original private version also had runbooks for adding a node end to end, moving an ingress to a new machine, removing a node and DR failover. They were tied to one specific fleet (its repos, monitoring and load balancer layout) and were not included. The helpers they used (dnsStep, ruGateStep, tailnetOf, gitCommit in src/scenarios/common.ts) are here for writing your own.

Configuration

Environment (or ~/.config/mia/secrets.env, managed by mia secrets):

Variable

Purpose

MIA_INVENTORY

path of fleet.yaml (default ~/.config/mia/fleet.yaml)

MIA_READONLY

true = no applies

MIA_STATE_DIR

journal, snapshots, oversized outputs (default ~/.local/state/mia)

MIA_SSH_OPTIONS, MIA_CONCURRENCY, MIA_SSH_REUSE

ssh behaviour

REMNAWAVE_BASE_URL, REMNAWAVE_API_TOKEN

panel, read-only use

MIA_REMNAWAVE_MCP

command that starts mcp-remnawave for panel steps of runbooks

MIA_REPOS, MIA_GIT_AUTHOR

local checkouts for repo_script / runbook local steps

MIA_PROBE_FROM, MIA_PROBE_IFACES, MIA_PROBE_CONTROL

ru_probe vantage host, its ISP interfaces (wan0=ISP-A,wan1=ISP-B), datacenter control host

TAILSCALE_API_KEY, CLOUDFLARE_API_TOKEN, GITEA_URL/GITEA_TOKEN, BESZEL_URL/…

optional integrations

Also in the box

  • mia — an interactive terminal console (menus, search, plan → Enter) and mia web — the same as a local page on 127.0.0.1 (mia web --demo to try it). Both are in Russian.

  • mia sessions-digest — reads your local Claude Code transcripts (~/.claude/projects, secrets masked) and writes a per-session digest plus a summary of hosts, IPs, domains and containers seen, to bootstrap an inventory. Local only.

Development

npm run build      # tsc --noEmit + tsup
npm test           # node:test via tsx (3 tests are skipped on macOS: they need GNU coreutils)
npm run docs:tools # regenerate docs/TOOLS.md after changing a tool

The lockfile is not committed; npm install resolves it.

Honest notes

  • It is a personal ops tool published as is. The defaults and the audit baseline (MGMT-PORTS iptables chain, ipset blacklists, beszel-agent, unattended security updates, no auto-reboots) reflect how the original fleet was built; adjust policy for yours.

  • node_bootstrap and tuning_apply run public install scripts pinned by URL (MIA_EDGE_SCRIPT_URL, MIA_TUNING_SCRIPT_URL); pin them to a commit you have reviewed.

  • Remote commands run as root via sudo on your hosts. Read the plan.

License

MIT, see LICENSE.

Кратко по-русски

mia — MCP-сервер и консоль для управления флотом Linux-серверов по ssh/Tailscale (ноды Remnawave/Xray, панель, домашние серверы). Всё, что меняет сервер, работает в два шага: холостой прогон с точным планом и planHash, затем apply именно этого плана; опасные действия — по одному хосту с проверкой, что он вернулся; всё пишется в журнал, снимки показывают ручные изменения. Начинать стоит с MIA_READONLY=true. Консоль и веб-страница на русском, описания MCP-инструментов на английском. Ранбуки, завязанные на конкретный флот (новая нода, перенос ингресса, вывод ноды, DR), в публичную версию не вошли.

Available Tools

63 tools
apt_upgradeA

Install pending apt updates on hosts (noninteractive, keeps existing config files). Shows what will be upgraded; warns when docker/containerd are in the list (remnanode restarts). Optional reboot afterwards when the kernel asks for it. Rolling, batch 1 by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
skipDockerNohold docker-ce/containerd back: their upgrade restarts every container (remnanode — clients reconnect); do them off-peak
distUpgradeNoapt-get dist-upgrade (may add/remove packages, e.g. new kernels)
securityOnlyNoonly packages from *-security
includeKernelNoalso kernel and GPU-driver packages (linux-image/modules/headers, nvidia) — they only take effect after a reboot
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)
rebootIfRequiredNoreboot afterwards when /var/run/reboot-required appears (waits for the host to return)

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose non-schema behavior: noninteractive execution, preservation of existing config files, and the fact that docker/containerd upgrades restart remnanode (clients reconnect). It stops short of covering failure-handling semantics, permissions, or what the response contains.

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?

Four compact sentences, front-loaded with the core action and safe to skim; each sentence adds a distinct fact (mode, docker risk, reboot, batching). Minor overlap with schema defaults keeps it from a 5.

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 an 11-parameter tool with no output schema and no annotations, the description gives a solid high-level picture of the operation, its disruptive side effects, and the reboot follow-up. The dry-run/planHash two-phase workflow and the shape of results are only touched on, leaving a small gap.

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 description coverage is 100%, so all 11 parameters are already documented in the schema; the description's mentions of batch default and the docker warning merely echo what the schema says. Baseline 3 is correct when the schema does the heavy lifting.

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+resource ("Install pending apt updates on hosts") and immediately qualifies the operating mode (noninteractive, keeps existing config files), so an agent knows exactly what operation this performs. It does not explicitly distinguish itself from neighbors like updates_policy or remnanode_update, so it stops 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 Guidelines3/5

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

Usage context is only implied: the dry-run-then-apply flow, the docker/containerd warning, and the optional reboot tell the agent roughly when to reach for this, but no alternative tool is named and there is no explicit when-not guidance. Adequate but leaves routing to inference.

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

beszel_system_editA

Rename or delete a Beszel card, found by exact name or host (tailnet name / IP). Delete only after the agent on that machine is stopped, or it recreates the card.

ParametersJSON Schema
NameRequiredDescriptionDefault
findYesexact card name or host
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
removeNo
renameNonew name, e.g. "🇵🇱 Poland | acme-pl3"
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A3.7/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 behavioral burden, and it does disclose one non-obvious hazard: deleting while the agent runs causes the card to be recreated. However, it omits that calls default to a safe dry run, that apply requires a one-shot planHash that is invalidated if targets change, and whether it fails on ambiguous name matches — all of which the schema states but the description does not reinforce.

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 sentences, zero filler, with the rename/delete scope and target resolution front-loaded before the operational caveat. Nothing could be cut without losing information.

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?

For a 5-parameter, destructive tool with no annotations and no output schema, the description covers purpose and one major hazard but leaves the dry-run/apply safety model, ambiguity handling, and post-call state entirely to the schema. Adequate but clearly incomplete for a mutation tool.

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 description coverage is 80%, so the baseline is 3. The description adds only the parenthetical clarifying that "host" may be a tailnet name or IP, a modest clarification over the schema's "exact card name or host", and gives no semantics for apply/remove/planHash beyond what the schema already documents.

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 pair of verbs (rename or delete) on a specific resource (Beszel card) and defines how the target is located (exact name or host / tailnet name / IP). It is distinguishable from listing tools like beszel_systems, though it never names a sibling explicitly.

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

Usage Guidelines4/5

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

Gives a concrete operational precondition for the destructive path ("Delete only after the agent on that machine is stopped, or it recreates the card"), which is real when-not guidance. It stops short of naming alternatives or telling the agent to enumerate candidates via beszel_systems before calling with an exact-match locator, and it defers dry-run guidance entirely to the schema.

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

beszel_systemsC

Systems (cards) in the Beszel hub: name, host, status — to find duplicates a new agent created and cards of removed nodes.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNo

TDQS

C2.8/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 never states that this is a read-only operation, whether it hits the hub directly, whether it paginates, or what the return payload shape is beyond three field names.

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 compact sentence with no filler; the resource is front-loaded and the rationale follows. The em-dash aside about duplicates/removed nodes is slightly tangential but does not bloat the definition.

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?

For a one-parameter read tool with no annotations and no output schema, the description covers what a card contains but leaves the filter input and the read-only nature undocumented. Adequate, but with clear gaps an agent would need to guess around.

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% for the single 'filter' parameter, and the description never mentions it, so its matching semantics (substring, exact name, host?) are entirely unexplained. The field list describes return data, not the input parameter.

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 identifies the resource (Beszel hub 'systems'/'cards') and enumerates exposed fields (name, host, status), but omits an explicit verb such as 'list' or 'retrieve'. It is distinguishable from beszel_system_edit only by inference, not by any stated contrast.

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?

Usage is implied through a narrow scenario: finding duplicate cards from a newly created agent and stale cards of removed nodes. There is no guidance on when to prefer this over siblings like beszel_system_edit, nor any exclusion or filtering advice.

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

blacklist_updateB

Refresh the ipset blacklists now with the fleet script /usr/local/bin/ufw-blacklist.sh (normally run by /etc/cron.d/ufw-blacklist every 2 h) and show the entry counts of the sets afterwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesrole:edge
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

B3.4/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 usefully discloses the script path, the cron cadence it bypasses, and that entry counts are shown afterwards, but it is silent on the two-phase dry-run/apply mutation implications, host-wide side effects, and any permission requirements -- gaps the schema partly covers but the description should flag.

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 sentence with the action front-loaded and only a brief parenthetical for context. Efficient and readable, though the parenthetical interrupts the main clause slightly.

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?

For a 6-parameter fleet-wide mutation tool with no annotations and no output schema, one sentence is thin. It covers what and the return summary but leaves the dry-run-then-apply workflow and mutation safety implied by the schema rather than spelled out in prose.

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 description coverage is 100%, so all six parameters (apply, batch, target, planHash, continueOnError, skipUnreachable) are already documented in the schema. The description adds no parameter-level meaning, so the baseline 3 applies.

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 -- refreshing ipset blacklists -- and even names the underlying script and its normal cron trigger, which lets an agent distinguish this from ufw_rule or other firewall siblings. However it never explicitly contrasts itself against those siblings.

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 parenthetical '(normally run by /etc/cron.d/ufw-blacklist every 2 h)' implies this is a manual out-of-band refresh, which hints at when to reach for it. But there is no explicit when-to-use vs alternatives guidance and no stated prerequisites.

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

cert_renewA

Renew the remnanode TLS certificate with the docker certbot from vps-edge-run.sh (cd /opt/certbot && docker compose run --rm certbot renew). Skips certificates with more than minDays left unless force. Port 80 must be publicly open (it is in the baseline). Optionally restarts remnanode so xray loads the new certificate.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
forceNo--force-renewal regardless of days left
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesrole:remnanode
minDaysNorenew only when fewer days left (certbot itself renews at <30)
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
restartNodeNorestart remnanode after a renewal (users reconnect)
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It usefully discloses the underlying command, the minDays skip rule, the port-80 precondition, and the restart consequence ('xray loads the new certificate'). However, it omits the safety-critical fact that the default is a dry run requiring a planHash to actually apply, and says nothing about SSH/permission requirements or failure semantics.

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?

Four sentences, front-loaded with the action and mechanism, and the embedded command is genuinely useful rather than padding. Slightly dense but every clause conveys operationally relevant 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?

For a nine-parameter mutation tool with no annotations and no output schema, the description covers purpose, precondition, skip logic, and the restart side effect. It leaves the dry-run/apply two-phase workflow to the schema, which documents it fully, so the remaining gap is minor.

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 description coverage is 100%, so the schema already documents all nine parameters. The description adds only a restatement of minDays/force behavior and nothing about target, batch, or planHash beyond what the schema states, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb (renew) and resource (remnanode TLS certificate), plus the exact mechanism (docker certbot via vps-edge-run.sh). No sibling tool competes for this function, so the agent can identify it immediately.

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

Usage Guidelines4/5

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

Provides concrete preconditions ('Port 80 must be publicly open') and the condition under which work is skipped ('more than minDays left unless force'). It does not name an alternative or exclusion, but no sibling overlaps, so the guidance is clear context without exclusions.

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

cron_loggingA

Make every cron job write its output to a log and rotate those logs. A line that already appends to a file keeps it and the file joins rotation unless another logrotate config covers it; output to /dev/null or nowhere → >> /var/log/cron/.log 2>&1; a pipe into logger stays in syslog. Rotation: /etc/logrotate.d/cron-jobs (weekly, 8 copies, compress, copytruncate). Every line also runs through /usr/local/sbin/mia-cronrun, which records start, end and exit code so fleet_schedule shows a result for cron jobs (the command itself is unchanged). Stock OS cron files are left alone; copies of touched files go to /root/mia-backup; a logrotate error after the change rolls the rotation file back. Roll out a few hosts at a time and look at fleet_schedule in between.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses backups to /root/mia-backup, that stock OS cron files are left alone, that the command itself is unchanged, that a logrotate error rolls the rotation file back, and the dry-run/planHash gating. This is unusually rich disclosure of side effects and reversibility for a mutation tool.

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?

Purpose is front-loaded in sentence one, and the paragraph is dense with decision-relevant facts rather than filler. It is long and mixes fine-grained logrotate config detail (weekly, 8 copies, compress, copytruncate) that is arguably not needed for correct invocation, keeping it just under a 5.

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

Completeness5/5

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

For a six-parameter mutation tool with no annotations and no output schema, the description covers what changes, what is preserved, backup location, rollback behavior, and rollout hygiene. Nothing an agent needs in order to call this safely is missing.

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 description coverage is 100%, so apply/planHash/target/batch/continueOnError/skipUnreachable are all documented in the schema itself. The description adds only indirect hints ('Roll out a few hosts at a time' gestures at batch, 'a pipe into logger stays in syslog' at line handling) but no new parameter syntax or semantics, which matches the baseline 3 when the schema does the heavy lifting.

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

Purpose5/5

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

The first sentence states a specific verb+resource with measurable outcome ('make every cron job write its output to a log and rotate those logs'), and later sentences clarify the job-vs-logrotate relationship and the fleet_schedule integration. An agent can distinguish this from siblings like fleet_schedule or host_file_edit without opening any schema.

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

Usage Guidelines4/5

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

It gives real operational guidance ('Roll out a few hosts at a time and look at fleet_schedule in between') and describes how existing lines are treated, so the agent knows the intended change process. It stops short of naming when NOT to use this (e.g. vs. host_file_edit for manual cron edits), so no explicit alternative routing.

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

disk_cleanupA

Free disk space on hosts: apt cache, journald vacuum to a size, unused docker images and build cache (never volumes), rotated logs. The dry run shows what takes space now.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
journalSizeNo300M
dockerImagesNodocker image prune -a (images not used by any container)
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A3.8/5.0
Behavior4/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 does much of it: it names exactly what gets removed, explicitly guarantees volumes are never touched, and signals a dry-run/plan workflow. It does not mention irreversibility, permission requirements, or the planHash single-use constraint, but the destructive-scope disclosure is solid.

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 tight sentences with zero filler. The action scope is front-loaded, followed by the dry-run behavior, so an agent reads the key facts first.

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 destructive multi-host mutation with no annotations and no output schema, the description covers what is deleted, what is protected, and the dry-run entry point. Remaining gaps (permissions, irreversibility, rollout behavior) are partially covered by the detailed schema, leaving it nearly complete.

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 88%, so the schema already documents nearly all parameters, including apply, planHash, batch, and target semantics. The description only hints at journalSize ('journald vacuum to a size') and the dockerImages scope ('never volumes'). Baseline 3 is appropriate when the schema does the heavy lifting.

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 (free) and resource (disk space) and enumerates the exact cleanup categories: apt cache, journald vacuum, unused docker images/build cache, rotated logs. The parenthetical '(never volumes)' sharpens the scope. It does not explicitly differentiate from siblings, but the specificity makes its function unambiguous.

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 closing sentence implies a dry-run-first workflow ('The dry run shows what takes space now'), which hints at how to start. However, it never states when to prefer this over alternatives like host_exec or host_docker, nor any prerequisites. Usage is only implied.

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

dns_changeA

Change A records in Cloudflare with a dry run: set (name → IP, created or updated; one A record per name), move (every A record on one IP to another — an ingress switch), remove (records by name, or every A record on an IP). The plan shows each record before and after; after apply every record is read back.

ParametersJSON Schema
NameRequiredDescriptionDefault
setNo
moveNo
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
removeNo
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the dry-run default, that the plan shows each record before and after, that records are read back after apply, the one-A-record-per-name invariant, and that planHash is single-use and invalidated by target state changes. It omits auth/permission requirements and any rate or concurrency behavior.

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 dense sentence front-loads the tool's identity and per-mode semantics, then closes with the plan/apply/read-back lifecycle. Every clause carries information, though the run-on density would benefit from light structural separation.

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 high-risk mutation tool with nested objects, no annotations and no output schema, the description covers the workflow, safety gate (planHash), and return behavior adequately. Missing permission/precondition detail keeps it short of complete.

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?

Schema description coverage is only 40%, and the description compensates by explaining the three array/object parameters (set = name→IP create-or-update, move = every A record on one IP to another, remove = by name or by IP) plus the apply/planHash relationship already documented in the schema. The proxied flag and the set-item structure are left to the schema, so it is not fully exhaustive.

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

Purpose5/5

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

States a concrete verb (change A records in Cloudflare) and enumerates the three distinct sub-operations - set, move, remove - with their exact semantics. An agent can distinguish each mode from the sibling read-only tool dns_records without opening any schema.

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

Usage Guidelines4/5

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

Clear operational context: dry run is the default and apply requires a planHash from the very same call, with guidance that the plan is refused if targets changed. It does not, however, name an alternative sibling (e.g. dns_records for inspection) or state when this tool should be preferred over one.

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

dns_recordsB

DNS records in Cloudflare (CLOUDFLARE_API_TOKEN): by name, or every record that points at an IP across all zones — e.g. everything still on an old ingress address.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNoevery record with this content
nameNoexact record name
typeNoany

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 discloses the auth dependency (CLOUDFLARE_API_TOKEN) and an important scope trait — that the IP search spans all zones rather than one — which is genuinely useful. It says nothing about result limits, pagination, or how many zones/records are walked, so for an unannotated read tool the behavioral picture is only partially drawn.

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, front-loaded sentence that keeps the resource first and the query modes second, with a compact example. Zero filler, though the em-dash construction is slightly compressed and the implied verb ('list/find') never appears explicitly.

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?

For a 3-param, no-output-schema, no-annotation tool the description covers the essentials: resource, auth, the two query modes, and cross-zone scope. Missing is anything about return shape (list of records), pagination/limits, and interaction between 'name' and 'ip' when both are supplied, which an agent needs to invoke it confidently.

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 67%, so the schema already explains 'ip' and 'name'; the description mainly restates 'by name' and 'record that points at an IP'. Its real added value is the 'across all zones' scope note for the IP query, which the schema's one-line 'every record with this content' does not convey. The 'type' param and its 'any' default go unaddressed in both places.

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 names the resource (DNS records in Cloudflare) and specifies the two query modes — resolving a name, or finding every record pointing at an IP across all zones. That is a clear, retrievable purpose an agent can act on. It does not, however, explicitly distinguish itself from the sibling dns_change, which mutates DNS records, so sibling differentiation relies on inference.

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 two query modes (by name / by IP) are stated with a concrete example ('everything still on an old ingress address'), which implies when to reach for the IP mode. There is no explicit when-not guidance and no named alternative for modification (dns_change) if the agent actually wants to change rather than read.

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

fail2ban_unbanA

Unban an IP in fail2ban (all jails, or one) on hosts — e.g. after locking yourself out or a false positive.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYes
jailNo
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A3.6/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 states the purpose. It doesn't disclose that this mutates firewall/ban state, that it defaults to a dry run requiring apply/planHash, or any permission or failure behavior; the dry-run mechanism is only visible in the schema.

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 front-loaded sentence: verb and resource lead, scope follows, and the motivating example closes without waste. Compact and easy to scan, though the trailing example is optional.

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?

For a 5-parameter mutation tool with no annotations and no output schema, the description covers only purpose and a hint of context. The schema carries the critical dry-run/planHash mechanics, but behavioral facts an agent needs (state changes, error cases, whether the ban must exist) are absent.

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 description coverage is a middling 60%, with ip and jail carrying only patterns and no prose. The description partially compensates by clarifying the jail parameter ('all jails, or one') and the host targeting ('on hosts'), but says nothing about apply/planHash/target beyond what the schema already documents.

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

Purpose5/5

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

The description gives a specific verb (unban), resource (an IP in fail2ban), and scope (all jails, or one) applied across hosts. An agent can tell exactly what this does, and the parenthetical disambiguates the jail scoping rather than leaving it to the schema alone.

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

Usage Guidelines4/5

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

It supplies a clear use context — 'after locking yourself out or a false positive' — which frames when an agent should reach for this tool. It does not name explicit exclusions or alternatives (e.g. ban-side tools), so it stops short of full routing guidance.

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

fleet_auditC

Audit hosts against the fleet baseline (as the nodes run now: vps-edge-run.sh bootstrap + ufw-blacklist.sh ipsets, MGMT-PORTS chain, beszel-agent, security updates automatic with manual reboots) and general health: firewall (ufw off, management ports public, other public ports listed), Tailscale, sshd hardening, fail2ban jails, node_exporter, beszel-agent, MGMT-PORTS, ipset blacklists, auto-updates, tuning (bbr/fq, conntrack), remnanode container/compose/SECRET_KEY, certificate expiry, geo updater, disks, memory, temperatures, pending security updates, reboot, failed units, NTP, inventory services, panel node state. Findings have stable codes (policy.skip in fleet.yaml mutes them).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoonly findings whose code starts with this (e.g. "cert", "fw")
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
minSeverityNowarn

TDQS

C2.9/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 that findings carry stable codes and that policy.skip in fleet.yaml mutes them, plus the 'as the nodes run now' baseline posture. However it does not state read-only/safety expectations, auth requirements, or cost/runtime characteristics of such a broad audit.

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

Conciseness2/5

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

It is one massive run-on sentence cramming dozens of checks into parenthetical lists. Purpose is front-loaded in the first clause, but the rest is dense enumeration that is hard to scan and would benefit from structure.

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?

For a complex fleet-wide tool with no output schema and no annotations, the description covers scope and the muting mechanism reasonably well, but omits what a run returns, how findings are shaped beyond codes, and safety/pacing expectations. Adequate but with clear gaps.

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 67%, so the schema already documents code, target, and minSeverity with their formats. The description adds a little (e.g., code prefixes relate to findings) but no syntax beyond the schema, so the baseline 3 is appropriate.

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 opens with a specific verb (audit) and resource (hosts) against a named baseline, and enumerates the concrete checks, which distinguishes it from narrower siblings like host_inspect or tuning_status. It is clear what it does, though the wall-of-text enumeration makes the scope harder to parse than it needs to be.

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?

It states what is audited but never says when to reach for this tool versus host_inspect, fleet_status, or the many individual host_* checks, nor any prerequisites or exclusions. Usage is only inferable from the scope listing.

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

fleet_changesA

What changed on hosts: diff of recorded snapshots (latest vs previous, or vs the first one after since), or of the latest snapshot vs the live host (live:true, catches changes made by hand since). Next to the diff: actions this server ran on those hosts in the same window (journal), so changes made outside mia stand out.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNocompare the latest snapshot with the host as it is now (probes the host)
sinceNoISO date/time: compare the first snapshot at/after it with the latest
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
sectionNoonly this section: packages, units, docker, firewall, listen, ssh, access, sysctl, files, certs, remnanode, tailscale, system

TDQS

A3.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 burden. It discloses that live:true probes the host and that journal entries are appended alongside the diff, which is useful, but says nothing about permissions, cost/latency of live probing, or result shape. Adequate but incomplete for an annotation-free tool.

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?

Two sentences, purpose front-loaded, no filler. The nested parentheses around `since` and `live:true` make it slightly dense to parse but nothing is wasted.

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?

With no output schema and no annotations, the description must cover behavior and returns. It conveys the conceptual output (diff plus journal) but omits output format, volume expectations, and the safety/cost profile of probing hosts, leaving gaps for a zero-required-param reporting tool.

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 100%, so the baseline is 3. The description restates the `since` semantics ('first one after since') and the live:true meaning, but this largely duplicates the schema's own parameter descriptions rather than adding format or edge-case detail.

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 opening clause 'What changed on hosts: diff of recorded snapshots' names the resource and the mechanism precisely, and the journal addendum clarifies the combined report nature. It implies but never explicitly names the siblings it overlaps with (snapshots_list, journal_list), so it stops 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 Guidelines4/5

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

It enumerates the operating modes (latest vs previous, vs the first snapshot after `since`, vs the live host) and states when live:true is warranted ('catches changes made by hand since'). No explicit when-not-to-use or named alternative is given, keeping it below 5.

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

fleet_discoverA

Cross-check the inventory with the tailnet (local tailscale status) and the Remnawave panel: nodes/peers missing from fleet.yaml (with ready YAML), inventory hosts that are offline or unknown to both, panel nodes and their state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.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 behavioral burden. It does disclose the data sources (local tailscale status, Remnawave panel) and the shape of the results, which is genuinely useful context. However, it never states that the operation is read-only, whether it writes the 'ready YAML' to disk, or what permissions/network access it needs – meaningful gaps for a zero-annotation tool.

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 front-loaded sentence with the verb and sources up front and a colon-delimited list of outputs. Dense but every clause carries information; no filler or restatement of the name.

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?

With no output schema, the description must convey return content, and it does so by enumerating the three result categories. Combined with the named data sources, an agent has enough to call it and interpret results; only the read-only/write-side-effect question remains unanswered.

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 there is nothing for the description to disambiguate; baseline 4 applies. No parameter information is missing or misleading.

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 ('cross-check') and concrete resources: the inventory, the tailnet via local `tailscale status`, and the Remnawave panel. It also enumerates what it surfaces (missing nodes with ready YAML, offline/unknown hosts, panel node state), so the agent knows this is a reconciliation/discovery operation. It never names or contrasts with the closest siblings (fleet_audit, fleet_status, tailnet_devices), 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 Guidelines3/5

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

Usage is implied by the cross-check framing – you'd call this when inventory and reality may have drifted apart – but there is no explicit when-to-use, when-not-to-use, or alternative (e.g. fleet_audit vs this). The agent must infer the trigger condition from the verb alone.

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

fleet_host_editA

Edit a host in fleet.yaml (this machine's inventory, not the server): add, change fields, move between groups, switch off/on (disabled), remove. The dry run shows the diff of fleet.yaml (layout and comments kept) and refuses a result mia could not load; apply writes it with a backup in the state directory and refuses if the file changed since the plan.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYesadd a host, update its fields, disable/enable it (disabled: true), remove it
nameYeshost key in fleet.yaml, e.g. pl3
portNossh port
sudoNorun commands through sudo -n
tagsNotags, e.g. prod
userNossh user (default: defaults.user)
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
notesNo
rolesNoroles: edge | remnanode | panel | docker
titleNoname for people: the animal with its emoji, e.g. "🐧 penguin"
unsetNofields to remove: address, user, port, sudo, roles, tags, domain, panelNode, title, provider, notes
domainNoremnanode TLS domain
groupsNothe groups the host is in after the edit (missing ones are created; omit to leave membership as is)
addressNossh target: tailnet name (node-pl3), IP or ~/.ssh/config alias
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
providerNo
panelNodeNonode name in the Remnawave panel

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does so well: it discloses that the dry run preserves layout and comments and refuses an unloadable result, and that apply creates a backup in the state directory and refuses if the file changed since the plan (optimistic-concurrency guard). It does not mention permissions or the exact failure surface, but the safety and workflow profile is unusually complete for a mutation tool.

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?

Two dense sentences, front-loaded with purpose then behavior. No filler, though the second sentence is long and packs the dry-run/apply mechanics tightly.

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 17-parameter mutation tool with no annotations and no output schema, the description supplies the missing behavioral layer (dry run vs apply, backup, conflict refusal, comment preservation) while the schema covers parameter detail. An agent has what it needs to call it correctly, though explicit alternative routing is absent.

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 description coverage is 88%, so the schema already documents the parameters, and the baseline is 3. The description loosely maps the op enum to operations ('switch off/on (disabled)') and mentions group-membership editing, adding marginal meaning but no syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb (Edit) and resource (a host in fleet.yaml) and then disambiguates scope explicitly with 'this machine's inventory, not the server', which separates it from server-side siblings like remnanode_update or host_inspect. It also enumerates the operations covered (add, change, move, disable/enable, remove), so an agent knows the tool's full remit without opening the schema.

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 explains the dry-run-then-apply workflow (dry run default, apply writes), which implicitly tells the agent how to invoke it, but it names no alternative or 'when not to use' condition. With siblings like fleet_hosts and host_inspect present, the absence of routing guidance leaves selection to inference.

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

fleet_hostsA

The inventory (fleet.yaml): hosts with address, roles, tags, groups, services. No host is contacted. Start here to learn the names used by every other tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
detailsNoinclude services, logs, policy and bootstrap settings

TDQS

A4/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 usefully discloses the critical safety trait 'No host is contacted' and identifies fleet.yaml as the source, but it omits whether local files are modified, permission requirements, and return/pagination behavior. Adequate but with clear gaps.

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?

Three short sentences, front-loaded with the resource and contents, followed by the key safety constraint and usage pointer. Every sentence earns its place with no redundant text.

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?

There is no output schema, and the description does give a return-shape hint ('hosts with address, roles, tags, groups, services'). However, it does not mention the richer details fields such as logs, policy, and bootstrap settings, and does not describe pagination or permissions. Complete enough for a simple inventory tool, but not fully comprehensive.

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 description coverage is 100%, so both the target filtering syntax and the details flag are fully documented in the schema. The description mentions host attributes but adds no parameter meaning or syntax beyond what the schema already provides; the baseline 3 applies.

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

Purpose5/5

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

States a specific resource — the fleet.yaml inventory of hosts and their address, roles, tags, groups, services. It distinguishes itself from sibling host-* tools by explicitly saying 'No host is contacted' and positions itself as the starting point for names used by other tools.

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

Usage Guidelines4/5

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

Explicitly says 'Start here to learn the names used by every other tool,' which gives clear first-step guidance. It also implies when to prefer it over host-contacting siblings via 'No host is contacted,' but it does not name a specific alternative or state exclusions.

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

fleet_scheduleA

Everything that runs on a schedule, Cronicle-style: systemd timers and cron jobs on every host — schedule, last run (when, result, duration), next run, failures first. cron does not log results, so for cron only the last start (journal/syslog) is known. Stock OS jobs (apt-daily, fstrim, logrotate …) are hidden unless all=true or they fail.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoshow stock OS jobs too (apt-daily, fstrim, logrotate …)
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
failedOnlyNoonly failed / never-run jobs

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and it does so well: it discloses the default sort ('failures first'), the hidden-by-default stock OS jobs, and an important domain caveat that cron does not log results so only the last start is known for cron entries. This is genuinely useful behavioral context beyond the schema, though it omits auth/permission expectations.

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?

Three dense sentences that front-load the resource scope before the caveats, with no filler. Slightly packed, but every clause (scope, fields, cron limitation, default filtering) 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?

For a zero-required, fully documented 3-param read tool with no output schema, the description supplies what an agent needs: what is returned, the default filtering, and the sorting. The absence of any annotation layer is partly compensated, though auth/permission context is unaddressed.

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 100% with per-parameter descriptions already documenting all, target, and failedOnly, so the baseline is 3. The description reinforces the all=true behavior and the failed-only framing but adds no syntax or format detail beyond what the schema already states.

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

Purpose5/5

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

The description names a concrete resource (scheduled jobs) and scopes it precisely: systemd timers and cron jobs across every host. It even enumerates the fields surfaced (schedule, last run, next run) so an agent knows this is a read/list surface distinct from job_status or schedule_toggle.

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?

Usage is implied rather than stated: the description clarifies default filtering ('stock OS jobs hidden unless all=true or they fail') but never says when to reach for this tool versus siblings like job_status, cron_logging, or schedule_toggle. No explicit alternatives or 'when-not' guidance is offered.

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

fleet_snapshotA

Record the configuration state of hosts (packages, enabled units, containers/images, ufw rules, listening ports, sshd, users/sudo/authorized keys, crontabs, sysctl, certificates, tracked config files …) to the local state dir, and report what changed since the previous snapshot. Run it on a schedule (e.g. daily cron mia call fleet_snapshot) to keep a change history.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNowhy (shown in history): manual, daily, before-upgrade …manual
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall

TDQS

A3.6/5.0
Behavior3/5

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

Without annotations the description carries the full burden, and it does disclose real behavior: output is persisted to the local state dir, changes are diffed against the previous snapshot, and it can be driven from cron. It still omits whether the tool touches the hosts (read-only vs mutating), any permission/auth requirements, runtime cost, and where the state dir lives.

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?

Front-loaded with the core action, followed by scope and then the scheduling tip; every sentence serves a purpose. The long parenthetical enumeration of captured subsystems is dense but earns its place as scope definition.

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 two-parameter tool with no output schema or annotations, the description covers purpose, captured scope, the reporting behavior, and scheduling. Remaining gaps are operational: state dir location, host-side impact, and how to retrieve past snapshots or diffs named by the sibling tools.

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 description coverage is 100%, so both 'reason' and 'target' are already documented in the schema; the baseline is 3. The description only indirectly enriches them, by implying the 'daily' reason value through the cron example, and adds no selector syntax or scoping detail beyond the 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 plus resource: record host configuration state and report the diff since the previous snapshot, with the captured surface enumerated (packages, units, containers, ufw, ports, sshd, keys, cron, sysctl, certs, tracked files). That is far more concrete than a title restatement. It stops short of naming related siblings such as fleet_changes or snapshots_list, so an agent cannot tell from the text alone which one surfaces the history it just wrote.

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

Usage Guidelines4/5

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

Gives a clear operational context: run it on a schedule (e.g. daily cron `mia call fleet_snapshot`) to build a change history. That tells the agent when this tool is the right one, namely a recurring baseline capture. No when-not guidance or explicit alternative is offered for ad-hoc inspection of existing snapshots or diffs.

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

fleet_statusA

One-screen health of the fleet: every host probed over ssh in parallel — uptime, load, memory, disk, pending updates/reboot, remnanode container, certificate days, Tailscale, panel state and users online — plus the codes of open issues (details: fleet_audit). With target all it also lists every tailnet device that is not in fleet.yaml: Linux machines are probed with the default ssh user, others shown with their online state.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
tailnetNowith target all: add the tailnet devices that are not in fleet.yaml

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden, and it does substantial work: probing happens over ssh in parallel, per-host metric set is enumerated, open issue codes are summarized rather than detailed, and with target=all non-fleet tailnet devices are added with Linux machines probed under the default ssh user and others reported by online state. It omits timing/timeout/rate-limit and credential behavior, which is the remaining gap.

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?

Front-loaded with the core purpose and dense with useful detail; nearly every clause carries information. It is a long em-dash-chained sentence, so readability suffers slightly, but there is little filler.

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?

With no output schema and no annotations, the description must cover both behavior and return content, and it enumerates the returned metrics and issue codes well enough to set expectations. It still does not describe the response structure (per-host objects, error/offline representation) or failure handling, leaving a modest gap for a probe tool that depends on SSH reachability.

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?

Schema coverage is 100%, so baseline is 3, but the description goes beyond the schema by explaining the semantic interaction between the two parameters: 'target all' triggers tailnet device enumeration and the 'tailnet' flag governs it, plus how those extra devices are handled. That is real added meaning, not a restatement.

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

Purpose5/5

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

States a specific verb and resource ('one-screen health of the fleet') and enumerates exactly what is collected per host (uptime, load, memory, disk, updates/reboot, container, certs, Tailscale, panel, users online). It also explicitly routes the agent to the sibling that owns the detailed view ('details: fleet_audit'), so it is distinguishable from fleet_hosts/fleet_audit without opening a schema.

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

Usage Guidelines4/5

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

Gives clear context for when this is the right tool (a single-screen fleet health summary) and names the alternative for the deeper case ('details: fleet_audit'). It does not state explicit exclusions or prerequisites (e.g. whether SSH reachability or credentials are required), so it stops short of full when/when-not guidance.

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

geo_updateB

Run the roscomvpn geoip/geosite updater now (update-roscomvpn-geo.service from vps-edge-run.sh) and check it succeeded.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesrole:remnanode
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

B3.1/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 burden. It says the call checks for success, which hints at a return signal, but it omits that the default is a dry run requiring a planHash to apply, that it rolls out across multiple hosts (default role:remnanode), and that it is a disruptive mutation.

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 sentence with no filler, and the action is front-loaded. The parenthetical service and script names add identification value without bloating it.

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?

For a six-parameter fleet mutation with no annotations and no output schema, the description is thin: it never mentions the dry-run/apply gate, the fleet-wide default target, the batch/rolling behavior, or how success is reported, leaving the agent to reconstruct all of that from the schema.

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 100%, so all six parameters including target, apply, and planHash are already thoroughly documented in the schema. The description adds nothing about parameter usage, so the baseline 3 applies.

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 (run) and resource (the roscomvpn geoip/geosite updater), naming the underlying service and script, which distinguishes it from sibling update tools like blacklist_update or cert_renew. It does not explicitly contrast itself with any sibling, but the resource is unambiguous.

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 word 'now' implies an immediate synchronous run rather than a scheduled one, but there is no explicit when-to-use guidance, no mention of the dry-run-then-apply workflow the schema implies, and no routing to alternatives such as fleet_schedule or scenario_start.

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

gitea_runner_registerA

Register the Gitea Actions runner on a node with a runner bootstrap script from your own repo checkout (MIA_REPOS; default ops:deploy/bootstrap-node-runner.sh ): a fresh registration token comes from the Gitea API at run time and reaches the script through an environment variable, never the plan or journal. Verified afterwards: act_runner active and the label is exactly node-:host (copied configs announced other nodes' labels before).

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesinventory host
nameNoname for the script (default: the inventory name, e.g. pl3 → label node-pl3:host)
repoNoops
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
scriptNodeploy/bootstrap-node-runner.sh
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: it discloses that a fresh registration token is fetched from the Gitea API at run time and passed via environment variable, never through the plan or journal (a meaningful security/secrets disclosure), and that post-conditions are verified (act_runner active, label exactly node-<name>:host). It stops short of stating required Gitea API credentials/permissions or reversibility.

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 purpose is front-loaded and every clause (token handling, verification, label correctness) adds operational value. It is dense with parentheticals and reads as one long sentence, which slightly hurts scannability, but there is no filler.

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 6-parameter mutation tool with no annotations and no output schema, the description covers the mechanism, the secrets handling, and the success verification. It does not describe the dry-run/planHash return content, though the schema partially covers the apply workflow, leaving a small gap.

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?

With schema coverage at 67%, the description adds real meaning beyond the schema: it documents the default script path and its positional arguments (<name> <token>), and explains the name-to-label mapping (label rendered as node-<name>:host). It leaves repo/apply semantics largely to the schema, so it complements rather than duplicates.

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

Purpose5/5

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

States a specific verb (register) and resource (Gitea Actions runner on a node), plus the exact mechanism used (runner bootstrap script from the MIA_REPOS checkout, default ops:deploy/bootstrap-node-runner.sh). It clearly distinguishes itself from sibling gitea_runner_remove (the inverse operation) and gitea_runners (read-only listing).

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 conveys the operational context (registering a runner via a repo script, dry-run/apply implied by the schema) but never explicitly states when to choose this over alternatives or when not to use it. It assumes the agent already knows it wants to register a runner; sibling gitea_runner_remove is not referenced for contrast.

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

gitea_runner_removeA

Delete a runner registration in Gitea (a node taken out of service). Dry run shows the runner; a busy runner is refused.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesrunner name, e.g. node-pl9
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does disclose two safety-relevant traits: a dry run previews the target and a busy runner causes refusal. It stops short of stating irreversibility, required permissions, or the failure response, which matters for a delete tool.

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 tight sentence with the destructive action front-loaded, followed by the preview behavior and the refusal condition. No wasted words.

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?

With no annotations and no output schema, the description adequately covers purpose, preview semantics, and the key failure mode; the schema handles input parameters. It could still note reversibility or permissions, but an agent has enough to call it correctly.

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 description coverage is 100%, and the schema already fully explains name, apply, and planHash including the planHash single-use constraint. The description's mention of 'dry run' adds only mild reinforcement, so baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource — 'Delete a runner registration in Gitea' — and the parenthetical 'a node taken out of service' clarifies what deletion means. This distinguishes it from sibling gitea_runner_register and gitea_runners without needing their schemas.

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

Usage Guidelines4/5

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

Gives real usage context: the dry-run-then-apply workflow is implied, and the precondition 'a busy runner is refused' tells the agent when the call will fail. It does not explicitly route to a sibling or state when not to use it, so it falls short of a 5.

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

gitea_runnersB

Gitea Actions runners (GITEA_URL + GITEA_TOKEN): name, online/offline, busy, labels — to spot stale registrations and runners that announce another node's label.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNo

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 burden. It usefully discloses required config (GITEA_URL + GITEA_TOKEN) and the shape of each runner record, but never states that the operation is read-only/no-side-effect, nor mentions pagination or result volume. Auth context is a plus; the safety profile is left to inference.

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 dense but well-structured sentence: resource first, returned fields in the middle, purpose at the end. No filler. Slightly overloaded with the parenthetical credential note, but every clause carries information.

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?

By enumerating the returned fields, it usefully substitutes for the absent output schema. But the single filter parameter is left entirely unexplained and the read-only nature is not asserted, so the definition is not fully complete for an agent to call it precisely.

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?

The schema defines a 'filter' parameter with 0% description coverage, and the description never explains it — whether it filters by name, online status, label, or something else. With a parameter present and undocumented in both places, the description fails to compensate for the schema gap.

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 resource (Gitea Actions runners) and enumerates the returned fields (name, online/offline, busy, labels), which makes the read-only inspection intent clear. It does not explicitly name the sibling it contrasts with (gitea_runner_register / gitea_runner_remove), so it falls short of the top band.

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?

"to spot stale registrations and runners that announce another node's label" gives the agent a motivating use case. However, it never states when to prefer this over gitea_runner_remove or gitea_runner_register, nor any prerequisites, leaving the when-to-use decision implicit.

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

host_connectionsA

Established TCP connections per host on a local port (default 443), total and by remote address family — to watch traffic move from an old ingress to a new one, or drain before removing a node.

ParametersJSON Schema
NameRequiredDescriptionDefault
portNo
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall

TDQS

A3.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 burden. 'Watch traffic' implies a passive read-only observation and it discloses the output shape (total plus per-address-family), but it says nothing about permissions, whether it queries remote hosts, sampling windows, or rate 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 front-loaded sentence that leads with the metric and scope before the use cases. Dense but each clause contributes; slightly long but no filler.

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 two-parameter, zero-required read tool with no output schema and no annotations, the description supplies the missing return-value context (total and by remote address family) and the operational intent. Only target-selector behavior and access requirements remain unexplained.

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 50%: the 'target' parameter is fully documented in the schema, while 'port' has only constraints. The description merely restates the 443 default and adds no meaning beyond it, and does not clarify the target selector syntax or what 'all' resolves to.

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 resource and scope: established TCP connections per host on a local port, broken down by total and remote address family. It is clearly distinguishable from a generic port listing, though it never names or contrasts with the sibling host_ports, which an agent could easily 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 Guidelines4/5

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

Gives concrete operational scenarios for use — watching traffic migrate from an old ingress to a new one, or draining before node removal — which tells the agent when this tool is the right call. It stops short of explicit exclusions or naming an alternative tool.

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

host_copyA

Copy files or directories from one host to others through this machine (certificates, /opt/remnanode/docker-compose.yml with the node key, /etc/log-upload/secrets.env, haproxy.cfg …): what the owner did by hand when moving an ingress or cloning a node. Contents are never shown: the plan lists size and sha256 on the source and on each target. Existing target paths are archived to /root/mia-backup-.tgz first. For one env-style file, set changes KEY=value lines on the way (e.g. LOG_NODE_NAME).

ParametersJSON Schema
NameRequiredDescriptionDefault
setNoonly with one file: KEY=value lines to set
fromYessource host (inventory)
modeNochmod for copied files, e.g. 600
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
pathsYes
targetYesdestination hosts: hosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludes
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A4.1/5.0
Behavior4/5

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

No annotations are supplied, so the description carries the full burden and does well: it states contents are never displayed, that a plan reports sha256/size on source and each target, that existing targets are archived to /root/mia-backup-<time>.tgz beforehand, and that dry-run/apply gates on a planHash. It omits auth/permission requirements and how the relay connection is established, leaving a small gap for a mutation tool.

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?

Front-loads the verb and resource, then layers safety behavior and the `set` special case. The long parenthetical enumerating example paths is dense but informative; the run-on first sentence is slightly heavy, but every clause carries operational meaning.

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 10-parameter, no-output-schema mutation tool, it covers the destructive/backup behavior, dry-run workflow, hashing, and the file-transformation caveat. Return-format detail is largely unnecessary since no output schema exists, though the plan/apply lifecycle could be spelled out a bit more.

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 description coverage is 90%, so the baseline is 3. The description only adds meaning for `set` (KEY=value lines changed on the way, with a LOG_NODE_NAME example) and touches planHash validity; the other parameters are already fully explained by the schema, so little net value is added.

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

Purpose5/5

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

States a specific verb (copy) and resource (files/directories) with explicit scope: from one host to others, relayed through this machine. Distinguishes it from the many read/edit siblings (host_file_read, host_file_edit) by describing a multi-host push operation and by enumerating the exact config paths it is meant for.

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

Usage Guidelines4/5

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

Gives clear situational context (the manual work done 'when moving an ingress or cloning a node'), which tells the agent when this tool applies. It does not name alternatives or explicit exclusions (e.g., single-host editing vs host_file_edit), so it falls short of a 5.

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

host_dockerC

Docker on a host: containers (state, image, restarts), compose projects, disk usage of images/volumes/build cache.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory (fleet_hosts)

TDQS

C2.7/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 and falls short. It never states that the call is read-only or side-effect free, and the word 'restarts' is genuinely ambiguous — it could mean reporting restart counts or triggering restarts, a distinction that materially changes safe usage.

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 compact sentence with no filler, and the covered subdomains are front-loaded. It loses a point only because the fragment omits any verb, which reduces rather than improves clarity.

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?

There is no output schema and no annotations, so the description should explain what a call returns; it partially does by listing state, image, restarts, and disk usage, but omits return shape, aggregation across containers/projects, and whether anything is mutated. Adequate but incomplete for a tool with zero structured behavioral support.

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 description coverage is 100% for the single 'host' parameter, including the pointer to fleet_hosts, so the schema does the work. The description adds nothing about the host parameter or how it is resolved, which fits the baseline 3 for a fully documented, one-parameter tool.

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?

It names a resource (Docker on a host) and enumerates the subdomains it covers (containers, compose projects, disk usage), but it is a bare noun phrase with no verb, so an agent cannot tell whether it reads/inspects Docker state or acts on it. It is distinguishable from siblings like host_services_discover or host_inspect only by the Docker keyword.

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 when-to-use guidance, no prerequisites, and no mention of alternative tools such as host_inspect, host_services_discover, or disk_cleanup that overlap in scope. The agent must infer that this is the Docker-specific inspection path.

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

host_execA

Run an arbitrary shell command on hosts (bash, through sudo when configured). For anything the dedicated tools do not cover. Output tail per host; the journal keeps the command. Parallel by default (batch 10).

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
asUserNorun as the ssh user instead of root
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
commandYes
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
timeoutSecNo
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A3.8/5.0
Behavior3/5

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

With zero annotations the description carries the full burden, and it does add real traits: sudo escalation, parallel execution (batch 10), per-host output tails, and journaling of the command. It stops short of the safety profile an arbitrary-execution tool needs - blast radius, default root execution, irreversibility - so the disclosure is partial rather than complete.

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?

Four short sentences with the core capability front-loaded and no filler; every clause carries information. Slightly under-elaborated rather than bloated, so it is efficient but not maximally informative.

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?

For a 9-parameter, annotation-free, arbitrary-command tool with no output schema, the description covers execution mode, output shape, and audit trail, but leaves safety framing and the dry-run/apply lifecycle entirely to the schema. Adequate, with a meaningful gap for such a high-risk tool.

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 description coverage is 78%, so the schema already documents most parameters thoroughly (planHash, timeoutSec, target grammar). The description adds only marginal semantics - 'Parallel by default (batch 10)' and 'through sudo when configured' - which lightly reinforce batch and asUser but do not extend the schema's own text.

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

Purpose5/5

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

States a specific verb+resource ('Run an arbitrary shell command on hosts') and immediately positions it relative to siblings with 'For anything the dedicated tools do not cover', so an agent can tell it apart from host_inspect, host_logs, host_file_edit, etc. without opening a schema.

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

Usage Guidelines4/5

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

Explicitly gives the usage condition: a fallback for gaps the dedicated tools leave. However it names no concrete alternatives and no when-not conditions (e.g. don't use for file edits, service restarts), leaving the agent to infer the routing.

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

host_file_editA

Edit one of the fleet's registry files on a host the way it is done by hand: clone the entry of a template node for a new node (Prometheus overrides, log-collector inventory, reboot-reminder lists, IP lists) or remove the entries of a removed node (e.g. node_servers.keep.txt). Works on plain lines (an IP inside a one-line list is edited in place), JSON and YAML (comments kept). The dry run shows the diff; the file is backed up (.bak-mia-), written in place (owner and mode kept), optionally a unit is reloaded.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYesclone — добавить копию записи; replace — поменять в самой записи; remove — убрать запись
hostYes
pathYes
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
matchYestext that identifies the entry (template node name / address, or the removed node)
formatNoauto
reloadNounit to reload (or restart when it cannot reload) afterwards
replaceNoclone: text replacements, e.g. {"node-pl2":"node-pl3","pl2":"pl3"}
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does it well: it discloses the dry-run default, the diff preview, the backup file naming (.bak-mia-<time>), in-place writing with owner and mode preserved, and the optional unit reload. It stops short of stating permission requirements or failure modes, but this is rich disclosure for a mutation tool.

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 purpose and the two primary operations are front-loaded in the first sentence, with behavioral details following. It is dense but every sentence carries information; the only minor cost is the parenthetical example lists, which lengthen the opening without much added routing value.

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?

No output schema exists, but the description covers the key lifecycle facts an agent needs: dry run returns a diff and planHash, apply requires that planHash, the file is backed up and written in place with permissions preserved, and a unit can be reloaded. Missing permission/auth requirements and the exact refusal condition (targets changed) is covered only via the schema, leaving a small gap for a destructive 9-parameter tool.

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 67%, so several parameters (apply, match, reload, replace, planHash) are already documented in the schema. The description adds contextual meaning for op (clone/replace/remove) and format (plain lines, JSON, YAML with comments kept), but leaves host and path unexplained, so it only partially compensates for the coverage gap.

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 (edit) and resource (fleet registry files on a host) and grounds it with concrete examples: cloning a template node's entry for a new node, or removing a removed node's entries (node_servers.keep.txt). This is enough to separate it from host_file_read (read) and fleet_host_edit (host config), though neither sibling is named explicitly.

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 two headline scenarios (clone for a new node, remove for a removed node) implicitly tell the agent when to reach for it, and the op enum is echoed contextually. However, there is no explicit when-not-to-use guidance and no pointer to alternatives such as host_file_read for inspection, so usage is implied rather than stated.

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

host_file_readA

Read a file on a host (as root when sudo is configured) or list a directory. Secrets (SECRET_KEY, private keys, tokens, passwords) are masked.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory (fleet_hosts)
pathYesabsolute path
maxBytesNo

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose two meaningful, non-obvious traits: root elevation under sudo and automatic masking of secrets (keys, tokens, passwords). It stops short of describing truncation via maxBytes or binary-file/error behavior, but the safety-relevant disclosures are strong.

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 tight sentences, front-loaded with the core action and the mode variation, then the safety note. Every clause carries information and there is no filler.

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?

For a tool with no annotations and no output schema, the description should ideally explain return shape and the effect of maxBytes (truncation), which it omits. The purpose, elevation, and masking details are present, so it is adequate but has clear gaps for a read tool whose output format is undefined.

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 67%: host and path are documented in-schema, while maxBytes has no description anywhere. The description does add meaning by clarifying that path may point to either a file or a directory, but it does not explain maxBytes truncation semantics, leaving the coverage gap unaddressed.

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+resource ('Read a file on a host') and adds a second mode ('or list a directory'), so an agent knows both file and directory paths are valid. It implicitly contrasts with the write-oriented sibling host_file_edit, but never names an alternative explicitly.

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?

Gives a conditional execution context ('as root when sudo is configured'), which is useful for predicting behavior. However, it offers no guidance on when to choose this over host_exec, host_copy, or host_file_edit, so the usage boundary is left implied.

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

host_firewallB

Firewall detail of a host: ufw status numbered, fail2ban jails with the banned IP lists, ipset blacklists (ufw-blacklist.sh) with entry counts, and the MGMT-PORTS iptables chain.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory (fleet_hosts)

TDQS

B3.2/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. It does reveal the concrete data sources and commands behind the result (ufw status numbered, fail2ban, ipset, iptables), which is genuine behavioral context beyond the schema. However, it never states that this is read-only, that it likely requires elevated privileges to query iptables/fail2ban, or how large/slow the collection is.

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 front-loaded sentence that leads with the resource ('Firewall detail of a host') before the itemized contents. The command names (ufw status numbered, ufw-blacklist.sh, MGMT-PORTS) are dense but each earns its place by specifying exactly what is returned.

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 simple one-parameter read tool with no output schema and no annotations, the description compensates well by enumerating the returned data categories, so an agent knows roughly what comes back. The remaining gap is safety/permission context, which is minor for a diagnostic read but not fully covered.

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?

Only one parameter exists and its schema coverage is 100%, with the schema itself explaining 'host name from the inventory (fleet_hosts)'. Per calibration, high schema coverage sets the baseline at 3 even when the description adds no additional parameter meaning, and this description adds none.

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 names a specific resource ('Firewall detail of a host') and enumerates exactly what is collected: ufw status numbered, fail2ban jails with banned IPs, ipset blacklists, and the MGMT-PORTS iptables chain. An agent can tell this is a firewall-state inspection tool apart from host_inspect or host_ports. It lacks an explicit action verb (get/retrieve), but the resource and scope are unambiguous.

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 explicit when-to-use or when-not-to-use guidance, and no mention of alternatives such as ufw_rule, fail2ban_unban, or blacklist_update, all of which live in the same sibling namespace and could be confused with a read of firewall state. The diagnostic intent must be inferred from the content listing alone.

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

host_inspectB

Everything about one host in one call: system, pending updates, systemd units, listening sockets, firewall, Tailscale, docker, remnanode (compose, certificate, geo files), inventory services, tuning — plus audit findings and the matching panel node.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory (fleet_hosts)
sectionsNosubset of: system, updates, units, network, firewall, tailscale, docker, remnanode, services, tuning (default all)

TDQS

B3.2/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 'inspect' plus the itemized contents make the read-only, broad-scan nature clear. However it says nothing about permission requirements, the potentially large response payload, latency of an all-in-one collection, or how the 'sections' filter affects returned data.

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 sentence with the scope front-loaded ('Everything about one host in one call') and no filler. The long enumeration is justified because it is literally the payload contract, though the dash-appended 'audit findings and matching panel node' items are easy to miss.

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?

With no output schema and no annotations, the description sensibly enumerates returned contents, which is the most important information an agent needs for an aggregate read tool. It is close to complete, missing only operational notes such as read-only status, expected response volume, and how omitted sections behave.

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 description coverage is 100%, so both parameters are already documented, establishing a baseline of 3. The description does expand a couple of cryptic section names (e.g., remnanode includes compose, certificate, geo files) and notes audit findings and panel node are included even though they are not valid 'sections' values, which is mildly useful but not a substitute for parameter syntax detail.

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 the resource precisely (one host) and enumerates the exact material returned — system, updates, units, sockets, firewall, Tailscale, docker, remnanode, services, tuning — so an agent knows this is a single-host aggregate read. It does not explicitly name the granular siblings (host_ports, host_docker, host_firewall), though 'in one call' implicitly contrasts with them.

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 explicit when-to-use guidance, no conditions, and no mention of the per-topic alternatives that overlap heavily with this tool. The phrase 'in one call' hints at the trade-off versus host_ports/host_docker/host_firewall, but the agent has to infer it.

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

host_logsA

Tail logs on a host. source: a service name (container stdout / systemd journal of the unit — e.g. remnanode, fail2ban, tailscaled), a log file name (remnanode.log = xray logs in /var/log/remnanode, auth, syslog, apt, install-*), or explicit unit:, container:, file:, journal (whole journal).

ParametersJSON Schema
NameRequiredDescriptionDefault
grepNoextended regex, case-insensitive; applied before taking the last N lines
hostYeshost name from the inventory (fleet_hosts)
linesNo
sinceNoonly newer entries (journal/containers): 30m, 2h, 1d
sourceYesservice name, log name, unit:<u>, container:<c>, file:<path>, journal

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 full behavioral burden. "Tail logs" implies a read-only operation, but nothing states permissions, whether it touches remote hosts live, or rate/pagination behavior — though the source-resolution semantics (unprefixed names, unit:/container:/file:/journal prefixes) do add genuine behavioral context.

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?

Front-loaded with the core action in five words, then a dense but purposeful second sentence. The example-heavy source sentence is long yet every clause carries distinct routing information, so little is wasted.

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?

With no output schema and no annotations, the description should ideally describe return format and any host-access constraints, but it stops at invocation semantics. It fully covers the hardest part (source resolution) yet leaves the response shape and remote-execution behavior unexplained.

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?

Schema coverage is already 80%, so the baseline is 3, but the description goes further by mapping the ambiguous `source` string to concrete resolution rules (service name -> container stdout/systemd journal, file name -> /var/log paths, explicit prefix forms). That is meaningfully beyond the schema's terse "service name, log name, unit:<u>..." line.

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+resource ("Tail logs on a host") that is immediately understandable. However, it never distinguishes itself from the sibling journal_list, which presumably also surfaces journal output, so an agent must guess which to pick.

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 extensive source-format enumeration implies how to invoke the tool, but there is no explicit when-to-use guidance or routing against alternatives like journal_list or host_inspect. Usage is implied rather than stated.

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

host_net_checkA

Network checks run FROM hosts (in parallel): tcp connect, tls (TLS1.3 + h2 — what a REALITY dest needs), http timings, dns, ping, trace. Use to pick/verify a REALITY dest, check a node reaches the panel, or see if a destination is filtered from a location.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYeshost / host:port (tcp, tls; default port 443) / URL (http) / name (dns)
sniNotls: server name to send (default: the host part of `to`), e.g. check a node by IP with its domain or a decoy SNI
checkYes
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden. It usefully discloses that checks run FROM the hosts and in parallel, and that tls uses TLS1.3 + h2, which is real added context. However it omits permission requirements, timeouts, and whether checks are safe/read-only, leaving meaningful gaps for a no-annotation tool.

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?

Two tightly packed sentences: capability first, then use cases. Front-loaded and waste-free, though the parenthetical 'what a REALITY dest needs' is jargon that may not parse for a general agent.

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?

For a diagnostic tool with no output schema, the description covers what is run but says nothing about the return format, timeouts, or how results are surfaced, which an agent may need to interpret output. Usage is well covered, but the mechanics of the result are left implicit.

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 75% and the schema already documents `to`, `sni`, and `target` in detail, with `check` constrained by an enum. The description adds meaning by implying what the `check` values do (tcp/tls/http/dns/ping/trace), but does not elaborate on `to`, `sni`, or `target` semantics beyond the schema. Baseline 3 is appropriate.

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+resource: network checks run FROM hosts, and enumerates the check types (tcp, tls, http, dns, ping, trace). An agent can tell it is a remote diagnostic tool rather than a firewall/port/config tool. It does not explicitly name a sibling it differs from (e.g. host_ports, host_inspect), so it lands just short of 5.

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

Usage Guidelines4/5

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

Three concrete use cases are given: pick/verify a REALITY dest, check a node reaches the panel, and detect if a destination is filtered from a location. That is clear context, though it does not name explicit alternatives or exclusions to route against sibling tools.

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

host_portsB

What is reachable on a host and from where: every listening socket classified as local / tailnet-only / public-allowed / blocked by ufw / PUBLIC because ufw is off, with the process name. Plus the public UFW allows.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory (fleet_hosts)

TDQS

B3.2/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 discloses the classification scheme (including the 'PUBLIC because ufw is off' edge case) and that process names are included, which is genuinely informative, but it never states that this is a read-only snapshot tool or whether any auth/permission is required. The disclosure is mostly about return content rather than operational behavior.

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?

Two sentences with essentially no filler, and the core scope ('what is reachable on a host and from where') is front-loaded. The trailing 'Plus the public UFW allows.' is a slightly awkward fragment, but nothing is wasteful.

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 low-complexity, one-parameter read tool with no output schema, the description carries the return-value burden well by enumerating the classification buckets and the process-name field. The remaining gap is the absence of any sibling differentiation, but on the whole an agent has enough to call it correctly.

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?

The single parameter 'host' is fully documented in the schema ('host name from the inventory (fleet_hosts)') at 100% coverage. The description adds nothing beyond that -- it never clarifies valid host identifiers or how the value relates to fleet_hosts. Baseline 3 applies when the schema already does the work.

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 resource -- every listening socket on a host with its exposure classification (local / tailnet-only / public-allowed / blocked by ufw / PUBLIC) plus the process name. An agent can tell what this reports without opening the schema. It does not, however, distinguish itself from adjacent siblings like host_firewall, host_connections, or host_net_check, which also deal with host reachability.

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 explicit when-to-use statement, no prerequisites, and no named alternative. The closest thing to guidance is the implication that this is an exposure/audit query, which the agent must infer rather than being told. Rival tools such as host_firewall and host_net_check are never mentioned, so the agent has no routing signal.

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

host_rebootA

Reboot hosts (shutdown -r +delay) and wait for each to come back over ssh with remnanode running before the next one (rolling, batch 1). The dry run shows users online per node (panel) and whether a reboot is pending anyway.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNowait for the host to return (up to 10 min) before the next batch
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
delayMinNo
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description must carry the behavioral burden, and it discloses a lot: rolling batch-1 sequential reboots, waiting for ssh + remnanode to return before the next host, and that the dry run reports users online per node and pending-reboot state. It omits permission requirements and failure/recovery details beyond what parameters imply, so it is strong but not exhaustive.

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?

Two dense sentences that are front-loaded with the core action and mechanism, with secondary dry-run detail trailing. Almost every clause carries information, though the phrasing is compressed enough to border on terse.

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 destructive, 8-parameter tool with no annotations and no output schema, the description supplies the operation mechanics and dry-run behavior needed to call it safely. It lacks explicit safety/permission framing and does not describe the return payload, but the pre-flight dry-run and planHash params largely cover the safety story.

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 88%, so the schema already documents nearly all parameters. The description only reinforces the dry-run visibility ('users online per node') and rolling batch behavior, adding little syntax or format detail beyond the schema's own descriptions of wait, apply, target, etc.

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

Purpose5/5

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

States a specific verb (Reboot) and resource (hosts) and immediately adds the mechanism (shutdown -r +delay) and rolling semantics. No sibling tool in the list performs a reboot, so the purpose is unambiguous and clearly differentiated.

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 a dry-run-then-apply workflow and mentions rolling batch behavior, which hints at how to use it. However it never states when to prefer this over alternatives (e.g., host_exec or service_action), nor prerequisites such as required access. Usage is implied rather than explicit.

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

host_services_discoverA

What runs on a host that the inventory does not know yet: docker compose projects (with their files), standalone containers, non-stock systemd services, and known apps with an API (Jellyfin, Tdarr) — returned as ready services: / apps: YAML for fleet.yaml. Read-only; use it to describe a home server once.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory (fleet_hosts)

TDQS

A4.1/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden, and it does disclose 'Read-only' plus the exact return format (ready services:/apps: YAML for fleet.yaml) — valuable given there is no output schema. It does not discuss permissions, rate limits, or how a partial/failed discovery behaves, leaving a minor gap.

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 dense sentence that front-loads the discovery scope, then the return format, then the read-only/one-time usage note. The parenthetical asides are informative rather than wasteful, though the breadth of listed service types makes it slightly heavy.

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 read-only, one-parameter tool with no output schema and no annotations, the description compensates well by explaining both what is discovered and the shape of the returned YAML. Only minor gaps remain around error behavior and relationship to the other host_* discovery siblings.

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?

There is a single required parameter and schema description coverage is 100%, with the schema stating it is a host name from the inventory (fleet_hosts). The description adds no further parameter syntax or constraints, so the baseline of 3 is appropriate since the schema already does the work.

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

Purpose5/5

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

States a specific verb (discover) and resource (services running on a host), and scopes it precisely: docker compose projects, standalone containers, non-stock systemd services, and API-bearing apps. It distinguishes itself from the inventory (fleet_hosts) and from siblings like host_docker by enumerating exactly what it surfaces and what it returns (services:/apps: YAML for fleet.yaml).

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

Usage Guidelines4/5

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

Gives a clear usage context: it finds what the inventory does not yet know, and 'use it to describe a home server once' frames it as a one-time discovery step. It stops short of naming alternatives or explicit when-not conditions (e.g. vs host_inspect or fleet_discover), so it lacks the exclusions that would earn a 5.

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

jellyfin_library_add_pathA

Add a folder to an existing Jellyfin library. The folder may be given as a host path (translated through the Jellyfin container mounts) or as the path inside the container; it must exist on both sides. Optionally scans the library afterwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr
pathYesfolder, absolute (host or container path)
scanNo
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
libraryYeslibrary name as in jellyfin_status
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

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 burden and does disclose meaningful behavior: the path is translated through Jellyfin container mounts and must exist on both host and container sides. It says nothing, however, about the dry-run/apply workflow that governs whether anything actually changes, nor about required permissions, which is a notable gap for a mutation tool.

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?

Two tight sentences, front-loaded with purpose followed by path semantics and the scan note; no filler. It could have spent a few words flagging the dry-run default, but as written it is efficient and well-ordered.

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?

For a 6-parameter mutation tool with no annotations and no output schema, the description covers purpose, path handling, and post-scan behavior, but omits the safety-relevant apply/planHash contract even though it is central to how the call behaves. Adequate but with a clear gap given the absence of annotations.

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?

Schema coverage is high (83%), so 3 is the baseline, and the description adds real meaning beyond the schema: the path can be given as a host path (translated through container mounts) or a container path, and must exist on both sides. The schema only says 'folder, absolute (host or container path)', so the dual-existence and translation semantics are a genuine addition.

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 ('Add a folder to an existing Jellyfin library'), and the word 'existing' implicitly separates it from jellyfin_library_create, which makes a new library rather than adding a path. It is clear and specific, though it never names a sibling outright, so it stops 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 Guidelines3/5

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

Usage is largely implied by the purpose sentence, and 'Optionally scans the library afterwards' mildly routes around jellyfin_scan. However there is no explicit when-to-use/when-not guidance against jellyfin_library_create, jellyfin_task_run, or tdarr_library_add, so alternatives are left to inference.

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

jellyfin_library_createC

Create a Jellyfin library with folders. Library options (metadata language, savers, fetchers …) can be copied from an existing library of your choice; otherwise Jellyfin defaults apply.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr
nameYes
scanNo
typeYes
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
pathsYesfolders (host or container paths)
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
optionsFromNoexisting library whose LibraryOptions to copy

TDQS

C2.9/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 burden and discloses only that library options may be copied or defaulted. It says nothing about the mutation's side effects, the fact that apply defaults to a dry run requiring a one-shot planHash, permissions, or irreversibility — all of which matter for a create operation.

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?

Two tightly written sentences with the core action front-loaded and the options nuance trailing; no filler. Slight verbosity with the parenthetical '…' ellipsis list, but otherwise efficient.

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?

For an 8-parameter mutation tool with no annotations, no output schema, and 63% schema coverage, the description omits the most consequential facts: the dry-run-first/apply contract, that optionsFrom is the sole options source, and scan defaults. An agent could invoke it without realizing the default call is a no-op dry run.

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 63%, so the schema already documents several parameters (host, apply, paths, planHash). The description's only parameter-level contribution is restating optionsFrom ('copy from an existing library of your choice') plus 'with folders' for paths, adding little beyond the schema text.

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 ('Create a Jellyfin library with folders'), which is enough to distinguish it from jellyfin_library_add_path (adds a path to an existing library) and jellyfin_scan. It does not explicitly name those siblings, but the verb+resource is unambiguous.

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 use this versus jellyfin_library_add_path, nor any mention of the dry-run/apply workflow that governs safe invocation. The only conditional offered is the internal optionsFrom behavior, not guidance about tool selection.

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

jellyfin_scanC

Scan Jellyfin for new/changed files: one library (metadata/images for new items only) or all libraries.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
libraryNodefault: all libraries
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description must carry the full behavioral burden. It adds the useful nuance that single-library scans only pull metadata/images for new items, but says nothing about whether this mutates state, what permissions/host model it needs, or how dry-run/apply interact — those mechanics live only in the schema.

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 front-loaded sentence with no filler. The parenthetical clarifying single-library behavior is slightly dense but earns its place.

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?

For a 4-parameter tool with a dry-run/planHash workflow, the schema covers the mechanics, but with zero annotations and no output schema the description leaves the safety profile and mutate-vs-read nature unstated. It is adequate but not complete for a mutation-triggering tool.

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 description coverage is 100%, so host, apply, library, and planHash are already documented. The description reinforces the library default (all libraries) and adds the metadata/images nuance, but adds no format or constraint details beyond the schema — baseline 3 applies.

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 (Scan) and resource (Jellyfin files) plus the scope distinction of one library vs all libraries, and clarifies that single-library mode only handles metadata/images for new items. It does not explicitly contrast with siblings like jellyfin_task_run or tdarr_scan, but the purpose is unambiguous.

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?

The description implies when scanning is relevant ('new/changed files') but gives no explicit when-to-use, prerequisites, or routing to alternatives such as jellyfin_task_run or tdarr_scan. The library scope choice is described but framed as a parameter effect rather than usage guidance.

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

jellyfin_statusA

Jellyfin on a host: version and pending restart, libraries (type, folders — with their host paths — and scan state), who is watching what right now (direct play vs transcode), item counts, scheduled tasks that failed last time or are running.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr

TDQS

A3.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden, and it does disclose a rich picture of what the call surfaces (scan state, live streams with direct-play vs transcode, failed/running tasks). It stops short of stating the safety profile, permission needs, or cost/latency traits, but for a passive status read the disclosed output behavior is substantial.

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 dense, tightly front-loaded sentence that opens with the resource and then lists the reported categories; every clause maps to a distinct piece of output. The nested em-dash parenthetical is slightly awkward but not wasteful.

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?

With no output schema, the description effectively serves as the return-value contract and covers version, libraries, streams, counts, and tasks. For a read-only diagnostic of moderate complexity this is nearly complete, missing only explicitly stated limits or guarantees.

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 100% and the single 'host' parameter is already documented in the schema (host from inventory with apps.jellyfin/apps.tdarr). The description adds no syntax or format detail beyond that, so the baseline 3 applies.

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 resource ('Jellyfin on a host') and enumerates exactly what is reported: version, libraries, active streams, item counts, tasks. This clearly separates it from action siblings like jellyfin_scan and jellyfin_task_run, though it never names alternatives explicitly.

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?

Usage is implied by the name and the read-only 'status' framing (check the state of Jellyfin on a host), but there is no explicit when-to-use, prerequisite, or when-to-prefer-a-sibling guidance despite many closely related tools in the list.

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

jellyfin_task_runC

Start a Jellyfin scheduled task by name or key (e.g. "Scan Media Library", "Extract Chapter Images", "Clean Cache", RefreshLibrary).

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr
taskYes
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

C2.9/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 and says nothing about side effects. It never mentions that this is a mutating action, that the default is a dry run requiring a planHash to actually execute, whether the call waits for task completion, or what happens if the task name/key is invalid.

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 front-loaded sentence with no filler; the examples are compact and useful. It is arguably under-sized rather than bloated, but as written every element earns its place.

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?

For a mutation tool with no annotations and no output schema, the description omits the two-phase dry-run/apply requirement, expected result, and error behavior. The agent must reconstruct the safety protocol from the schema, which is insufficient for correct invocation.

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 75%: host, apply, and planHash are documented in the schema, but the required 'task' parameter has no schema description. The description compensates by supplying example task names/keys for 'task', adding real value, though it does not clarify valid key formats or name matching rules.

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 gives a specific verb+resource ('Start a Jellyfin scheduled task') and clarifies that lookup can be by name or key, with concrete task examples ("Scan Media Library", "Clean Cache", RefreshLibrary). It does not distinguish this from the sibling jellyfin_scan, however, which may cover overlapping ground (both trigger media scans).

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 use this tool versus jellyfin_scan or the other jellyfin_* siblings, nor any prerequisites. The only procedural guidance (dry-run first, then apply) lives in the schema parameter descriptions, not the tool description.

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

job_statusA

State of a detached remote job (node_bootstrap): running or finished with exit code, the log tail, a Tailscale login URL if the node waits for authorization. Tries the host over Tailscale (inventory address) first, then the public bootstrap address. Without jobId: lists known jobs.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdNo
linesNo

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does a good job: it discloses the returned payload (running/finished with exit code, log tail, Tailscale login URL when authorization is pending) and the connection strategy (Tailscale inventory address first, then public bootstrap address). It does not mention permission or auth requirements, so it is strong but not exhaustive.

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?

Three sentences, zero filler, with the core purpose front-loaded and the fallback and no-argument behaviors appended in order of relevance. Every clause adds usable 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?

For a two-parameter status tool with no annotations, no output schema, and 0% schema coverage, the description covers purpose, return contents, fallback addressing, and the no-jobId mode. The only meaningful hole is the semantics of the 'lines' parameter, which the agent must guess from 'the log tail'.

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 description coverage is 0%, so the description must compensate. It fully explains jobId, including the distinct no-jobId listing behavior, but never mentions the 'lines' parameter that controls how much log tail is returned, leaving one of two parameters undocumented.

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 resource and verb-equivalent ('State of a detached remote job') and scopes it to a concrete job type, node_bootstrap, which helps the agent separate it from the start-a-job sibling. It does not explicitly contrast itself with other status tools such as fleet_status, so it stops 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 Guidelines3/5

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

The conditional 'Without jobId: lists known jobs' gives an implied mode-selection rule, which is genuinely useful. However there is no explicit when-to-use guidance relative to node_bootstrap (which presumably launches the job this tool monitors) or any other status sibling, so usage is inferred rather than stated.

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

journal_listB

What this server did to hosts: every action with time, host, outcome and planHash (newest first).

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNo
limitNo
sinceNoISO date/time
containsNo

TDQS

B3.1/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 the returned fields and newest-first ordering, but does not explicitly state that the operation is read-only, whether it requires authorization, how pagination or limits behave, or what planHash represents.

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?

The definition is a single front-loaded sentence with no wasted words. It efficiently communicates the core purpose, return content, and ordering.

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?

The description partially covers the tool's behavior by naming returned fields and sorting, but it omits filter semantics, pagination/limit behavior, and usage context. With no output schema or annotations, these gaps leave the definition only adequate, not complete.

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 only 25%, and the description does not compensate by explaining the host, limit, or contains parameters. Only since has schema-level documentation as an ISO date/time, while the description focuses on returned fields rather than input filters.

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 clearly states the resource and content: every action the server performed on hosts, with time, host, outcome, planHash, and newest-first ordering. It is specific enough to understand the tool, but it does not distinguish this from sibling audit/history tools such as fleet_audit, fleet_changes, or host_logs.

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 explicit guidance on when to use this tool versus alternatives, nor any prerequisites or exclusions. The description only describes output content and ordering, leaving the agent to infer its role among many sibling tools.

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

node_bootstrapA

Turn a fresh Ubuntu server into a node with vps-edge-run.sh (github.com/akadorkin/remnanode-install-script): user + sudo, Tailscale (--ssh, exit node), Docker, hardening (ssh, fail2ban, UFW tailscale-only), tuning, node_exporter, geo updater, certbot certificate for the domain, remnanode with the panel's SECRET_KEY. That is only the start of the current baseline: afterwards ops-scripts fleet-node-seal.sh (ipset blocklists, MGMT-PORTS, node_exporter, beszel-agent, log-upload) — the node_add runbook (scenario_start) runs the whole sequence; fleet_audit shows what is missing. Runs detached on the server over its public IP (the firewall reset cuts public ssh); poll with job_status. The server reboots 3 min after success. Needs the domain's A record pointing at the server.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesinventory host (with bootstrap.address) or a new name
userNosudo user to create (default: inventory/defaults user)
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
domainNoremnanode TLS domain (default: inventory domain)
addressNopublic IP / ssh target of the fresh server (default: bootstrap.address from the inventory)
sshPortNo
sshUserNoinitial ssh user (root on most VPS)root
hostnameNo
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
remnanodeNo
secretKeyNoremnanode SECRET_KEY; default: fetched from the panel (/api/keygen)
tailscaleAuthKeyNotskey-auth-… to join the tailnet unattended; else the log shows a login URL to open

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does well: it discloses that execution is detached over the public IP, that the firewall reset severs public SSH, that polling must go through job_status, and that the server reboots 3 minutes after success. It also reveals the two-phase baseline (bootstrap then fleet-node-seal.sh) with ipset blocklists, MGMT-PORTS and agents.

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?

Front-loaded with the core action followed by the sequence and caveats, and every clause carries real information. It is dense and somewhat run-on, with the baseline description packed into a single sprawling sentence, but nothing is wasted given the tool's complexity.

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

Completeness5/5

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

For a complex, annotation-free, output-schema-free provisioning tool this is remarkably complete: prerequisites, side effects (SSH severance, reboot), async lifecycle, dry-run semantics, and the follow-on sealing phase are all covered. An agent has enough to reason about blast radius before invoking.

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?

Schema coverage is 75%, so the schema documents most parameters. The description adds operational meaning by tying secretKey to the panel's SECRET_KEY, framing planHash as a one-shot dry-run token, and noting the Tailscale auth path (--ssh, exit node), though thinner params like hostname and remnanode remain unexplained.

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

Purpose5/5

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

States a specific verb and resource ('Turn a fresh Ubuntu server into a node'), names the concrete script it drives, and enumerates the resulting stack. It clearly differentiates itself from siblings by positioning scenario_start as the full-sequence runner and fleet_audit as the gap reporter.

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

Usage Guidelines5/5

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

Explicitly routes the agent: scenario_start runs the whole sequence while this is 'only the start of the current baseline', fleet_audit shows what is missing, and job_status is the polling mechanism. It also states the prerequisite (domain A record pointing at the server) and the apply/planHash gate.

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

remnanode_updateA

Update remnanode (remnawave/node image) on nodes: compares the running image with Docker Hub, then per node docker compose pull && up -d, waits for the container and (if the panel is configured) for the panel to see the node connected before moving on. Rolling, batch 1 by default; stops at the first node that does not come back.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
forceNorecreate even when the running image is already the latest
pruneNoremove dangling images afterwards
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesrole:remnanode
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses the rolling batch-1 default, the per-node pull/up sequence, the wait for container plus panel connection, and the fail-stop behavior. It omits auth/permission needs and the time cost of a full rollout, keeping it short of a 5.

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 dense sentences, zero filler, with the core action and mechanism front-loaded and the rollout/failure semantics following. 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?

For a mutation tool with no annotations and no output schema, the description covers the workflow, the dry-run/apply gate, and failure handling adequately, and the schema covers the return-adjacent planHash. It stops short of noting duration, auth prerequisites, or blast radius (e.g. prune removing dangling images).

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 100%, so the schema already documents all 8 parameters including defaults and planHash semantics. The description reinforces the batch-1 default and the pull/up behavior but adds little on parameter syntax beyond what the schema provides; baseline 3 applies.

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

Purpose5/5

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

States a specific verb (Update) and resource (remnanode / remnawave node image on nodes), then spells out the exact mechanism: compare against Docker Hub, then per-node `docker compose pull && up -d`. An agent can identify this distinctly among the fleet siblings without opening the schema.

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 through the dry-run/apply workflow and the 'stops at the first node' rollout semantics, and the apply param clarifies the plan step. However, it never states when to prefer this over alternatives (e.g. apt_upgrade or service_action) or when not to use it, leaving routing to inference.

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

repo_scriptA

Run one of your own fleet scripts from a local repo checkout (MIA_REPOS, e.g. ops=~/src/ops-scripts) on hosts: deploy/migrate-blacklist.sh, lock-mgmt-ports-apply.sh, install-beszel.sh … The script (plus files listed in with, same relative paths) is sent over ssh, run as root from a temp dir, then removed. Exactly the checked-out version runs: the plan shows the commit, uncommitted changes and a hash of the files. Secrets go by env var name (envFrom): the value is read from mia's own environment and never shown.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNonon-secret variables
argsNo
repoNorepo name from MIA_REPOSops
withNoother repo files the script reads (relative paths are kept)
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
scriptYespath inside the repo, e.g. deploy/migrate-blacklist.sh
targetYeshosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludes
envFromNonames of variables to pass from mia's environment (secrets)
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
installToNoinstall the script at this path first (e.g. /usr/local/bin/ufw-blacklist.sh, which cron re-runs), then run that copy; the previous copy is kept as .bak-<time>
timeoutSecNo
installOnlyNowith installTo: only install the new copy (bash -n checked), do not run it — cron picks it up
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and discharges much of it: it discloses ssh delivery, root execution from a temp dir, cleanup afterward, that the checked-out version is pinned and shown with commit/uncommitted-changes/hash, that secrets are read from mia's environment and never displayed, and that installTo keeps the prior copy as .bak-<time>. It omits explicit permission/auth requirements and error-handling traits, so it is not exhaustive.

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?

Information-dense and front-loaded: the core action appears first, followed by delivery/execution behavior, then provenance and the secrets model. It is fairly long, but nearly every clause carries new information, so it earns most of its length.

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 15-parameter, no-annotation, no-output-schema tool this is a fairly complete description: it explains the execution model, the safe plan/apply flow, provenance, and the secrets and install variants. Remaining gaps (behavior of timeoutSec, batch, continueOnError, skipUnreachable) are covered by schema descriptions, so an agent has enough to call it correctly.

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?

Schema coverage is high (87%), setting a baseline of 3, but the description adds meaning beyond the schema for the workflow-critical params: envFrom (secrets sourced from mia's own environment, never shown), with (companion files kept at same relative paths), apply/planHash (dry-run then apply, refused if state changed), and installTo (cron re-runs the installed copy). It adds genuine semantics rather than restating the schema.

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

Purpose5/5

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

States a specific verb+resource: it runs the user's own fleet scripts from a local repo checkout on hosts, and names the exact kinds of scripts (deploy/migrate-blacklist.sh etc.). This clearly distinguishes it from generic remote-execution siblings like host_exec, since it emphasizes 'exactly the checked-out version runs' with commit/hash provenance.

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

Usage Guidelines4/5

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

The description lays out the intended two-phase workflow (dry run with apply=false and a planHash, then apply=true) and explains the envFrom/secrets path, which is real usage guidance. It does not explicitly contrast with alternatives such as host_exec or service_action, so it stops short of a full when/when-not routing statement.

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

ru_probeA

Is an address reachable from Russia (or any censored network): a TLS handshake from a vantage host through EVERY local ISP interface (MIA_PROBE_FROM, MIA_PROBE_IFACES) with the address forced (--resolve, not DNS), plus a control from a datacenter host (MIA_PROBE_CONTROL). Verdict per target: ok | partial (one ISP) | blocked-ru (both ISPs fail, datacenter passes = DPI (TSPU) blocks address:port — roll the DNS back first) | down. Read-only, one handshake per pair; the gate before and after any address switch (ingress, new node).

ParametersJSON Schema
NameRequiredDescriptionDefault
toYestargets: "ip:port" or "ip:port/sni" (default port 443)
sniNoSNI for targets without their own
fromNohost with the home ISPs (default MIA_PROBE_FROM; only read, nothing changes there)
ifacesNointerfaces = ISPs (default from MIA_PROBE_IFACES)
controlNodatacenter host for the control probe (default MIA_PROBE_CONTROL; "" = none)

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden; it discloses that the probe is read-only, that only one handshake per pair is performed (low-impact, bounded), that the source host is only read and nothing changes there, and that resolution is forced via --resolve rather than DNS. It omits timing/timeout behavior and error handling, keeping it short of a 5.

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 core question is front-loaded and the total length is reasonable for the amount of mechanism conveyed. It is dense with parentheticals and environment-variable names, which makes it a heavy read, but almost every clause carries operational meaning.

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?

With no output schema, the description correctly enumerates the return verdicts (ok | partial | blocked-ru | down) and explains what each means, including the DPI/TSPU inference behind blocked-ru. It leaves secondary gaps — probe duration, timeout/failure behavior when a vantage host is unreachable — that an agent planning around this call would want.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond it: it ties MIA_PROBE_FROM/MIA_PROBE_IFACES/MIA_PROBE_CONTROL to the probing model, clarifies that 'ifaces' are ISPs and that 'from' is read-only, and explains that address resolution is forced rather than DNS-driven. That is genuine semantic value over the schema text.

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

Purpose5/5

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

Opens with a precise, specific question — whether an address is reachable from Russia or any censored network — and immediately names the mechanism (per-ISP TLS handshake plus datacenter control). The scope is narrow and distinctive enough that an agent would not confuse it with generic siblings like host_net_check or host_ports.

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

Usage Guidelines4/5

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

States a clear usage context: it is the gate to run before and after any address switch (ingress, new node), and it instructs rolling DNS back first when the verdict is blocked-ru. It gives strong context but never names an alternative tool or an explicit when-not-to-use condition.

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

scenario_listB

Runbooks for whole operations (add a node and bring it to the fleet standard, switch the ingress, remove a node, change xray rules): their parameters, and the runs started so far. With run: the step log of that run.

ParametersJSON Schema
NameRequiredDescriptionDefault
runNo

TDQS

B3.2/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 discloses the return shape (parameters, prior runs, and step log when run is supplied), which is genuinely useful, but it omits the read-only nature, any pagination/limit behavior, and error conditions for an unknown run.

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?

Two dense sentences with no filler; the resource is front-loaded and the parameter behavior is appended. The parenthetical example list is slightly heavy but earns its place by clarifying what a 'runbook' covers.

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?

For a one-parameter, no-output-schema list tool, the description covers what is returned and the parameter's effect, but it omits sibling differentiation and invocation context, so an agent still has to guess how it relates to scenario_start and scenario_step.

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 'run' parameter, so the description must compensate. It does explain the parameter's effect ('the step log of that run'), but not its expected format (ID vs name) or what happens when omitted, leaving the semantics only partially covered.

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 concrete resource — runbooks (scenarios) for whole operations — plus what is returned: their parameters and the runs started so far, with step-log detail when run is set. It is clear enough to act on, but it never names or distinguishes itself from the sibling scenario_start / scenario_step tools.

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 explicit when-to-use or when-not-use guidance, and no alternatives are named. The only usage-adjacent statement is 'With run: the step log of that run,' which hints at the parameter's effect but does not tell the agent when to prefer this tool over scenario_step.

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

scenario_startA

Start a runbook. Read-only checks run on their own; the first step that changes something comes back with its exact plan (dry run) and waits. Show that plan to the owner and continue with scenario_step only after the owner said yes to that step.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
scenarioYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: read-only steps auto-run, while the first mutating step returns a dry-run plan and waits for approval. It omits error handling, auth requirements, and idempotency details, so it is not fully complete.

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?

Three compact sentences: purpose first, then behavioral model, then the required next action. Every sentence is informative and well ordered for an agent scanning the definition.

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?

Given no annotations and no output schema, the description adequately explains the critical dry-run and approval workflow. The main gap is parameter documentation, though the required 'scenario' is implied and 'params' is optional.

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 coverage is 0% across two parameters. The phrase 'Start a runbook' loosely implies what 'scenario' means, but there is no explanation of the optional 'params' object, its keys, or expected formats, so the description barely compensates for the empty schema.

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

Purpose5/5

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

The first sentence gives a specific verb ('Start') and resource ('runbook'), making the purpose unambiguous. It also distinguishes itself from the sibling scenario_step by presenting scenario_step as the continuation tool rather than the starter.

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

Usage Guidelines4/5

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

It clearly states when to call the sibling scenario_step (only after owner approval) and instructs the agent to show the plan to the owner. It does not explicitly state when not to use scenario_start or compare it against scenario_list, so it falls short of full alternative routing.

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

scenario_stepA

Answer the step a run is waiting on: apply (run the plan shown — only with the owner's explicit yes for this step), done (a manual step the owner has finished), skip, or retry (re-check / re-plan). Returns what happened and the next step that needs an answer. Runs are saved: resume any time with decision retry.

ParametersJSON Schema
NameRequiredDescriptionDefault
runYes
paramsNochange parameters of the run first (e.g. the sniMap a step asked for); the step is then re-checked instead of decided
decisionYes

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations the description carries the full burden, and it does well: it discloses the safety constraint that apply requires the owner's explicit yes for this specific step, that runs are persisted and resumable via retry, and that the call returns what happened plus the next pending step.

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?

Front-loaded with the core action and packed with meaning; the parenthetical glosses on each decision earn their place. Dense and slightly run-on, but no wasted sentences.

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?

No output schema, but the description covers return values and persistence. However it omits how a 'run' is obtained (presumably from scenario_start) and how params (nested object) interacts at call time beyond the schema note, leaving a gap for a mutation tool with no annotations.

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 only 33%, so the description must compensate. It richly explains the decision enum (apply/done/skip/retry), which is more than the bare enum, but the required 'run' parameter is left unexplained in both schema and description — where a run id comes from is never stated.

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: answering the step a run is waiting on, and names the four decision values with their meanings. An agent can tell this is the step-resolution tool distinct from scenario_list/scenario_start, though it never explicitly names those siblings.

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

Usage Guidelines4/5

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

Explains when each decision applies: apply only with the owner's explicit yes, done for a manual step the owner finished, retry to re-check/re-plan. This is clear per-decision guidance, but it gives no explicit routing rule versus scenario_start or scenario_list.

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

schedule_toggleA

Switch a scheduled job off / on, or run a timer now (the «Расписание» buttons): a systemd timer — disable --now / enable --now (+ reset-failed of its service), run = start its service; a cron job — the exact line in /etc/crontab, /etc/cron.d/* or a user crontab is commented out with «#mia-off » (enable removes the marker; a copy of the file goes to /root/mia-backup first). Reversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesinventory host
unitNothe timer (for timers)
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
actionYesdisable / enable, or run a timer now
cronFileNocron: the file with the line
cronLineNocron: the exact line (as fleet_schedule shows it)
cronUserNocron: whose crontab (instead of a file)
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the concrete side effects (disable/enable --now, reset-failed of the timer's service, run = start its service), the cron mechanism (line commented with «#mia-off »), the backup copy written to /root/mia-backup, and explicit reversibility. It stops short of permissions/auth requirements and error behavior, so a 4 rather than 5.

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?

Front-loaded with the one-line purpose before the systemd/cron detail, and every clause carries information (exact commands, backup path, reversibility). It is dense and semicolon-chained into a single long statement, which slightly hurts scanability.

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 an 8-parameter mutation tool with no annotations and no output schema, the description covers the mutation semantics, branching, and reversibility well. The two-phase dry-run/planHash safety workflow is only in the schema, and no return/error expectations are given, leaving minor gaps.

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 description coverage is 100%, so baseline is 3. The description adds the timer-vs-cron branching that motivates the unit/cronFile/cronLine/cronUser parameter groups and explains the «#mia-off » marker tied to cronLine, but adds no syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource: 'Switch a scheduled job off / on, or run a timer now', and splits the two concrete cases (systemd timer vs cron job) with the exact operations applied to each. An agent can tell exactly what state change this accomplishes without opening the schema.

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 action semantics (disable / enable / run) structure the usage, and 'Reversible' hints the operation is safe to retry, but there is no explicit statement of when to prefer this over siblings like service_action or fleet_schedule, and no prerequisites (host access, required state) are given. Usage is implied rather than guided.

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

service_actionA

restart / start / stop / update (compose pull + up -d) / recreate a service on hosts — a compose project, systemd unit or container from the inventory (remnanode, certbot, remnawave, tailscaled, fail2ban, node_exporter, docker … or your own). Rolling by default (batch 1 for disruptive actions), verified: the service must be up again.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
actionYes
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
serviceYesservice name (fleet_hosts details:true lists them)
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose meaningful behavior: rolling by default, batch size 1 for disruptive actions, and post-action verification that the service must be up again. It stops short of disclosing the dry-run/apply workflow and the consequence of a failed rollout, which the schema hints at.

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?

Two dense sentences, front-loaded with the verb list and scope. The long parenthetical inventory example is informative but slightly bloats the sentence; overall it stays efficient with minimal waste.

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 an 8-parameter mutation tool with no output schema, the description covers scope, strategy, and verification adequately. It is not fully complete because the dry-run-then-apply contract and failure mode are left entirely to the schema.

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 88%, so the schema already documents almost every parameter including the apply/planHash fingerprint workflow. The description adds only a partial gloss (update = compose pull + up -d, service list sources from inventory), which is useful but not beyond the schema baseline.

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

Purpose5/5

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

States specific verbs (restart/start/stop/update/recreate) applied to a clear resource (a service), and enumerates what counts as a service: a compose project, systemd unit, or container from the inventory. An agent can distinguish this from siblings like host_reboot or remnanode_update without opening the schema.

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 conveys operating intent (rolling default, batch 1 for disruptive actions, verified up again) but never says when to choose this over siblings such as host_reboot, remnanode_update, or host_exec, nor any preconditions. Usage is implied through the action list rather than stated.

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

snapshots_listC

Recorded snapshots of a host (newest first), or the hosts that have any.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNo

TDQS

C2.7/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, and it does disclose two real behavioral traits: results are ordered newest first, and the call has two distinct modes depending on whether host is supplied. It stops short of stating that this is a read-only operation, whether any pagination or limits apply, or what authentication is needed.

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?

At one sentence it is appropriately short and the ordering hint is front-loaded, so it respects conciseness. The second clause is garbled enough that brevity has come at the cost of clarity, which keeps it from earning a 4.

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?

There is no output schema, no annotations, and no parameter documentation, so the description is the only artifact an agent has. It omits the return shape (what fields a snapshot record contains) and the identifier format for the one parameter, leaving the definition under-specified for invocation.

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 description coverage is 0% for the single optional 'host' parameter, so the description must compensate and it partially does: supplying host scopes results to that host's snapshots while omitting it changes the result set entirely. It never clarifies the accepted host identifier format, so meaning is incomplete but directionally useful.

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 conveys that this returns recorded snapshots (newest first) and implies a dual mode where omitting the host returns hosts that have snapshots. However the phrasing 'or the hosts that have any' is grammatically incomplete and never names the action as a list operation, so the purpose is inferable but not crisp. It also does not distinguish itself from the sibling fleet_snapshot.

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 explicit guidance on when to call this versus the related fleet_snapshot or fleet_changes tools, and no stated prerequisites. The implicit with-host vs without-host behavior is the only hint at usage, and it must be reverse-engineered from a cryptic clause.

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

tailnet_device_removeA

Remove a machine from the tailnet (Tailscale API, needs TAILSCALE_API_KEY): the last step of taking a server out of service. The dry run shows the device, when it was last seen and whether it is still in fleet.yaml; an online device or one still in the inventory is refused unless force.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
forceNoremove even if it is online or still an enabled inventory host
deviceYesMagicDNS name (node-pl2), full name or hostname
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses the required TAILSCALE_API_KEY, the dry-run-first workflow, the refusal gating on online/inventory state, and the force override. It stops short of saying whether removal is reversible or what happens to DNS/inventory records afterward, so it is strong but not exhaustive.

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?

Two sentences, front-loaded with the action and scope, with the dry-run/refusal nuance trailing. Every clause carries information, though the parenthetical credential note and the compound refusal clause make it slightly dense.

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 destructive 4-parameter tool with no annotations and no output schema, the description covers auth, the dry-run/apply handshake, and the safety gate. What is missing is post-removal state (does it leave the fleet inventory, DNS records, or is it re-joinable), which an operator would want to know.

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 description coverage is 100%, so the schema already documents apply, force, planHash server-side one-shot semantics. The description reinforces the force behavior but adds little syntax or format detail beyond what the schema states, so baseline 3 applies.

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

Purpose5/5

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

Names a specific verb and resource ("Remove a machine from the tailnet") plus the underlying API and credential, and the phrase "last step of taking a server out of service" cleanly separates it from siblings like tailnet_join and tailnet_devices.

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

Usage Guidelines4/5

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

Gives clear situational context (final decommissioning step) and preconditions: an online device or one still in the enabled inventory is refused unless force is set. It does not name an alternative tool for just inspecting the device, but the when-to-use is unambiguous.

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

tailnet_devicesA

Every device of the tailnet (Tailscale API with TAILSCALE_API_KEY, else this machine's tailscale status): online / last seen, OS and client version, update available, node key expiry, tags — and which inventory host and panel node it is.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNosubstring of the name / hostname / OS / tag
offlineDaysNoonly devices offline for at least this many days

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does add real behavioral context: the two possible data sources and the fallback logic, plus an enumeration of the fields returned (online/last seen, OS, version, update availability, key expiry, tags, host/panel mapping). It stops short of stating permissions or explicitly labeling the operation read-only.

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 dense sentence, front-loaded with the resource scope before the parenthetical about data source. It packs a lot of field information without wasted words, though the parenthetical interrupt is slightly awkward.

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 read-only listing tool with no output schema and two optional filters, the description covers the data source and the content of each returned record, which is enough for an agent to call it correctly. Missing only explicit safety/permission framing, which is minor here.

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 description coverage is 100% (both `filter` and `offlineDays` are documented in the schema), so the baseline is 3. The description adds no meaning for either parameter beyond what the schema already provides.

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 resource (every device of the tailnet) and enumerates the per-device attributes returned, so an agent can distinguish it from siblings like tailnet_join or tailnet_device_remove. It does not explicitly name those siblings, but the enumeration scope makes its role unambiguous.

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?

Usage is only implied: the agent infers it should call this to inventory devices. The parenthetical explains the data-source fallback (TAILSCALE_API_KEY vs local `tailscale status`), which is useful context, but there is no explicit when-to-use, when-not-to, or named alternative.

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

tailnet_joinA

Join a server to the tailnet over its public address (hosts..bootstrap in fleet.yaml): for a machine that is already set up but logged out of Tailscale or never joined. The key is a fresh one-time key from the Tailscale API (TAILSCALE_API_KEY), made only on apply and passed through the environment — never in the plan or journal; without the API it falls back to TAILSCALE_AUTH_KEY. Runs tailscale up --reset --ssh --hostname node-<name> (+ exit node like the fleet), then verifies the node shows up online.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYesinventory host with bootstrap.address
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
installNoinstall Tailscale first when it is missing (official install script), for a fresh server set up without node_bootstrap
sshPortNo
sshUserNossh user on the public address (default: bootstrap.user, else root)
exitNodeNo--advertise-exit-node, as every fleet node does
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so unusually well: it discloses the auth path (fresh one-time key from TAILSCALE_API_KEY, generated only on apply, passed via environment and never persisted to plan/journal, with TAILSCALE_AUTH_KEY fallback), the exact effect (`tailscale up --reset --ssh --hostname node-<name>` plus exit node), and a post-run verification step. Secret handling, side effects, and confirmation behavior are all surfaced.

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?

Four dense sentences, front-loaded with the action and scope, then the auth mechanism and the executed command. Information-dense with little waste, though it is longer than strictly necessary for the front-loaded portion to land.

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?

No output schema or annotations, so the description must stand alone — and for a 7-parameter mutation tool it covers credentials, mechanism, and verification well. Remaining gaps (error modes, permissions required, consequences of --reset on existing state) are minor but real.

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 86%, so the parameters are already largely documented. The description reinforces the apply/host semantics ('key made only on apply', bootstrap.address) but adds no syntax or format beyond what the schema states, so this is baseline-level.

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

Purpose5/5

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

States a specific verb (Join) and resource (a server to the tailnet) plus the connection path (hosts.<name>.bootstrap in fleet.yaml). It also pins the eligibility window — 'already set up but logged out of Tailscale or never joined' — which implicitly separates it from node_bootstrap (fresh servers) so an agent can route correctly.

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

Usage Guidelines4/5

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

Gives a clear when-to-use condition (machine already set up but logged out, or never joined), which is the key routing signal. It never names the alternative (node_bootstrap) explicitly nor states when NOT to use this tool, so it stops short of full alternative routing.

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

tdarr_library_addA

Add folders to Tdarr: one new library per folder, cloned from an existing library (same flow/plugin stack, transcode/health-check settings, cache and output unless given), with counters reset. Folders may be host paths (translated through the Tdarr container mounts). The dry run shows every library object that will be inserted. Optionally starts a "find new" scan of each.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr
scanNoscanFindNew each new library afterwards
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
cacheNotranscode cache folder (default: the template's)
namesNolibrary names, same order as folders (default: the folder name)
outputNooutput folder when the template converts folder-to-folder
foldersYesabsolute folders, host or container paths
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
templateYesexisting Tdarr library to copy settings from

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations the description carries the full burden and does well: it discloses the mutation, that settings are cloned from a template (flow/plugin stack, transcode/health-check, cache/output), that counters are reset, that host paths are translated through container mounts, and that the dry run previews every inserted object. It omits auth/permission needs and partial-failure behavior, so not a 5.

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?

Front-loaded with the core action and no filler sentences; the parentheticals are dense but each carries distinct information (cloning scope, defaults). It reads as one long paragraph rather than cleanly separated workflow vs. behavior, which costs a point.

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 9-parameter, no-annotation, no-output-schema mutation tool, the description covers the workflow (dry run vs apply), cloning semantics, path translation, and the optional scan. Missing pieces are auth requirements and error/partial-failure behavior, which would be needed for full completeness.

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?

Schema coverage is 100%, so baseline is 3, but the description adds real semantics beyond the schema: 'cache and output unless given' explains the inheritance default, and the container-mount translation note explains why folders accept host or container paths. That is genuine additive value over the field descriptions.

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 gives a precise verb+resource+mechanism: 'Add folders to Tdarr: one new library per folder, cloned from an existing library'. The cloning-from-template detail is specific enough to separate it from generic library-creation tools, but it never names a sibling (e.g. jellyfin_library_add_path) to route the agent, 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 Guidelines3/5

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

Usage is implied rather than stated: the dry-run sentence and 'Optionally starts a find new scan' hint at the intended workflow, but there is no explicit when-to-use/when-not guidance or named alternative. The agent must infer that dry run precedes apply from the schema rather than the prose.

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

tdarr_pauseA

Pause or resume all Tdarr nodes (global setting), e.g. while the server is busy streaming.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
pausedYes
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

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 full burden. It usefully discloses that this is a global setting affecting ALL Tdarr nodes, which is real behavioral context, but it omits auth/permission needs, reversibility, and the dry-run/apply workflow implications beyond what the schema already states.

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 the action first and the scope and motivating example second; zero filler or redundancy.

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?

For an unannotated global mutation tool with four parameters and no output schema, the definition is minimal but the schema does cover the dry-run/apply mechanics. It still leaves permission requirements and the consequences of a global pause undisclosed.

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 75%, so most parameters are already documented; the undescribed 'paused' param is partially covered by the description's 'Pause or resume' framing, implying a boolean toggle. The description adds little else beyond the schema's own apply/planHash explanations.

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 clear verb+resource pair ('Pause or resume all Tdarr nodes') and scopes it as a global setting, which reads unambiguously and separates it from read-only siblings like tdarr_status. It does not explicitly name an alternative tool, but the purpose itself is specific enough for selection.

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?

Provides one concrete usage context ('while the server is busy streaming'), which implies when to reach for it. However, it offers no when-not guidance, no prerequisites, and no alternatives, leaving usage conditions mostly to inference.

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

tdarr_scanA

Scan a Tdarr library: scanFindNew (only new files, default) or scanFresh (re-scan everything).

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr
modeNoscanFindNew
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
libraryYes
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It discloses the mode semantics, but never states that this is a mutating action, that the default is a dry run, or that apply needs a planHash (those details live only in the schema). Adequate but not rich.

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?

One tight sentence, front-loaded with the action, and the mode options are given inline with their default. Every clause earns its place.

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?

For a 5-parameter, un-annotated mutation tool with no output schema, the description is thin: it omits the dry-run/apply/planHash safety path and the meaning of host and library. The schema covers some of this, but the description alone is not sufficient.

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 description coverage is 60% and the description adds meaning for the mode enum only ('only new files' vs 're-scan everything'). It supplies nothing for host, library (undocumented in the schema), apply, or planHash, leaving the biggest workflow decisions to the 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 (scan) and resource (Tdarr library), and the two modes are named and distinguished by their effect (only new files vs re-scan everything). It does not explicitly differentiate itself from neighboring tdarr_* siblings, but the purpose is unambiguous.

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?

It usefully explains when to pick each mode (new-only vs full re-scan), which is implied guidance. It gives no guidance on when to use this versus tdarr_status/tdarr_pause, and does not mention the dry-run-then-apply workflow, so the agent must infer the safe invocation order from the schema.

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

tdarr_statusB

Tdarr on a host: server version/uptime, nodes (paused, workers), libraries (folder, cache, output, watching, processing), global pause, overall statistics.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYeshost name from the inventory that has apps.jellyfin / apps.tdarr

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 burden. It does disclose the informational, non-mutating nature and precisely what is surfaced (paused nodes, workers, watching/processing libraries, global pause). It stops short of confirming read-only behavior, permission/auth needs, or error conditions, which is a gap 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.

Conciseness4/5

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

A single sentence, front-loaded with the resource and then the reported fields. It is dense but every phrase earns its place by documenting return content that no output schema provides; no filler or repetition.

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 low-complexity, single-parameter inspection tool with no output schema, the description compensates by enumerating the returned data categories, which is exactly what the missing output schema would otherwise cover. It lacks only explicit read-only/permission framing, a minor gap at this complexity.

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?

Only one parameter (host) and schema description coverage is 100%, so the schema already explains the host must come from the inventory having apps.tdarr. The description adds nothing new about the parameter's syntax or constraints, so the baseline of 3 applies.

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 clearly states the resource (Tdarr on a host) and enumerates the aspects reported: server version/uptime, nodes, libraries, global pause, statistics. The 'status' name plus this content makes the retrieval purpose unambiguous. It does not, however, explicitly distinguish itself from the tdarr_scan / tdarr_pause / tdarr_library_add siblings, relying on the reader to infer the read-only inspection role.

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 explicit when-to-use guidance, no prerequisites, and no mention of alternatives. An agent can infer it is the 'check Tdarr state' tool, but nothing states when to prefer it over the sibling tdarr_* tools or what conditions warrant calling it.

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

tuning_applyA

Apply or roll back the kernel/network tuning of vps-network-tuning-script (initial.sh apply|rollback): BBR+fq, conntrack, NOFILE, swap, journald limits. apply creates a backup in /root/edge-tuning-backup-*; rollback restores the latest (or backupDir).

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
backupDirNo
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A3.7/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 usefully discloses that apply creates a backup in /root/edge-tuning-backup-* and that rollback restores the latest or a given backupDir, but it omits important safety context such as required privileges, potential disruption, or dry-run/planHash workflow details that are only present in the schema.

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 tightly written sentences front-load the operation and resource, then add backup semantics without repetition or filler. Every clause contributes useful information.

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?

For an eight-parameter mutation tool with no annotations and no output schema, the description covers the core actions and backup behavior but leaves gaps around prerequisites, safety, and when to use it versus tuning_status. The schema handles parameter detail, but the overall definition is only minimally complete.

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 75%, so the schema already documents most parameters. The description adds some meaning for op and backupDir, but it does not clarify the remaining parameters such as target syntax, batch behavior, or continueOnError beyond what the schema provides.

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

Purpose5/5

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

States a specific verb pair (apply/roll back) and resource (kernel/network tuning of vps-network-tuning-script), plus the concrete tuning areas (BBR+fq, conntrack, NOFILE, swap, journald). This clearly distinguishes it from the sibling tuning_status, which would report rather than apply changes.

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 when to use each operation (apply versus rollback) and notes that rollback can target the latest backup or a specified backupDir. However, it gives no explicit when-not-to-use guidance and does not route the agent to tuning_status for inspection before applying.

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

tuning_statusB

Kernel/network tuning state from the owner's vps-network-tuning-script (initial.sh status): profile, BBR/fq, conntrack, NOFILE, swap, journald — plus available rollback backups.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall

TDQS

B3.3/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 implies a read-only status check via 'state' and the `initial.sh status` command, and it lists what is included, but it does not state permissions, auth needs, side effects, or whether anything is modified.

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 redundant or wasted wording. Every element, including the source command and the list of reported aspects, contributes to selecting and understanding the tool.

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?

For a status tool with one fully documented parameter and no output schema, the description lists the main returned areas and mentions rollback backups. However, it omits usage guidance and explicit safety/behavioral context, leaving meaningful gaps for an agent choosing among siblings.

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 description coverage is 100% for the single target parameter, and the description adds no parameter-level meaning beyond what the schema already documents. With full schema coverage, the baseline of 3 applies.

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 resource (kernel/network tuning state) and lists the reported aspects (profile, BBR/fq, conntrack, NOFILE, swap, journald, rollback backups). It clearly distinguishes a state-reading tool from a mutation tool, though it does not explicitly contrast with the sibling tuning_apply.

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?

Provides no when-to-use or when-not-to-use guidance, and does not name alternatives. The sibling tuning_apply exists, but the description gives no condition for choosing status over apply.

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

ufw_ruleA

Add or delete a UFW rule on hosts, e.g. open a new public port for an inbound (allow 8443/tcp on the internet interface) or close one. Public exposure of 22/2222/5443/5444/9100 is blocked unless allowDangerous. The rule list before the change is shown in the dry run.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
fromNosource IP/CIDR; default Anywhere
portYes
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
ifaceNointerface, e.g. eth0 (public) or tailscale0; default: any
protoNotcp
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
allowDangerousNo

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose meaningful behavior: certain ports (22/2222/5443/5444/9100) are blocked from public exposure unless allowDangerous, and a dry run shows the rule list before the change. That is real safety context beyond the schema, though it omits privilege requirements and what the apply step returns.

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?

Three tight sentences, front-loaded with purpose then the safety caveat then the dry-run behavior. Every sentence contributes; minimal waste.

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 9-param mutation tool with no output schema and no annotations, the description covers the crucial safety gate and the dry-run/apply workflow. Targeting semantics and planHash mechanics live in the schema, so coverage is adequate though not exhaustive.

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 only 56% across 9 params, so the description must compensate. It clarifies allowDangerous (which dangerous ports are gated) and apply (dry run vs execute), but adds nothing for from, proto, target, or planHash beyond what the schema already says. Partial compensation warrants a 3.

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 concrete verb+resource ('Add or delete a UFW rule on hosts') and reinforces it with a worked example ('allow 8443/tcp on the internet interface'). An agent immediately knows this manages host firewall rules. It does not explicitly distinguish itself from the sibling host_firewall, so it stops 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 Guidelines3/5

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

The example ('open a new public port ... or close one') implies the usage context, and the dry-run sentence hints at the intended workflow. However, there is no explicit when-to-use/when-not guidance and no routing to alternatives such as host_firewall, leaving selection to inference.

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

updates_policyA

Bring hosts to the fleet update policy: security updates install automatically (unattended-upgrades, stock security-only origins), NO automatic reboots — reboots stay manual (host_reboot). Writes /etc/apt/apt.conf.d/20auto-upgrades and 99zz-mia-policy, enables apt-daily timers. apt-based hosts only.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNofalse (default) = dry run: show what will happen on which hosts and a planHash. true = run it; needs planHash
batchNohosts at a time (rolling). Default depends on the action: 1 for disruptive ones
targetNohosts: all | <host> | <glob nl-*> | <group> | role:<edge|remnanode|panel|docker> | tag:<tag>; comma-separated, !x excludesall
planHashNoplanHash from the dry run of the very same call, good for one apply; refused if targets or their state changed since
continueOnErrorNokeep going after a host fails (default: stop the rollout at the first failure)
skipUnreachableNoskip hosts that do not answer over ssh instead of refusing the whole plan (they show as skipped)

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: it discloses which files are written, which timers are enabled, and the deliberate no-reboot policy. It does not disclose privilege requirements, idempotency, or reversal behavior when the policy is later changed, leaving a modest gap for a write-configuration tool.

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 dense sentences, front-loaded with the core policy outcome before the implementation files. Every clause (auto-install scope, no-reboot rule, written paths, apt-only boundary) carries distinct, non-redundant 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?

For a six-parameter mutation tool with no annotations and no output schema, the description covers the essential policy semantics and scope boundary, while the schema handles apply/planHash mechanics. It omits any note on required privileges or effect on hosts already carrying a conflicting policy, which would round it out.

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 description coverage is 100%, so all six parameters (apply, batch, target, planHash, continueOnError, skipUnreachable) are already documented in the schema, including the dry-run/planHash workflow. The description adds no parameter-level syntax or format detail beyond what the schema provides, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource (bring hosts to the fleet update policy) and enumerates the exact configuration outcome: security-only unattended upgrades, no auto reboots, which files are written (/etc/apt/apt.conf.d/20auto-upgrades and 99zz-mia-policy). An agent can distinguish this from apt_upgrade (which performs upgrades) and host_reboot (which it explicitly routes reboots to) without opening any schema.

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

Usage Guidelines4/5

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

Names the alternative for the excluded behavior ('reboots stay manual (host_reboot)') and gives an explicit applicability boundary ('apt-based hosts only'), which tells the agent when this tool is valid. It stops short of stating when to prefer this over apt_upgrade or tuning_apply, so it is strong context without full when/when-not coverage.

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. 63 tool updatesv0.1.0
    • First observedapt_upgrade
    • First observedbeszel_system_edit
    • First observedbeszel_systems
    • First observedblacklist_update
    • First observedcert_renew
    • First observedcron_logging
    • First observeddisk_cleanup
    • First observeddns_change
    • First observeddns_records
    • First observedfail2ban_unban
    • First observedfleet_audit
    • First observedfleet_changes
    • First observedfleet_discover
    • First observedfleet_host_edit
    • First observedfleet_hosts
    • First observedfleet_schedule
    • First observedfleet_snapshot
    • First observedfleet_status
    • First observedgeo_update
    • First observedgitea_runner_register
    • First observedgitea_runner_remove
    • First observedgitea_runners
    • First observedhost_connections
    • First observedhost_copy
    • First observedhost_docker
    • First observedhost_exec
    • First observedhost_file_edit
    • First observedhost_file_read
    • First observedhost_firewall
    • First observedhost_inspect
    • First observedhost_logs
    • First observedhost_net_check
    • First observedhost_ports
    • First observedhost_reboot
    • First observedhost_services_discover
    • First observedjellyfin_library_add_path
    • First observedjellyfin_library_create
    • First observedjellyfin_scan
    • First observedjellyfin_status
    • First observedjellyfin_task_run
    • First observedjob_status
    • First observedjournal_list
    • First observednode_bootstrap
    • First observedremnanode_update
    • First observedrepo_script
    • First observedru_probe
    • First observedscenario_list
    • First observedscenario_start
    • First observedscenario_step
    • First observedschedule_toggle
    • First observedservice_action
    • First observedsnapshots_list
    • First observedtailnet_device_remove
    • First observedtailnet_devices
    • First observedtailnet_join
    • First observedtdarr_library_add
    • First observedtdarr_pause
    • First observedtdarr_scan
    • First observedtdarr_status
    • First observedtuning_apply
    • First observedtuning_status
    • First observedufw_rule
    • First observedupdates_policy

TDQS

B3.4/5.0

Scored across 63 tools

Disambiguation4/5

Tools are organized by clear domain prefixes (fleet_, host_, jellyfin_, tdarr_, dns_, gitea_, tailnet_, scenario_) and each names a distinct resource+action. A few boundaries blur where a fleet-wide tool overlaps host-level ones (fleet_status vs fleet_audit vs host_inspect; fleet_changes vs fleet_snapshot vs snapshots_list; host_firewall vs host_ports), but descriptions clarify the split.

Naming Consistency4/5

Uniform snake_case with predictable domain prefixes throughout. Minor deviations exist in verb placement (gitea_runner_remove/gitea_runner_register vs gitea_runners; jellyfin_library_add_path vs jellyfin_library_create), but the convention remains readable and largely consistent.

Tool Count2/5

63 tools is far beyond the 25+ heavy threshold, and the surface spans many unrelated subsystems (fleet ops, Jellyfin, Tdarr, DNS, Gitea, Tailscale, runbooks). Even with broad legitimate scope, the sheer count risks overwhelming an agent and makes selection costly.

Completeness5/5

Near-exhaustive lifecycle coverage: reads, writes, edits, dry-run/plan modalitities, backups, verification, and orchestration runbooks. CRUD plus ops (reboot, service actions, cert renewal, disk cleanup, snapshots, journal) is present across every domain, with no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Your sysadmin co-pilot — an AI that administers Linux through typed, approval-gated, Ed25519-audited actions instead of shell strings. Reference implementation of the LACS standard.
    5
    16
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to manage an entire fleet of servers over SSH through MCP, fanning a single intent out across many hosts with target expressions while enforcing a policy engine, approval gates, and tamper-evident audit logs. Supports rolling execution with circuit breakers, cross-host diffing, bulk file transfer, tmux sessions, and YAML workflows.
    6 npm
    14
    AGPL 3.0
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to inspect and manage remote hosts over SSH with tiered blast-radius containment that classifies and blocks destructive commands, plus forensic post-flight assertions that verify ports, processes, files, and HTTP health. It also provides long-running background task envelopes and atomic SFTP file editing with automatic backups, unified diffs, and one-click rollback.
    12
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables an OAuth-capable AI assistant to manage a self-hosted Linux server, starting with host-health and probe snapshots and optionally expanding to shell commands, bounded text-file reads/writes/moves, and asynchronous jobs through an owner-authenticated local broker. Configuration and credentials stay private on your own machine, with no hosted service or model API keys required.
    MIT