Server definition
- Hash
- sha256:a14eff2099aaff47ac447cff4ac0c171074a54413d0e1bd89f6aa2e31df8bb31
- What it is
- What a remote MCP server returned when asked what it offers: 6 tools
The blob, as servednamed by its sha256
{
"instructions": "/call-me rings a real human's iPhone and returns what they said.\n\n- A Call Me number is all that is needed: no login, OAuth, or verification code. It is the 10-digit number from My Number in the app, not a regular telephone number.\n- Before asking for a number on a local host, read ~/.aiphone/config.json and use its user_number. After first setup, save the user-provided number there with owner-only permissions (directory 700, file 600), outside the plugin install directory so updates preserve it. Never read the developer's number from examples or use a remembered number from another user.\n- When no number is available, call `setup` and ALWAYS include this clickable link in your reply: [Download Call Me from the App Store](https://apps.apple.com/app/call-me/id6789575165). Ask the user to open My Number in the app and provide its 10 digits. Never give only the app name. Any setup_required result must be shown with its download link.\n- In a host without local file access, reuse a number provided in the current chat, but do not claim it is permanently saved across chats. This hosted server cannot read the client's local files; the client must pass user_number as to. Never invent or hardcode a number. Never store numbers by IP address or share a default across users.\n- `call` rings the phone, reads your text aloud word for word, then listens for a spoken reply. The text does not have to be a question: a status update or a summary of the day ahead works too. Up to 2000 characters, about two minutes of speech. It waits ~30 seconds. status \"completed\" carries what they said as text (empty if they only listened). status \"ringing\" means nobody picked up yet and \"in_call\" means they are listening: pass the returned call_id to `poll_result` (each poll waits up to ~25s). An unanswered ring resolves as \"missed\" within about a minute; an answered call lasts as long as your text takes to read plus their reply, so keep polling until it settles.\n- Every result carries a session_token. Reuse it in later `call`/`text` calls so they land in the same conversation thread on the phone, and pass it to `wait_for_reply` to receive what the human sends back (texts, voicemail transcripts) after a missed call or a text.\n- `text` sends a one-way message — use it for notifications that need no answer, or as the fallback when a call comes back \"missed\" or \"declined\".\n- A /call-me number needs an active subscription (started in the iOS app). If a call or text comes back \"this /call-me number is not active\", relay that to the person you work for — an agent cannot fix it.\n- To try the loop without a human, `call` or `text` the demo line 5550001234 — it answers and replies automatically and says so.\n- Do not retry an unanswered call in a loop; one call plus one text is the polite ceiling.",
"tools": [
{
"description": "Ring the human's iPhone, read `question` aloud word for word, and return\n what they say back. It does not have to be a question: an update or a\n summary of the day ahead works too, up to 2000 characters (about two\n minutes of speech). Waits up to ~30s; if the result comes back status\n \"ringing\" or \"in_call\", follow up with poll_result. On a local client, read `to` from\n `~/.aiphone/config.json` → `user_number`; this hosted server cannot read\n that file itself. It is a Call Me app number, not a regular phone number.\n If missing, returns setup_required with the App Store link. Pass a previous\n session_token to stay in the same thread on their phone.",
"inputSchema": {
"properties": {
"from_label": {
"default": "Someone's AI",
"title": "From Label",
"type": "string"
},
"question": {
"title": "Question",
"type": "string"
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Session Token"
},
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "To"
}
},
"required": [
"question"
],
"title": "callArguments",
"type": "object"
},
"name": "call",
"outputSchema": null
},
{
"description": "Check on a call that was still ringing or in progress. Waits up to ~25s\n for it to settle; returns the final status and transcript once the call\n ends, the human declines, or the ring times out (\"missed\").",
"inputSchema": {
"properties": {
"call_id": {
"title": "Call Id",
"type": "integer"
},
"session_token": {
"title": "Session Token",
"type": "string"
}
},
"required": [
"call_id",
"session_token"
],
"title": "poll_resultArguments",
"type": "object"
},
"name": "poll_result",
"outputSchema": null
},
{
"description": "Name this session's conversation thread on the human's phone (e.g. the\n project or task you are working on). Shown as the thread title in the app.",
"inputSchema": {
"properties": {
"session_token": {
"title": "Session Token",
"type": "string"
},
"title": {
"title": "Title",
"type": "string"
}
},
"required": [
"session_token",
"title"
],
"title": "set_thread_titleArguments",
"type": "object"
},
"name": "set_thread_title",
"outputSchema": null
},
{
"description": "Return first-setup instructions and a clickable App Store download link when no number is available.",
"inputSchema": {
"properties": {},
"title": "setupArguments",
"type": "object"
},
"name": "setup",
"outputSchema": null
},
{
"description": "Send a one-way text to the human's phone (push notification, no ring).\n On a local client, read `to` from `~/.aiphone/config.json` → `user_number`;\n this hosted server cannot read that file itself. If missing, returns\n setup_required with the App Store link. Pass a previous session_token to\n stay in the same thread.",
"inputSchema": {
"properties": {
"body": {
"title": "Body",
"type": "string"
},
"from_label": {
"default": "Someone's AI",
"title": "From Label",
"type": "string"
},
"session_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Session Token"
},
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "To"
}
},
"required": [
"body"
],
"title": "textArguments",
"type": "object"
},
"name": "text",
"outputSchema": null
},
{
"description": "Wait for the human to send something back to this session — texts and\n voicemail transcripts arrive here. Long-polls up to wait_s (max 30s);\n returns {events, cursor}. Pass the returned cursor next time to only see\n new events. An empty events list just means nothing yet — poll again if\n you are still waiting.",
"inputSchema": {
"properties": {
"cursor": {
"default": 0,
"title": "Cursor",
"type": "integer"
},
"session_token": {
"title": "Session Token",
"type": "string"
},
"wait_s": {
"default": 25,
"title": "Wait S",
"type": "integer"
}
},
"required": [
"session_token"
],
"title": "wait_for_replyArguments",
"type": "object"
},
"name": "wait_for_reply",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:a14eff2099aaff47ac447cff4ac0c171074a54413d0e1bd89f6aa2e31df8bb31 | sha256sum