npm run api:validate reports 32 endpoints without an MCP tool. 30 of them are the entire /api/backup/* family — not a 1.0.42 regression, it has never been covered.
Of the remaining two, neither is a real gap:
So the backup family is the only outstanding coverage gap in the server.
What is uncovered
| Area |
Endpoints |
| Destinations |
GET/POST /destinations, GET/PUT/DELETE /destinations/{id}, POST /destinations/test, /destinations/{id}/test, /{id}/init, /{id}/rotate-key, /{id}/verify, /{id}/task |
| Configs |
GET/POST /configs, GET/PUT/DELETE /configs/{id}, POST /configs/{id}/run, /configs/{id}/stop |
| Snapshots |
GET /snapshots, DELETE /snapshots/{id}, GET /snapshots/diff, /{id}/browse, /{id}/dump, /{id}/metadata |
| Restore |
POST /restore, /restore/preview, /restore/stop |
| Misc |
GET /instance, GET /stack-dir-listing, GET /stack-path |
Worth thinking about before implementing
Credentials. Destinations almost certainly carry storage credentials (S3 keys, repository passwords) in their config, and rotate-key is explicitly about key material. The same asymmetry as the secret providers likely applies: responses redacted, requests not. The TOOL_DESCRIPTION_SUFFIXES mechanism added in #201 is the place for that, but each endpoint needs checking against its handler first — not assumed.
Destructive surface. POST /restore overwrites live data, and DELETE /snapshots/{id} is irreversible. These deserve more care than a mechanical port of the endpoint list.
Streaming/binary. /snapshots/{id}/dump and /snapshots/{id}/browse return archive content; same payload considerations as images/load. They may be better left out than half-supported.
Scope. 30 endpoints is too much for one PR. A sensible cut is read-only first (list/get destinations, configs, snapshots, instance) — immediately useful for "what backups exist, when did they last run" without touching a single destructive or credential-carrying path. Write and restore operations can follow once the read side has proven the shapes.
Refs #196.
npm run api:validatereports 32 endpoints without an MCP tool. 30 of them are the entire/api/backup/*family — not a 1.0.42 regression, it has never been covered.Of the remaining two, neither is a real gap:
POST /api/images/load— deliberately skipped, see Data loss: update_stack_env wipes all .env variables because the raw GET returns an object, not a string #196 and OpenAPI: no requestBody generated for the two non-JSON request bodies (images/load, containers/{id}/files/upload) Finsys/dockhand#1421: the body is the raw image tar, which is not a workable base64 tool argument.POST /api/git/stacks/{id}/webhook— the inbound receiver GitHub/GitLab calls with a signature. Not something an agent should invoke;get_git_stack_webhook(GET) is the useful half and exists.So the backup family is the only outstanding coverage gap in the server.
What is uncovered
GET/POST /destinations,GET/PUT/DELETE /destinations/{id},POST /destinations/test,/destinations/{id}/test,/{id}/init,/{id}/rotate-key,/{id}/verify,/{id}/taskGET/POST /configs,GET/PUT/DELETE /configs/{id},POST /configs/{id}/run,/configs/{id}/stopGET /snapshots,DELETE /snapshots/{id},GET /snapshots/diff,/{id}/browse,/{id}/dump,/{id}/metadataPOST /restore,/restore/preview,/restore/stopGET /instance,GET /stack-dir-listing,GET /stack-pathWorth thinking about before implementing
Credentials. Destinations almost certainly carry storage credentials (S3 keys, repository passwords) in their config, and
rotate-keyis explicitly about key material. The same asymmetry as the secret providers likely applies: responses redacted, requests not. TheTOOL_DESCRIPTION_SUFFIXESmechanism added in #201 is the place for that, but each endpoint needs checking against its handler first — not assumed.Destructive surface.
POST /restoreoverwrites live data, andDELETE /snapshots/{id}is irreversible. These deserve more care than a mechanical port of the endpoint list.Streaming/binary.
/snapshots/{id}/dumpand/snapshots/{id}/browsereturn archive content; same payload considerations asimages/load. They may be better left out than half-supported.Scope. 30 endpoints is too much for one PR. A sensible cut is read-only first (list/get destinations, configs, snapshots, instance) — immediately useful for "what backups exist, when did they last run" without touching a single destructive or credential-carrying path. Write and restore operations can follow once the read side has proven the shapes.
Refs #196.