Call Me

Your AI rings your iPhone, speaks its question, and gets your spoken answer back as text.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
71%
Naming quality
90%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,497Tokens (tool definitions)
~833 BTypical response size
Moderate attention impact (1.17% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "call-me": {
      "url": "https://serdaroztetik.com/aiphone/mcp"
    }
  }
}

Remote endpoints

https://serdaroztetik.com/aiphone/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢setup

Return first-setup instructions and a clickable App Store download link when no number is available.

Input Schema

{
  "type": "object",
  "properties": {},
  "title": "setupArguments"
}
🔴call(question, to, from_label, session_token, keep_open, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "question": {
      "title": "Question",
      "type": "string"
    },
    "to": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "To"
    },
    "from_label": {
      "default": "Someone's AI",
      "title": "From Label",
      "type": "string"
    },
    "session_token": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Session Token"
    },
    "keep_open": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Keep Open"
    },
    "language": {
      "default": "",
      "title": "Language",
      "type": "string"
    }
  },
  "required": [
    "question"
  ],
  "title": "callArguments"
}
🟢poll_result(call_id, 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").

Input Schema

{
  "type": "object",
  "properties": {
    "call_id": {
      "title": "Call Id",
      "type": "integer"
    },
    "session_token": {
      "title": "Session Token",
      "type": "string"
    }
  },
  "required": [
    "call_id",
    "session_token"
  ],
  "title": "poll_resultArguments"
}
🔴say(call_id, session_token, text, language)

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".

Input Schema

{
  "type": "object",
  "properties": {
    "call_id": {
      "title": "Call Id",
      "type": "integer"
    },
    "session_token": {
      "title": "Session Token",
      "type": "string"
    },
    "text": {
      "title": "Text",
      "type": "string"
    },
    "language": {
      "default": "",
      "title": "Language",
      "type": "string"
    }
  },
  "required": [
    "call_id",
    "session_token",
    "text"
  ],
  "title": "sayArguments"
}
🔴hang_up(call_id, session_token, goodbye)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "call_id": {
      "title": "Call Id",
      "type": "integer"
    },
    "session_token": {
      "title": "Session Token",
      "type": "string"
    },
    "goodbye": {
      "default": "",
      "title": "Goodbye",
      "type": "string"
    }
  },
  "required": [
    "call_id",
    "session_token"
  ],
  "title": "hang_upArguments"
}
🔴text(body, to, from_label, session_token)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "body": {
      "title": "Body",
      "type": "string"
    },
    "to": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "To"
    },
    "from_label": {
      "default": "Someone's AI",
      "title": "From Label",
      "type": "string"
    },
    "session_token": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Session Token"
    }
  },
  "required": [
    "body"
  ],
  "title": "textArguments"
}
🟢wait_for_reply(session_token, cursor, wait_s)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "session_token": {
      "title": "Session Token",
      "type": "string"
    },
    "cursor": {
      "default": 0,
      "title": "Cursor",
      "type": "integer"
    },
    "wait_s": {
      "default": 25,
      "title": "Wait S",
      "type": "integer"
    }
  },
  "required": [
    "session_token"
  ],
  "title": "wait_for_replyArguments"
}
🔴set_thread_title(session_token, 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.

Input Schema

{
  "type": "object",
  "properties": {
    "session_token": {
      "title": "Session Token",
      "type": "string"
    },
    "title": {
      "title": "Title",
      "type": "string"
    }
  },
  "required": [
    "session_token",
    "title"
  ],
  "title": "set_thread_titleArguments"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded6 tools
verifiedversion not recorded6 tools
verifiedversion not recorded6 tools
verifiedversion not recorded6 tools