Gives Claude a real phone line through the AgentPhone API. You get 26 tools covering the full lifecycle: buy numbers in specific area codes, send and receive SMS, place outbound calls with AI conversation built in, create agents with custom voices and system prompts, set up webhooks for inbound handling, and pull usage breakdowns. The agent model is clever: each one gets its own numbers and voice personality, so you can spin up separate lines for support, sales, or scheduling. Works over stdio for Cursor and Claude Desktop, or hit their hosted streamable HTTP endpoint if you're building a multi-user platform. Useful when you need your AI to actually interact with people over the phone network, not just simulate it.
claude mcp add --transport http agentphone https://mcp.agentphone.to/mcp --header 'Authorization: YOUR_AUTHORIZATION'Run in your terminal. Add --scope user to make it available in every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 11, 2026.
account_overviewGet a complete snapshot of your AgentPhone account: agents, phone numbers, webhook status, and usage limits. Call this first to orient yourself before using other tools.Get a complete snapshot of your AgentPhone account: agents, phone numbers, webhook status, and usage limits. Call this first to orient yourself before using other tools.
No parameters — call it with no arguments.
list_numbersList all phone numbers in your account. Each number has an ID needed by other tools (get_messages, attach_number, list_calls).2 paramsList all phone numbers in your account. Each number has an ID needed by other tools (get_messages, attach_number, list_calls).
limitnumberoffsetnumberbuy_numberPurchase a new phone number. Use area_code to request a specific region (e.g. '415' for San Francisco). Tip: pass agent_id to attach it immediately, or use attach_number later.3 paramsPurchase a new phone number. Use area_code to request a specific region (e.g. '415' for San Francisco). Tip: pass agent_id to attach it immediately, or use attach_number later.
countrystringagent_idstringarea_codestringsend_messageSend an SMS or iMessage from one of your agent's phone numbers. USE THIS TOOL WHEN the user wants to text someone. The agent must have at least one phone number attached. If the agent has multiple numbers, use number_id to specify which one to send from.5 paramsSend an SMS or iMessage from one of your agent's phone numbers. USE THIS TOOL WHEN the user wants to text someone. The agent must have at least one phone number attached. If the agent has multiple numbers, use number_id to specify which one to send from.
body*stringagent_id*stringmedia_urlstringnumber_idstringto_number*stringget_messagesGet SMS messages for a specific phone number. Use list_numbers to find the number ID. For threaded conversations, use list_conversations + get_conversation instead.2 paramsGet SMS messages for a specific phone number. Use list_numbers to find the number ID. For threaded conversations, use list_conversations + get_conversation instead.
limitnumbernumber_id*stringlist_callsList recent calls. Scope by agent_id or number_id, or use status/direction/search to filter globally. When agent_id or number_id is passed, status/direction/search filters are not applied. Returns call IDs — use get_call with an ID to fetch the full transcript.7 paramsList recent calls. Scope by agent_id or number_id, or use status/direction/search to filter globally. When agent_id or number_id is passed, status/direction/search filters are not applied. Returns call IDs — use get_call with an ID to fetch the full transcript.
limitnumberoffsetnumbersearchstringstatusstringagent_idstringdirectionstringinbound · outboundnumber_idstringget_callGet details and transcript for a specific call. Use list_calls to find call IDs. Pass wait=true to block until an in-progress call finishes before returning.3 paramsGet details and transcript for a specific call. Use list_calls to find call IDs. Pass wait=true to block until an in-progress call finishes before returning.
waitbooleancall_id*stringtimeoutnumbermake_callInitiate an outbound phone call. USE THIS TOOL WHEN the user wants to place a webhook-driven call where your backend handles the conversation logic. DO NOT USE when the user wants an autonomous AI conversation — use make_conversation_call instead. The agent must have a phone n...5 paramsInitiate an outbound phone call. USE THIS TOOL WHEN the user wants to place a webhook-driven call where your backend handles the conversation logic. DO NOT USE when the user wants an autonomous AI conversation — use make_conversation_call instead. The agent must have a phone n...
voicestringagent_id*stringto_number*stringfrom_number_idstringinitial_greetingstringmake_conversation_callPlace a phone call where the AI has an autonomous conversation about a given topic. USE THIS TOOL WHEN the user wants an AI agent to call someone and have a conversation — scheduling, surveys, follow-ups, etc. No webhook setup needed. DO NOT USE when the user wants a webhook-d...8 paramsPlace a phone call where the AI has an autonomous conversation about a given topic. USE THIS TOOL WHEN the user wants an AI agent to call someone and have a conversation — scheduling, surveys, follow-ups, etc. No webhook setup needed. DO NOT USE when the user wants a webhook-d...
waitbooleantopic*stringvoicestringagent_id*stringto_number*stringfrom_number_idstringinitial_greetingstringmax_wait_secondsnumberlist_agentsList all agents with their phone numbers and voice configuration. An agent is required before you can make calls — it owns phone numbers and handles voice/SMS.1 paramsList all agents with their phone numbers and voice configuration. An agent is required before you can make calls — it owns phone numbers and handles voice/SMS.
limitnumbercreate_agentCreate a new agent. An agent owns phone numbers and handles calls/SMS. After creating, use buy_number or attach_number to give it a phone number. Set voice_mode to 'hosted' with a system_prompt for autonomous AI voice calls, or 'webhook' (default) to forward call transcripts t...9 paramsCreate a new agent. An agent owns phone numbers and handles calls/SMS. After creating, use buy_number or attach_number to give it a phone number. Set voice_mode to 'hosted' with a system_prompt for autonomous AI voice calls, or 'webhook' (default) to forward call transcripts t...
name*stringvoicestringmodel_tierstringturbo · balanced · maxvoice_modestringwebhook · hosteddescriptionstringbegin_messagestringsystem_promptstringtransfer_numberstringvoicemail_messagestringupdate_agentUpdate an agent's configuration — name, description, voice settings, system prompt, greeting, call transfer, or voicemail. Only provided fields are updated. Use list_voices to see available voice IDs. Switching voice_mode to 'hosted' requires a system_prompt.10 paramsUpdate an agent's configuration — name, description, voice settings, system prompt, greeting, call transfer, or voicemail. Only provided fields are updated. Use list_voices to see available voice IDs. Switching voice_mode to 'hosted' requires a system_prompt.
namestringvoicestringagent_id*stringmodel_tierstringturbo · balanced · maxvoice_modestringwebhook · hosteddescriptionstringbegin_messagestringsystem_promptstringtransfer_numberstringvoicemail_messagestringdelete_agentDelete an agent permanently. Phone numbers attached to it will be kept but unassigned. DO NOT USE without confirming with the user — this cannot be undone.1 paramsDelete an agent permanently. Phone numbers attached to it will be kept but unassigned. DO NOT USE without confirming with the user — this cannot be undone.
agent_id*stringget_agentGet details for a specific agent including its phone numbers, voice configuration, and system prompt.1 paramsGet details for a specific agent including its phone numbers, voice configuration, and system prompt.
agent_id*stringattach_numberAttach a phone number to an agent so the agent handles calls/SMS on that number. Use list_numbers to find unassigned number IDs and list_agents for agent IDs.2 paramsAttach a phone number to an agent so the agent handles calls/SMS on that number. Use list_numbers to find unassigned number IDs and list_agents for agent IDs.
agent_id*stringnumber_id*stringdetach_numberDetach a phone number from an agent. The number is kept in your account but becomes unassigned. Use list_agents or get_agent to see which numbers are attached.2 paramsDetach a phone number from an agent. The number is kept in your account but becomes unassigned. Use list_agents or get_agent to see which numbers are attached.
agent_id*stringnumber_id*stringlist_voicesList available voices for agents. Use the voice_id value when calling create_agent or update_agent.List available voices for agents. Use the voice_id value when calling create_agent or update_agent.
No parameters — call it with no arguments.
list_conversationsList SMS conversations. Optionally filter by agent_id to see conversations for a specific agent. Each conversation is a thread between your number and an external contact. Use get_conversation with the ID to read messages.3 paramsList SMS conversations. Optionally filter by agent_id to see conversations for a specific agent. Each conversation is a thread between your number and an external contact. Use get_conversation with the ID to read messages.
limitnumberoffsetnumberagent_idstringget_conversationGet a specific SMS conversation with message history. Use list_conversations to find IDs.2 paramsGet a specific SMS conversation with message history. Use list_conversations to find IDs.
message_limitnumberconversation_id*stringupdate_conversationSet metadata on a conversation. Use this to store custom state, tags, or context that persists between messages. Pass null to clear metadata.2 paramsSet metadata on a conversation. Use this to store custom state, tags, or context that persists between messages. Pass null to clear metadata.
metadata*valueconversation_id*stringget_usageGet account usage statistics. By default returns a summary with plan limits, quotas, and message/call volume. Use breakdown='daily' or 'monthly' for time-series data.3 paramsGet account usage statistics. By default returns a summary with plan limits, quotas, and message/call volume. Use breakdown='daily' or 'monthly' for time-series data.
daysnumbermonthsnumberbreakdownstringsummary · daily · monthlydefault: summaryget_webhookGet the webhook configuration. Pass agent_id to get an agent-specific webhook, or omit for the project-level default.1 paramsGet the webhook configuration. Pass agent_id to get an agent-specific webhook, or omit for the project-level default.
agent_idstringset_webhookSet a webhook URL to receive inbound messages and call events. Pass agent_id to set a webhook for a specific agent (overrides project default). Omit agent_id to set the project-level webhook for all agents. The webhook secret is returned — use it to verify signatures.4 paramsSet a webhook URL to receive inbound messages and call events. Pass agent_id to set a webhook for a specific agent (overrides project default). Omit agent_id to set the project-level webhook for all agents. The webhook secret is returned — use it to verify signatures.
url*stringtimeoutnumberagent_idstringcontext_limitnumberdelete_webhookRemove a webhook. Pass agent_id to remove an agent's webhook (falls back to project default). Omit agent_id to remove the project-level webhook. DO NOT USE without confirming with the user.1 paramsRemove a webhook. Pass agent_id to remove an agent's webhook (falls back to project default). Omit agent_id to remove the project-level webhook. DO NOT USE without confirming with the user.
agent_idstringtest_webhookSend a test event to verify a webhook is working. Returns the HTTP status code and response time. Pass agent_id to test that agent's webhook. Omit to test the project-level webhook.1 paramsSend a test event to verify a webhook is working. Returns the HTTP status code and response time. Pass agent_id to test that agent's webhook. Omit to test the project-level webhook.
agent_idstringlist_webhook_deliveriesView recent webhook delivery history. Shows which events were delivered, HTTP status codes, and timing. Pass agent_id to see deliveries for that agent's webhook. Omit for project-level.3 paramsView recent webhook delivery history. Shows which events were delivered, HTTP status codes, and timing. Pass agent_id to see deliveries for that agent's webhook. Omit for project-level.
hoursnumberlimitnumberagent_idstringGive AI agents real phone numbers, SMS, and voice calls via the Model Context Protocol.
AgentPhone lets your AI agent buy phone numbers, send/receive SMS, and place voice calls — all through natural language in Cursor, Claude Desktop, or any MCP-compatible client.
Agents are the core concept — each agent gets its own phone numbers, voice personality, system prompt, and webhook. Think of an agent as a virtual team member with its own phone line. You can create agents for different purposes (support, sales, scheduling) and configure how they sound and behave on calls.
Sign up at agentphone.ai and create an API key from Settings.
Option A: Remote server (recommended)
Point your MCP client at the hosted endpoint — no install needed:
{
"mcpServers": {
"agentphone": {
"type": "streamable-http",
"url": "https://mcp.agentphone.ai/mcp",
"headers": {
"Authorization": "Bearer your_api_key_here"
}
}
}
}
Works with any MCP client that supports Streamable HTTP transport (Switchboard, remote agent platforms, etc.).
Option B: Local server (stdio)
Runs locally via npx — works with Cursor, Claude Desktop, Windsurf, and Claude Code:
Cursor: Settings > MCP or ~/.cursor/mcp.json
Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
{
"mcpServers": {
"agentphone": {
"command": "npx",
"args": ["-y", "agentphone-mcp"],
"env": {
"AGENTPHONE_API_KEY": "your_api_key_here"
}
}
}
}
Option C: Self-hosted HTTP server
Run your own HTTP MCP endpoint:
AGENTPHONE_API_KEY=your_api_key npx agentphone-mcp --http --port 3000
Then connect to http://localhost:3000/mcp.
Once configured, just ask your AI agent things like:
| Transport | Command | Use case |
|---|---|---|
| Streamable HTTP (remote) | https://mcp.agentphone.ai/mcp | Agent platforms (Switchboard, etc.), remote clients |
| Streamable HTTP (self-hosted) | npx agentphone-mcp --http --port 3000 | Your own infrastructure |
| stdio (default) | npx agentphone-mcp | Cursor, Claude Desktop, Windsurf, Claude Code |
AGENTPHONE_API_KEY environment variableAuthorization: Bearer <key> header per requestAuthorization: Bearer <key> header per request| Method | Path | Description |
|---|---|---|
POST | /mcp | MCP Streamable HTTP endpoint (stateless — each request is independent) |
GET | /health | Health check |
| Tool | Description |
|---|---|
account_overview | Get a full snapshot of your account — agents, numbers, webhook, and usage |
get_usage | Get usage stats, plan limits, and quotas. Use breakdown for daily or monthly time-series. |
| Tool | Description |
|---|---|
list_numbers | List all phone numbers in your account |
buy_number | Purchase a new phone number with optional area_code and agent_id |
| Tool | Description |
|---|---|
send_message | Send SMS or iMessage. Supports media, threaded replies (reply_to_message_id), iMessage send effects (send_style), and group chats |
get_messages | Get messages for a specific number |
list_conversations | List SMS conversations. Pass agent_id to filter by agent. |
get_conversation | Get a conversation with full message history |
update_conversation | Set metadata on a conversation |
| Tool | Description |
|---|---|
list_contacts | List saved contacts (address book). Filter with a search term. |
manage_contact | Create, update, or delete a contact (set action) |
| Tool | Description |
|---|---|
list_calls | List calls. Filter by agent_id, number_id, status, direction, or keyword. |
get_call | Get call details and transcript |
make_call | Place an outbound call (webhook-driven) |
make_conversation_call | Place a call with built-in AI conversation — no webhook needed |
| Tool | Description |
|---|---|
list_agents | List all agents with their numbers and voice config |
create_agent | Create an agent with voice, system prompt, call transfer, voicemail, and voice tuning (speed, interruption sensitivity, backchannel, language, and more) |
update_agent | Update an agent's configuration |
delete_agent | Delete an agent (numbers are kept but unassigned) |
get_agent | Get agent details including phone numbers and voice config |
attach_number | Assign a phone number to an agent |
detach_number | Remove a phone number from an agent |
list_voices | List available voices for agents |
All webhook tools accept an optional agent_id — pass it to manage an agent-specific webhook, omit it for the project-level default. Agent webhooks take priority over project-level.
| Tool | Description |
|---|---|
get_webhook | Get webhook configuration |
set_webhook | Set a webhook URL for inbound messages and call events |
delete_webhook | Remove a webhook |
test_webhook | Send a test event to verify your webhook works |
list_webhook_deliveries | View delivery history for debugging |
| Variable | Required | Description |
|---|---|---|
AGENTPHONE_API_KEY | stdio: yes, HTTP: no | Your AgentPhone API key (HTTP mode can use Authorization header instead) |
AGENTPHONE_BASE_URL | No | Override the API base URL (defaults to https://api.agentphone.ai) |
PORT | No | Port for HTTP mode (defaults to 3000, overridden by --port) |
git clone https://github.com/AgentPhone-AI/agentphone-mcp.git
cd agentphone-mcp
npm install
npm run dev # Run with tsx (hot reload)
npm run build # Compile TypeScript
npm start # Run compiled JS (stdio)
This MCP server connects your AI assistant to the AgentPhone API. Your assistant talks to the MCP server, which calls the AgentPhone API, which talks to the phone network.
Your AI Assistant <--> agentphone-mcp <--> AgentPhone API <--> Phone Network
Outbound: your assistant places calls and sends texts through AgentPhone's API.
Inbound: when someone calls or texts your number, AgentPhone sends a webhook event to your server — you can then respond programmatically or let your agent's built-in AI handle it.
MIT
AGENTPHONE_API_KEY*secretYour AgentPhone API key. Get one at https://agentphone.to