Dialyne
Server Details
Real phone calls in France for AI agents: dial +33 numbers, menus, hold, AI disclosure.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- dialyne/dialyne-mcp
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 12 tools
Each tool targets a distinct action on a distinct resource: placing single vs batch calls, reading one call vs listing vs batch progress, cancelling, scheduling a callback, answering vs holding a live question, transferring, and configuring identity. The descriptions explicitly disambiguate similar pairs (e.g. answer_call_question vs hold_call_question, get_call vs list_calls, place_phone_call vs place_batch_calls) and cross-reference the correct alternative. An agent can select the right tool without guessing.
All 12 names use consistent snake_case verb_noun form (place_phone_call, get_batch_calls, schedule_callback, transfer_call_to_user) with no camelCase or bare-verb outliers. Verb choices are meaningful and stable across the set (place/get/list/cancel/schedule/answer/hold/transfer/configure).
12 tools sits in the ideal range for an outbound-calling service, and every tool earns its place in the call lifecycle (place, follow, interact, cancel, retry, batch, identity, balance). No redundant or trivial tools inflate the surface.
The core lifecycle is fully covered: place single/batch calls, poll status, read transcripts, answer or hold live questions, transfer, cancel, schedule callbacks, configure identity, check balance. Minor gaps remain: no in-place modification/reschedule of an already scheduled call (must cancel and re-place), no batch-level cancel or bulk scheduling view beyond get_batch_calls, and no billing/history surface (credit top-up is deliberately out of scope).
Available Tools
12 toolsanswer_call_questionAnswer the voice agent's question during a callADestructiveInspect
Send the user's answer to a question the voice agent asked during a live call (shown by get_call as pending_question) and get confirmation that it was relayed. Compliance: the same rules as the task apply; an answer that threatens, impersonates someone, asks the callee for codes, card details or a transfer, or dictates a payment code or a full card with its security code is refused before anything is sent.
Use it only when get_call shows a pending_question. The answer is spoken to the person on the line, so it must be the user's real information or decision: if you do not know it, ask the user and relay their words; never invent personal details. If the callee asks for a code (SMS, verification, delivery), a password or a card detail, ask the user: they decide whether to give it (write it as [secret: value] so it is masked in stored transcripts) or to decline, or to take the call themselves with transfer_call_to_user. During a live call, answer quickly: after about 45 seconds without an answer (pending_question.seconds_left) the voice agent offers the callee a callback; if you need to ask your human, call hold_call_question first (one extra minute, only if the callee agrees). If the call then ended with the question still open and a callback is scheduled (get_call shows status retry_scheduled with a pending_question), the answer is still accepted: it is kept and given at the start of the callback (sending the same answer again is harmless). Any other ended call fails with wrong_call_state. Then continue with get_call.
| Name | Required | Description | Default |
|---|---|---|---|
| answer | Yes | The user's answer, as the voice agent should relay it to the callee (1-1000 characters), e.g. 'Indoors, please', 'The booking reference is AB-123-CD' or 'The code is [secret: 482913]'. | |
| call_id | Yes | The call_id of the live call (or of an ended call awaiting its callback with a pending_question). | |
| question_id | No | pending_question.question_id from get_call. Omit to answer the question currently pending. |
Output Schema
| Name | Required | Description |
|---|---|---|
| call_id | No | |
| next_step | No | |
| after_call | No | |
| answer_sent | No | |
| callback_at | No | |
| already_received | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses a lot: a pre-send refusal policy for prohibited answers, the ~45 second timing window, the one-minute hold extension requiring callee consent, callback retention behavior, and the wrong_call_state failure mode. What it leaves implicit is the irreversibility implied by destructiveHint=true — that a spoken answer cannot be retracted — and there is mild tension with idempotentHint=false when it says re-sending the same answer after a callback is harmless, though that claim is scoped to the ended-call case.
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 action and the usage gate are front-loaded in the opening two sentences, and every subsequent sentence carries operational content (compliance, secrets, timing, hold, callback, error). It is dense and long for a three-parameter tool, with the compliance clause folded into the first sentence rather than separated, which slightly hurts scanability.
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?
An output schema exists, so return values need no explanation, and the description covers the remaining risk surface: preconditions, refusal policy, sensitive-data handling, timing pressure, escalation paths, and the post-call state. An agent has everything needed to decide whether to call and how to phrase the answer.
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 100%, yet the description adds real semantics: the answer must be the user's actual information or decision rather than invented content, must not ask the callee for codes or card details, and can encode sensitive values as [secret: value] so transcripts mask them. It also ties question_id to pending_question.question_id from get_call, which is behaviourally more informative than the schema's 'omit to answer the question currently pending'.
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 first sentence states a specific verb and resource — send the user's answer to a pending question and return confirmation of relay — and anchors it to a concrete signal ('pending_question' from get_call). This makes it immediately distinguishable from hold_call_question, transfer_call_to_user, cancel_call, and get_call.
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 enabling condition ('Use it only when get_call shows a pending_question'), then routes to alternatives by situation: ask the human and use hold_call_question if time is short, or transfer_call_to_user if the callee wants to speak to the user. It also names the terminal follow-up ('Then continue with get_call') and clarifies the callback-after-end case where the tool still applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_callCancel a scheduled or live callADestructiveIdempotentInspect
Cancel a call that is scheduled or in progress (including a scheduled callback or automatic retry) and get the cancelled status back. Compliance: stops any further attempt to that number for this call; nothing is charged beyond the time already spoken.
A live call is hung up immediately; only the time already spoken is paid and the reserved credit is released. A scheduled call will not be placed. Use it when the user changes their mind or the task is no longer needed. Cannot be undone. Cancelling an already cancelled call has no further effect; a call that already ended cannot be cancelled.
| Name | Required | Description | Default |
|---|---|---|---|
| call_id | Yes | The call_id of the scheduled or live call to cancel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| call_id | No | |
| already_cancelled | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it destructive, idempotent, and mutating, and the description adds substance beyond that: it is irreversible, it stops any further attempt to the number for this call, billing is limited to time already spoken, and reserved credit is released. It also reconciles with idempotentHint=true by noting that re-cancelling is a no-op rather than implying reversibility.
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 action and scope lead the description, and the when-to-use and precondition sentences are short and purposeful. The billing point is stated twice ("nothing is charged beyond the time already spoken" and again in the live-call sentence), and the "Compliance:" fragment is slightly clipped, but neither obscures meaning.
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?
An output schema exists, so return values need no prose, and the description still signals that cancelled status comes back. For a one-parameter mutation it covers irreversibility, per-state behavior (live vs. scheduled), idempotency, and billing/compliance consequences, leaving nothing an agent needs before calling it.
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?
The single call_id parameter is fully documented in the schema (100% coverage), so the schema carries the weight. The description adds only that the identifier may refer to a scheduled or live call, which is marginal over the field description already present.
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 (cancel) and resource (a scheduled or live call), and explicitly enumerates what counts as cancellable: scheduled calls, in-progress calls, scheduled callbacks, and automatic retries. No sibling tool performs cancellation, so no disambiguation from siblings is required, and the note that the cancelled status is returned rounds out a complete picture of the operation.
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 positive trigger ("Use it when the user changes their mind or the task is no longer needed") as well as explicit exclusions: cancelling an already-cancelled call has no further effect, and a call that already ended cannot be cancelled. There is no sibling alternative that competes with this tool, so the missing "use X instead" clause is not a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_agent_identityRead or change how the voice agent introduces itselfAIdempotentInspect
Read or change how the voice agent introduces itself on the user's calls: name, tone, opening line, answer to "who is calling?", introduction and the AI mention in the opening. Compliance: the recommended settings (default) say "Hello, this is Léa, 's virtual assistant. I'm calling about…" and answer yes when asked if it is an AI (EU AI Act art. 50); the agent never denies being an AI, whatever the settings.
Call it with no argument to read the current identity, a preview of what the agent will say, and the warning. Name and tone can be changed freely. Any other change is a deviation from the recommended settings: the first attempt returns the warning (error responsibility_acceptance_required) and changes nothing. Show the warning text to the user word for word; only if the user explicitly accepts, call again with the same changes plus accept_responsibility=true and warning_version. The acceptance is logged with a timestamp and the user becomes responsible for those settings. Refused whatever the acceptance: texts claiming the agent is human, or presenting it as police, government or a bank.
When to use: the user asks to rename the agent, change how it introduces itself or its tone. When not to use: a one-off greeting for a single call (put it in place_phone_call's task instead). Side effects: changes the settings for every new call of the account (calls already scheduled keep their identity). Idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| tone | No | Tone of voice: 'warm' (recommended), 'neutral', 'formal' or 'upbeat'. Stays within the recommended settings. | |
| first_name | No | Name the voice agent gives (e.g. 'Lea'). Omit to keep the current one. Stays within the recommended settings. | |
| introduction | No | Custom answer when the callee asks who the agent is. Empty string = recommended. DEVIATION. | |
| opening_line | No | Custom opening line, spoken word for word when the callee answers, before the purpose of the call; may use {prenom} (agent name) and {operateur} (user's announced name). Write it in the language of the calls. Empty string = back to the recommended line. DEVIATION: needs the user's acceptance. | |
| warning_version | No | The warning.version the user accepted (from a previous call of this tool). | |
| reset_to_recommended | No | true: drop every deviation (keeps first_name and tone). | |
| accept_responsibility | No | Set true ONLY after you showed the user the warning text returned by this tool and the user explicitly accepted it in their own words. Never set it on your own initiative. | |
| ai_mention_in_opening | No | true (recommended): the opening line says the agent is a virtual assistant. false = DEVIATION. Either way the agent says yes if asked whether it is an AI. | |
| who_is_calling_answer | No | Custom answer when the callee asks who the agent is calling for. Empty string = recommended. DEVIATION. |
Output Schema
| Name | Required | Description |
|---|---|---|
| preview | No | |
| warning | No | |
| identity | No | |
| next_step | No | |
| deviations | No | |
| fixed_rule | No | |
| responsibility_accepted_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), it discloses the two-step responsibility-acceptance flow, the error code responsibility_acceptance_required, the fact that the first attempt changes nothing, that acceptance is logged with a timestamp, hard refusals (human-impersonation, police/government/bank), and account-wide side effects with scheduled calls retaining their identity. The only minor gap is that annotation-level claims like idempotency are restated rather than expanded, but the compliance workflow is far richer than 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?
Front-loaded with purpose, then compliance context, then invocation mechanics, then when/when-not and side effects — a logical progression with no filler sentences. It runs long, and the compliance paragraph could be tightened, but nearly every clause carries operational information the agent needs.
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 9-parameter mutation tool with compliance implications, the description covers read mode output (current identity, preview, warning), the acceptance handshake, refusal cases, and side-effect scope. An output schema exists, yet it still explains what the no-argument call returns, so 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?
With 100% schema coverage the baseline is 3, but the description adds workflow meaning the schema alone does not convey: which parameters are free (name, tone) versus deviations, and the required pairing of the same changes with accept_responsibility=true plus warning_version on retry. It reinforces reset_to_recommended keeping name and tone, though it does not restate each parameter individually.
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 pair (read/change) and resource (how the voice agent introduces itself), then enumerates the exact editable facets: name, tone, opening line, 'who is calling?' answer, introduction, AI mention. It is unmistakably distinct from siblings like place_phone_call or transfer_call_to_user.
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 an explicit 'When to use' (rename the agent, change introduction or tone) and an explicit 'When not to use' that names the alternative: a one-off greeting belongs in place_phone_call's task. It also tells the agent how to invoke read mode (no argument).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_balanceGet remaining call timeARead-onlyIdempotentInspect
Read the remaining call time on this account and get the minutes of conversation left on the prepaid credit (subscription minutes included, with their expiry date) and the account limits (simultaneous calls, calls per day). Compliance: read-only; no payment can be made from here (only the account owner adds credit, in the web app).
Use it before a long call (e.g. one with a long hold) or after place_phone_call failed for insufficient credit. Read-only. Credit cannot be added from here: if it is low, tell the user to add credit from their account in the web app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| plan | No | |
| limits | No | |
| billing | No | |
| max_calls_per_day | No | |
| talk_minutes_left | No | |
| price_per_minute_eur | No | |
| subscription_minutes | No | |
| max_simultaneous_calls | No | |
| subscription_minutes_expire_on | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, and the description reinforces that with a remediation path: credit cannot be added from here, so the agent must redirect the user to the web app. That 'what to do instead' detail is genuine added value beyond the structured fields, though it doesn't cover freshness or staleness of the reported balance.
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 content is front-loaded and useful, but the text repeats itself: 'read-only' appears twice, and the 'credit cannot be added here / tell the user to add credit in the web app' instruction is stated twice in near-identical wording. Trimming the duplicate clause would tighten it without losing 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 needn't explain return formatting, and it doesn't try to. Given zero parameters and strong annotation coverage, the definition supplies everything needed — purpose, triggers, and the follow-up action — for an agent to call it correctly.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline for a no-parameter tool applies, and the description correctly spends its words on return-content scope instead of inventing argument 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?
The description names a specific verb ('Read') and resource ('remaining call time on this account') and enumerates exactly what is returned: minutes left on prepaid credit with expiry date, plus account limits (simultaneous calls, calls per day). No sibling tool in the list queries balance, so an agent can immediately see this is not a call-control 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 states two concrete trigger conditions: before a long call (explicitly, one with a long hold) and after place_phone_call fails for insufficient credit. It also states the boundary action — tell the user to top up in the web app rather than trying to do it here — so the agent knows what to do next, not just when to call this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_batch_callsGet the progress of a batch of callsARead-onlyIdempotentInspect
Get the progress and results of a batch of calls: counts by status, successes, refused numbers and, for each call, its call_id, status, outcome and summary. Compliance: read-only, limited to this account's own batches.
Use it after place_batch_calls to report results to the user. Read-only. For one call's transcript, use get_call with response_format='detailed'. To stop a single call, use cancel_call.
| Name | Required | Description | Default |
|---|---|---|---|
| batch_id | Yes | The batch_id returned by place_batch_calls (e.g. 'lot_…'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| calls | No | |
| total | No | |
| status | No | |
| refused | No | |
| batch_id | No | |
| by_status | No | |
| next_step | No | |
| succeeded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered structurally. The description adds a scope constraint beyond the annotations — results are limited to this account's own batches — which is genuinely useful for an agent reasoning about visibility. It does not add pagination, latency or staleness behavior, so not a 5.
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 return contents, then sequencing, then alternatives — a sensible order. Minor waste: read-only is stated twice (in the compliance line and again as a standalone 'Read-only.'), and the trailing alternative-routing sentences could be tightened. Still well under the length where it becomes costly.
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?
An output schema exists, so return values need not be fully specified, yet the description still summarizes them usefully. For a single-parameter read tool with full annotation coverage, nothing an agent needs in order to call it correctly — sequencing, scope, alternatives — 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 100% and the single batch_id parameter is documented with its origin and an example format ('lot_…'), so the schema does the heavy lifting. The description mentions the batch only implicitly via its relationship to place_batch_calls and adds no format or edge-case detail (e.g. invalid or expired batch_id) beyond the schema. 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?
States a specific verb+resource (get progress/results of a batch of calls) and enumerates exactly what comes back: status counts, successes, refused numbers, plus per-call call_id, status, outcome and summary. An agent can distinguish it from get_call or list_calls 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 explicit sequencing ('use it after place_batch_calls to report results to the user') and names two alternatives with the conditions that select them: get_call with response_format='detailed' for a transcript, cancel_call to stop a single call. This is exactly the when/when-not/alternative guidance the dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_callGet call status and resultARead-onlyIdempotentInspect
Get the status and written result of a call placed with place_phone_call (outcome, summary, pending question, transcript on request), optionally waiting for news. Compliance: read-only; transcripts are text only (no audio is recorded) and are kept 90 days at most.
Use it to follow a call in progress (repeat until done=true), to see whether the voice agent is waiting for the user's answer (pending_question), and to read the final outcome and summary to report to the user. Read-only: it never places, changes or ends a call.
Returns: status (scheduled, in_progress, retry_scheduled, completed, cancelled, failed), done, outcome (success, failed, voicemail, no_answer, busy, callback_requested, callee_objected), summary, pending_question {question_id, text}, new events since after_event_id, last_event_id and next_step. A call that is busy or not answered is retried automatically (status retry_scheduled), except on lines where every call needs a new request from the user (event callback_suggested: ask the user). callee_objected means the person asked not to be called again: the transcript was deleted and the number can no longer be called; tell the user.
| Name | Required | Description | Default |
|---|---|---|---|
| call_id | Yes | The call_id returned by place_phone_call or list_calls (e.g. 'mis_…'). | |
| wait_seconds | No | Seconds (0-50) to wait for news before returning: returns early when the callee answers, the call goes on hold, the voice agent asks a question, a transfer progresses or the call ends. Use 20-30 while a call is in progress, 0 for an instant snapshot. | |
| after_event_id | No | Return only events after this id: pass last_event_id from the previous get_call response. 0 = from the start. | |
| response_format | No | 'concise' (default): status, outcome, summary, pending question and key events. 'detailed': also every transcript line, talk and hold durations, attempts and scheduled time. | concise |
Output Schema
| Name | Required | Description |
|---|---|---|
| done | No | |
| events | No | |
| status | No | |
| call_id | No | |
| outcome | No | |
| summary | No | |
| attempts | No | |
| language | No | |
| next_step | No | |
| transcript | No | |
| latest_line | No | |
| hold_seconds | No | |
| phone_number | No | |
| last_event_id | No | |
| scheduled_for | No | |
| pending_question | No | |
| talk_seconds_billed | No | |
| new_transcript_lines | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses non-obvious behavior: automatic retry with status retry_scheduled, the exception for lines requiring a new user request, transcript retention of 90 days, text-only transcripts with no audio, and that callee_objected deletes the transcript and blocks the number.
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 when-to-use guidance is front-loaded and valuable, but the Returns paragraph enumerates status, outcome and event fields that the output schema already carries, making the definition longer than necessary without adding proportional value.
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 polling tool, the definition covers the complete loop an agent needs: how to poll, when to stop, how to consume events via last_event_id, how retries surface, and the exceptional terminal states. Nothing needed to invoke 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 100%, so call_id, wait_seconds, after_event_id and response_format are already fully documented with ranges, defaults and examples. The description only adds light context ('optionally waiting for news', 'transcript on request') that maps loosely to wait_seconds and response_format, so 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 sentence names a specific verb and resource (get the status and written result of a call) and ties it to the originating tool place_phone_call, making the relationship to siblings like list_calls or place_phone_call unambiguous.
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 concrete usage patterns: poll repeatedly until done=true to follow a call in progress, check pending_question, and read the final outcome. It also sets explicit boundaries ('it never places, changes or ends a call') and explains what to do on event callback_suggested and on callee_objected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hold_call_questionAsk the callee for one more minute to answer the agent's questionAInspect
Get one more minute to answer the voice agent's pending question: the request is passed to the voice agent, which asks the callee. Compliance: the extension happens ONLY if the callee agrees; the voice agent asks them politely and never makes anyone wait more than 2 minutes in total for one question.
Use it as soon as get_call shows a pending_question you cannot answer yourself (you need to ask your human): call hold_call_question first, then ask your human. Once per question (+60 seconds). The voice agent asks the callee "can you hold for another minute, or shall I call you back?": if they agree, pending_question.seconds_left grows by 60; if they would rather be called back, the agent arranges a callback and your answer, sent later with answer_call_question, is given at the callback. Follow it with get_call (event question_hold: accepted, callee_prefers_callback or not_possible). Not for a finished call, nor when you already know the answer (just answer).
| Name | Required | Description | Default |
|---|---|---|---|
| call_id | Yes | The call_id of the live call whose voice agent is waiting for an answer. | |
| question_id | No | pending_question.question_id from get_call. Omit for the question currently pending. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hold | No | |
| call_id | No | |
| next_step | No | |
| question_id | No | |
| seconds_left | No | |
| extra_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the coarse profile (not read-only, not idempotent, open-world), while the description supplies the real behavior: the request is relayed through the voice agent to the callee, the extension is conditional on consent, it is allowed once per question, seconds_left grows by 60, and total wait per question is capped at 2 minutes. It also discloses the failure/branch outcomes (accepted, callee_prefers_callback, not_possible) and that a callback reschedules when the answer is delivered.
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 purpose, then trigger, then mechanics, then exclusions — a sensible order. It is somewhat long and repeats the relay idea ('the request is passed to the voice agent, which asks the callee' then later quoting the agent's phrasing), but almost every sentence carries operational detail.
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 with annotations and an output schema, the description covers trigger, sequencing, consent semantics, the size and limit of the extension, and the follow-up event to look for. Nothing an agent needs in order to call it correctly at the right moment 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 100%, so the baseline is 3, but the description adds that call_id must reference a live call whose agent is waiting and that question_id ties the hold to a single pending_question from get_call (hence the once-per-question limit). Those constraints on valid values go slightly beyond the schema text.
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 the specific action (extend the answer window by one minute) applied to the specific resource (the voice agent's pending question on a live call), and distinguishes it from answer_call_question and get_call by role in the workflow. An agent can tell from the first sentence alone what this does and what it does not do.
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 concrete trigger ('as soon as get_call shows a pending_question you cannot answer yourself'), an explicit sequence (call hold_call_question first, then ask your human, then answer_call_question), and negative cases ('not for a finished call, nor when you already know the answer — just answer'). The alternative path when the callee prefers a callback is also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_callsList callsARead-onlyIdempotentInspect
List this account's calls, newest first, and get for each one its call_id, phone number, status, outcome, task and one-line summary. Compliance: read-only, limited to this account's own calls; transcripts older than 90 days are deleted.
Use it to find a call_id, to check whether a number was already called recently before placing a new call, or to answer questions such as 'what happened with my call to the garage?'. Read-only. For the full result and transcript of one call, use get_call with response_format='detailed'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of calls returned (1-50). | |
| query | No | Optional text searched in the task, the summary, the transcript and the phone number (e.g. 'garage', '0561'). Empty = all calls. | |
| outcome | No | Optional filter on the call outcome. |
Output Schema
| Name | Required | Description |
|---|---|---|
| calls | No | |
| total | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, yet the description still adds real context: account-scoping, newest-first ordering, and the 90-day transcript retention window that limits what the transcript search can reach. It does not explain pagination behavior (no cursor/offset exists, limit caps at 50), which an agent retrieving many calls would need to know.
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 scope, ordering and returned fields, then use cases, then the alternative — a sensible information order. It wastes some space by asserting read-only twice ("Compliance: read-only" and a trailing "Read-only."), both redundant with the annotations.
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?
An output schema exists, so the field list is supporting rather than load-bearing, and the description still covers scope, retention limits, ordering, use cases and the detailed alternative. For a read-only, non-paginated listing tool, 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 description coverage is 100%, so limit, query and outcome are already fully documented in the schema, and the baseline applies. The description adds only an oblique hint about text search via the "garage" question example; it adds no syntax, default, or interaction details 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?
States a specific verb and resource ("List this account's calls"), specifies ordering ("newest first") and enumerates the returned fields (call_id, phone number, status, outcome, task, summary). It also names the sibling it is not — "For the full result and transcript of one call, use get_call" — so an agent can distinguish 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?
Gives three concrete use cases (find a call_id, check whether a number was already called recently, answer "what happened with my call to the garage?") and routes single-call detail work to get_call with a specific parameter value. It does not address the close sibling get_batch_calls or state when this tool should be avoided, so the exclusions are incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_batch_callsPlace the same call to a list of numbers in FranceADestructiveInspect
Place the same call to a list of numbers in France (Pro and Enterprise plans) and get back a batch_id with one call_id per number. Compliance: the AI disclosure is always made; marketing, prospecting, surveys and mass calling of people who did not expect it are unlawful and refused; anti-harassment limits per number apply.
Use it when the user explicitly asks to make the same kind of call to several numbers they provide (e.g. confirm tomorrow's appointments with their own customers, ask several garages for a quote). The account's limits apply: calls run a few at a time (simultaneous-call limit; the rest wait their turn), the batch is refused if it exceeds the calls left for the last 24 hours, automatic retries and calls still waiting 15 minutes after the requested time stay within 08:00-21:00 callee's time. Each call is paid like a single call. Returns immediately; follow it with get_batch_calls, or each call with get_call. Particulier accounts get plan_feature_required: tell the user.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional batch name, e.g. 'Tuesday appointment confirmations'. | |
| task | Yes | The same task for every call, as in place_phone_call (goal, on whose behalf, facts, limits). Never marketing or prospecting. | |
| voice | No | Optional voice; omit for the account default. | |
| language | No | Language of the calls; omit for the account default. | |
| scheduled_at | No | When to start (ISO 8601 with time zone). Omit to start now. | |
| phone_numbers | Yes | Numbers to call, French only, copied as given ('01 42 00 00 00' or +33…); 100 at most. Duplicates and invalid numbers are skipped and listed in refused. Every number must come from the user. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| calls | No | |
| total | No | |
| status | No | |
| refused | No | |
| batch_id | No | |
| by_status | No | |
| next_step | No | |
| succeeded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as destructive, open-world and non-idempotent, yet the description still adds substantial operational context: the AI disclosure is always made, per-number anti-harassment limits, a simultaneous-call limit with queueing, refusal when exceeding the 24-hour quota, retry and 15-minute-wait behavior inside the 08:00-21:00 window, and per-call billing. What it does not clarify is the partial-failure semantics of a batch beyond pointing to a 'refused' list, which keeps it from a 5.
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 return value are front-loaded, and nearly every sentence carries operational fact rather than filler. The compliance and timing sentences are dense and slightly run-on (the 15-minute/08:00-21:00 clause is hard to parse on first read), which costs a point but does not obscure the core instruction.
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 high-stakes bulk outbound-calling tool with six parameters and an output schema, the definition covers purpose, legality, quota and concurrency behavior, billing, return handling and plan gating. Since an output schema exists, the description need not enumerate return fields, and nothing an agent needs in order to call this safely 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 100%, so the baseline is 3, but the description genuinely adds meaning: task must mirror place_phone_call and never be marketing, phone_numbers are French-only, capped at 100, echoed as given, and duplicates/invalid entries are skipped and returned in 'refused'. That last point is behavioral detail the schema does not convey.
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 ('Place the same call to a list of numbers in France') and immediately discloses the return shape (batch_id plus one call_id per number). It also distinguishes itself from the sibling place_phone_call by describing itself as the same task applied to many numbers, so an agent can choose between them without inspecting 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 explicit triggering conditions ('when the user explicitly asks to make the same kind of call to several numbers they provide') with two concrete examples, plus exclusion rules (marketing, prospecting, surveys, mass calling refused) and a recovery path for non-Pro accounts (plan_feature_required). It also names the follow-up tools, get_batch_calls and get_call, closing the loop on what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_phone_callPlace a phone call in FranceADestructiveInspect
Place a real outbound phone call to a number in France (+33) and get back a written result: a voice agent carries out the task you describe (book a table, move an appointment, ask a business a question, follow up on an order or a claim). Compliance: the service's rules require the voice agent to disclose it is an AI assistant at the start of every call (EU AI Act art. 50), and calls are placed only on the user's explicit request. The only exception is a callee the user confirms already knows an AI will call (ai_disclosure; not recommended).
The voice agent opens by saying it is an AI assistant calling on behalf of the user; if the callee objects to the call, it ends the call politely and the number is never called again by this service. It navigates phone menus (voice or keypad), waits on hold and talks with the person who answers. No audio is returned or recorded: you get a written outcome, a summary and, on request, the transcript (text kept 90 days at most).
When to use: the user explicitly asked you to phone a specific French business or person, and the number and the task are confirmed.
Number found by you: if the number did not come from the user (you found it by web search, in memory or in a document), STOP before calling: show the number to the user, ask "Shall I call this number?" and call only after they confirm in a later message.
Missing details: do not quiz the user for every detail before calling. Give the facts you already have in task; if the callee asks for something the user did not give, get_call shows it as pending_question and you ask the user then.
When not to use: marketing, sales prospecting, surveys, debt collection, mass or repeated calling (unlawful in France and refused); impersonating another person, an authority or a bank; threats or harassment; asking the callee for their codes, passwords, card details or a money transfer, gift cards or crypto (claiming money owed to the user is fine); dictating a payment code (3-D Secure, voucher) or a full card number with its security code; emergencies (emergency numbers are refused: tell the user to dial them directly). When you decline, tell the user why in one sentence (e.g. prospecting calls are unlawful in France and refused by this service).
Codes and payment details: the user decides what to give. A verification code, password or card number the user gives you may go in task or in answer_call_question; good practice is to share it only when the call needs it, mark it [secret: value], and prefer transfer_call_to_user for a payment.
Behavior: places a real call that cannot be taken back once answered. It is paid from the account's prepaid credit, per second of conversation; busy or unanswered calls are free and retried once after 15 minutes, within 08:00-21:00 callee's time (on lines where every call needs a new request from the user, get_call shows callback_suggested instead: ask the user before calling again). The call is placed now (or at scheduled_at) whatever the hour: the user decides. Returns immediately with a call_id while the call runs in the background (usually 1-10 minutes): then call get_call (wait_seconds=25) until done=true, answer any pending_question with answer_call_question within 45 seconds (hold_call_question asks the callee for one more minute), and report the outcome and summary to the user. To retry safely after an error or timeout, reuse the same idempotency_key.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | What the call must achieve, in plain English or French (10-2000 characters): the goal, on whose behalf (the user's name), the facts the callee may ask for (dates, booking or customer references) and the limits (what to accept or refuse, e.g. 'any time 19:30-21:00 is fine, no deposit'). The voice agent follows it, including giving a code or card detail the user chose to share; write such a value as [secret: value] so it is masked in stored transcripts and logs (card numbers are masked automatically). Refused: asking the callee for codes, passwords, card details or a money transfer (claiming money owed to the user is fine), and dictating a payment code or a full card number with its security code. | |
| voice | No | Optional voice: '1' Solène (female, calm), '2' Gaspard (male, warm), '3' Coralie (female, lively), '4' Marius (male, deep), '5' Bella (female, premium, most expressive). Omit to use the account default. | |
| language | No | Language spoken on the call: 'fr' (French), 'en' (English) or 'auto' (starts in French, switches to English if the callee speaks English). Omit to use the account default (usually French). | |
| phone_number | Yes | Number to call, French only. Copy it exactly as the user or the source wrote it: national format '01 42 00 00 00' is accepted and converted for you, so do not rewrite it yourself; E.164 '+33' followed by 9 digits (e.g. +33142000000) also works. Landlines (01-05, 09) and mobiles (06, 07) are allowed; emergency, short and premium-rate numbers are refused. A number you found yourself must be confirmed by the user before you call. | |
| scheduled_at | No | When to PLACE the call (not the time of the booking or appointment: that goes in task). Omit to call now, the normal case. Only for a call the user wants placed later, e.g. 'call the vet tomorrow at 10': ISO 8601 with time zone, e.g. 2026-11-03T14:00:00+01:00. The call is placed at that time, whatever the hour: the user decides. | |
| ai_disclosure | No | 'standard' (default, recommended): the voice agent says it is an AI assistant in its opening line. 'callee_already_informed': leave that mention out of the opening line. Before using it, explain to the user that removing the AI disclosure is not recommended and is allowed ONLY when the person called already knows they will talk to an AI (e.g. a relative the user warned beforehand); use it only if the user then confirms it, and put their confirmation in callee_informed_confirmation. Never use it on your own initiative. Even then the voice agent never denies being an AI, tells the truth if asked, and announces it is an AI if someone else answers. Every use is logged. | standard |
| outside_hours | No | Obsolete, accepted and ignored: no calling-hours window is imposed any more. Omit it. | |
| voice_settings | No | Optional tuning, only if the user asks for it (omit otherwise: the account settings, already optimal, apply). Basic: address_form 'vous' (default) or 'tu'; expressiveness 'natural' (default) or 'plain'; hesitations (default true, light 'alors…'); background 'none' (default), 'office', 'cafe', 'street', 'outdoor'; voicemail 'leave_message' (default) or 'hang_up'. Advanced (bounded, else rejected): response_delay 0.7-1.5 s step 0.1 (max wait before answering, default 1.0); silence_prompt_after 4-10 s (says 'Allô ?' after a silence, default 6); interruption_min_speech 0.3-1.0 s (default 0.5); model 'v4_turbo' (default) or 'flash_v2_5'; stability 0.30-0.60; similarity 0.50-0.90; human_touch 0.05-0.40 (hesitation density); background_volume 0.03-0.20; flash only: style 0-0.30, speed 0.90-1.10, speaker_boost. The AI disclosure is never altered. | |
| idempotency_key | No | Optional unique key (letters, digits, '-', '_', '.', ':'; max 64) for this call request. Retrying with the same key within 24 h returns the original call instead of placing a second one. | |
| callee_informed_confirmation | No | Required with ai_disclosure='callee_already_informed' (10-300 characters): the user's confirmation, in their words, of who the callee is and how they know an AI will call (e.g. 'My sister Lea, I told her this morning an AI would call her for me'). Kept as proof. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| call_id | No | |
| outcome | No | |
| summary | No | |
| language | No | |
| next_step | No | |
| phone_number | No | |
| scheduled_for | No | |
| duplicate_request | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, openWorldHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is partly given. The description still adds substantial non-schema behavior: an irreversible real call once answered, per-second prepaid billing, free retry of busy/unanswered calls after 15 minutes, a 08:00-21:00 window that does not block scheduled calls, background execution returning a call_id within 1-10 minutes, and the 45-second answer window. The apparent tension between destructiveHint/idempotentHint=false and the recommended reuse of idempotency_key is a per-request idempotency semantics point, not a contradiction.
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?
It is long, but front-loaded with the purpose and organized into clear labeled blocks (Compliance, When to use, When not to use, Codes and payment details, Behavior) that match the decision path of a high-stakes mutation tool. Some content is duplicated with the task parameter description (the refused-payment list appears twice), which is the main thing keeping it from a 5.
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 destructive, open-world, paid, asynchronous tool with 10 parameters, the description covers authorization (explicit user request), compliance (EU AI Act art. 50), cost, irreversibility, the full async follow-up loop, and retry strategy. An output schema exists, so it does not need to explain return values, and it stays appropriately high-level there.
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 baseline is 3 and the schema already carries voice personality labels, language modes, phone format rules and voice_settings ranges. The description adds cross-cutting semantics the schema cannot: the [secret: value] masking convention, why the AI disclosure default should not be changed, and the requirement to confirm a self-found number before calling.
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 specific verb and resource ("Place a real outbound phone call to a number in France (+33)") plus the return form ("a written result"), and the parenthetical lists concrete tasks (book a table, move an appointment). It is clearly distinguishable from siblings like place_batch_calls and get_call, which the description also names later.
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?
There are explicit when-to-use criteria (user explicitly asked, number and task confirmed) and explicit when-not-to-use rules (prospecting, surveys, debt collection, impersonation, emergencies, refusing to reveal codes). It also routes the agent to siblings by name: get_call for polling/pending_question, answer_call_question within 45 seconds, hold_call_question, transfer_call_to_user for payments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_callbackSchedule a callback of a finished callADestructiveInspect
Schedule a new attempt of a finished call (same number, same task) at the time the user chose and get the scheduled time back, for instance when the callee said 'call back tomorrow after 3 pm'. Compliance: only on the user's request; limited to 3 callbacks within 14 days, at the exact time the user chose (no calling-hours window); turned off on lines where every call needs a new request from the user (error callbacks_disabled).
Use it only after get_call shows done=true. To call another number or do a different task, use place_phone_call instead. The time is kept as given (at least 2 minutes from now); at most 14 days ahead and 3 callbacks per call. A real call will be placed at that time and paid like any call; cancel it with cancel_call.
| Name | Required | Description | Default |
|---|---|---|---|
| call_id | Yes | The call_id of a finished call (status completed). | |
| callback_at | Yes | When to call again, ISO 8601, e.g. 2026-11-04T15:00:00+01:00 (without a time zone, Europe/Paris is assumed). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| call_id | No | |
| next_step | No | |
| scheduled_for | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' destructive/openWorld flags, it discloses the real-world consequences an agent cannot infer: a real paid call will be placed, limits of 3 callbacks per call within 14 days, a minimum 2-minute and maximum 14-day lead time, no calling-hours window, and a named failure mode 'callbacks_disabled'. It also names cancel_call as the reversal path, which is exactly the context destructiveHint alone does not supply.
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 is front-loaded, then compliance, then routing to siblings, then limits — a sensible priority order with no filler. The compliance sentence is dense but all of it is load-bearing; a small trim of the overlapping time-window statements (repeated in the compliance and limits sentences) would tighten it.
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 destructive, open-world scheduling mutation with only two parameters, the description covers preconditions, limits, cost, failure mode, and reversal. The output schema handles the returned scheduled time, which the description points at without duplicating.
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 100%, including the ISO 8601 format and the Europe/Paris default, so the description need not restate syntax. It still adds binding constraints on callback_at that the schema lacks ('at least 2 minutes from now', 'at most 14 days ahead') and clarifies that the number and task are inherited from call_id rather than passed. Slightly redundant on 'the time is kept as given'.
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 ('Schedule a new attempt of a finished call (same number, same task)') and immediately distinguishes the two nearest siblings: get_call as a precondition and place_phone_call for a different number or task. An agent can pick it out of the sibling list without opening any 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 an explicit precondition ('only after get_call shows done=true'), an explicit alternative ('To call another number or do a different task, use place_phone_call'), and a compliance gate ('only on the user's request'), plus the closing instruction to use cancel_call to undo. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_call_to_userTransfer a live call to the userADestructiveInspect
Transfer a live call to the user's own phone so they can talk to the callee themselves, and get the transfer request confirmed. Compliance: the voice agent tells the callee it is handing over to the person it calls for; recommended whenever a payment or sensitive data is needed.
The voice agent tells the callee it is passing the call over, rings user_phone_number, connects both sides without hanging up, then leaves the call. Use it only when the user asked to take over the conversation (or accepted when you offered) and can pick up their phone now. Fails if the call is not in progress. Follow progress with get_call: transfer events go requested → ringing → connected (or failed, in which case the voice agent stays on the line).
| Name | Required | Description | Default |
|---|---|---|---|
| call_id | Yes | The call_id of the live call to hand over. | |
| user_phone_number | Yes | The user's own phone number to ring, French only (+33…, mobile 06/07 accepted), e.g. +33612345678. |
Output Schema
| Name | Required | Description |
|---|---|---|
| call_id | No | |
| transfer | No | |
| next_step | No | |
| user_phone_number | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructive and open-world, and the description adds behavior beyond that: the precise handover sequence (announce to callee, ring user_phone_number, bridge both sides, then leave), the event lifecycle requested → ringing → connected/failed, and the critical fallback that on failure the voice agent stays on the line.
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 compliance rationale are front-loaded, and the operational sequence follows logically. It runs slightly long with a trailing line break and some redundancy between the failure clause and the event-progression sentence, but every sentence carries actionable content.
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 destructive, open-world handover tool with an output schema, this covers preconditions, side effects, failure handling, and post-call monitoring via get_call. Nothing an agent needs before invoking it 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 100%, so both parameters are already documented, but the description adds meaning by tying user_phone_number to the ring step and call_id to 'the live call to hand over'. The French-only number format is left to the schema, which is acceptable given full coverage.
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 first sentence names a specific verb and resource: transferring a live call to the user's own phone so they can talk to the callee. It is unmistakable against siblings like place_phone_call or get_call, which neither transfer an existing live call nor target the user's own number.
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 triggers ('recommended whenever a payment or sensitive data is needed'), explicit preconditions ('only when the user asked to take over... and can pick up their phone now'), an explicit failure condition ('Fails if the call is not in progress'), and routes progress-checking to get_call.
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.
12 tool updates
- First observed
answer_call_question - First observed
cancel_call - First observed
configure_agent_identity - First observed
get_account_balance - First observed
get_batch_calls - First observed
get_call - First observed
hold_call_question - First observed
list_calls - First observed
place_batch_calls - First observed
place_phone_call - First observed
schedule_callback - First observed
transfer_call_to_user
Related MCP Connectors
Real US phone calls for AI agents: navigates phone menus, waits on hold, returns transcripts.
Real phone calls for AI agents: Spain, Mexico, US, Canada, Latin America, UK, EU. From 0.25 USD/min.
Give your AI agent a phone: place calls, navigate IVRs, wait on hold, get structured answers.
AI voice agents that make real phone calls: single calls or campaigns, with transcripts and notes.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to place real phone calls, navigate IVR trees, and retrieve structured answers with transcripts and recordings.MIT
- AlicenseAqualityCmaintenanceVirtual phone number platform for AI agents — rent numbers across 200+ countries, receive SMS, and manage the full activation lifecycle.6267 npm4MIT
- AlicenseAqualityAmaintenanceMake phone calls and join Zoom, Microsoft Teams and Google Meet meetings from any AI agent. A self-hosted, open-source voice agent that calls businesses and people through your own SignalWire or Twilio number, joins meetings as a bot that answers when spoken to, says it is an AI, and returns the outcome, decisions, action items and transcript.142Apache 2.0

Deyaho Phone Calls MCPofficial
AlicenseNot gradedqualityCmaintenanceEnables any AI to place real phone calls in Spain and Mexico with an AI voice agent, then retrieve call status, summaries, collected data, and transcripts.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.