voicehook
Server Details
Talk with your agents. A voice call in the browser that your agent can start or join.
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- voicehook-ai/voicehook-agent
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 23 tools
The set is organized around a clear main-agent surface and a parallel helper_* surface, and descriptions repeatedly anchor each tool (e.g. 'for a helper session that is not in the call'). The main overlap is call_me vs notify_me, which the description resolves by explicitly saying to prefer notify_me, and the helper/main twins could still be mis-picked by an agent unsure of its role.
All names are snake_case, which is good, but the conventions are mixed: bare verbs (say, show, decide, join, leave, next), bare nouns (activity, status, decisions, task, tasks, ui), and prefixed forms (helper_*, add_vocab, call_me, notify_me, send_data). The task/tasks singular-plural pair in particular reads ambiguously, and there is no predictable verb_noun pattern.
At 23 tools the surface is on the heavy side, and a meaningful share of it is duplicated structure (activity/helper_activity, decide/helper_decide, show/helper_show, status/helper_status, next/helper_next). Each tool does earn a place, but the helper split inflates the count into the borderline-heavy band.
The lifecycle is well covered: create/join/leave, speak, listen via next, cards, decisions, status, activity, inter-agent data, vocabulary, task board, UI control, and human outreach. The main known gaps are deliberate (task move/rename/assign only via the CLI, no transcript retrieval tool), which agents can live without but limit some workflows.
Available Tools
23 toolsactivityAdd an activity lineAInspect
Append one line (3-8 words) to the activity feed on the call page, shown as a timestamped line. Never spoken. context and faq: hidden background of this line for the voicebot.
| Name | Required | Description | Default |
|---|---|---|---|
| faq | No | Up to 3 likely follow-up questions with prepared answers [{q, a}] (max 200 chars each), hidden, for the voicebot. | |
| goal | No | Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting). | |
| text | Yes | 3-8 words. | |
| context | No | Hidden background of this entry for the voicebot (what, why, current state), max 2000 chars, never shown on the page. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover mutability and open-world behavior, and the description adds genuinely new context: the line is appended, timestamped, visible on the call page, and never spoken, while context/faq remain hidden from the page. It does not mention that repeated calls create duplicate lines (consistent with idempotentHint=false) or the permission/session prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and the visible result, followed by the key behavioral constraint and the hidden-field note. No filler; the fragment 'Never spoken.' earns its place as the main routing signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All five parameters are documented in-schema, an output schema exists, and annotations cover the safety profile, so the description only needs to add the visible/hidden distinction, which it does. The remaining gap is the session prerequisite ('the `session` value returned by join') being left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only re-frames `context` and `faq` as 'hidden background of this line for the voicebot', which is essentially what the schema already documents; no extra syntax, format, or selection guidance is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Append one line ... to the activity feed on the call page') plus a hard length constraint (3-8 words). It implicitly separates itself from the speaking siblings via 'Never spoken', but never names `say` or `helper_activity`, so the differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Never spoken' and 'shown as a timestamped line' phrasing implies this is for silent page log entries rather than spoken output, which does route the agent away from `say`. However there is no explicit when-to-use/when-not statement, no mention that a session from `join` must exist, and no guidance on choosing this over `helper_activity`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_vocabAdd vocabulary for speech recognitionAIdempotentInspect
Teach the call's speech recognition words it keeps mishearing (product names, people, jargon). Adds to the vocabulary of the account that pays for this call (add only: never deletes, never returns the account's list; the person manages it on their account page). terms: words to recognize; fixes: {wrong, right} = a known mishearing and the correct word (right is added to the terms too). Max 20 entries per call of this tool, 100 per call, 50 characters each. Corrections apply right away, the word list from the next sentence or the next call. 409: guest call without an account. Returns added {terms, fixes}, total, call_left, reloaded.
| Name | Required | Description | Default |
|---|---|---|---|
| fixes | No | Known mishearings: [{"wrong": "Erzähli", "right": "Trello"}]. | |
| terms | No | Words or short phrases to recognize, e.g. ["Trello"]. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description discloses behavior richly: additive-only semantics, account scoping to the paying account, hard limits (20 entries per invocation, 100 per call, 50 chars), immediate-effect timing, and the 409 guest-call failure mode. It even enumerates the return payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, followed by constraints, timing, error behavior, and return shape — each sentence carries information. It is dense and slightly run-on, and restating return fields is mildly redundant given the output schema, but there is little true filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, the description covers everything an agent needs: limits, timing of effect, account scope, failure mode (409 for guest calls), and the return structure. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: `fixes` is a {wrong, right} mishearing/correction pair and, importantly, `right` is also appended to terms. That side-effect is not derivable from the schema and would change how an agent constructs input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb+resource: 'Teach the call's speech recognition words it keeps mishearing', immediately clarified with examples (product names, people, jargon). No sibling tool overlaps this function, so an agent can select it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear (correct recurring mishearing errors during a call) and scope is spelled out: add-only, never deletes, and the list is not returned here but managed on the account page. No explicit alternative tool is named, but none exists among the siblings, so the omission is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_mePhone the humanAInspect
Phone the human who owns this call on their own confirmed phone number, e.g. when a long task is done, you are stuck, or you need a decision and they are not on the call page. You never pass a number. Their account rules decide (opt-in, allowed reasons, quiet hours, calls per day, budget, credit); a refusal returns {status: refused, why}. Returns as soon as they pick up: {status: answered, answered: true, phone_call_id}, or {status: no_answer|busy|failed|insufficient} if nobody picked up. The call goes on in the background and is billed when it ends; what they say arrives as usual through next. reason: done | blocked | decision. message: max 200 characters, opens the call.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why you call: done, blocked or decision. | |
| message | No | Optional: what to tell them when they pick up, max 200 chars. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond annotations: explains that account rules govern opt-in, reasons, quiet hours, per-day limits and budget, that refusals return {status: refused, why}, and that the call continues in the background and is billed at end. It also distinguishes blocking-until-answer from background continuation, which is exactly the behavioral context an agent needs for an openWorld, non-idempotent action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and trigger, then return statuses. Dense but nearly every clause carries information; the return-status enumeration is slightly compressed but earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description explains the return contract (answered/no_answer/busy/failed/insufficient, refused with why) and the async billing model, so an agent knows both what it gets back and what continues afterward. Complete for a call-placing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds value by stating 'You never pass a number', enumerating reason values (done | blocked | decision), and clarifying that message (max 200 chars) 'opens the call'. It mostly echoes the schema's field docs, keeping it just below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Phone the human who owns this call on their own confirmed phone number') and clarifies the 'you never pass a number' constraint that separates it from a generic dialer. An agent can distinguish it from notify_me/say/activity without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use triggers ('when a long task is done, you are stuck, or you need a decision and they are not on the call page'). It does not explicitly name when NOT to use it or point to the closest alternative (notify_me), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_callStart a new voicehook callAInspect
Start a new voicehook.ai voice call. lang = the language of the person being called (de or en, default de). Returns human_url (the link for the person; whoever opens it starts the call, on their own free allowance or credit), share_text (a ready message with human_url and the hint that the link needs a normal browser, because an app's built-in browser blocks the microphone), operator_invite_url (the agent's own link for join), room and expires_in (seconds until an unopened link expires, 30 min); local_cli_hint only for a local client with a shell (Claude Code, Cursor, VS Code and similar). join with operator_invite_url waits for the person (up to 200 s in Claude clients, else 50 s) and returns waiting_for_human with next_action until they open human_url; it can be repeated until the link expires (410), also from a background job over the HTTPS bridge. Errors: 429 = too many new calls right now. Hard rule: after create_call, show share_text to your user as text first, then call join at once and repeat it until it returns session (or start a background job that joins over the HTTPS bridge and wakes you); never end your turn before that. Then keep calling next in a loop.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the person you are calling (default de). | de |
| mode | No | normal | |
| name | No | Optional label for your own reference (not shown in the call; your name in the call comes from join). | |
| solo | No | true or left out (default) = solo call: the voicebot speaks as each joining agent, every agent in its own voice and in first person; more agents may join (e.g. a second model next to you). false = the voicebot speaks as itself and announces the agents. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply safety hints (readOnlyHint=false, openWorldHint=true); the description adds substantial behavior beyond them: return fields, 30-minute expiry, 429 and 410 error semantics, the 200 s/50 s join wait limits, and the repeatability of join. This is unusually rich disclosure for a mutating, open-world tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the lang hint before the dense field/error/workflow block. It is long and reads as a single paragraph, but nearly every sentence carries needed operational detail, so there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a call-initiating tool with an output schema, the description still supplies the workflow contract, expiry and timeout semantics, error codes, and the share_text prerequisite. Nothing an agent needs to call this correctly and then route into join/next is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema already documents name, solo, and lang in detail. The description's mention of lang ('de or en, default de') largely restates the schema, and it adds nothing for name, solo, or mode, so it does not meaningfully exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Start a new voicehook.ai voice call') and its default behavior. It also references the follow-on sibling tools join and next, so an agent can distinguish this from join/next/say/leave without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Hard rule' section gives explicit sequencing: show share_text first, then call join immediately, repeat until `session`, and continue with next in a loop. It also names the background-job-over-HTTPS-bridge alternative, so both when-to-use and alternatives are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decideAsk the human to decideADestructiveInspect
Put a question for the person on the call's Decision Board (shown as #number with buttons; the person can also answer by voice, also freely). Meant for every question the person decides: yes/no, A/B, an approval, picking a value. A question only spoken via say leaves no button and no decision event. Without options it is a yes/no question (buttons Yes/No); options: 2 to 3, max 40 characters each, recommend = index of the recommended option. question: max 160 characters. Longer or more: 422, never cut. Returns id and number. The answer arrives later as a next event {type: decision, id, number, verdict: yes|no|option|other|unclear, option?, text? (their own answer, or for unclear the request to ask it again more simply), by (name), answered_by (who set it: owner|guest|delta_voice|helper|agent), answered_via (click|voice|api), answered_by_label (helper/agent label), answered_role?}. context: the background the person opens with the arrow next to the question on the card and Delta uses to explain it, only what the reader needs, nothing internal, one short line per part (Was / Warum / Bei Ja / Bei Nein, or What / Why / If yes / If no; lines starting with '- ' show as bullet points); faq: the 3 likely follow-up questions with prepared answers, shown below it as questions and answers. Without context and faq the card shows no arrow; without context and 3 faq the result carries warnings (no error). Change an open one with id plus new fields, remove it with id and delete true. no_question = id of a question_check event, alone: confirms that line was no question to the person. Decisions marked auto (detected automatically) are answered only by a human; changing or deleting them gives 403. card_type done = completion report instead of a question: title (whole sentence, max 160), summary (max 600), evidence [{label, url?}] (max 5, http(s) only), live (bool), ask (optional follow-up question); no question/options/recommend/context/faq (422). The server shows the single button Seen; it never counts as an open decision. Same sender and same title while unseen updates that card. When the person marks it, next gets {type: decision, card_type: done, id, number, verdict: seen, title, text? (answer to ask), by, answered_by, answered_via, answered_by_label}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Id of an open decision to change or delete. | |
| ask | No | card_type done: optional follow-up question (one sentence ending with ?), answered in a text field next to Seen. | |
| faq | No | Up to 3 likely follow-up questions with prepared answers [{q, a}] (max 200 chars each), hidden, for the voicebot. Without context and 3 faq the result carries `warnings`. | |
| goal | No | Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting). | |
| live | No | card_type done: true = it is live (marked on the card). | |
| title | No | card_type done: what is finished, one whole sentence, max 160 chars, no bare numbers. | |
| ttl_s | No | Optional: seconds until this card is hidden from the board if it is still open (or answered). Omit it and the card stays until it is answered or your session ends; never set a default. | |
| delete | No | true = remove the decision `id`. | |
| context | No | Background (max 1500 chars) the person opens with the arrow next to the question; Delta reads its first sentences aloud with the card and explains from it, so write it for the ear: an example, one key number, no lists. Only reader-relevant, one line per part: Was / Warum / Bei Ja / Bei Nein. | |
| options | No | Optional: 2 to 3 answer options, max 40 characters each; leave out for a yes/no question. | |
| session | Yes | The `session` value returned by join. | |
| summary | No | card_type done: short report, max 600 chars. | |
| evidence | No | card_type done: up to 5 proofs [{label, url?}], url only http(s). | |
| question | No | The question, max 160 chars (required when creating). | |
| card_type | No | decision (default) or done: a completion report ('work finished') with title, summary, evidence, live, ask instead of question/options; the person only marks it Seen, no decision. | |
| recommend | No | Index (0-based) of your recommended option. | |
| no_question | No | Id of a question_check event: confirms the line was no question to the person (pass it alone). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which already declare a write with destructiveHint=true), the description discloses the error paths (422 for over-long questions or invalid done fields, 403 for auto-detected decisions, `warnings` rather than an error when context/faq are thin), the card lifetime rules, and that the answer arrives asynchronously as a `next` event with a full verdict vocabulary. One nuance conflicts with the schema, however: the description says faq is 'shown below it as questions and answers' while the schema calls it 'hidden, for the voicebot'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the say-comparison are front-loaded, which is right, but the body is one dense run-on block of semicolon-joined clauses with no headings or bullets, and it spends a long stretch enumerating the full `next` event payload that structured output already covers. It is information-rich but would be markedly easier to scan if split into Create / Edit / Done / Response sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with two card modes, an async answer channel, and several documented error codes, nothing an agent needs to call it correctly is missing: limits, required-vs-optional behavior, the edit/delete path, and the reply event shape are all present. The presence of an output schema makes the verbose return-value section redundant rather than necessary, but it does not leave gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description nonetheless adds real meaning for a few fields, e.g. that omitting options yields Yes/No buttons, that context lines starting with '- ' render as bullets, and that no_question must be passed alone. Several limits (2-3 options, 40 chars, 0-based recommend, 160 chars) restate the schema rather than extend it, which caps this at 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and resource ('Put a question for the person on the call's Decision Board') and immediately names the sibling it is not: a question 'spoken via say leaves no button and no decision event.' It also distinguishes the card_type=done variant ('completion report instead of a question'), so an agent can separate three modes without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended scope explicitly ('Meant for every question the person decides: yes/no, A/B, an approval, picking a value') and gives the exclusion that matters (use say if you only want speech, because it produces no decision event). It also routes the two other modes: id plus new fields to change, id plus delete true to remove, and card_type done for finished work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decisionsList decisions and helper boardsARead-onlyIdempotentInspect
Lists every OPEN decision on the call's Decision Board, from all agents in the call and their helper sessions (relay, MCP, bridge), oldest number first. Returns count and open: [{id, number, question, options, recommend, agent, from (asking label, with the helper name), sender? (helper session), state, at (created, epoch), age_s, mine (asked by this session or one of its helpers), context? (background, also shown on the card behind the arrow)}]. Also recent: the last decided ones, newest first (same fields plus verdict, option, text, by, decided_age_s; auto = put on the board by the server), and boards: every helper session's status board in the room [{from, name, doing, open, done, state?, age_s (since its last update), meta? (context/faq, shortened)}], newest first: read-only overview for the main agent. Errors: 503 = voicebot not (yet) in the call.
| Name | Required | Description | Default |
|---|---|---|---|
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so there is little safety burden left; the description still adds real context beyond them, notably the 503 error semantics ('voicebot not (yet) in the call') and the meaning of derived fields like 'mine' (asked by this session or one of its helpers) and 'auto'. It does not mention pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded in the first clauses, which is good, but the bulk of the text is a long enumeration of returned fields (id, number, question, options, recommend, agent, from, sender, state, at, age_s, mine, context, verdict, option, text, by, decided_age_s) that largely restates the output schema. Much of that verbosity does not earn its place given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the return-shape prose is not strictly needed, and the remaining essentials — scope, ordering across the three result groups, and the 503 failure mode — are all present. Coverage is solid; only explicit usage routing against siblings is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already explains that session is 'the `session` value returned by join'. The description adds nothing about the parameter itself, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause gives a specific verb and resource with scope: 'Lists every OPEN decision on the call's Decision Board, from all agents in the call and their helper sessions' plus ordering ('oldest number first'). It also clarifies the audiences (main agent, helper sessions). It stops short of naming a sibling it is distinct from, so it falls one notch below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'read-only overview for the main agent' and by the read-only annotations; there is no explicit when-to-use statement, no condition selecting it over decide/helper_decide/status, and no exclusions. An agent can infer it is the read path, but nothing is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helper_activityHelper: add an activity lineAInspect
For a helper session that is not in the call: appends one line (3-8 words) to the call's activity feed as 'Helper : <helper_name>: '. Never spoken verbatim. context and faq: hidden background of this line for the voicebot. Returns the line.
| Name | Required | Description | Default |
|---|---|---|---|
| faq | No | Up to 3 likely follow-up questions with prepared answers [{q, a}] (max 200 chars each), hidden, for the voicebot. | |
| goal | No | Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting). | |
| text | Yes | 3-8 words. | |
| context | No | Hidden background of this entry for the voicebot (what, why, current state), max 2000 chars, never shown on the page. | |
| credential | Yes | Helper credential `token` from helper_credential or POST /api/helper/credential. | |
| helper_name | Yes | Name of this helper session, 1-40 chars (shown on the call page as `from`). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly=false, idempotent=false, openWorld=true, but say nothing about what the write produces. The description fills that gap: the exact feed line format, that it is silently logged rather than spoken, that `context` and `faq` stay hidden from the page, and that the call returns the line. It omits any mention of credential/permission failure behavior, which is the only notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the precondition and output format, with no filler. The middle sentence duplicates schema wording on context/faq, which is the only wasteful element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation tool with an output schema and full schema coverage, the description covers the who/what/how plus the non-obvious hidden-field semantics, so an agent can call it correctly. Only the `goal` parameter's interaction with this tool (schema mentions 'helpers: no inheriting') goes unmentioned in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema, including that `context` and `faq` are hidden voicebot background and that `text` is 3-8 words. The description largely restates those facts ('context and faq: hidden background of this line for the voicebot'), adding little new meaning, notably skipping the `goal` parameter entirely. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource (appends one line to the call's activity feed) and pins the exact rendering format 'Helper <label>: <helper_name>: <text>'. The precondition 'for a helper session that is not in the call' distinguishes it from the sibling `activity`/`say` tools, which operate for the in-call agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear situational precondition (helper session, not in the call) and signals the line is 'never spoken verbatim', which implicitly rules out using this to talk to the participant. It does not explicitly name the alternative to use for spoken output (e.g. `say`), so the routing guidance stops just short of complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helper_credentialGet a helper credentialAInspect
For the agent in the call (session): returns a helper credential token (with url and expires_in) that lets other sessions working for the same person add their own status board, decisions and activity lines to this call without joining (no voice, no chip). label = name of the helper's machine, max 22 chars, shown as 'Helper : <helper_name>'. rotate true makes every earlier helper credential of this call invalid. The credential works only for the helper_* tools and /api/activity/relay*, never for say or join, and ends with the call.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Machine label of the helper, max 22 chars. | |
| rotate | No | true = invalidate earlier helper credentials. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: the credential's scope is limited to helper_* tools and /api/activity/relay*, it expires when the call ends, and rotate=true invalidates every earlier helper credential for this call. That rotate semantics is exactly the kind of side effect annotations (destructiveHint=false, idempotentHint=false) don't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph front-loads the return value and its audience, then layers label format, rotate semantics, and scope limits. Every clause carries information an agent needs; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return values are covered, yet the description still adds the lifetime ('ends with the call') and the tool-scope restriction, which are critical to correct invocation. Complete enough that an agent could use the credential safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description still enriches parameters: label is the helper's machine name (max 22 chars) rendered as 'Helper <label>: <helper_name>', and rotate's invalidation effect is spelled out beyond the schema's terse wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('returns a helper credential token') and immediately enumerates the return payload (url, expires_in). It also distinguishes itself from siblings by describing the helper's role (add status/decisions/activity without joining, no voice, no chip) versus join/say.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames the use case ('other sessions working for the same person add their own status board... without joining') and the exclusions ('never for say or join'). It stops short of naming a competing sibling to pick instead, so the when-to-use-vs-alternative routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helper_decideHelper: ask the human to decideADestructiveInspect
For a helper session that is not in the call: puts its own question on the Decision Board, shown with the sender 'Helper : <helper_name>'. Same fields and limits as decide (question max 160 chars, 2-3 options max 40 chars each, recommend = index, context = background shown behind the arrow next to the question and used by Delta, faq = 3 follow-up questions with prepared answers; without them the result carries warnings). Change or delete only own questions (same credential and from), else 403. Returns id and number; the answer comes from helper_next, never from the main agent's next. card_type done = completion report instead of a question: title (whole sentence, max 160), summary (max 600), evidence [{label, url?}] (max 5, http(s) only), live (bool), ask (optional follow-up question); no question/options/recommend/context/faq (422). The server shows the single button Seen; it never counts as an open decision. Same sender and same title while unseen updates that card. When the person marks it, helper_next gets {type: decision, card_type: done, id, number, verdict: seen, title, text? (answer to ask), by, answered_by, answered_via, answered_by_label}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Id of an own open decision to change or delete. | |
| ask | No | card_type done: optional follow-up question (one sentence ending with ?), answered in a text field next to Seen. | |
| faq | No | Up to 3 likely follow-up questions with prepared answers [{q, a}] (max 200 chars each), hidden, for the voicebot. Without context and 3 faq the result carries `warnings`. | |
| goal | No | Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting). | |
| live | No | card_type done: true = it is live (marked on the card). | |
| title | No | card_type done: what is finished, one whole sentence, max 160 chars, no bare numbers. | |
| ttl_s | No | Optional: seconds until this card is hidden from the board if it is still open (or answered). Omit it and the card stays until it is answered or your session ends; never set a default. | |
| delete | No | true = remove the decision `id`. | |
| context | No | Background (max 1500 chars) the person opens with the arrow next to the question; Delta reads its first sentences aloud with the card and explains from it, so write it for the ear: an example, one key number, no lists. Only reader-relevant, one line per part: Was / Warum / Bei Ja / Bei Nein. | |
| options | No | Optional: 2 to 3 answer options, max 40 characters each. | |
| summary | No | card_type done: short report, max 600 chars. | |
| evidence | No | card_type done: up to 5 proofs [{label, url?}], url only http(s). | |
| question | No | The question, max 160 chars (required when creating). | |
| card_type | No | decision (default) or done: a completion report ('work finished') with title, summary, evidence, live, ask instead of question/options; the person only marks it Seen, no decision. | |
| recommend | No | Index (0-based) of the recommended option. | |
| credential | Yes | Helper credential `token` from helper_credential or POST /api/helper/credential. | |
| helper_name | Yes | Name of this helper session, 1-40 chars (shown on the call page as `from`). | |
| no_question | No | Id of a question_check event from helper_next: confirms the line was no question to the person (pass it alone). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses permissions and side effects: only own questions can be changed or deleted, otherwise 403; duplicate unseen titles update the existing card; missing context/faq produces warnings; and card_type done shows only a Seen button. These are substantial behavioral details not already in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is a dense run-on covering many clauses, and it spends space explaining return values despite the presence of an output schema. It is information-rich but not well structured for quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex helper tool with 18 parameters, the description covers the core workflow, permissions, limits, card types, update behavior, and answer routing. Anything not covered in prose is fully documented in the input schema, and an output schema exists for return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 18 parameters. The description adds some semantic meaning for context, faq, and card_type done, but it repeats many schema limits and omits goal, ttl_s, delete, and no_question entirely, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: placing a question on the Decision Board from a helper session. It distinguishes itself from decide by saying 'Same fields and limits as decide' and from the main agent's next by routing answers through helper_next.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when condition ('For a helper session that is not in the call') and covers change/delete and card_type done. The alternative routing to helper_next is explicit, though it does not spell out a full 'use decide instead when...' exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helper_nextHelper: answers to own decisionsARead-onlyInspect
For a helper session that is not in the call: returns the answers to its own questions (same credential and helper_name) as events [{type: decision, id, number, verdict: yes|no|option|other, option?, text?, by, answered_by, answered_via, answered_by_label}], plus question_check events (a status or activity line of this helper reads like a question to the person: id, quote, wait_s, text; answered by helper_decide with the question or with no_question = id), plus user_turn events (the person addressed this helper by name in the call: text as transcribed, to, ts), waiting up to timeout seconds (0-25) when none is there. At most 50 kept per helper, gone when the call ends.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Seconds to wait, 0-25. | |
| credential | Yes | Helper credential `token` from helper_credential or POST /api/helper/credential. | |
| helper_name | Yes | Name of this helper session, 1-40 chars (shown on the call page as `from`). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent=false, and destructive=false; the description adds substantial behavioral detail beyond that. It discloses event structures, waiting up to timeout when none is there, a 50-event retention cap, and call-end expiration, giving the agent a clear lifecycle model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, but the entire description is one long run-on sentence with nested parentheticals and inline event schemas. The detail earns its place, yet the lack of structure hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema and annotated safety profile, the description covers the key event types, wait behavior, and retention limits. It leaves gaps such as event ordering or whether returned events are consumed, which keeps it from 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description repeats the timeout range and the need for the same credential and helper_name, but adds no syntax, format, or failure semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('returns') and resource (answers to its own questions and related events) for a helper session not in the call. It names helper_decide in the question_check context, which helps distinguish retrieval from decision submission, though it does not explicitly contrast with helper_activity or helper_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use for a helper session that is not in the call, and mentions helper_decide for answering question_check events. It lacks explicit when-not-to-use guidance or alternative routing among sibling retrieval tools, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helper_showHelper: show something on the call pageAInspect
For a helper session that is not in the call: puts a card on the person's call page (never spoken), shown with the sender 'Helper : <helper_name>'. kind: text (default), code, link (exactly one http(s) URL) or image (image = SVG text or base64 PNG/JPEG/WebP, never a URL). Same checks and limits as show: text 4000 chars, title 80, SVG 300 KB, raster 1024 KB, at most 10 images a minute. An image returns ok only after a call page loaded it (shown = number of pages); otherwise an error says why (nobody in the call, image did not load). kind image REQUIRES context (the full text of everything in the image, invisible, for the voicebot). Files: kind pdf, csv or md with data = base64 and name (pdf max 10 MB, csv/md max 2 MB); the server shows and confirms them itself.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | kind pdf, csv or md: the file as base64. | |
| goal | No | Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting). | |
| kind | No | ||
| name | No | kind pdf, csv or md: file name. | |
| text | No | Card text, max 4000 chars (code: the code; link: the URL). | |
| image | No | kind image: SVG text or base64 PNG/JPEG/WebP (SVG max 300 KB, raster max 1 MB). | |
| title | No | Optional title, max 80 chars. | |
| context | No | Required for kind image: the full text of everything in the image (numbers, table rows, labels), invisible. Max 4000 chars. | |
| credential | Yes | Helper credential `token` from helper_credential or POST /api/helper/credential. | |
| helper_name | Yes | Name of this helper session, 1-40 chars (shown on the call page as `from`). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the visible sender string format 'Helper <label>: <helper_name>', that images return ok only after a call page loads them (with a shown count) and otherwise error with a stated reason, rate limits (10 images/minute), size caps, and that the server self-confirms pdf/csv/md. Annotations only say non-read-only, open-world and non-idempotent, so this detail is genuinely additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose comes first and every sentence carries operational detail. The kind-by-kind constraint dump makes it a dense single paragraph that is slower to scan than a short bulleted structure would be, but there is little outright filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the practical picture for a 10-parameter mutation tool: what appears on the page, sender labeling, per-kind payload rules, failure modes and limits. With an output schema present and required parameters documented, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 90%, yet the description still adds semantics the schema lacks: link must contain exactly one http(s) URL, image must be SVG or base64 raster and never a URL, image requires context, and the per-kind meaning of `text`. The generous size limits are useful reinforcement rather than new information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action and resource: places a card on the person's call page from a helper session that is not in the call, and explicitly notes it is never spoken. The scoping clause 'not in the call' separates it from the related 'show' tool, though the phrasing is embedded mid-sentence rather than front-loaded.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening condition ('For a helper session that is not in the call') tells the agent when this tool applies and implicitly when the plain 'show' tool does instead. It references 'show' for shared limits but does not explicitly say to use 'show' when the helper is in the call, so no exclusions are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helper_statusHelper: set own status boardADestructiveInspect
For a helper session that is not in the call: sets its own status board on the call page, shown as 'Helper : <helper_name>' below the main agent; the main agent's board stays as it is. Same limits as status (doing max 400 chars, open / done max 10 items). meta: Per entry hidden background for the voicebot, never shown on the page: context (max 2000 chars) and faq (up to 3 follow-up questions with prepared answers). Without context and 3 faq on an entry the result carries warnings (no error). Empty doing, open and done removes the helper's board. Returns ok and, when context or faq is missing on an entry, warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| done | No | Done items, max 10. | |
| goal | No | Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting). | |
| meta | No | Per entry hidden background for the voicebot, never shown on the page: context (max 2000 chars) and faq (up to 3 follow-up questions with prepared answers). Without context and 3 faq on an entry the result carries `warnings` (no error). | |
| open | No | Open items, max 10. | |
| doing | No | Current step + ETA, max 400 chars. | |
| credential | Yes | Helper credential `token` from helper_credential or POST /api/helper/credential. | |
| helper_name | Yes | Name of this helper session, 1-40 chars (shown on the call page as `from`). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: empty doing/open/done removes the helper's board (the destructive effect behind destructiveHint=true), meta is hidden background for the voicebot and never shown on the page, missing context/faq produces `warnings` rather than an error, and helpers do not inherit goals. These are exactly the operational details an agent needs and are not present in the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the identity/scope sentence, then limits, then meta, then removal and return behavior. It is dense and sentence-long in places, but every clause carries operational information; minor readability cost without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description still covers the parts schemas cannot: display placement, page-vs-voicebot visibility, warning-not-error behavior, and the destructive empty-payload case. Nothing material for correct invocation is missing for a helper-scoped board mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the `meta` entries are explicitly invisible to the page and consumed by the voicebot, and the warnings coupling with context/faq is only stated here. It also clarifies the empty-value removal semantics for doing/open/done beyond the schema's max-length notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('sets its own status board on the call page') plus the exact rendering ('Helper <label>: <helper_name>' below the main agent). It explicitly separates itself from the sibling `status` by noting the main agent's board stays unchanged and that limits match `status`, so an agent can differentiate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear applicability condition ('For a helper session that is not in the call') and implies the alternative (`status`) by reference to its limits. It does not explicitly state when NOT to use it or name which sibling to pick for a non-helper session, so it falls short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
joinJoin a voicehook callAInspect
Connect to a voicehook.ai voice call as the agent behind its voicebot. invite_url: the full invite link including ?invite= (from the person or from create_call). label: the text on the agent's chip in the call, max 22 characters (longer is rejected). model: the model id the agent runs on (internal, not shown). greet (default true): the voicebot speaks a short greeting with the label in the call language right after the join (or when the person is back, if they are out). Returns session (the handle for every other tool, valid until the call ends, after 10 min without next or say, or after leave), room, lang (call language), idle_timeout_s, peers, humans_present (people in the call; 0 plus human_away = the person is out right now), solo (true = solo call: the voicebot speaks as you, in your voice, first person; other agents may join with their own voices) and context (lang, mode, functions, skill_url, status_every = seconds between the voicebot's status summaries). With a link from create_call, join waits for the person (up to 200 s in Claude clients, else 50 s, with progress every 10 s) and then returns status waiting_for_human (not an error, with share_text and next_action) while the link is still unopened. local_cli_hint only for a local client with a shell (Claude Code, Cursor, VS Code and similar). Errors: 403 invalid invite, 409 no person in the room, 410 link expired or call over, 429 too many joins, 503 server restarting (the call stays valid). MCP and bridge connect one agent to the call; activity lines are only what that agent writes. For several agents or sessions on one machine in one call, the voicehook-agent CLI (pro tool) feeds the live activity log, status and decisions of all local sessions into the call automatically; MCP and bridge run on the server and cannot see the user's local sessions. Hard rule: after create_call, show share_text to your user as text first, then call join at once and repeat it until it returns session (or start a background job that joins over the HTTPS bridge and wakes you); never end your turn before that. Then keep calling next in a loop.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Old name of `label` (still accepted). | |
| greet | No | true (default) = the voicebot greets for you right after the join, in the call language: 'Hallo, hier ist <label>. Worum geht es?' / 'Hi, this is <label>. What can I do for you?'. | |
| label | No | Text on your chip in the call, max 22 characters: your session or chat name, else your model name. Too long is rejected. | |
| model | No | Exact model id you run on (internal, not shown). | unbekannt |
| quiet | No | Accepted for compatibility with the HTTPS bridge; no effect here. | |
| voice | No | Optional Chirp3-HD voice for the agent in normal mode, short name (e.g. Puck) or full name; invalid values are ignored. In a one-agent call the voicebot speaks in this voice. | |
| invite_url | Yes | Invite link https://voicehook.ai/r/<room>?invite=... (max 2048 chars) | |
| data_channel | No | false (default): every user turn addressed to you wakes your `next`. true = join as a pure DATA CHANNEL: `next` wakes only on a turn addressed to you by name/mention or routed to you by Delta, and on your own decisions; broad turns (to everyone, or a passive followup) stay readable as context (since_last on the next woken event) but do not wake you. | |
| status_every | No | Optional seconds between the voicebot's own status summaries of your board, activity and decisions (default 60; 0 = only when the person asks; 10..59 or whole minutes up to 3600). The person can change it in the call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses extensive behavior beyond annotations: session lifetime, idle timeout, waiting_for_human semantics, return fields, error codes, local_cli_hint behavior, and multi-agent limitations. This is well above the baseline needed for an open-world, non-destructive mutation-like join operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical purpose is front-loaded, but the description is a dense wall of clauses mixing return values, errors, workflow rules, and multi-agent distinctions. Much is useful, but the structure makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, annotations, output schema, and nine parameters, the description is complete enough to call it correctly. It covers lifecycle, returns, errors, timing, and operational constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description nonetheless adds useful meaning for invite_url, label length rejection, greet timing, model visibility, and returned session fields, but it does not clarify every parameter such as quiet or data_channel beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: connect to a voicehook.ai voice call as the agent behind its voicebot. It clearly distinguishes this from create_call and other sibling tools by explaining the invite flow and session handle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage conditions, including the hard rule after create_call, when to repeat join, and how several-agent scenarios should use the CLI instead of MCP/bridge. Alternatives and timing are named directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leaveLeave the callADestructiveIdempotentInspect
Leave the call (optionally speaking say first, e.g. a short goodbye). The session handle is invalid afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| say | No | Optional goodbye, max 4000 chars. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new behavioral context: the session handle becomes invalid afterwards, warning the agent not to reuse it. Missing only edge-case detail such as behavior on an already-invalid session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the core action and the session-invalidation consequence both front-loaded. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with an output schema and full annotation coverage, the description supplies the essential post-condition (invalid session). Only minor gaps remain, e.g. what happens if the session is already gone, which the idempotentHint partly signals.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both `say` and `session` are documented, including the 4000-char limit and the join provenance). The description restates the optional `say` semantics but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Leave the call') that any agent can distinguish from siblings like join, say, or status. The parenthetical clarifies the optional pre-leave utterance, which sharpens rather than muddies the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes clear this is the tool for exiting a call and notes the optional pattern of speaking a goodbye first. It does not explicitly contrast with alternatives (e.g., why not just stop calling `next`), but the usage context is unambiguous and no exclusions are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nextWait for the next turnARead-onlyInspect
Wait (up to timeout seconds, max 50) for the next event in the call and return it. Event type: user (text = what the person said; after a pause also missed = earlier turns, oldest first, and away_s), revise (queued says were replaced; reason user_stop = the person said stop; reason stale + stale:true = your says waited over 60 s unspoken and were dropped (items = seq + text): do not repeat them, if still relevant say ONE short current summary), status_request (the person asked what the agent is doing), decision (answer to a decide question: id, number, verdict yes|no|option|other, option, text, by, answered_by, answered_via, answered_by_label), helper_decision (the human answered a helper session's question: from, label, id, number, question, verdict, option, text, by, answered_by, answered_via, answered_by_label; a routing hint, never speak or answer it: send it to that session so it continues), question_check (a status or activity line of this agent reads like a question to the person: id, quote, wait_s, text; answered by decide with the question, or by decide with no_question = id; without either, after wait_s the server puts it on the Decision Board itself, marked as detected automatically, answered only by a human), timeout (nothing happened; reconnect true = server restart), human_left / human_rejoined (the person dropped out / is back; greeted true = the join greeting was just spoken), voicebot_left / voicebot_back (the voicebot dropped out, e.g. a server update; a new one usually joins within ~20 s, says are not heard until then / it is back after seconds, say works again), operator (another agent addressed this one: addressed_to_you), data (another agent sent data with send_data: from, kind, payload or url + file_id; never spoken), context (the call language changed, new context), superseded (a newer next call replaced this one), ended (the call is over; detail live_budget, wallet_empty, free_limit or review_budget = budget used up (quota), unspoken says were dropped). Every answer has humans_present; user events and operators_said lines carry addressed_to / addressed_to_you; a user event with routed_by_delta = the person gave Delta a request, it is yours; a user event with to_kind helper = the person addressed a helper session by name (to), the sentence is in that helper's inbox, info_only; to_kind helper_ambiguous = several helpers matched, Delta asks which one. agent_said = what the voicebot said on its own since the last next, operators_said = what other agents said (with name), board_now / activity_now = the agent's current doing line and last feed line as the voicebot sees them, stale_error = board or feed older than 60 s while the agent is working, or no activity line yet after the join. Errors: 404 = unknown session (after leave); 5xx, 503 or a network error leave the session valid. Hard rule: after create_call, show share_text to your user as text first, then call join at once and repeat it until it returns session (or start a background job that joins over the HTTPS bridge and wakes you); never end your turn before that. Then keep calling next in a loop.
| Name | Required | Description | Default |
|---|---|---|---|
| session | Yes | The `session` value returned by join. | |
| timeout | No | Seconds to wait, max 50. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (readOnly, openWorld, non-idempotent, non-destructive), which only say this is a safe poll. It explains the 50 s cap, that timeout is a normal no-event result, that `reconnect: true` means a server restart, that `superseded` means a newer next call replaced this one, that `ended` carries budget/limit detail codes, and that 404 means the session is gone while 5xx/503/network errors leave it valid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the hard join rule are correctly front-loaded, but the body is one enormous run-on sentence of nested parentheticals enumerating every event field. Much of that enumeration duplicates the output schema and forces the reader to parse a wall of text to find the two or three events that change behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a long-poll loop tool with this much branching behavior, nothing essential is missing: call sequencing, error recovery, stale/revise handling, decision routing, and the meaning of the less common events are all covered. With an output schema present, the field-level enumeration is arguably redundant but not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so `session` and `timeout` are already documented, but the description adds the consequence of the timeout value — that elapsed time yields a `timeout` event with `reconnect: true` on server restart — which the schema does not express. The max-50 cap is repeated from the schema, adding no new information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource+scope: 'Wait (up to `timeout` seconds, max 50) for the next event in the call and return it,' and the exhaustive event enumeration leaves no doubt what comes back. It never names `helper_next` as the alternative for helper sessions, so the sibling distinction is only implied by references to 'this one' vs 'another agent'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong operational guidance: 'keep calling next in a loop,' the hard rule to show share_text then join before any turn ends, the instruction to route helper_decision to that session and never answer it, and to answer question_check via decide. What's missing is an explicit exclusion pointing an agent at `helper_next`/`helper_status` when it is driving a helper rather than its own call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notify_meNotify the human (SMS first)AInspect
Reach the human who owns this call when they are not on the call page: an SMS to their own confirmed number with a single-use link back into this call (valid 10 min, opens only logged in or with the PIN from the SMS); if they do not open it within 2 minutes, a phone call follows. Prefer this over call_me. Their account rules decide (opt-in, reasons, quiet hours, per day, budget, credit); a refusal returns {status: refused, why}. Otherwise {status: sms_sent|sms_failed|insufficient, phone_call_id, billed_eur, link_valid_s, fallback_call_in_s}. reason: done | blocked | decision. message: max 120 characters, in the SMS.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why: done, blocked or decision. | |
| message | No | Optional short text for the SMS, max 120 chars. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only declare non-read-only, open-world, non-idempotent, non-destructive) by disclosing the whole escalation ladder: SMS with a 10-minute single-use link, auth requirement (logged in or PIN), 2-minute fallback to a phone call, account-level gating rules (opt-in, quiet hours, per-day, budget, credit), billing via billed_eur, and the refusal shape {status: refused, why}. That is exactly the operational context an agent needs before triggering a paid, side-effecting notification.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and escalation behavior, with the parameter notes compressed into the tail. Dense but nearly every clause carries new information; the return-shape enumeration is somewhat redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a cross-channel, money-spending notification tool, the description covers trigger condition, delivery path, fallback timing, auth, gating rules, and failure modes. Since an output schema exists, the return-value enumeration is optional, and nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents reason, message, and session. The description's 'reason: done | blocked | decision' and 'message: max 120 characters' merely restate the enum and schema text, adding no syntax or format meaning beyond it. Baseline 3 is correct when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (notify the human owner via SMS) and immediately scopes it to the case where they are not on the call page. It is clearly distinguishable from sibling call_me and from status/decide/next, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Prefer this over call_me' and gives the selecting condition ('when they are not on the call page'), which implies call_me is the alternative when the human is present. It stops short of stating the when-not case outright, so it is strong routing guidance rather than a complete decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saySpeak in the callADestructiveInspect
The voicebot speaks text aloud in the call (verbatim in normal mode; in a live room the voice rephrases it and the answer has verbatim false, mode live_paraphrase). mode: append (default, queued after earlier says), overwrite (replaces this agent's says that have not started yet), revise (like overwrite, and next then returns a revise event). ref (optional) ties the sentence to a card or decision: the person sees it highlighted while you speak. Returns ok and seq.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Optional: the card or decision this sentence is about, "card:<card id>" (id from show) or "decision:<number>". While the sentence plays, the person sees it highlighted (its window opens if closed). Unknown ids are ignored, the sentence is spoken anyway. | |
| mode | No | append | |
| text | Yes | What to say, max 4000 chars. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive, non-idempotent, and open-world behavior, and the description adds concrete consequences: overwrite discards not-yet-started says, revise changes the next event, live rooms paraphrase and return verbatim false, and ref highlights a card while speaking. It also discloses the return values ok and seq. This is consistent with destructiveHint=true rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then modes, ref, and return values, and every sentence carries useful information. The parenthetical 'verbatim false, mode live_paraphrase' is slightly dense, but it does not waste space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, rich annotations, and mostly documented parameters, the description is complete enough for correct invocation. It adds the key behavioral nuance around destructive overwrites and live-room paraphrasing that an agent otherwise would not know.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description supplies the missing mode semantics in detail, including append, overwrite, and revise behavior. It also explains ref's highlighting effect and notes text is spoken verbatim in normal mode, adding meaning beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: the voicebot speaks `text` aloud in the call. The title reinforces this, and the tool is clearly the speech primitive rather than a data, notification, or decision tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit mode-selection guidance: append queues after earlier says, overwrite replaces this agent's not-yet-started says, and revise also causes the next tool to return a revise event. It does not explicitly compare the tool with siblings like notify_me or send_data, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_dataSend data to another agentAInspect
Send JSON, text or a file to other agents in this call (silent data channel: never spoken, never shown to the human, never to the voicebot; the human only sees one activity line 'Data to B: name (size)'). to: the other agent's label (as on its chip), its identity, or "*" for all other agents; unknown -> 404 with the labels in the call. kind json: payload any JSON; text: payload a string; file: payload = base64 of the file plus name and mime, or file_id of a file uploaded with the REST endpoint POST /api/bridge/upload (files over about 11 KB, up to 10 MB). The whole packet is max 15000 bytes inline (413 otherwise; base64 makes a file 4/3 larger). Receivers get it in next as type data {from, from_identity, kind, id, name?, mime?, payload | url + file_id, size?}; url is a path, served at https://voicehook.ai with the header Authorization: Bearer . Returns id, to (labels), size.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Optional own message id (1-64 of [A-Za-z0-9._-]); else the server makes one. | |
| to | Yes | Label or identity of the receiver, or "*" for all other agents. | |
| kind | Yes | ||
| mime | No | Optional media type, e.g. application/json. | |
| name | No | Optional name, e.g. result.json. | |
| file_id | No | kind file: id from POST /api/bridge/upload. | |
| payload | No | json: any JSON value; text: a string; file: base64 of the file. Leave out with file_id. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic mutation/open-world profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false). The description goes well beyond them: unknown recipients yield 404 with the call's labels, the 15000-byte inline cap yields 413, files over ~11 KB must go through POST /api/bridge/upload (up to 10 MB), base64 inflates size by 4/3, and receivers see a typed data packet served at a URL requiring Bearer session auth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and channel semantics are front-loaded, and nearly every clause carries operational information (limits, error codes, recipient format). It is a dense semicolon-chained paragraph, and the receiver-side packet format partially restates the output schema, so it is informative but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with an output schema already present, the description still supplies everything an agent needs: size ceilings and the 413 failure mode, the upload fallback endpoint for large files, recipient resolution and the 404 behavior, and per-kind payload requirements. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so baseline is 3. The description adds real meaning beyond the schema: it maps each kind value to the expected payload shape (json=any JSON, text=string, file=base64 plus name/mime or file_id), explains the '*' wildcard for to, and specifies that name/mime accompany file payloads. Only minor gaps remain, such as the optional id format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (send JSON/text/file to other agents in this call) and immediately distinguishes itself from siblings by naming the channel's nature: 'silent data channel: never spoken, never shown to the human'. An agent can tell this apart from say/show without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes the context of use (silent, non-spoken, non-visible to human, only one activity line shown), which implicitly routes the agent away from say/show for machine-to-machine payloads. It does not explicitly name those alternatives or state when-not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
showShow something on the call pageAInspect
Put a card on the person's call page (never spoken): text, code, a link or an image. kind: text (default), code (monospace with copy button), link (exactly one http(s) URL, shown as a tappable link), image (image = SVG text or base64 PNG/JPEG/WebP, line breaks, a data:image/...;base64, prefix and missing padding are accepted; or file_id of an image uploaded with the REST endpoint POST /api/bridge/upload, which keeps large base64 out of the tool call). kind image REQUIRES context: the full text of everything in the image (numbers, table rows, labels); it is never shown, the voicebot cannot see images and answers questions from it. A new card appears as a small preview top left; panel cards opens the cards view, board, log or decisions open those panels, none closes them. large: true opens the cards view big in the middle with this card at full size (diagrams, swimlanes; implies panel cards). SVG may draw anything (no scripts, no foreignObject, no external references). Files (reports, tables): kind pdf (preview with page turning and download), csv (table preview of the first rows and download) or md (Markdown, rendered safely, and download) with data = the file as base64 and name = file name (e.g. report.pdf), or file_id from POST /api/bridge/upload. Limits: text 4000 chars, title 80, SVG 300 KB, raster 1024 KB, pdf 10 MB, csv and md 2 MB (UTF-8).
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | kind pdf, csv or md: the file as base64 (pdf max 10 MB, csv/md max 2 MB UTF-8). | |
| goal | No | Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting). | |
| kind | No | ||
| name | No | kind pdf, csv or md: file name shown on the card and used for the download. | |
| text | No | Card text, max 4000 chars (code: the code; link: the URL). | |
| image | No | kind image: SVG text or base64 PNG/JPEG/WebP (SVG max 300 KB, raster max 1 MB). | |
| large | No | Open the cards view big in the middle with this card at full size. | |
| panel | No | ||
| title | No | Optional title, max 80 chars. | |
| context | No | Required for kind image: the full text of everything in the image (numbers, table rows, labels). Invisible on the page; the voicebot reads it to answer questions about the image. Max 4000 chars. | |
| file_id | No | kind image, pdf, csv or md: id from POST /api/bridge/upload (same call, same limits and checks); instead of image or data. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well past the annotations, which only say readOnlyHint=false, destructiveHint=false, openWorldHint=true. It discloses visible side effects (a preview appears top left, panels open or close), the hidden `context` channel the voicebot reads instead of the image, SVG sandbox restrictions (no scripts, no foreignObject, no external references), and per-kind size limits — all behavior an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded correctly, but the rest is a single dense run-on paragraph mixing content kinds, panel semantics, SVG rules, file kinds and limits, which makes it hard to scan. Some sentences duplicate what the schema already documents (the 4000/80/300 KB/1024 KB/10 MB/2 MB limits appear in both places), so not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with seven rendering kinds, the description covers the decisions an agent must make: which kind, when `context` is mandatory, when `file_id` replaces inline data, and what the page does afterward. An output schema exists so return values need no explanation, but the description is silent on failure behavior when a limit is exceeded and on the relationship to `helper_show`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 83% the baseline is already 3, and the description pushes higher by explaining cross-parameter constraints the schema states only in isolation: image kind REQUIRES `context`, `large` implies panel cards, `link` takes exactly one URL, and `file_id` exists specifically to keep large base64 out of the tool call. It loses a point for repeating size limits already in the schema and for saying nothing about the `goal` parameter's inheritance behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a concrete verb and resource — "Put a card on the person's call page" — and immediately bounds the scope with "(never spoken)", which cleanly separates it from the sibling `say`. It then enumerates the exact content kinds it renders (text, code, link, image, plus pdf/csv/md later), so an agent can tell what it is for without consulting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Guidance is rich at the level of kinds: code is monospace with a copy button, link takes exactly one http(s) URL, image requires `context`, `large: true` is for diagrams and swimlanes, `panel` opens/`none` closes specific views. What it never does is name the alternatives explicitly (e.g. `say` for spoken output, `helper_show`, `send_data`), so the routing decision is implied by "never spoken" rather than stated as a when-to-use rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusUpdate the status boardADestructiveIdempotentInspect
Replace the agent's status board on the call page with this one (never spoken; the voicebot answers the person's questions about progress from it). Progress only: questions for the person belong on the Decision Board (decide). doing: current step and ETA (max 400 chars). open / done: max 10 items each, 200 chars per item. faq: up to 6 question/answer pairs the voicebot can answer directly. meta: Per entry hidden background for the voicebot, never shown on the page: context (max 2000 chars) and faq (up to 3 follow-up questions with prepared answers). Without context and 3 faq on an entry the result carries warnings (no error). emoji (optional): An emoji shown on the agent's chip in the call, from the listed set. Empty string removes it, left out keeps it. Whole board max 2000 chars. Returns ok, humans_present and, when context or faq is missing on an entry, warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| faq | No | Max 6 pairs [{"q": "question", "a": "short answer"}]. | |
| done | No | Done items, max 10. | |
| goal | No | Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting). | |
| meta | No | Per entry hidden background for the voicebot, never shown on the page: context (max 2000 chars) and faq (up to 3 follow-up questions with prepared answers). Without context and 3 faq on an entry the result carries `warnings` (no error). | |
| open | No | Open items, max 10. | |
| doing | No | Current step + ETA, max 400 chars. | |
| emoji | No | An emoji shown on the agent's chip in the call, from the listed set. "" removes it. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses replacement semantics, hidden-vs-visible meta content, the warnings-not-error degradation when context/faq are missing, and the emoji keep/remove behavior. It stops short of saying what the prior board's contents are lost or how partial updates behave, but the destructive overwrite is clearly implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the sibling routing, then limits and meta semantics. It is dense and somewhat run-on with per-field char caps inline, but nearly every clause carries operational information rather than restating the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with an output schema and annotations, the description covers board structure, hidden meta, warnings behavior, and the return fields (ok, humans_present, warnings). The `goal` inheritance parameter is only handled by the schema, which is a minor gap given the otherwise thorough coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: meta entries are hidden background never shown on the page, missing context/faq yields warnings rather than failure, and emoji empty-string removes while omission keeps. It does not touch `goal` or `session`, leaving those entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Replace the agent's status board on the call page with this one') and immediately clarifies the artifact is never spoken but read by the voicebot. It also distinguishes itself from the sibling decision board by routing person-directed questions to 'decide'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the boundary: this board is for progress only, and questions for the person belong on the Decision Board (decide). That is a concrete when-to-use/when-not-to-use rule tied to a named sibling, so an agent can route correctly without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
taskAccount task board: change a cardAInspect
Changes one card of the account task board that this agent holds: op pick, update (note), done (proof), release. Moving, renaming, assigning and discarding cards is only possible from the owner's voicehook-agent CLI with an agent key, not here. Returns {ok, card}.
| Name | Required | Description | Default |
|---|---|---|---|
| nr | Yes | Card number. | |
| op | Yes | The action. | |
| note | No | update: progress note. | |
| proof | No | done: proof, e.g. pr:612. | |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true); the description adds real context beyond them by scoping which card operations are reachable here and by stating the return shape. It does not explain the semantics of the individual operations — notably whether 'pick' claims the card exclusively or what 'release' restores — which matters for a non-idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and the operation list before the restriction boundary. The trailing 'Returns {ok, card}' is slight duplication given an output schema exists, but it costs almost nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema makes the return explanation unnecessary, and the CLI-only restriction is well covered, but the description never explains what 'pick', 'done' or 'release' actually do to the board state. For a five-parameter, non-idempotent mutation tool, an agent still has to infer the core semantics of the operations from their names alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including 'nr', 'session' and the op enum is already documented in the schema. The description mirrors that mapping (update→note, done→proof) without adding syntax, constraints, or meaning for the opaque op values 'pick' and 'release'. Baseline 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Changes one card of the account task board') and enumerates the four allowed operations (pick, update, done, release), which lets an agent distinguish it from the sibling 'tasks' listing tool. It stops short of naming that sibling explicitly, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit when-not boundary: moving, renaming, assigning and discarding cards must go through the owner's voicehook-agent CLI with an agent key, not this tool. What is missing is a positive pointer to the read-side alternative (e.g. 'tasks' for listing/inspecting cards), so the routing guidance is one-sided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasksAccount task board: list cardsARead-onlyIdempotentInspect
Lists cards of the account task board (Kanban) of the call owner, for an agent the owner brought into the call (joined with an agent key or the owner's agent link). Returns {ok, states, cards: [{nr, title, state, marks, assignee, ...}]}. scope: mine (assigned to or picked by this agent), assigned, open or all. Agents of guests get 403 not_owner_agent.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Which cards: mine, assigned, open or all. | mine |
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral facts beyond that: the ownership/agent-key precondition and the concrete 403 not_owner_agent failure mode, which an agent cannot derive from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with purpose, then the return shape, then scope, then the failure condition, with no filler sentences. Every clause, including the return-shape sketch, carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not fully explain return values, yet it still previews the card fields, and it covers the access precondition and enum scopes. The remaining gap is the lack of differentiation from the sibling `task` tool for a board-based read operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, establishing a baseline of 3. The description adds real meaning for one enum value ('mine (assigned to or picked by this agent)'), but leaves the distinction between 'mine' and 'assigned' and the meaning of 'open' unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Lists cards of the account task board (Kanban)') and narrows the audience (the call owner's board, viewed by an agent the owner brought in). It never names the sibling `task` tool explicitly, so the agent must infer the boundary between listing cards and the singular task tool, which keeps this from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied through the scope enumeration and the access precondition ('Agents of guests get 403 not_owner_agent'), which tells the agent when the call will fail. However, there is no explicit statement of when to choose this over `task`, `activity`, or `decisions`, and no when-not guidance beyond the 403 case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uiArrange the call pageAInspect
Change the person's call page right away, like their own clicks: cmd window (win log=activity, dec=decisions, board=status board, wrap=transcript, cards; state open, close, min, medium, large, max), cmd layout (preset halves, quarters, thirds, bigmid, bar), cmd move (win + slot l, m, r, b, tl, tr, bl, br, main, side; optional preset), cmd focus (project voicehook, salesengine, kunden, sonstiges or all: only that project's sections stay open in activity, status and decisions). Never spoken. Only when the person asks for it or it clearly helps (e.g. open decisions after asking one).
| Name | Required | Description | Default |
|---|---|---|---|
| cmd | Yes | ||
| win | No | ||
| slot | No | ||
| state | No | ||
| preset | No | ||
| project | No | ||
| session | Yes | The `session` value returned by join. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/mutation profile (readOnlyHint=false, idempotentHint=false, openWorldHint=true, destructiveHint=false), so the safety bar is lower. The description adds that effects are immediate and equivalent to the user's own clicks, which is useful context, but says nothing about reversibility, failures, or whether 'close' loses state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and free of filler, but rendered as a single run-on sentence with deeply nested parentheses that makes the subcommand grammar hard to scan. Compact in length, weak in structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with an output schema (so return values need not be explained), the description covers all four commands, their parameter combinations, and the usage gate. Only minor omissions remain, such as the undocumented 'ring' window value and undefined behavior for incomplete command/parameter combinations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 14% (session alone), so the description must carry the load, and it largely does: it maps each cmd to its companion parameters (win+state for window, preset for layout, win+slot for move, project for focus), which is the co-occurrence logic the schema cannot express. It does omit the 'ring' win value present in the enum, a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: change the person's call page layout immediately, with an explicit subcommand breakdown (window/layout/move/focus) that maps onto the cmd enum. An agent can tell it mutates the live UI. However, it never distinguishes itself from siblings like 'show', 'activity', or 'status', which also touch what the user sees, leaving overlap unresolved.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit gating condition ('only when the person asks for it or it clearly helps') plus a concrete example (open decisions after asking one), and rules out narration ('never spoken'). It stops short of naming any alternative tool or stating when NOT to use it versus siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Added
task - Added
tasks
8 tool updates
- Changed
activity1 field changed- added
Input schema / properties / goalAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting).", + "title": "Goal" +}
- Changed
decide1 field changed- added
Input schema / properties / goalAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting).", + "title": "Goal" +}
- Changed
helper_activity1 field changed- added
Input schema / properties / goalAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting).", + "title": "Goal" +}
- Changed
helper_decide1 field changed- added
Input schema / properties / goalAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting).", + "title": "Goal" +}
- Changed
helper_show1 field changed- added
Input schema / properties / goalAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting).", + "title": "Goal" +}
- Changed
helper_status1 field changed- added
Input schema / properties / goalAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting).", + "title": "Goal" +}
- Changed
show1 field changed- added
Input schema / properties / goalAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting).", + "title": "Goal" +}
- Changed
status1 field changed- added
Input schema / properties / goalAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional goal of this entry: number or title of a goal of the account (0 or empty = no goal). Unknown goals are ignored. Without it the entry inherits the goal of your last status (helpers: no inheriting).", + "title": "Goal" +}
2 tool updates
- Changed
decide1 field changed- changed
Input schema / properties / context / descriptionPrevious value: -"Background (max 1500 chars) the person opens with the arrow next to the question; Delta explains from it. Only reader-relevant, one line per part: Was / Warum / Bei Ja / Bei Nein."New value: +"Background (max 1500 chars) the person opens with the arrow next to the question; Delta reads its first sentences aloud with the card and explains from it, so write it for the ear: an example, one key number, no lists. Only reader-relevant, one line per part: Was / Warum / Bei Ja / Bei Nein."
- Changed
helper_decide1 field changed- changed
Input schema / properties / context / descriptionPrevious value: -"Background (max 1500 chars) the person opens with the arrow next to the question; Delta explains from it. Only reader-relevant, one line per part: Was / Warum / Bei Ja / Bei Nein."New value: +"Background (max 1500 chars) the person opens with the arrow next to the question; Delta reads its first sentences aloud with the card and explains from it, so write it for the ear: an example, one key number, no lists. Only reader-relevant, one line per part: Was / Warum / Bei Ja / Bei Nein."
1 tool update
- Changed
say1 field changed- added
Input schema / properties / refAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional: the card or decision this sentence is about, \"card:<card id>\" (id from show) or \"decision:<number>\". While the sentence plays, the person sees it highlighted (its window opens if closed). Unknown ids are ignored, the sentence is spoken anyway.", + "title": "Ref" +}
2 tool updates
- Changed
helper_show1 field changed- added
Input schema / properties / contextAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required for kind image: the full text of everything in the image (numbers, table rows, labels), invisible. Max 4000 chars.", + "title": "Context" +}
- Changed
show1 field changed- added
Input schema / properties / contextAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required for kind image: the full text of everything in the image (numbers, table rows, labels). Invisible on the page; the voicebot reads it to answer questions about the image. Max 4000 chars.", + "title": "Context" +}
2 tool updates
- Changed
decide1 field changed- added
Input schema / properties / ttl_sAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional: seconds until this card is hidden from the board if it is still open (or answered). Omit it and the card stays until it is answered or your session ends; never set a default.", + "title": "Ttl S" +}
- Changed
helper_decide1 field changed- added
Input schema / properties / ttl_sAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional: seconds until this card is hidden from the board if it is still open (or answered). Omit it and the card stays until it is answered or your session ends; never set a default.", + "title": "Ttl S" +}
2 tool updates
- Changed
decide7 fields changed- added
Input schema / $defs / EvidenceItemAdded value: +{ + "properties": { + "label": { + "description": "What it proves, max 80 chars (e.g. 'All 412 tests green').", + "title": "Label", + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional http(s) link (PR, CI run, live page).", + "title": "Url" + } + }, + "required": [ + "label" + ], + "title": "EvidenceItem", + "type": "object" +} - added
Input schema / properties / askAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: optional follow-up question (one sentence ending with ?), answered in a text field next to Seen.", + "title": "Ask" +} - added
Input schema / properties / card_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "decision (default) or done: a completion report ('work finished') with title, summary, evidence, live, ask instead of question/options; the person only marks it Seen, no decision.", + "title": "Card Type" +} - added
Input schema / properties / evidenceAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/EvidenceItem" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: up to 5 proofs [{label, url?}], url only http(s).", + "title": "Evidence" +} - added
Input schema / properties / liveAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: true = it is live (marked on the card).", + "title": "Live" +} - added
Input schema / properties / summaryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: short report, max 600 chars.", + "title": "Summary" +} - added
Input schema / properties / titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: what is finished, one whole sentence, max 160 chars, no bare numbers.", + "title": "Title" +}
- Changed
helper_decide7 fields changed- added
Input schema / $defs / EvidenceItemAdded value: +{ + "properties": { + "label": { + "description": "What it proves, max 80 chars (e.g. 'All 412 tests green').", + "title": "Label", + "type": "string" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional http(s) link (PR, CI run, live page).", + "title": "Url" + } + }, + "required": [ + "label" + ], + "title": "EvidenceItem", + "type": "object" +} - added
Input schema / properties / askAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: optional follow-up question (one sentence ending with ?), answered in a text field next to Seen.", + "title": "Ask" +} - added
Input schema / properties / card_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "decision (default) or done: a completion report ('work finished') with title, summary, evidence, live, ask instead of question/options; the person only marks it Seen, no decision.", + "title": "Card Type" +} - added
Input schema / properties / evidenceAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/EvidenceItem" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: up to 5 proofs [{label, url?}], url only http(s).", + "title": "Evidence" +} - added
Input schema / properties / liveAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: true = it is live (marked on the card).", + "title": "Live" +} - added
Input schema / properties / summaryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: short report, max 600 chars.", + "title": "Summary" +} - added
Input schema / properties / titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "card_type done: what is finished, one whole sentence, max 160 chars, no bare numbers.", + "title": "Title" +}
1 tool update
- Changed
join1 field changed- added
Input schema / properties / data_channelAdded value: +{ + "default": false, + "description": "false (default): every user turn addressed to you wakes your `next`. true = join as a pure DATA CHANNEL: `next` wakes only on a turn addressed to you by name/mention or routed to you by Delta, and on your own decisions; broad turns (to everyone, or a passive followup) stay readable as context (since_last on the next woken event) but do not wake you.", + "title": "Data Channel", + "type": "boolean" +}
2 tool updates
- Changed
helper_show3 fields changed- added
Input schema / properties / dataAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "kind pdf, csv or md: the file as base64.", + "title": "Data" +} - changed
Input schema / properties / kind / anyOfPrevious value: -[ - { - "enum": [ - "text", - "code", - "link", - "image" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "text", + "code", + "link", + "image", + "pdf", + "csv", + "md" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "kind pdf, csv or md: file name.", + "title": "Name" +}
- Changed
show4 fields changed- added
Input schema / properties / dataAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "kind pdf, csv or md: the file as base64 (pdf max 10 MB, csv/md max 2 MB UTF-8).", + "title": "Data" +} - changed
Input schema / properties / file_id / descriptionPrevious value: -"kind image: id from POST /api/bridge/upload (same call, same limits and checks as image); instead of image."New value: +"kind image, pdf, csv or md: id from POST /api/bridge/upload (same call, same limits and checks); instead of image or data." - changed
Input schema / properties / kind / anyOfPrevious value: -[ - { - "enum": [ - "text", - "code", - "link", - "image" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "text", + "code", + "link", + "image", + "pdf", + "csv", + "md" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "kind pdf, csv or md: file name shown on the card and used for the download.", + "title": "Name" +}
2 tool updates
- Changed
decide1 field changed- changed
Input schema / properties / context / descriptionPrevious value: -"Background for Delta only (max 1500 chars, not shown on the card): 2-4 plain sentences: what, why, yes ->, no ->."New value: +"Background (max 1500 chars) the person opens with the arrow next to the question; Delta explains from it. Only reader-relevant, one line per part: Was / Warum / Bei Ja / Bei Nein."
- Changed
helper_decide1 field changed- changed
Input schema / properties / context / descriptionPrevious value: -"Background for Delta only (max 1500 chars, not shown on the card): 2-4 plain sentences: what, why, yes ->, no ->."New value: +"Background (max 1500 chars) the person opens with the arrow next to the question; Delta explains from it. Only reader-relevant, one line per part: Was / Warum / Bei Ja / Bei Nein."
1 tool update
- Added
helper_show
1 tool update
- Changed
show1 field changed- added
Input schema / properties / file_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "kind image: id from POST /api/bridge/upload (same call, same limits and checks as image); instead of image.", + "title": "File Id" +}
2 tool updates
- Changed
decide1 field changed- added
Input schema / properties / no_questionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Id of a question_check event: confirms the line was no question to the person (pass it alone).", + "title": "No Question" +}
- Changed
helper_decide1 field changed- added
Input schema / properties / no_questionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Id of a question_check event from helper_next: confirms the line was no question to the person (pass it alone).", + "title": "No Question" +}
6 tool updates
- Changed
activity3 fields changed- added
Input schema / $defsAdded value: +{ + "FaqPair": { + "properties": { + "a": { + "description": "The prepared answer, max 200 chars.", + "title": "A", + "type": "string" + }, + "q": { + "description": "A likely follow-up question of the person, max 200 chars.", + "title": "Q", + "type": "string" + } + }, + "required": [ + "q", + "a" + ], + "title": "FaqPair", + "type": "object" + } +} - added
Input schema / properties / contextAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Hidden background of this entry for the voicebot (what, why, current state), max 2000 chars, never shown on the page.", + "title": "Context" +} - added
Input schema / properties / faqAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/FaqPair" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Up to 3 likely follow-up questions with prepared answers [{q, a}] (max 200 chars each), hidden, for the voicebot.", + "title": "Faq" +}
- Changed
decide2 fields changed- added
Input schema / $defsAdded value: +{ + "FaqPair": { + "properties": { + "a": { + "description": "The prepared answer, max 200 chars.", + "title": "A", + "type": "string" + }, + "q": { + "description": "A likely follow-up question of the person, max 200 chars.", + "title": "Q", + "type": "string" + } + }, + "required": [ + "q", + "a" + ], + "title": "FaqPair", + "type": "object" + } +} - added
Input schema / properties / faqAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/FaqPair" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Up to 3 likely follow-up questions with prepared answers [{q, a}] (max 200 chars each), hidden, for the voicebot. Without context and 3 faq the result carries `warnings`.", + "title": "Faq" +}
- Changed
helper_activity3 fields changed- added
Input schema / $defsAdded value: +{ + "FaqPair": { + "properties": { + "a": { + "description": "The prepared answer, max 200 chars.", + "title": "A", + "type": "string" + }, + "q": { + "description": "A likely follow-up question of the person, max 200 chars.", + "title": "Q", + "type": "string" + } + }, + "required": [ + "q", + "a" + ], + "title": "FaqPair", + "type": "object" + } +} - added
Input schema / properties / contextAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Hidden background of this entry for the voicebot (what, why, current state), max 2000 chars, never shown on the page.", + "title": "Context" +} - added
Input schema / properties / faqAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/FaqPair" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Up to 3 likely follow-up questions with prepared answers [{q, a}] (max 200 chars each), hidden, for the voicebot.", + "title": "Faq" +}
- Changed
helper_decide2 fields changed- added
Input schema / $defsAdded value: +{ + "FaqPair": { + "properties": { + "a": { + "description": "The prepared answer, max 200 chars.", + "title": "A", + "type": "string" + }, + "q": { + "description": "A likely follow-up question of the person, max 200 chars.", + "title": "Q", + "type": "string" + } + }, + "required": [ + "q", + "a" + ], + "title": "FaqPair", + "type": "object" + } +} - added
Input schema / properties / faqAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/FaqPair" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Up to 3 likely follow-up questions with prepared answers [{q, a}] (max 200 chars each), hidden, for the voicebot. Without context and 3 faq the result carries `warnings`.", + "title": "Faq" +}
- Changed
helper_status2 fields changed- added
Input schema / $defsAdded value: +{ + "BoardMeta": { + "properties": { + "doing": { + "anyOf": [ + { + "$ref": "#/$defs/ItemMeta" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Background of `doing`." + }, + "done": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ItemMeta" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Background per done item, same order as `done`.", + "title": "Done" + }, + "open": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ItemMeta" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Background per open item, same order as `open`.", + "title": "Open" + } + }, + "title": "BoardMeta", + "type": "object" + }, + "FaqPair": { + "properties": { + "a": { + "description": "The prepared answer, max 200 chars.", + "title": "A", + "type": "string" + }, + "q": { + "description": "A likely follow-up question of the person, max 200 chars.", + "title": "Q", + "type": "string" + } + }, + "required": [ + "q", + "a" + ], + "title": "FaqPair", + "type": "object" + }, + "ItemMeta": { + "properties": { + "context": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Background of this entry for the voicebot (what, why, current state), max 2000 chars.", + "title": "Context" + }, + "faq": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/FaqPair" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Up to 3 likely follow-up questions with prepared answers.", + "title": "Faq" + } + }, + "title": "ItemMeta", + "type": "object" + } +} - added
Input schema / properties / metaAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/BoardMeta" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Per entry hidden background for the voicebot, never shown on the page: context (max 2000 chars) and faq (up to 3 follow-up questions with prepared answers). Without context and 3 faq on an entry the result carries `warnings` (no error)." +}
- Changed
status2 fields changed- added
Input schema / $defsAdded value: +{ + "BoardMeta": { + "properties": { + "doing": { + "anyOf": [ + { + "$ref": "#/$defs/ItemMeta" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Background of `doing`." + }, + "done": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ItemMeta" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Background per done item, same order as `done`.", + "title": "Done" + }, + "open": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ItemMeta" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Background per open item, same order as `open`.", + "title": "Open" + } + }, + "title": "BoardMeta", + "type": "object" + }, + "FaqPair": { + "properties": { + "a": { + "description": "The prepared answer, max 200 chars.", + "title": "A", + "type": "string" + }, + "q": { + "description": "A likely follow-up question of the person, max 200 chars.", + "title": "Q", + "type": "string" + } + }, + "required": [ + "q", + "a" + ], + "title": "FaqPair", + "type": "object" + }, + "ItemMeta": { + "properties": { + "context": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Background of this entry for the voicebot (what, why, current state), max 2000 chars.", + "title": "Context" + }, + "faq": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/FaqPair" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Up to 3 likely follow-up questions with prepared answers.", + "title": "Faq" + } + }, + "title": "ItemMeta", + "type": "object" + } +} - added
Input schema / properties / metaAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/BoardMeta" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Per entry hidden background for the voicebot, never shown on the page: context (max 2000 chars) and faq (up to 3 follow-up questions with prepared answers). Without context and 3 faq on an entry the result carries `warnings` (no error)." +}
1 tool update
- Added
decisions
Related MCP Connectors
Place real phone calls and hold spoken conversations on a user's behalf, billed per minute.
Let AI agents place real phone calls from your verified number, with transcripts and recordings.
AI voice agents that make real phone calls: single calls or campaigns, with transcripts and notes.
Build and manage voice AI agents for real phone lines: assistants, calls, numbers and campaigns.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to place and manage outbound phone calls, handle inbound calls with a realtime voice agent, add live context, send DTMF digits, and retrieve structured call outcomes and transcripts.MIT

sidevoice-connectorofficial
AlicenseNot gradedqualityAmaintenanceEnables coding agents to participate in voice calls, speaking replies while continuing their work and accepting spoken input or interruptions within the same conversation. It delivers voice input into Claude Code, Codex, Cursor, or custom HTTP endpoint workflows.Apache 2.0- AlicenseBqualityBmaintenanceDials any LiveKit voice agent with an AI simulated caller and records a full forensic behavior log.127MIT
- AlicenseAqualityDmaintenanceManage voice AI agents, make calls, run campaigns, and control phone numbers through natural language.5814 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.