Download the macOS app. No Xcode, no cloud accounts, no dependencies — just a .dmg.
# Download the latest release
curl -L https://takecallos.polsia.app/download -o TakeCallOS.dmg
# Mount and install
open TakeCallOS.dmg
Or download directly → Drag TakeCallOS to Applications, launch it, and grant phone permissions on first run. macOS will ask for Contacts and Notifications access — both needed for call handling.
TakeCallOS pairs with your existing iPhone via Apple Continuity — the same technology that lets you take calls on your Mac. No virtual numbers. No porting. Your real cell number, nothing changes for callers.
Open TakeCallOS → Settings → API Keys. Paste in the keys for the providers you want to use. BYOK means your usage goes directly to your provider account — no markup, no per-minute fees on top.
The local MCP server starts automatically when TakeCallOS is running. Your endpoint is always:
make_call and
answer_call.
Any MCP-compatible client will discover them on connection.
Pick your agent framework below. Paste the config snippet, restart your client, and TakeCallOS shows up as a phone tool.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json.
Add the mcpServers block below (merge into existing config if you have other servers):
{
"mcpServers": {
"takecallos": {
"url": "takecallos://mcp",
"transport": "stdio",
"command": "takecallos-mcp"
}
}
}
Quit and relaunch Claude Desktop. You'll see a phone icon in the tool palette — Claude can now make and receive calls from your iPhone number.
Go to Cursor → Settings → MCP and add a new server entry,
or paste this snippet directly into your ~/.cursor/mcp.json:
{
"mcpServers": {
"takecallos": {
"url": "takecallos://mcp",
"transport": "stdio",
"command": "takecallos-mcp"
}
}
}
Reload the MCP servers from the Cursor settings panel. The TakeCallOS phone tools appear in Cursor Agent mode automatically.
Use the mcp Python client to connect and call the tools directly.
Works with CrewAI, LangChain, AutoGen, or any custom agent:
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
# Connect to the local TakeCallOS MCP server
server_params = StdioServerParameters(
command="takecallos-mcp",
args=[],
)
async def make_call_example():
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# List available tools (make_call, answer_call)
tools = await session.list_tools()
print("Available tools:", [t.name for t in tools.tools])
# Place a call
result = await session.call_tool(
"make_call",
arguments={
"number": "+1 555 867 5309",
"goal": "Book the earliest available cleaning next week",
"context": "I am a patient. My name is Alex. I am flexible on time."
}
)
print("Call result:", result.content)
asyncio.run(make_call_example())
Wrap make_call as a tool in your CrewAI crew,
LangChain agent, or AutoGen assistant the same way you'd add any other tool.
See full integration examples →
Type a prompt in Claude Desktop (or your agent). Watch TakeCallOS place the call from your real number, stream the transcript live, and hand back a summary when it's done.