Safe, read-only system diagnostics for AI assistants: CPU, memory, disk, processes, network, ports, and logs.
SysOps Diagnostics demonstrates solid definition quality with all 8 tools properly named with action verbs (get_*, tail_*), comprehensive parameter schemas using Pydantic Field annotations with type constraints, and detailed descriptions. All tools are read-only diagnostics with clear purposes. However, output schemas are documented only in docstrings (not machine-parseable), error handling lacks recovery guidance, and some parameter descriptions could be more explicit about constraints and formats. Tool annotations are present (readOnlyHint, idempotentHint, destructiveHint), which is excellent. The server follows good naming conventions and provides reasonable defaults.
Get CPU utilization, core counts, and load averages. Samples CPU for `sample_seconds` and reports utilization percentage, physical/logical core counts, 1/5/15-minute load averages, and load-per-core (values >= 1.0 indicate saturation). Returns: str: Markdown summary or JSON object with keys: percent, sample_seconds, physical_cores, logical_cores, load_avg {1min,5min,15min}, load_per_core_1min, per_core_percent (optional).
Get disk usage per partition, flagging any above a warning threshold. Read-only mounts are listed but never flagged, since space cannot be reclaimed on them (Linux snap squashfs mounts sit at 100% by design).
Get a high-level summary of host health: CPU, memory, disk, and swap status with warnings.
List all listening TCP/UDP ports and the processes bound to them.
Get RAM and swap utilization. Returns: str: Markdown summary or JSON object with keys: virtual {total_gb,used_gb,available_gb,percent} and swap {total_gb,used_gb,percent}.
Output schemas documented only in docstrings, not in machine-parseable format. LLMs cannot reliably extract expected response structure from prose descriptions.
Error handling lacks recovery guidance. Tools return raw errors without suggesting next steps (e.g., 'path not found, try get_disk_usage() to list available partitions').
Parameter descriptions for get_processes (filter_name, sort_by) and get_network_stats lack detail on expected formats and behavior. E.g., is filter_name case-sensitive? Does sort_by affect output order deterministically?
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Get network interface statistics (bytes sent/received, packets, errors, dropped).
List running processes, optionally filtered by name or sorted by resource usage.
Tail the last N lines of a log file (restricted to /var/log for safety).
tail_log enforces /var/log restriction but error message for path traversal attempts is not visible in source. LLM may not understand why a valid-looking path is rejected.
No pagination support for tools that could return large result sets (get_processes, get_network_stats). Unbounded results risk context window exhaustion.