Read-only remote diagnostics over SSH, exposed as an MCP server
SafeReach defines 7 tools with clear, action-oriented names (run, run_many, status, list_hosts, explain, audit, spec). All tools have descriptions and input schemas with typed parameters. However, descriptions are terse (avg ~40 chars, well below the 194-char baseline), parameter descriptions lack detail on constraints and formats, and output schemas are inferred from Pydantic models rather than explicitly documented in tool definitions. Error handling is present but generic. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being read-only. Security posture is strong (SSH-based, no secrets in params), but composition could be tighter, run and run_many overlap in intent.
Query the audit log
Explain why a command would be rejected
List all configured hosts and their allowed commands
Execute a single command on a host
Execute a command on multiple hosts in parallel
Get the command specification and fingerprint
Check the status of one or more hosts
Tool descriptions are terse (30 - 40 chars vs 194-char baseline). Descriptions like 'Check the status of one or more hosts' lack context on when to call this tool vs others, what it returns, and prerequisites.
Parameter descriptions lack constraint details. 'host' and 'hosts' parameters do not specify format, valid values, or how to discover available hosts. 'limit' in audit has no min/max bounds. LLMs cannot validate inputs without explicit constraints.
No tool annotations despite all tools being read-only. Adding readOnlyHint=true to all 7 tools would signal to agents that these are safe to call without side effects, enabling more aggressive caching and retry strategies.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | <=2025-11-25 | v2 |
Output schemas are implicit (derived from Pydantic models). Tool definitions do not explicitly document what fields CommandResult, HostResult, HostStatus contain, forcing LLMs to infer structure. Explicit schema documentation in tool registration would improve clarity.
run and run_many have overlapping intent (execute command on host(s)). Composition could be tighter, consider a single 'run' tool accepting hosts as an array (empty = all, single item = one host) to reduce cognitive load on LLM tool selection.