Your AI rings your iPhone, speaks its question, and gets your spoken answer back as text.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Ring the human's iPhone, read `question` aloud word for word, and return what they say back. It does not have to be a question: an update or a summary of the day ahead works too, up to 2000 characters (about two minutes of speech). Waits up to ~30s; if the result comes back status "ringing" or "in_call", follow up with poll_result. On a local client, read `to` from `~/.aiphone/config.json` → `user_number`; this hosted server cannot read that file itself. It is a Call Me app number, not a regular phone number. If missing, returns setup_required with the App Store link. Pass a previous session_token to stay in the same thread on their phone. By default the call is a conversation: after their answer the line stays up for `say` until you `hang_up`; keep_open=false hangs up after one answer. `language` ("tr", "de", ...) is the language you are speaking; the call's own short lines follow it. Default English.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Ring the human's iPhone, read `question` aloud word for word, and return what they say back. It does not have to be a question: an update or a summary of the day ahead works too, up to 2000 characters (about two minutes of speech). Waits up to ~30s; if the result comes back status "ringing" or "in_call", follow up with poll_result. On a local client, read `to` from `~/.aiphone/config.json` → `user_number`; this hosted server cannot read that file itself. It is a Call Me app number, not a regular phone number. If missing, returns setup_required with the App Store link. Pass a previous session_token to stay in the same thread on their phone. By default the call is a conversation: after their answer the line stays up for `say` until you `hang_up`; keep_open=false hangs up after one answer. `language` ("tr", "de", ...) is the language you are speaking; the call's own short lines follow it. Default English.
| Argument | Type | Description |
|---|---|---|
| to | any | |
| language | string | |
| question* | string | |
| keep_open | any | |
| from_label | string | |
| session_token | any |
{
"type": "object",
"title": "callArguments",
"required": [
"question"
],
"properties": {
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "To",
"default": null
},
"language": {
"type": "string",
"title": "Language",
"default": ""
},
"question": {
"type": "string",
"title": "Question"
},
"keep_open": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Keep Open",
"default": null
},
"from_label": {
"type": "string",
"title": "From Label",
"default": "Someone's AI"
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null
}
}
}End a call you placed. In a keep_open conversation `goodbye` is spoken first (e.g. "Thanks, I'll get on it."); leave it empty to just hang up.
| Argument | Type | Description |
|---|---|---|
| call_id* | integer | |
| goodbye | string | |
| session_token* | string |
{
"type": "object",
"title": "hang_upArguments",
"required": [
"call_id",
"session_token"
],
"properties": {
"call_id": {
"type": "integer",
"title": "Call Id"
},
"goodbye": {
"type": "string",
"title": "Goodbye",
"default": ""
},
"session_token": {
"type": "string",
"title": "Session Token"
}
}
}Check on a call that was still ringing or in progress. Waits up to ~25s for it to settle; returns the final status and transcript once the call ends, the human declines, or the ring times out ("missed").
| Argument | Type | Description |
|---|---|---|
| call_id* | integer | |
| session_token* | string |
{
"type": "object",
"title": "poll_resultArguments",
"required": [
"call_id",
"session_token"
],
"properties": {
"call_id": {
"type": "integer",
"title": "Call Id"
},
"session_token": {
"type": "string",
"title": "Session Token"
}
}
}In a call placed with keep_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".
| Argument | Type | Description |
|---|---|---|
| text* | string | |
| call_id* | integer | |
| language | string | |
| session_token* | string |
{
"type": "object",
"title": "sayArguments",
"required": [
"call_id",
"session_token",
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text"
},
"call_id": {
"type": "integer",
"title": "Call Id"
},
"language": {
"type": "string",
"title": "Language",
"default": ""
},
"session_token": {
"type": "string",
"title": "Session Token"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| title* | string | |
| session_token* | string |
{
"type": "object",
"title": "set_thread_titleArguments",
"required": [
"session_token",
"title"
],
"properties": {
"title": {
"type": "string",
"title": "Title"
},
"session_token": {
"type": "string",
"title": "Session Token"
}
}
}Return first-setup instructions and a clickable App Store download link when no number is available.
No arguments.
{
"type": "object",
"title": "setupArguments",
"properties": {}
}Send a one-way text to the human's phone (push notification, no ring). On a local client, read `to` from `~/.aiphone/config.json` → `user_number`; this hosted server cannot read that file itself. If missing, returns setup_required with the App Store link. Pass a previous session_token to stay in the same thread.
| Argument | Type | Description |
|---|---|---|
| to | any | |
| body* | string | |
| from_label | string | |
| session_token | any |
{
"type": "object",
"title": "textArguments",
"required": [
"body"
],
"properties": {
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "To",
"default": null
},
"body": {
"type": "string",
"title": "Body"
},
"from_label": {
"type": "string",
"title": "From Label",
"default": "Someone's AI"
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Session Token",
"default": null
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| cursor | integer | |
| wait_s | integer | |
| session_token* | string |
{
"type": "object",
"title": "wait_for_replyArguments",
"required": [
"session_token"
],
"properties": {
"cursor": {
"type": "integer",
"title": "Cursor",
"default": 0
},
"wait_s": {
"type": "integer",
"title": "Wait S",
"default": 25
},
"session_token": {
"type": "string",
"title": "Session Token"
}
}
}