Skip to content

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

  • notifications/request_send
  • notifications/consent/consent_request
  • notifications/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 .

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 })