Call Me MCP
An MCP server that enables AI agents to initiate voice calls to the user's mobile device. The agent reads a question aloud, the user answers by voice, and the transcript is returned to the agent as text to continue processing. It supports two-way communication via calls and texts within agent sessions.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://callmemcp.com/mcpWhat its tools do
9 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (3)
Can change data (6)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to callmemcp.com ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Agent asks for a decision via phone call
- User answers voice prompt and agent receives transcript
- Agent sends progress updates via text to user
- User sends text or voicemail to active agent session
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- call-me 1.1.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 9 advertised
- Resources
- 0 advertised
- Resource templates
- 0 advertised
- Prompts
- 0 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
},
"resources": {
"subscribe": false,
"listChanged": false
},
"experimental": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
9 advertised
setup — Set up Call Me
Return first-setup instructions and clickable App Store and Google Play download links, for when you do not have the human's Call Me number yet. Show both links to the human as clickable links, then ask them to open My Number in the app and give you its 10 digits. Nothing is sent and nothing rings.
{
"type": "object",
"title": "setupArguments",
"properties": {}
}{
"type": "object",
"title": "SetupResult",
"required": [
"status",
"app_store_url",
"play_store_url",
"message"
],
"properties": {
"status": {
"type": "string",
"title": "Status",
"description": "\"setup_required\": no Call Me number is known yet."
},
"message": {
"type": "string",
"title": "Message",
"description": "What to tell the human, with both download links."
},
"storage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Storage",
"default": null,
"description": "How the number is stored."
},
"app_store_url": {
"type": "string",
"title": "App Store Url",
"description": "Call Me on the App Store, for iPhone."
},
"play_store_url": {
"type": "string",
"title": "Play Store Url",
"description": "Call Me on Google Play, for Android."
},
"local_config_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Local Config Key",
"default": null,
"description": "The key that holds it in that file."
},
"local_config_path": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Local Config Path",
"default": null,
"description": "Where a local client keeps the number."
}
},
"additionalProperties": true
}{
"title": "Set up Call Me",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}call — Call the human
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. 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.
{
"type": "object",
"title": "callArguments",
"required": [
"question"
],
"properties": {
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "To",
"default": null,
"description": "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."
},
"language": {
"type": "string",
"title": "Language",
"default": "",
"description": "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."
},
"question": {
"type": "string",
"title": "Question",
"description": "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."
},
"keep_open": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Keep Open",
"default": null,
"description": "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."
},
"from_label": {
"type": "string",
"title": "From Label",
"default": "Someone's AI",
"description": "Who is calling, shown on their phone and spoken: e.g. \"Claude on my laptop\"."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "A session_token from an earlier result, to stay in that thread. Omit on first contact."
}
}
}{
"type": "object",
"title": "CallResult",
"required": [
"status"
],
"properties": {
"from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "From",
"default": null,
"description": "Your own agent number. Never call or text it."
},
"next": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Next",
"default": null,
"description": "What to do next when the call has not settled."
},
"open": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Open",
"default": null,
"description": "True while the line stays up for say or hang_up."
},
"turn": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Turn",
"default": null,
"description": "Index of the answer within a conversation."
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Title",
"default": null,
"description": "play_audio: the recording's title."
},
"status": {
"type": "string",
"title": "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."
},
"call_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Call Id",
"default": null,
"description": "Pass to poll_result, say and hang_up."
},
"audio_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Audio Id",
"default": null,
"description": "play_audio: the recording that was offered."
},
"finished": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Finished",
"default": null,
"description": "play_audio: whether they heard it to the end."
},
"language": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Language",
"default": null,
"description": "Language code the recognizer heard, information only."
},
"listened": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Listened",
"default": null,
"description": "play_audio: whether they chose to listen."
},
"duration_s": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Duration S",
"default": null,
"description": "play_audio: its length in seconds."
},
"listened_s": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Listened S",
"default": null,
"description": "play_audio: seconds they listened."
},
"transcript": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Transcript",
"default": null,
"description": "What the human said; empty if they only listened."
},
"audio_error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Audio Error",
"default": null,
"description": "play_audio: why the recording could not be played."
},
"language_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Language Name",
"default": null,
"description": "That language's name."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "Reuse in later calls and texts to stay in one thread."
},
"said_while_waiting": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Said While Waiting",
"default": null,
"description": "What they said while you were thinking."
}
},
"additionalProperties": true
}{
"title": "Call the human",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}poll_result — Get call result
Check on a call that came back "ringing", "in_call" or "playing". Waits up to ~25s for it to settle, then returns the same shape as `call`: the final status and transcript once they answer, decline, or the ring times out ("missed", within about a minute). Still not settled: call it again. For play_audio calls it reports listened_s and finished. Rings nothing.
{
"type": "object",
"title": "poll_resultArguments",
"required": [
"call_id",
"session_token"
],
"properties": {
"call_id": {
"type": "integer",
"title": "Call Id",
"description": "The call_id from the call or play_audio result."
},
"session_token": {
"type": "string",
"title": "Session Token",
"description": "The session_token from an earlier result. It keeps every call and text in one thread on their phone."
}
}
}{
"type": "object",
"title": "CallResult",
"required": [
"status"
],
"properties": {
"from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "From",
"default": null,
"description": "Your own agent number. Never call or text it."
},
"next": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Next",
"default": null,
"description": "What to do next when the call has not settled."
},
"open": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Open",
"default": null,
"description": "True while the line stays up for say or hang_up."
},
"turn": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Turn",
"default": null,
"description": "Index of the answer within a conversation."
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Title",
"default": null,
"description": "play_audio: the recording's title."
},
"status": {
"type": "string",
"title": "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."
},
"call_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Call Id",
"default": null,
"description": "Pass to poll_result, say and hang_up."
},
"audio_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Audio Id",
"default": null,
"description": "play_audio: the recording that was offered."
},
"finished": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Finished",
"default": null,
"description": "play_audio: whether they heard it to the end."
},
"language": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Language",
"default": null,
"description": "Language code the recognizer heard, information only."
},
"listened": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Listened",
"default": null,
"description": "play_audio: whether they chose to listen."
},
"duration_s": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Duration S",
"default": null,
"description": "play_audio: its length in seconds."
},
"listened_s": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Listened S",
"default": null,
"description": "play_audio: seconds they listened."
},
"transcript": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Transcript",
"default": null,
"description": "What the human said; empty if they only listened."
},
"audio_error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Audio Error",
"default": null,
"description": "play_audio: why the recording could not be played."
},
"language_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Language Name",
"default": null,
"description": "That language's name."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "Reuse in later calls and texts to stay in one thread."
},
"said_while_waiting": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Said While Waiting",
"default": null,
"description": "What they said while you were thinking."
}
},
"additionalProperties": true
}{
"title": "Get call result",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}play_audio — Play long audio
Bigger and longer audio goes here. Calls the human and plays a recording to them as a phone call: a podcast, a long narration you rendered, a voice memo, music. `source` is a link (YouTube, SoundCloud, a podcast page, or a direct .mp3/.m4a/.wav/.ogg/.flac/... link) or the audio_id of a file uploaded with `curl --data-binary @file.m4a "https://callmemcp.com/audio?to=<number>&filename=file.m4a"` (up to 300 MB / 3 hours, kept for a day). The voice says your `intro`, the title and the length, then asks if they want to listen now; on a yes the file plays as plain sound (no voice model) until it ends or they hang up. Returns once they answer the offer: status "playing" (they said yes), "completed" with listened:false (no, or nothing), or missed/declined. poll_result later reports listened_s and finished. Use `call` for text under ~2000 characters. `language` ("tr", "de") is the language of your intro; the offer and the call's own lines follow it.
{
"type": "object",
"title": "play_audioArguments",
"required": [
"source"
],
"properties": {
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "To",
"default": null,
"description": "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."
},
"intro": {
"type": "string",
"title": "Intro",
"default": "",
"description": "Spoken before the offer, up to 500 characters: what this is and why they might want it."
},
"title": {
"type": "string",
"title": "Title",
"default": "",
"description": "The recording's title. Empty uses the title read from the link."
},
"source": {
"type": "string",
"title": "Source",
"description": "A link (YouTube, SoundCloud, a podcast page, or a direct .mp3/.m4a/.wav/.ogg/.flac link) or the audio_id of an uploaded file."
},
"language": {
"type": "string",
"title": "Language",
"default": "",
"description": "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."
},
"from_label": {
"type": "string",
"title": "From Label",
"default": "Someone's AI",
"description": "Who is calling, shown on their phone and spoken: e.g. \"Claude on my laptop\"."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "A session_token from an earlier result, to stay in that thread. Omit on first contact."
}
}
}{
"type": "object",
"title": "CallResult",
"required": [
"status"
],
"properties": {
"from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "From",
"default": null,
"description": "Your own agent number. Never call or text it."
},
"next": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Next",
"default": null,
"description": "What to do next when the call has not settled."
},
"open": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Open",
"default": null,
"description": "True while the line stays up for say or hang_up."
},
"turn": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Turn",
"default": null,
"description": "Index of the answer within a conversation."
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Title",
"default": null,
"description": "play_audio: the recording's title."
},
"status": {
"type": "string",
"title": "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."
},
"call_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Call Id",
"default": null,
"description": "Pass to poll_result, say and hang_up."
},
"audio_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Audio Id",
"default": null,
"description": "play_audio: the recording that was offered."
},
"finished": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Finished",
"default": null,
"description": "play_audio: whether they heard it to the end."
},
"language": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Language",
"default": null,
"description": "Language code the recognizer heard, information only."
},
"listened": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Listened",
"default": null,
"description": "play_audio: whether they chose to listen."
},
"duration_s": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Duration S",
"default": null,
"description": "play_audio: its length in seconds."
},
"listened_s": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Listened S",
"default": null,
"description": "play_audio: seconds they listened."
},
"transcript": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Transcript",
"default": null,
"description": "What the human said; empty if they only listened."
},
"audio_error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Audio Error",
"default": null,
"description": "play_audio: why the recording could not be played."
},
"language_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Language Name",
"default": null,
"description": "That language's name."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "Reuse in later calls and texts to stay in one thread."
},
"said_while_waiting": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Said While Waiting",
"default": null,
"description": "What they said while you were thinking."
}
},
"additionalProperties": true
}{
"title": "Play long audio",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}say — Say the next line
In a call whose result came back "open": true, speak `text` to the human and return what they answer, in the same shape as `call`. Only after their previous answer is in. Waits up to ~30s; on "in_call", follow up with poll_result. "open": false means the call has ended. Pass `language` only to switch the language of the call's own lines; empty keeps it. Anything they said while you were thinking comes back as "said_while_waiting". End the call with `hang_up` once you are done.
{
"type": "object",
"title": "sayArguments",
"required": [
"call_id",
"session_token",
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text",
"description": "Your next line, read aloud word for word. Keep it short and conversational; up to 2000 characters."
},
"call_id": {
"type": "integer",
"title": "Call Id",
"description": "The call_id from the call or play_audio result."
},
"language": {
"type": "string",
"title": "Language",
"default": "",
"description": "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."
},
"session_token": {
"type": "string",
"title": "Session Token",
"description": "The session_token from an earlier result. It keeps every call and text in one thread on their phone."
}
}
}{
"type": "object",
"title": "CallResult",
"required": [
"status"
],
"properties": {
"from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "From",
"default": null,
"description": "Your own agent number. Never call or text it."
},
"next": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Next",
"default": null,
"description": "What to do next when the call has not settled."
},
"open": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Open",
"default": null,
"description": "True while the line stays up for say or hang_up."
},
"turn": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Turn",
"default": null,
"description": "Index of the answer within a conversation."
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Title",
"default": null,
"description": "play_audio: the recording's title."
},
"status": {
"type": "string",
"title": "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."
},
"call_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Call Id",
"default": null,
"description": "Pass to poll_result, say and hang_up."
},
"audio_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Audio Id",
"default": null,
"description": "play_audio: the recording that was offered."
},
"finished": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Finished",
"default": null,
"description": "play_audio: whether they heard it to the end."
},
"language": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Language",
"default": null,
"description": "Language code the recognizer heard, information only."
},
"listened": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Listened",
"default": null,
"description": "play_audio: whether they chose to listen."
},
"duration_s": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Duration S",
"default": null,
"description": "play_audio: its length in seconds."
},
"listened_s": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Listened S",
"default": null,
"description": "play_audio: seconds they listened."
},
"transcript": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Transcript",
"default": null,
"description": "What the human said; empty if they only listened."
},
"audio_error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Audio Error",
"default": null,
"description": "play_audio: why the recording could not be played."
},
"language_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Language Name",
"default": null,
"description": "That language's name."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "Reuse in later calls and texts to stay in one thread."
},
"said_while_waiting": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Said While Waiting",
"default": null,
"description": "What they said while you were thinking."
}
},
"additionalProperties": true
}{
"title": "Say the next line",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}hang_up — Hang up
End a call you placed. In an open conversation `goodbye` is spoken first; leave it empty to just hang up. A call that already ended reports its final status.
{
"type": "object",
"title": "hang_upArguments",
"required": [
"call_id",
"session_token"
],
"properties": {
"call_id": {
"type": "integer",
"title": "Call Id",
"description": "The call_id from the call or play_audio result."
},
"goodbye": {
"type": "string",
"title": "Goodbye",
"default": "",
"description": "Spoken before the line drops in an open conversation, e.g. \"Thanks, I'll get on it.\" Empty just hangs up."
},
"session_token": {
"type": "string",
"title": "Session Token",
"description": "The session_token from an earlier result. It keeps every call and text in one thread on their phone."
}
}
}{
"type": "object",
"title": "HangUpResult",
"required": [
"status"
],
"properties": {
"open": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Open",
"default": null,
"description": "Always false: the line is down."
},
"status": {
"type": "string",
"title": "Status",
"description": "\"ended\", or \"hanging_up\" while the goodbye is spoken."
},
"call_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Call Id",
"default": null,
"description": "The call that was ended."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "This session's token."
}
},
"additionalProperties": true
}{
"title": "Hang up",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}text — Text the human
Send a one-way text to the human's phone (a push notification, no ring). Use it for updates that need no answer, or as the fallback when a call comes back "missed" or "declined". delivered:false means it was saved to their history but no notification showed; `notice` says why. Their replies arrive through wait_for_reply. Missing `to` returns setup_required with the download links. Pass a previous session_token to stay in the same thread.
{
"type": "object",
"title": "textArguments",
"required": [
"body"
],
"properties": {
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "To",
"default": null,
"description": "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."
},
"body": {
"type": "string",
"title": "Body",
"description": "The message, up to 2000 characters. Markdown links render as links."
},
"from_label": {
"type": "string",
"title": "From Label",
"default": "Someone's AI",
"description": "Who is calling, shown on their phone and spoken: e.g. \"Claude on my laptop\"."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "A session_token from an earlier result, to stay in that thread. Omit on first contact."
}
}
}{
"type": "object",
"title": "TextResult",
"properties": {
"ok": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Ok",
"default": null,
"description": "True when the message was stored."
},
"from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "From",
"default": null,
"description": "Your own agent number. Never call or text it."
},
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Note",
"default": null,
"description": "Extra information, e.g. from the demo line."
},
"notice": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Notice",
"default": null,
"description": "Why the text was saved but not shown, when delivered is false."
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Status",
"default": null,
"description": "\"setup_required\" when no number was given."
},
"delivered": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Delivered",
"default": null,
"description": "True when a notification was shown on the phone."
},
"message_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Message Id",
"default": null,
"description": "The stored message."
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null,
"description": "Reuse in later calls and texts to stay in one thread."
}
},
"additionalProperties": true
}{
"title": "Text the human",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}wait_for_reply — Wait for a text reply
Wait for the human to send something back to this session — texts and voicemail transcripts arrive here. Long-polls up to wait_s (max 30s); returns {events, cursor}. Pass the returned cursor next time to only see new events. An empty events list just means nothing yet — poll again if you are still waiting.
{
"type": "object",
"title": "wait_for_replyArguments",
"required": [
"session_token"
],
"properties": {
"cursor": {
"type": "integer",
"title": "Cursor",
"default": 0,
"description": "The cursor from the previous result; 0 the first time."
},
"wait_s": {
"type": "integer",
"title": "Wait S",
"default": 25,
"description": "How long to wait for something to arrive, 0 to 30 seconds."
},
"session_token": {
"type": "string",
"title": "Session Token",
"description": "The session_token from an earlier result. It keeps every call and text in one thread on their phone."
}
}
}{
"type": "object",
"$defs": {
"ReplyEvent": {
"type": "object",
"title": "ReplyEvent",
"required": [
"id",
"type",
"payload",
"created_at"
],
"properties": {
"id": {
"type": "integer",
"title": "Id",
"description": "Event id; the cursor moves past it."
},
"type": {
"type": "string",
"title": "Type",
"description": "What arrived, e.g. a text or a voicemail."
},
"payload": {
"type": "object",
"title": "Payload",
"description": "The event's content, e.g. the message body.",
"additionalProperties": true
},
"created_at": {
"type": "string",
"title": "Created At",
"description": "When it arrived (ISO 8601, UTC)."
}
},
"additionalProperties": true
}
},
"title": "RepliesResult",
"required": [
"events",
"cursor"
],
"properties": {
"cursor": {
"type": "integer",
"title": "Cursor",
"description": "Pass back as cursor next time to see only newer events."
},
"events": {
"type": "array",
"items": {
"$ref": "#/$defs/ReplyEvent"
},
"title": "Events",
"description": "New events since the cursor; empty means nothing yet."
}
},
"additionalProperties": true
}{
"title": "Wait for a text reply",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}set_thread_title — Set thread title
Name this session's conversation thread on the human's phone (e.g. the project or task you are working on). Shown as the thread title in the app.
{
"type": "object",
"title": "set_thread_titleArguments",
"required": [
"session_token",
"title"
],
"properties": {
"title": {
"type": "string",
"title": "Title",
"description": "A short name, 3 to 5 words, e.g. \"Deploy of billing API\"."
},
"session_token": {
"type": "string",
"title": "Session Token",
"description": "The session_token from an earlier result. It keeps every call and text in one thread on their phone."
}
}
}{
"type": "object",
"title": "TitleResult",
"required": [
"ok",
"label"
],
"properties": {
"ok": {
"type": "boolean",
"title": "Ok",
"description": "True when the title was saved."
},
"label": {
"type": "string",
"title": "Label",
"description": "The title as it now shows on the phone."
}
},
"additionalProperties": true
}{
"title": "Set thread title",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}Prompts
0 advertised
Resources
0 advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 591 ms
- 95th percentile latency
- 591 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 591 ms · metadata changed · 9 tool(s), 0 resource(s), 0 resource template(s), 0 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http call-me-mcp-callmemcp https://callmemcp.com/mcpCodex
codex mcp add call-me-mcp-callmemcp --url https://callmemcp.com/mcpCursor
{
"mcpServers": {
"call-me-mcp-callmemcp": {
"url": "https://callmemcp.com/mcp"
}
}
}Cline
{
"mcpServers": {
"call-me-mcp-callmemcp": {
"type": "streamableHttp",
"url": "https://callmemcp.com/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"call-me-mcp-callmemcp": {
"type": "http",
"url": "https://callmemcp.com/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http call-me-mcp-callmemcp https://callmemcp.com/mcpClaude Desktop
https://callmemcp.com/mcpWindsurf
{
"mcpServers": {
"call-me-mcp-callmemcp": {
"serverUrl": "https://callmemcp.com/mcp"
}
}
}Let your agent find its tools
Find servers like Call Me MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Call Me MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.