_ registry / mcp streamable-http · checked 2h ago

call-me

https://serdaroztetik.com

Registry code: fd33201d56f99e7f

api record

/call-me rings a real human's phone (iPhone or Android), reads your text aloud and returns what they said.

- `to` is the 10-digit number from My Number in the Call Me app, not a phone number. No login or OAuth. On a local host read user_number from ~/.aiphone/config.json, and save it there after first setup (directory 700, file 600). This hosted server cannot read that file, so pass the number as `to`. Never invent or hardcode a number or reuse another user's.

endpoint
https://serdaroztetik.com/aiphone/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is call-me live?
Yes — it answered the hub's last check (checked 2h ago). It answered 99% of checks over the last 30 days.
Is call-me free to use?
Yes — the hub reached it with no key and no payment.
What tools does call-me have?
9 tools: call, setup, poll_result, play_audio, say, hang_up, text, wait_for_reply, ….
Is call-me safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
98.9%

90 days 99.2%· all time 99.2%

latency
2,625ms

last good check

priced tools
0

of 9 tools

_ answered our checks, 90 days 397 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
_ what it is for
used for
  • call a human phone and get their spoken answer
  • send a text to a human phone
  • wait for a human reply
takes → gives
text → text
tools
3 reads1 changes data2 sends messages
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

inferred, not observed

Access was read off the card rather than seen on the wire: inferred: the handshake, the tool list and a call without arguments went through with no key and no payment asked; no tool was run

_ what it can do 9 tools
9 never probed 0 of 9 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • call sends messages unknown never probed

    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.

    mcp-tool

    {
      "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."
        },
        "voice": {
          "type": "string",
          "title": "Voice",
          "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."
        },
        "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."
        }
      }
    }
    arguments 71 lines
  • setup reads unknown never probed

    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.

    mcp-tool

    {
      "type": "object",
      "title": "setupArguments",
      "properties": {}
    }
    arguments 5 lines
  • poll_result reads unknown 26h ago

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 20 lines
  • play_audio unknown never probed

    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.

    mcp-tool

    {
      "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."
        },
        "voice": {
          "type": "string",
          "title": "Voice",
          "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."
        },
        "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."
        }
      }
    }
    arguments 70 lines
  • say unknown never probed

    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. `voice` switches who speaks from this line on (female first: bella, sarah, ...; male: roger, eric, ...); 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.

    mcp-tool

    {
      "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."
        },
        "voice": {
          "type": "string",
          "title": "Voice",
          "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."
        },
        "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."
        }
      }
    }
    arguments 38 lines
  • hang_up unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 26 lines
  • text sends messages unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 46 lines
  • wait_for_reply reads unknown 26h ago

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 26 lines
  • set_thread_title changes data unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 20 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id fd33201d56f99e7f.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/fd33201d56f99e7f/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/fd33201d56f99e7f/badge.svg)](https://brick.blue/agent/fd33201d56f99e7f?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.