Skip to main content
Glama

Call the human

call
Destructive

Ring the human's phone (iPhone or Android), read question aloud word for word, and return what they say back as text. Waits up to ~30s.

status "completed" carries their words in `transcript` (empty if they only
listened). "ringing" (not picked up yet) or "in_call" (listening) means the
call has not settled: pass call_id to poll_result until it does. An
unanswered ring settles as "missed" within about a minute; "declined" means
they refused it. Do not retry an unanswered call in a loop: send one `text`
instead.

By default the line stays open after their answer ("open": true): they hear
a soft hold sound while you think, and a voice assistant tells them you are
working on it. Reply with `say`, finish with `hang_up`; after about two
minutes of silence the line drops by itself. Anything they said while
waiting comes back with their next answer as "said_while_waiting". The
"language" and "language_name" fields report what the recognizer heard, as
information only. `voice` picks who speaks (female first: bella, sarah,
jessica, ...; male: roger, eric, brian, ...) and sticks for later calls.

Reuse the returned session_token in later calls and texts so the phone
keeps one thread. The `from` in the result is your own number: never call
or text it. Missing `to` returns setup_required with download links.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "question": "<question>"
    },
    "name": "call"
  }
}

Input Schema

NameRequiredDescriptionDefault
toNoThe human's 10-digit Call Me number, from My Number in the app (not a regular phone number). Local clients read it from ~/.aiphone/config.json user_number. In a host without file access, reuse a number given earlier in this chat, but do not claim it is saved across chats. Omit it only to get setup_required with the download links.
voiceNoWho speaks, female first (default "bella"). female: bella, sarah, jessica, matilda, laura, alice (british), lily (british); neutral: river; male: roger, eric, chris, brian, will, liam, bill, george (british), daniel (british), charlie (australian). "female" or "male" picks the first of that kind. Your choice sticks for this session's later calls until you pass another; empty keeps it, or else uses the voice the person chose in their app.
languageNoThe language you are speaking, e.g. "tr", "pt-BR" or "Turkish". The call's own short lines (thanks, goodbye) follow it. Empty means English, or on `say` keeps the current one.
questionYesWhat to say, read aloud word for word, up to 2000 characters (about two minutes). It need not be a question: a status update or a summary works too.
keep_openNoThe line always stays up after their answer so you can reply with `say`; end it with `hang_up`. Kept for older clients: false no longer makes a one-shot call.
from_labelNoWho is calling, shown on their phone and spoken: e.g. "Claude on my laptop".Someone's AI
session_tokenNoA session_token from an earlier result, to stay in that thread. Omit on first contact.

Output Schema

NameRequiredDescriptionDefault
fromNoYour own agent number. Never call or text it.
nextNoWhat to do next when the call has not settled.
openNoTrue while the line stays up for say or hang_up.
turnNoIndex of the answer within a conversation.
titleNoplay_audio: the recording's title.
statusYes"completed" (answered), "ringing" or "in_call" (not settled: poll_result), "missed", "declined", "ended", "hanging_up", "playing" (play_audio), or "setup_required" when no number was given.
call_idNoPass to poll_result, say and hang_up.
audio_idNoplay_audio: the recording that was offered.
finishedNoplay_audio: whether they heard it to the end.
languageNoLanguage code the recognizer heard, information only.
listenedNoplay_audio: whether they chose to listen.
duration_sNoplay_audio: its length in seconds.
listened_sNoplay_audio: seconds they listened.
transcriptNoWhat the human said; empty if they only listened.
audio_errorNoplay_audio: why the recording could not be played.
language_nameNoThat language's name.
session_tokenNoReuse in later calls and texts to stay in one thread.
said_while_waitingNoWhat they said while you were thinking.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / keep_open / description
      Previous value: -"Keep the line up after their answer so you can reply with `say` (default on). false makes a one-shot call that hangs up after one answer."New value: +"The line always stays up after their answer so you can reply with `say`; end it with `hang_up`. Kept for older clients: false no longer makes a one-shot call."
  2. Changed1 schema field changed
    • addedInput schema / properties / voice
      Added value: +{
      +  "default": "",
      +  "description": "Who speaks, female first (default \"bella\"). female: bella, sarah, jessica, matilda, laura, alice (british), lily (british); neutral: river; male: roger, eric, chris, brian, will, liam, bill, george (british), daniel (british), charlie (australian). \"female\" or \"male\" picks the first of that kind. Your choice sticks for this session's later calls until you pass another; empty keeps it, or else uses the voice the person chose in their app.",
      +  "title": "Voice",
      +  "type": "string"
      +}
  3. Changed7 schema fields changed
    • addedInput schema / properties / from_label / description
      Added value: +"Who is calling, shown on their phone and spoken: e.g. \"Claude on my laptop\"."
    • addedInput schema / properties / keep_open / description
      Added value: +"Keep the line up after their answer so you can reply with `say` (default on). false makes a one-shot call that hangs up after one answer."
    • addedInput schema / properties / language / description
      Added value: +"The language you are speaking, e.g. \"tr\", \"pt-BR\" or \"Turkish\". The call's own short lines (thanks, goodbye) follow it. Empty means English, or on `say` keeps the current one."
    • addedInput schema / properties / question / description
      Added value: +"What to say, read aloud word for word, up to 2000 characters (about two minutes). It need not be a question: a status update or a summary works too."
    • addedInput schema / properties / session_token / description
      Added value: +"A session_token from an earlier result, to stay in that thread. Omit on first contact."
    • addedInput schema / properties / to / description
      Added value: +"The human's 10-digit Call Me number, from My Number in the app (not a regular phone number). Local clients read it from ~/.aiphone/config.json user_number. In a host without file access, reuse a number given earlier in this chat, but do not claim it is saved across chats. Omit it only to get setup_required with the download links."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "audio_error": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "play_audio: why the recording could not be played.",
      +      "title": "Audio Error"
      +    },
      +    "audio_id": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "play_audio: the recording that was offered.",
      +      "title": "Audio Id"
      +    },
      +    "call_id": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "Pass to poll_result, say and hang_up.",
      +      "title": "Call Id"
      +    },
      +    "duration_s": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "play_audio: its length in seconds.",
      +      "title": "Duration S"
      +    },
      +    "finished": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "play_audio: whether they heard it to the end.",
      +      "title": "Finished"
      +    },
      +    "from": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "Your own agent number. Never call or text it.",
      +      "title": "From"
      +    },
      +    "language": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "Language code the recognizer heard, information only.",
      +      "title": "Language"
      +    },
      +    "language_name": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "That language's name.",
      +      "title": "Language Name"
      +    },
      +    "listened": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "play_audio: whether they chose to listen.",
      +      "title": "Listened"
      +    },
      +    "listened_s": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "play_audio: seconds they listened.",
      +      "title": "Listened S"
      +    },
      +    "next": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "What to do next when the call has not settled.",
      +      "title": "Next"
      +    },
      +    "open": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "True while the line stays up for say or hang_up.",
      +      "title": "Open"
      +    },
      +    "said_while_waiting": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "What they said while you were thinking.",
      +      "title": "Said While Waiting"
      +    },
      +    "session_token": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "Reuse in later calls and texts to stay in one thread.",
      +      "title": "Session Token"
      +    },
      +    "status": {
      +      "description": "\"completed\" (answered), \"ringing\" or \"in_call\" (not settled: poll_result), \"missed\", \"declined\", \"ended\", \"hanging_up\", \"playing\" (play_audio), or \"setup_required\" when no number was given.",
      +      "title": "Status",
      +      "type": "string"
      +    },
      +    "title": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "play_audio: the recording's title.",
      +      "title": "Title"
      +    },
      +    "transcript": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "What the human said; empty if they only listened.",
      +      "title": "Transcript"
      +    },
      +    "turn": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "Index of the answer within a conversation.",
      +      "title": "Turn"
      +    }
      +  },
      +  "required": [
      +    "status"
      +  ],
      +  "title": "CallResult",
      +  "type": "object"
      +}
  4. Changed3 schema fields changed
    • addedInput schema / properties / keep_open / anyOf
      Added value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / keep_open / default
      Previous value: -falseNew value: +null
    • removedInput schema / properties / keep_open / type
      Removed value: -"boolean"
  5. Changed2 schema fields changed
    • addedInput schema / properties / keep_open
      Added value: +{
      +  "default": false,
      +  "title": "Keep Open",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / language
      Added value: +{
      +  "default": "",
      +  "title": "Language",
      +  "type": "string"
      +}
  6. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations mark the tool as non-read-only, non-idempotent and destructive, and the description backs that up with real-world consequences: a ~30s wait, statuses (completed/ringing/in_call/missed/declined), the line auto-dropping after ~2 minutes of silence, and said_while_waiting capture. It also warns that the returned `from` is the agent's own number and must never be called or texted — context annotations cannot convey.

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-loaded with the core action and return contract, then status semantics, then line-persistence behavior — a logical order. It is dense and mostly earns its length, but repeats some schema content (voice roster, keep_open deprecation) that could be trimmed.

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?

For a destructive, real-world, pollable tool with an output schema, the description covers everything an agent needs to call and follow up correctly: status meanings, polling path, session reuse, and the self-number warning.

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 most param meaning is already structured; the description still adds cross-parameter rules the schema does not state, such as voice choices persisting across later calls, session_token keeping one thread, and omitting `to` yielding setup_required. A few items (voice name list, keep_open legacy behavior) largely repeat what the schema already says.

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?

Opens with a concrete verb and resource: ring a real phone, read `question` aloud verbatim, return their speech as text. That is unmistakably different from siblings like text, say, or poll_result, 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.

Usage Guidelines5/5

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

Explicitly routes the agent: pass call_id to poll_result while status is ringing/in_call, do not retry unanswered calls in a loop but send one `text` instead, reply with `say` and finish with `hang_up`. It names both the alternatives and the conditions that select them.

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.