Claude Code ↔ OpenClaw bridge: user interaction via Telegram/Signal/Discord when running headless
cc-openclaw-bridge provides two user-interaction tools with reasonably clear naming and comprehensive input schemas. Both tools are explicitly registered with Zod schemas and descriptions. However, schema documentation is embedded in Zod validation rather than exposed in a machine-readable output schema format. Parameter descriptions are present and specific (e.g., 'Option text, 1-5 words', 'Clear question ending with ?'), meeting baseline standards. Tool descriptions are action-oriented and explain the use case. Weaknesses: (1) No documented output schemas, responses are wrapped in generic 'content' structures without field-level documentation; (2) No error handling guidance, tools lack recovery paths or error categorization; (3) Missing idempotency and destructiveness hints in tool definitions; (4) Context parameter is optional everywhere, reducing explicitness about state threading. Tools are well-composed (each does one thing), and naming follows verb_noun convention ('ask_user', 'notify_user'). Schema completeness is strong, all critical parameters have types and descriptions, but the lack of structured output documentation and error patterns prevents a higher score.
Ask the user 1-4 questions and wait for replies. Delivered via OpenClaw to their messaging app. Each question can have a header (short tag), options with descriptions, and multiSelect. Omit options for free-text. The user always has an implicit "Other" option.
Send a notification to the user without waiting for a reply.
No documented output schemas. Tools return generic { content: [{ type: 'text', text: ... }] } responses without field-level documentation. LLMs cannot infer the structure of formatResult() or understand downstream composition.
No error handling or recovery guidance. Tools lack descriptions of failure modes (timeout, invalid question format, user rejection, network failure). LLMs have no guidance on what to do if ask_user fails, retry? Escalate? Fallback to notify_user?
Missing tool annotations. Neither ask_user nor notify_user declares readOnlyHint, destructiveHint, or idempotentHint. ask_user is interactive (blocks for user input); notify_user is fire-and-forget. These distinctions should be explicit in tool metadata.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 59 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 62 | - | v1 |
ask_user returns a formatted text response. The structure of the response (multi-line Q&A format) is undocumented. LLMs cannot reliably parse the output to extract individual question-answer pairs. Consider returning structured { questions: [...], answers: [...] } instead of formatted text.
context parameter is optional everywhere. This weakens explicitness about what work the agent is performing. Guidance for when context is required vs. inferred from task state is missing.