Claude-skill-registry dumbwaiter-mcp
Provider-agnostic wait-for-change skill that uses the Dumbwaiter MCP server to wait on PR events (GitHub first) via wait.start/status/cancel/await, with progress notifications and durable state.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/dumbwaiter-mcp" ~/.claude/skills/majiayu000-claude-skill-registry-dumbwaiter-mcp && rm -rf "$T"
manifest:
skills/data/dumbwaiter-mcp/SKILL.mdsource content
Dumbwaiter MCP: Wait-for-Change
Goal: give Claude a single, stable way to “wait until X happens” on a code host (GitHub now; GitLab next). This skill teaches Claude when and how to use the Dumbwaiter MCP server’s tools.
Prerequisites
- Server: this repo builds a stdio MCP server (
).cargo build && target/debug/dumbwaiter-mcp - Auth:
(repo read permissions are sufficient for commit statuses).export GITHUB_TOKEN=… - Persistence (optional):
to overrideDUMBWAITER_DB
../state/dumbwaiter.sqlite - Await settings (optional):
(default 900),DUMBWAITER_AWAIT_TTL_SECS
to enable background polling.DUMBWAITER_WATCHER=1
When to use this skill
- You need to pause orchestration until PR checks turn green, a PR is merged, or checks fail.
- You want durable waits with a
, cancellable and recoverable after restarts.wait_id - You want progress updates visible to the host via MCP
.notify_progress
Tools overview
→ returnswait.start
for a condition on a selector{ wait_id }
→ returns current state:wait.statuspending|satisfied|failed|timeout|cancelled|unknown
→ cancels a pending waitwait.cancel
→ polls provider with exponential backoff; emits progress notifications; resolves to terminal state or timeoutwait.await
Selectors and conditions (GitHub)
- selector:
{ "owner": "ORG", "repo": "REPO", "pr": 123 } - Supported
tokens:condition
— combined status successchecks_succeeded
— combined status failure/errorchecks_failed
— merged flag truepr_merged
— at least one approved reviewpr_approved
— an open review with changes requestedchanges_requested
— at least one completed workflow runworkflow_completed
— any new PR comment/review/reaction event (see streaming section below)comment_received
For
comment_received, optional filters refine which events count. If omitted, since defaults to the wait's created_at timestamp so Dumbwaiter streams everything posted after the wait was created.
Happy-path flow
- Start wait
- name:
wait.start - arguments:
{ "provider": "github", "selector": {…}, "condition": "checks_succeeded" } - capture
wait_id
- name:
- Await
- name:
wait.await - arguments:
{ "wait_id": "…" } - Observe progress notifications; handle final result
- name:
- Query or cancel as needed
orwait.statuswait.cancel
Guidelines
- Prefer
when a host can display progress; otherwise poll withwait.await
on an interval < backoff cap (default 30s).wait.status - Always report final state back to the orchestrator and link the
in logs/notes.wait_id - On auth errors or rate limits, surface a clear, actionable message; do not retry aggressively (respect backoff).
- On timeouts, return
with elapsed seconds; let the caller decide next steps.timeout - Security: never echo tokens; require least scopes.
Streaming GitHub comment events
Set
condition to comment_received plus optional filters:
{ "provider": "github", "selector": { "owner": "acme", "repo": "widgets", "pr": 42 }, "condition": "comment_received", "filters": { "since": "2025-01-01T00:00:00Z", "include_bots": true, "author_allowlist": ["alice"], "author_denylist": ["bot"] } }
wait.await emits notify_progress for every matching comment/review/reaction (body + URL + reaction counts + code context) before returning the terminal payload that mirrors the streamed events. Use this when an orchestrator needs to react to each individual discussion event.
Examples
- “Wait for PR 42 in acme/widgets until checks pass.”
- start →
{ provider: "github", selector: { owner: "acme", repo: "widgets", pr: 42 }, condition: "checks_succeeded" } - await →
{ wait_id }
- start →
- “Stream every new comment on PR 42 since midnight UTC.”
- start →
{ provider: "github", selector: { owner: "acme", repo: "widgets", pr: 42 }, condition: "comment_received", filters: { since: "2025-01-01T00:00:00Z", include_bots: true } } - await → receives per-comment progress events plus the final summary payload
- start →
Troubleshooting
status: theunknown
was not found (DB purge or wrong project).wait_id- No progress events: confirm host supports MCP notifications and server is connected.
- Auth failures: ensure
is set and valid for the target repo.GITHUB_TOKEN