redeploy_project, create_project and pull_image used to block the tool
call while polling DSM until the project reached RUNNING / the image
appeared - up to 300s and 240s respectively. On large images this
regularly ran past Claude Desktop's ~4 min tool-call ceiling (the live
MCP log shows redeploy_project calls up to 260s), which the client
reported as a timeout even though the server kept working. Whether a
call crossed the ceiling depended on image size and NAS load, which is
why the failure was intermittent.
These tools now fire-and-return: they trigger the operation, consume
build_stream only for a short early-error window (20s, to catch fast
daemon errors like "manifest unknown"), then return a "running in the
background - check get_project_status / check_image_updates" hint.
Completion is observed via the existing fast status tools.
- DsmClient.trigger_build_stream gains a `budget` parameter
- remove _wait_for_project_running and the _POLL_*/_BUILD_POLL_TIMEOUT
constants (projects.py) and _PULL_POLL_* constants (registry.py)
- update tests, CLAUDE.md DSM quirks and CHANGELOG; bump 0.7.0 -> 0.8.0
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The 0.5.0 prompt mis-attributed the API: pull_start lives on
SYNO.Docker.Image, not SYNO.Docker.Registry (live DSM capture).
search and tags ARE correctly on Registry; only pull_start belongs
to Image. Registry/pull_start returns "Method does not exist".
Parameters are unchanged (repository + tag both JSON-encoded), and
the Image/list polling for completion detection is untouched.
Tests updated to assert SYNO.Docker.Image/pull_start. CLAUDE.md
DSM-quirks section consolidates the Image vs. Registry split so
this trap is documented for future surface additions. References
#3 (already closed).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Three new SYNO.Docker.Registry tools, reverse-engineered from a live
DSM API capture (n4s4 reference disagrees on param names and methods).
- search_registry (#5): SYNO.Docker.Registry/search v1 with JSON-encoded
q, plus offset/limit/page_size. Renders stars, downloads, official
flag, truncated description, and total match count. Read-only.
- list_image_tags: SYNO.Docker.Registry/tags v1 with JSON-encoded repo
(not name — DSM live capture diverges from n4s4). Response shape is
unusual: tag list comes back as the envelope's data field directly.
Output capped by limit (default 50); accepts both list and dict
response shapes defensively. Read-only.
- pull_image (#3): SYNO.Docker.Registry/pull_start v1 with both
repository and tag JSON-encoded. Async pull — no pull_status method
confirmed on this DSM, so completion is detected by polling
SYNO.Docker.Image/list (2–10 s backoff, 240 s budget under the
Claude Desktop ~4 min tool-call ceiling). Timeout returns a
non-fatal "still running" hint. Short-circuits when the image is
already present locally. Confirmation gate required.
Tool count: 31 → 34. CLAUDE.md confirmation list updated. New DSM
quirks documented for pull_start (no pull_status) and tags (repo
param name, top-level data array).
Closes#3Closes#5
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>