MCP server for Proxmox Backup Server (datastore, snapshot, GC, verify, prune)
pbs-mcp demonstrates solid tool design with 17 well-named, action-verb tools (pbs_list_*, pbs_run_*, pbs_get_*). All tools have descriptions (avg ~150 chars, within 10-1024 baseline). Input schemas are complete with types, descriptions, and constraints (enums, patterns, min/max). Output schemas are not explicitly documented in the source, which is a notable gap. Error handling is present but minimal, no recovery guidance or actionable error messages visible. Security is well-handled: write operations require PBS_ALLOW_WRITE=true and confirm=true flags, preventing accidental destructive calls. Tool composition is excellent, each tool has one clear responsibility, and chaining is supported (e.g., pbs_list_snapshots returns timestamps that pbs_protect_snapshot accepts). Naming is consistent and clear (verb_noun pattern throughout). Parameter descriptions include format hints (e.g., 'PBS ISO format, e.g. 2026-05-25T10:54:07Z') and constraints (maxLength, pattern, min/max). One minor issue: some parameters like 'datastore' accept None with a fallback to PBS_DEFAULT_DATASTORE, which is good UX but not explicitly documented in all tool descriptions.
Total / used / available bytes for one datastore.
Delete one snapshot (and its chunks, after the next GC). Protected snapshots cannot be forgotten until unprotected. Requires PBS_ALLOW_WRITE=true and confirm=true.
Return the last garbage-collection statistics: bytes referenced, pending, removed, plus any flagged-bad chunks.
Fetch log lines from a PBS task. Supports pagination via start/limit, or tail=true for just the end of the log — usually all you need to see how a verify or GC finished.
Return current state of a PBS task (running / stopped) plus exit status if finished.
One-call health report for a datastore: storage usage, node load, last GC result, snapshot/verify coverage, backup freshness, corrupt groups, and failed/running tasks. Start here for any 'is PBS okay?' question — it replaces separate status/gc/tasks/groups calls.
Output schemas not documented in source code. Tool descriptions state what is returned (e.g., 'Return current state of a PBS task') but no explicit JSON Schema for response objects is visible. LLMs cannot plan downstream tool calls without knowing response field names and types.
Error handling lacks recovery guidance. Tools enforce confirm=true and PBS_ALLOW_WRITE checks, but error responses are not shown in source. No evidence of actionable error messages (e.g., 'User not found. Try search_users() first') or error classification (retryable vs fatal).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
List every configured PBS datastore with its path and any scheduled GC/prune jobs.
List every backup group on a datastore with its snapshot count, last-backup time, owner, and file count. Groups with zero files are flagged as likely corrupt.
List snapshots on a datastore with size, file count, protected flag, and last verify state — newest first, capped at `limit`. Set summary=true for one aggregate row per group instead (preferred for overviews).
Browse recent PBS tasks with optional type filter, running-only flag, and errors-only flag. Running or failed tasks come with their full UPID for follow-up via pbs_get_task_status / pbs_get_task_log.
List all configured verify jobs on a datastore with their schedule and last-run status.
Set or clear the protected flag on one snapshot. Protected snapshots are skipped by prune and cannot be forgotten until unprotected. Requires PBS_ALLOW_WRITE=true and confirm=true.
Apply a retention policy and drop matching snapshots. The on-disk chunks aren't freed until the next garbage collection. Always run pbs_prune_dry_run first. Requires PBS_ALLOW_WRITE=true and confirm=true.
Preview which snapshots in a backup group would be kept or dropped by a given retention policy.
Trigger a garbage-collection run. GC walks every chunk and frees those no longer referenced by any snapshot. Async — returns a UPID immediately. Requires PBS_ALLOW_WRITE=true and confirm=true.
Trigger a verification run on a datastore or specific backup group. Verify walks every snapshot and checks that all chunks are present and uncorrupted. Async — returns a UPID immediately. Requires PBS_ALLOW_WRITE=true and confirm=true.
Abort a running PBS task (e.g. a GC or verify stuck on a slow NFS datastore). The task stops at the next safe point; an interrupted GC or verify can simply be re-run later. Requires PBS_ALLOW_WRITE=true and confirm=true.
Pagination not visible for list tools. pbs_list_snapshots accepts 'limit' (default 50, max 1000) but no 'offset', 'cursor', or 'total_count' is documented. Large datastores may exceed the limit; agents need pagination to iterate safely.
Optional 'datastore' parameter behavior not consistently documented. Tools accept datastore=None and fall back to PBS_DEFAULT_DATASTORE, but descriptions say 'Omit to use PBS_DEFAULT_DATASTORE', unclear whether omitting means passing null, empty string, or not including the param at all.
No tool annotations visible in source. fastmcp supports readOnlyHint, destructiveHint, and idempotentHint decorators (per MCP 2026-07-28 spec), but none are shown. Tools like pbs_forget_snapshot and pbs_run_gc should be marked destructive to guide agent behavior.