Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,561Letters: 14Defects: 1,336counted just now
teppi

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 yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:a14eff2099aaff47ac447cff4ac0c171074a54413d0e1bd89f6aa2e31df8bb31 | sha256sum