Skip to main content
Glama

Put a live call on hold

hold_call
DestructiveIdempotent

Place one leg of a live call on hold to stop its current interactions; resume later with the unhold action and XML URL that takes over.

Instructions

Put one leg of a LIVE call on hold (emulated: the leg is transferred to a hosted flow that loops music_url, or plays silence for up to an hour), so whatever that leg was doing stops. Resume with unhold_call and the XML URL that should take over; Vobiz cannot return to the exact point before the hold. To send the leg somewhere else use transfer_call; to silence audio you started with play_audio use stop_audio instead. HTTP mode with VOBIZ_PUBLIC_URL only; a call that is not live fails with call_not_active. Requires confirm: true.

Input Schema

NameRequiredDescriptionDefault
legsNoLeg to park: aleg (the call's first leg, default), bleg (the party bridged by <Dial>) or both. Give the same value to unhold_call.
confirmYesMust be true, set only after the user explicitly asked to put this call on hold. If your client supports MCP elicitation, the server asks the user to approve directly and this flag is not relied on; otherwise it is your attestation that the user approved.
call_uuidYesUUID of the LIVE call to act on: the request_uuid returned by make_call, or a UUID from list_live_calls.
music_urlNohttps .mp3/.wav to loop while on hold. Silence if omitted.

Output Schema

NameRequiredDescriptionDefault
okNoTrue on success. On a failure the result is isError with ok: false plus `error` (kind), `message`, `retryable` and sometimes `http_status`.
legsNoThe leg(s) the action was applied to (aleg when none was given).
on_holdNoTrue once Vobiz accepted the transfer into the hold flow.
emulatedNoAlways true: Vobiz has no native hold, so this is a transfer to a hosted hold flow.
call_uuidNoThe call UUID the action was applied to, echoed from the request.
http_statusNoHTTP status Vobiz answered with: 202 when an action was accepted, 204 when one was stopped.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv1.4.2
    • addedInput schema / properties / call_uuid / description
      Added value: +"UUID of the LIVE call to act on: the request_uuid returned by make_call, or a UUID from list_live_calls."
    • changedInput schema / properties / confirm / description
      Previous value: -"Must be true, set only after the user explicitly asked to put this call on hold."New value: +"Must be true, set only after the user explicitly asked to put this call on hold. If your client supports MCP elicitation, the server asks the user to approve directly and this flag is not relied on; otherwise it is your attestation that the user approved."
    • changedInput schema / properties / legs / description
      Previous value: -"Which call leg: aleg (default), bleg or both."New value: +"Leg to park: aleg (the call's first leg, default), bleg (the party bridged by <Dial>) or both. Give the same value to unhold_call."
    • changedInput schema / properties / music_url / description
      Previous value: -"Hold music (https .mp3/.wav). Silence if omitted."New value: +"https .mp3/.wav to loop while on hold. Silence if omitted."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "properties": {
      +    "call_uuid": {
      +      "description": "The call UUID the action was applied to, echoed from the request.",
      +      "type": "string"
      +    },
      +    "emulated": {
      +      "const": true,
      +      "description": "Always true: Vobiz has no native hold, so this is a transfer to a hosted hold flow.",
      +      "type": "boolean"
      +    },
      +    "http_status": {
      +      "description": "HTTP status Vobiz answered with: 202 when an action was accepted, 204 when one was stopped.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "legs": {
      +      "description": "The leg(s) the action was applied to (aleg when none was given).",
      +      "enum": [
      +        "aleg",
      +        "bleg",
      +        "both"
      +      ],
      +      "type": "string"
      +    },
      +    "ok": {
      +      "description": "True on success. On a failure the result is isError with ok: false plus `error` (kind), `message`, `retryable` and sometimes `http_status`.",
      +      "type": "boolean"
      +    },
      +    "on_hold": {
      +      "const": true,
      +      "description": "True once Vobiz accepted the transfer into the hold flow.",
      +      "type": "boolean"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observedv1.1.1

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, idempotentHint=true and openWorldHint, but the description adds critical context they don't carry: the hold is emulated via a hosted flow, Vobiz cannot resume to the exact prior point, HTTP mode with VOBIZ_PUBLIC_URL is required, and confirm:true attestation applies. This is informed disclosure beyond 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense single paragraph, front-loaded with purpose and mechanism before alternatives and constraints. Every sentence carries signal (behavior, resume path, alternatives, HTTP requirement, error, confirm), though the packed clause structure could be parsed as slightly heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return format needn't be explained. The description covers mechanism, irreversibility, resume path, alternatives, transport constraint, failure mode, and the confirm attestation, leaving nothing an agent needs to call it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 legs, confirm, call_uuid, and music_url in detail. The description reinforces the confirm requirement and the leg/Xml URL handoff to unhold_call, but adds little syntax or format meaning beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Put one leg of a LIVE call on hold') and immediately scopes it as emulated transfer-to-flow. It distinguishes the tool from unhold_call, transfer_call, and stop_audio by name, so an agent can route correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names alternatives and the conditions that select them: transfer_call for sending the leg elsewhere, stop_audio for silencing audio started with play_audio, unhold_call to resume. It also excludes non-live calls via the call_not_active error.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools