2 days ago
62(and growing) read-only diagnostic tools that let Claude inspect your Linux fleet without touching it. Files, systemd, performance, networking, processes, disks, kernel, packages,
Docker — each a hardened wrapper around a command you already trust, run over your own SSH config.
Read-only by construction: there is no code path that restarts a service, edits a file, installs a package, or runs anything that mutates state. Every argument is
validated and shell-quoted, flag injection is killed by per-tool whitelists, and hosts can be pinned to an allowlist. Point it at production and sleep.
Run any tool on one host, or pass a list to fan out in parallel — bounded, with a hard 25-host ceiling so a curious model can't trigger an SSH storm.
Why
- Can't break anything — no mutate path exists. No restart, no edit, no install, no -exec.
- Injection-hardened — shlex.quote everywhere, flag whitelists, NUL/newline rejection, host allowlist.
- Your SSH, your rules — uses your ssh/agent or any wrapper (tsh ssh, jump hosts). Server never sees a credential.
- Bounded — byte-capped output, per-call timeouts, capped multi-host fan-out.
- Auditable — structured {stdout, stderr, exit_code, truncated} + optional JSONL logs with per-call IDs.
Setup
Python via uv.
One mcpServers entry, tuned by env vars. Works with Claude Desktop and Claude Code.
Server Config
{
"mcpServers": {
"linux-info": {
"command": "uv",
"args": [
"run",
"--directory",
"/Users/ronenangluster/repos/linux-info-mcp",
"linux-info-mcp"
],
"env": {
"LINUX_INFO_SSH_CMD": "ssh",
"LINUX_INFO_HOSTS": "",
"LINUX_INFO_TIMEOUT": "30",
"LINUX_INFO_MAX_BYTES": "1048576",
"LINUX_INFO_MAX_HOSTS": "10",
"LINUX_INFO_PARALLELISM": "4",
"LINUX_INFO_LOG_FILE": "",
"LINUX_INFO_LOG_LEVEL": "INFO"
}
}
}
}