Skip to main content
Glama

Call and speak

request_speak

Dials the number and the assistant handles the errand on the phone. Business plan. Takes a structured brief only (call describe_errand_template for the fields); free text is refused. A bad brief lists every missing and invalid field at once. The assistant introduces itself with the name in the user's Widely AI assistant settings, or brief.assistant_name; with neither the call is refused (set it with set_assistant_name). It agrees only to allowed_commitments, leaves a voicemail by default, and always ends with a thank-you and goodbye. Returns immediately with the task and call ids.

Input Schema

NameRequiredDescriptionDefault
briefYesThe structured errand brief. destination may be given here or at the top level.
destinationNoNumber to call. brief.destination wins when both are set.
identity_idNoOptional. You may set it. If you omit it, Widely picks the caller ID. If you set it, it must be an identity_id from list_identities, one of the user's own. Never invent another number.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / brief / properties / intent
      Added value: +{
      +  "description": "Optional. Why you are calling, in one sentence. If you leave it out, the opening line is used, then who the call is for.",
      +  "maxLength": 300,
      +  "type": "string"
      +}
    • addedInput schema / properties / brief / properties / time_limit
      Added value: +{
      +  "description": "Optional. Minutes the assistant has for this call. If you leave it out, limits.max_call_minutes is used when that is set, otherwise 5.",
      +  "maximum": 120,
      +  "minimum": 1,
      +  "type": "integer"
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / brief / properties / caller_identity_id / description
      Previous value: -"Optional identity id. Omit it and Widely picks the caller ID the same way the app does."New value: +"Optional. You may set it. If you omit it, Widely picks the caller ID. If you set it, it must be an identity_id from list_identities, one of the user's own. Never invent another number."
    • changedInput schema / properties / identity_id / description
      Previous value: -"Optional identity id. Omit it and Widely picks the caller ID the same way the app does."New value: +"Optional. You may set it. If you omit it, Widely picks the caller ID. If you set it, it must be an identity_id from list_identities, one of the user's own. Never invent another number."
  3. Changed6 schema fields changed
    • addedInput schema / properties / brief
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The structured errand brief. destination may be given here or at the top level.",
      +  "properties": {
      +    "allowed_commitments": {
      +      "description": "The only things the assistant may agree to, e.g. 'accept any slot Tue–Thu after 14:00'. For anything else it says it will check and come back, and lists it in the report. Payments, contracts and cancellations are never allowed.",
      +      "items": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "assistant_name": {
      +      "description": "Optional. The name the assistant uses on this call instead of the AI assistant settings name.",
      +      "maxLength": 40,
      +      "type": "string"
      +    },
      +    "callback": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "events": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "webhook_url": {
      +          "description": "https URL for task events.",
      +          "format": "uri",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "callee_is_business": {
      +      "description": "Optional. True when the callee is a business.",
      +      "type": "boolean"
      +    },
      +    "callee_name": {
      +      "description": "Who you are calling, e.g. 'FedEx UK Import Clearance' or 'Dr Cohen's clinic'.",
      +      "maxLength": 120,
      +      "type": "string"
      +    },
      +    "caller_identity_id": {
      +      "description": "Optional identity id. Omit it and Widely picks the caller ID the same way the app does.",
      +      "maxLength": 64,
      +      "type": "string"
      +    },
      +    "client_reference": {
      +      "description": "Your own reference.",
      +      "maxLength": 100,
      +      "type": "string"
      +    },
      +    "connect_user": {
      +      "default": false,
      +      "description": "When true, the assistant asks the callee to hold at the end, rings the user's phones into the call, and leaves.",
      +      "type": "boolean"
      +    },
      +    "destination": {
      +      "description": "Number to call, E.164 (+44…, +972…, +1…) or local. Emergency and premium-rate numbers are refused.",
      +      "maxLength": 32,
      +      "type": "string"
      +    },
      +    "escalation": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "blockers": {
      +          "items": {
      +            "enum": [
      +              "verification_failed",
      +              "asks_for_account_holder",
      +              "payment_requested",
      +              "legal_or_dispute",
      +              "callee_requests_human",
      +              "unknown_fact_needed"
      +            ],
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "mode": {
      +          "default": "on_blocker",
      +          "enum": [
      +            "never",
      +            "on_request",
      +            "on_human",
      +            "on_blocker"
      +          ],
      +          "type": "string"
      +        },
      +        "notify": {
      +          "default": "app",
      +          "enum": [
      +            "app",
      +            "whatsapp",
      +            "both"
      +          ],
      +          "type": "string"
      +        },
      +        "ring_user_after_seconds": {
      +          "default": 60,
      +          "maximum": 600,
      +          "minimum": 0,
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "facts_to_collect": {
      +      "description": "Questions to ask and the information to bring back.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "confirm_back": {
      +            "default": true,
      +            "type": "boolean"
      +          },
      +          "description": {
      +            "description": "The question to ask or the information needed.",
      +            "maxLength": 300,
      +            "type": "string"
      +          },
      +          "key": {
      +            "pattern": "^[a-z0-9_]{1,40}$",
      +            "type": "string"
      +          },
      +          "required": {
      +            "default": true,
      +            "type": "boolean"
      +          },
      +          "type": {
      +            "default": "string",
      +            "enum": [
      +              "string",
      +              "number",
      +              "date",
      +              "boolean",
      +              "money",
      +              "reference"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "description"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    "facts_to_give": {
      +      "description": "Facts the assistant may give. Card numbers, CVVs, PINs and passwords are refused.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "disclose": {
      +            "default": "if_asked",
      +            "enum": [
      +              "freely",
      +              "if_asked",
      +              "only_to_verified_human",
      +              "never"
      +            ],
      +            "type": "string"
      +          },
      +          "key": {
      +            "description": "Short label, e.g. 'order_number'.",
      +            "maxLength": 80,
      +            "type": "string"
      +          },
      +          "value": {
      +            "description": "The fact.",
      +            "maxLength": 300,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "value"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 30,
      +      "type": "array"
      +    },
      +    "forbidden": {
      +      "description": "Things the assistant must not say or agree to.",
      +      "items": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "goal": {
      +      "description": "The outcome you want, in one or two sentences.",
      +      "maxLength": 500,
      +      "minLength": 8,
      +      "type": "string"
      +    },
      +    "if_unknown": {
      +      "default": "say_will_check_back",
      +      "description": "What to do when asked something the brief does not cover.",
      +      "enum": [
      +        "say_will_check_back",
      +        "escalate",
      +        "end_politely"
      +      ],
      +      "type": "string"
      +    },
      +    "ivr_hints": {
      +      "description": "Phone menu hints, e.g. 'choose imports'.",
      +      "items": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    "language": {
      +      "description": "BCP-47 such as en-GB or he-IL, or auto-from-seat.",
      +      "maxLength": 40,
      +      "type": "string"
      +    },
      +    "limits": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "max_call_minutes": {
      +          "default": 30,
      +          "maximum": 120,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "max_cost": {
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "max_hold_minutes": {
      +          "default": 20,
      +          "maximum": 90,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "max_ivr_minutes": {
      +          "default": 6,
      +          "maximum": 15,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "retry": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "gap_minutes": {
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "on_busy_or_no_answer": {
      +              "default": 0,
      +              "maximum": 3,
      +              "minimum": 0,
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "on_behalf_of": {
      +      "additionalProperties": false,
      +      "description": "Who the call is for. person is required.",
      +      "properties": {
      +        "company": {
      +          "description": "Company, if the call is for a business.",
      +          "maxLength": 120,
      +          "type": "string"
      +        },
      +        "person": {
      +          "description": "Name of the person the call is for.",
      +          "maxLength": 120,
      +          "type": "string"
      +        },
      +        "relationship": {
      +          "description": "e.g. 'account holder', 'director', 'parent'.",
      +          "maxLength": 120,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "person"
      +      ],
      +      "type": "object"
      +    },
      +    "opening_line": {
      +      "description": "Optional. What to say first, after the assistant introduces itself and plays the mandatory notice.",
      +      "maxLength": 200,
      +      "type": "string"
      +    },
      +    "purpose_category": {
      +      "description": "Kind of call. Marketing, sales, surveys, debt collection, political and fundraising calls are refused.",
      +      "enum": [
      +        "service_enquiry",
      +        "account_admin",
      +        "booking",
      +        "logistics",
      +        "complaint",
      +        "other_non_marketing"
      +      ],
      +      "type": "string"
      +    },
      +    "save_as_default": {
      +      "default": false,
      +      "description": "With assistant_name, also save it as the default name in Widely AI assistant settings.",
      +      "type": "boolean"
      +    },
      +    "schedule_at": {
      +      "description": "When to call, ISO date-time, at most 14 days ahead. Omit it to call now.",
      +      "format": "date-time",
      +      "type": "string"
      +    },
      +    "success_criteria": {
      +      "description": "How to tell the call worked, e.g. 'they confirm the delivery date'.",
      +      "items": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "time_window": {
      +      "additionalProperties": false,
      +      "description": "Optional calling window, at least 10 minutes long and within 14 days. The call is placed inside it.",
      +      "properties": {
      +        "not_after": {
      +          "description": "ISO date-time with offset.",
      +          "format": "date-time",
      +          "type": "string"
      +        },
      +        "not_before": {
      +          "description": "ISO date-time with offset.",
      +          "format": "date-time",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "not_before",
      +        "not_after"
      +      ],
      +      "type": "object"
      +    },
      +    "voicemail": {
      +      "default": "leave_message",
      +      "description": "On voicemail: leave_message (default), hang_up_and_retry (uses limits.retry), or hang_up.",
      +      "enum": [
      +        "leave_message",
      +        "hang_up_and_retry",
      +        "hang_up"
      +      ],
      +      "type": "string"
      +    },
      +    "voicemail_message": {
      +      "description": "Optional. If absent, the assistant leaves a short message from the goal and on_behalf_of, with no sensitive facts.",
      +      "maxLength": 300,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "callee_name",
      +    "goal",
      +    "on_behalf_of",
      +    "purpose_category",
      +    "success_criteria"
      +  ],
      +  "type": "object"
      +}
    • removedInput schema / properties / connect_user
      Removed value: -{
      -  "description": "When true, the destination is asked to hold, the user's phones are rung into the same conversation, and the assistant leaves.",
      -  "type": "boolean"
      -}
    • addedInput schema / properties / destination / description
      Added value: +"Number to call. brief.destination wins when both are set."
    • changedInput schema / properties / identity_id / description
      Previous value: -"Optional identity id. Omit it and Widely picks the caller ID the same way the app does. Needed only when the grant is limited to several numbers."New value: +"Optional identity id. Omit it and Widely picks the caller ID the same way the app does."
    • removedInput schema / properties / task
      Removed value: -{
      -  "description": "What the assistant should say and do. Max 500 characters.",
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "destination",
      -  "task"
      -]New value: +[
      +  "brief"
      +]
  4. Changed1 schema field changed
    • addedInput schema / properties / identity_id / description
      Added value: +"Optional identity id. Omit it and Widely picks the caller ID the same way the app does. Needed only when the grant is limited to several numbers."
  5. Changed1 schema field changed
    • changedInput schema / properties / connect_user / description
      Previous value: -"When true, hold the destination, ring the user into the call, then the assistant leaves."New value: +"When true, the destination is asked to hold, the user's phones are rung into the same conversation, and the assistant leaves."
  6. First observed

TDQS

A4.2/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that the call is asynchronous (returns immediately with task and call ids), that validation lists every missing and invalid field at once, that voicemail is the default, that only allowed_commitments may be agreed to, and that the assistant always closes with a thank-you and goodbye. These are exactly the operational traits an agent needs before invoking a long-running outbound call.

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?

Front-loads the core action and packs a lot of relevant constraint information into one dense paragraph with little waste. The terse 'Business plan.' fragment is slightly awkward but still informative.

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

Completeness4/5

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

With no output schema, the description helpfully states the immediate return (task and call ids) and key refusal/validation behavior for a complex nested-brief tool. It could go one step further by pointing to get_call_task/get_call for tracking the call, but it is largely complete for correct invocation.

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

Parameters4/5

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 about the brief's structure and the assistant_name resolution order (settings name vs brief.assistant_name) plus the allowed_commitments guardrail. It stops short of explaining the nested limits, escalation, or callback blocks, which the schema already covers.

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

Purpose4/5

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

States a specific verb and outcome: it dials a number and an AI assistant conducts the errand, with a clear constraint (Business plan, structured brief only). It does not explicitly distinguish itself from close siblings like request_call or create_call_task, leaving the agent to infer the difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

Gives clear usage context: structured brief only, free text refused, call describe_errand_template for the fields, and an assistant name must exist or the call is refused (set it with set_assistant_name). It stops short of explicit when-not-to-use guidance or naming alternative tools to choose instead.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.