Sending Requests and Consent¶
How to request user decisions — request_send, consent_request, surface rendering, blocking vs non-blocking, and handling responses
When to use¶
agent needs a decision, confirmation, or input from the user
Slash command: /wb-request
Related capabilities¶
notifications/request_sendnotifications/consent/consent_requestnotifications/request_poll
Directions¶
request_send — general-purpose¶
Call: mcp__work-buddy__wb_run("request_send", params)
Parameters: - title (required): Short subject line - body: Longer description - response_type (required): "boolean", "choice", "freeform", "range", or "custom" - choices: For choice type — list of {"key": "...", "label": "..."} dicts - number_range: For range type — {"min": 1, "max": 10, "step": 1} - timeout_seconds: Block and poll for this many seconds (max ~110). Omit for non-blocking. - surfaces: Target specific surfaces. Default: all available
Surface rendering: - Dashboard: card-styled form with appropriate inputs (buttons, textarea, etc.) - Obsidian: "Open Dashboard" toast (except consent, which uses native modals) - Telegram: inline keyboard buttons or text prompts
Requests get a 4-digit short ID (e.g., #4920) for Telegram /reply
consent_request — consent-specific¶
Use when you need consent for a protected operation.
mcp__work-buddy__wb_run("consent_request", {
"operation": "task.archive",
"reason": "Move completed tasks to archive",
"risk": "low",
"timeout_seconds": 90
})
Returns {status: "granted", mode: "once"} or {status: "denied"} or {status: "timeout"}.
Handling responses¶
Blocking (with timeout_seconds): Call blocks until user responds or timeout. Response is in result.poll.value.
Non-blocking (no timeout_seconds): Returns immediately with notification_id. Poll later:
mcp__work-buddy__wb_run("request_poll", {"notification_id": "req_XXXXXXXX", "timeout_seconds": 60})
After timeout: Request stays pending. User can still respond on any surface. Use request_poll to check, or consent_request_resolve for consent.
Examples¶
Yes/No:
mcp__work-buddy__wb_run("request_send", {
"title": "Archive completed tasks?",
"body": "10 done tasks found.",
"response_type": "boolean",
"timeout_seconds": 90
})
Multiple choice:
mcp__work-buddy__wb_run("request_send", {
"title": "Reschedule weekly review?",
"response_type": "choice",
"choices": [
{"key": "today", "label": "Yes, today"},
{"key": "tomorrow", "label": "Tomorrow"},
{"key": "skip", "label": "Skip this week"}
],
"timeout_seconds": 90
})
Freeform text:
mcp__work-buddy__wb_run("request_send", {
"title": "What should we focus on today?",
"body": "No contracts active.",
"response_type": "freeform",
"timeout_seconds": 90
})