/call-me rings a real human's phone (iPhone or Android) and returns what they said.
- 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.
- 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.
- Only a person's number works. The `from` in every result is your own agent identity: never call or text it, or any other agent's number, because agents cannot reach each other through /call-me. A caller that keeps trying numbers that are not /call-me numbers is blocked for an hour.
- When no number is available, call `setup` and ALWAYS include these clickable links in your reply: [Download Call Me from the App Store](https://apps.apple.com/app/call-me/id6789575165) for iPhone, or [get it on Google Play](https://play.google.com/store/apps/details?id=com.serdaroztetik.callmeai) for Android. 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 links.
- 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.
- `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
Discoverability
0 of 6 checks0/100
Client listings and public setup information.
mcp.json on main domain
No matching manifest was found at /mcp.json or /.well-known/mcp.json.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "setup",
"title": "Set up Call Me",
"description": "Return first-setup instructions and clickable App Store and Google Play download links when no number is available.",
"inputSchema": {
"type": "object",
"title": "setupArguments",
"properties": {}
},
"annotations": {
"title": "Set up Call Me",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Ring the human's phone, 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 download links. 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 description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
question
Not provided
Missing description. Explain what this value means and how to supply it.
to
Not provided
Missing description. Explain what this value means and how to supply it.
from_label
Not provided
Missing description. Explain what this value means and how to supply it.
session_token
Not provided
Missing description. Explain what this value means and how to supply it.
keep_open
Not provided
Missing description. Explain what this value means and how to supply it.
language
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "call",
"title": "Call the human",
"description": "Ring the human's phone, 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 download links. Pass a previous\n session_token to stay in the same thread on their phone. By default the\n call is a conversation: after their answer the line stays up for `say`\n until you `hang_up`; keep_open=false hangs up after one answer. `language` (\"tr\", \"de\", ...) is the language you are\n speaking; the call's own short lines follow it. Default English.",
"inputSchema": {
"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
}
}
},
"annotations": {
"title": "Call the human",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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").
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
call_id
Not provided
Missing description. Explain what this value means and how to supply it.
session_token
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "poll_result",
"title": "Get call result",
"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": {
"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"
}
}
},
"annotations": {
"title": "Get call result",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
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".
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
call_id
Not provided
Missing description. Explain what this value means and how to supply it.
session_token
Not provided
Missing description. Explain what this value means and how to supply it.
text
Not provided
Missing description. Explain what this value means and how to supply it.
language
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Say the next line",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "say",
"title": "Say the next line",
"description": "In a call placed with keep_open=true, speak `text` to the human and\n return what they answer, in the same shape as `call`. Only after their\n previous answer is in. Waits up to ~30s; on \"in_call\", follow up with\n poll_result. \"open\": false means the call has ended. Pass `language` only\n to switch the language of the call's own lines; empty keeps it. Anything\n they said while you were thinking comes back as \"said_while_waiting\".",
"inputSchema": {
"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"
}
}
},
"annotations": {
"title": "Say the next line",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
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 download links. Pass a previous session_token to
stay in the same thread.
Describe the returned information so the agent knows whether it will answer the request.
Inputs0/100
0 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body
Not provided
Missing description. Explain what this value means and how to supply it.
to
Not provided
Missing description. Explain what this value means and how to supply it.
from_label
Not provided
Missing description. Explain what this value means and how to supply it.
session_token
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
session_token
Not provided
Missing description. Explain what this value means and how to supply it.
cursor
Not provided
Missing description. Explain what this value means and how to supply it.
wait_s
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Wait for a text reply",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "wait_for_reply",
"title": "Wait for a text reply",
"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": {
"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"
}
}
},
"annotations": {
"title": "Wait for a text reply",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
/call-me setup, tools, quality score, publishing readiness, and alternatives.
How do I add /call-me to Claude, ChatGPT, or Cursor?
Add /call-me to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://callmemcp.com/mcp.
Is /call-me MCP ready for ChatGPT and Claude?
As of October 30, 2026, /call-me scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is /call-me's MCP tool documentation?
As of October 30, 2026, /call-me scores 60/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 8 of 8 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to /call-me?
As of October 30, 2026, alternatives to /call-me in communication on the Manufact MCP leaderboard include Dial, Primitive Email, Granola, AgentLine: Phone Numbers for AI Agents, and JooVoice.
How can /call-me improve its MCP documentation?
say is the lowest-scoring reviewed tool at 54/100. 0 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.