Agent skill
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 this agent skill to your Project
npx add-skill https://github.com/lambdamechanic/skills/tree/main/dumbwaiter-mcp
SKILL.md
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:
export GITHUB_TOKEN=…(repo read permissions are sufficient for commit statuses). - Persistence (optional):
DUMBWAITER_DBto override./state/dumbwaiter.sqlite. - Await settings (optional):
DUMBWAITER_AWAIT_TTL_SECS(default 900),DUMBWAITER_ENGINE=1to enable the background engine (legacy aliasDUMBWAITER_WATCHER=1still works).
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
wait_id, cancellable and recoverable after restarts. - You want progress updates visible to the host via MCP
notify_progress.
Tools overview
wait.start→ returns{ wait_id }for a condition on a selectorwait.status→ returns current state:pending|satisfied|failed|timeout|cancelled|unknownwait.cancel→ cancels a pending waitwait.await→ polls provider with exponential backoff; emits progress notifications; resolves to terminal state or timeout
Selectors and conditions (GitHub)
- selector:
{ "owner": "ORG", "repo": "REPO", "pr": 123 } - Supported
conditiontokens:checks_succeeded— combined status successchecks_failed— combined status failure/errorpr_merged— merged flag truepr_approved— at least one approved reviewchanges_requested— an open review with changes requestedworkflow_completed— at least one completed workflow runcomment_received— any new PR comment/review/reaction event (see streaming section below)
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
wait.statusorwait.cancel
Guidelines
- Prefer
wait.awaitwhen a host can display progress; otherwise poll withwait.statuson an interval < backoff cap (default 30s). - Always report final state back to the orchestrator and link the
wait_idin logs/notes. - On auth errors or rate limits, surface a clear, actionable message; do not retry aggressively (respect backoff).
- On timeouts, return
timeoutwith elapsed seconds; let the caller decide next steps. - 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
unknownstatus: thewait_idwas not found (DB purge or wrong project).- No progress events: confirm host supports MCP notifications and server is connected.
- Auth failures: ensure
GITHUB_TOKENis set and valid for the target repo.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
lambda-workflow
One lifecycle for Lambda repos: choose a bd task, start work, land the PR, and watch GitHub via Dumbwaiter MCP until it merges.
testing-patterns
Testing patterns and standards for this codebase, including async effects, fakes vs mocks, and property-based testing.
rust-guidelines
Pragmatic Rust conventions to keep code readable, testable, and performant for this project.
galahad
how to approach tests, types and coverage
template-skill
Replace with description of the skill and when Claude should use it.
pr-watch
Use the local pr-watch CLI/daemon to watch GitHub pull request activity, wait for PR changes, and fetch normalized event deltas without manually managing webhook forwarding or event subscriptions.
Didn't find tool you were looking for?