AgentCall MCP Server
Give Claude Desktop, Cursor, Windsurf, VS Code, Hermes, OpenClaw, Codex, and any other MCP-compatible AI agent direct access to phone numbers, SMS, voice calls, inbound AI virtual agents with live pre-call context, auditable cross-call memory, and automatic OTP extraction. 43 tools and 4 prompts, one install command. Same hosted URL for every client.
Quick Install
1. Get your API key
Sign up at agentcall.co/sign-up and grab your API key from the dashboard. It looks like ac_live_xxxxxxxx
2. Add to your AI tool
Pick your client below. Same MCP URL works everywhere. Paste it, add your API key as the auth header, and you're live.
https://api.agentcall.co/mcpSame URL for every client below. Auth via Authorization: Bearer ac_live_... header.
Open Claude Desktop settings
~/Library/Application Support/Claude/claude_desktop_config.json (Mac) — or %APPDATA%\Claude\claude_desktop_config.json (Windows)Paste this config
{
"mcpServers": {
"agentcall": {
"transport": "streamable-http",
"url": "https://api.agentcall.co/mcp",
"headers": {
"Authorization": "Bearer ac_live_xxx"
}
}
}
}Connect
Prefer to run it locally? (Node.js 18+)
Run the MCP server on your machine instead of using the hosted endpoint. Useful for air-gapped setups or local development.
claude mcp add agentcall --env AGENTCALL_API_KEY=ac_live_xxx -- npx -y @agentcall/mcp-server{
"mcpServers": {
"agentcall": {
"command": "npx",
"args": ["-y", "@agentcall/mcp-server"],
"env": {
"AGENTCALL_API_KEY": "ac_live_xxx"
}
}
}
}3. Start using it
Once connected, your AI agent can provision phone numbers, send SMS, make calls, and extract OTP codes by simply asking. Try:
Running Hermes? Give your agent a phone number.
The hosted MCP works out of the box with the Hermes agent platform. Connect it once, then ask Hermes through Telegram (or whichever messaging platform you use) to provision a number, configure a virtual agent persona, and wire live context from your inbox. Full walkthrough at the Hermes integration guide.
Using OpenClaw?
OpenClaw agents use environment variables instead of MCP config. See the OpenClaw integration guide for the two-line setup.
Install via Smithery
AgentCall is published on Smithery, the MCP server marketplace. One command installs the server into Claude Desktop, Cursor, Windsurf, or any MCP client Smithery supports — no manual config editing.
npx -y @smithery/cli install @agentcall/mcp-server --client claudeReplace --client claude with cursor, windsurf, or any supported client. Smithery prompts you for your AGENTCALL_API_KEY on first run and writes the config file for you.
Tool Reference (43 tools, 4 prompts)
Phone Numbers
provision_numberProvision a new phone numbertype (local/tollfree/mobile), country?, label?list_numbersList all provisioned numberslimit?, country?, type?get_numberGet details of a specific numbernumberIdupdate_number_labelRename a phone number's human-readable label (or pass null to clear)numberId, labelupdate_number_voiceChange the inbound AI voice on an existing virtual agent without resetting the rest of the config (systemPrompt, contextWebhook, notify, etc. are preserved)numberId, voicerelease_numberRelease a phone numbernumberIdconfigure_inbound_aiConfigure inbound AI voice on a supported number so incoming calls are answered autonomously. Optionally wire a contextWebhook URL so the AI fetches live context (today's brief, current priorities) on every call.numberId, systemPrompt, voice?, firstMessage?, maxDurationSecs?, record?, notify?, contextWebhook?disable_inbound_aiDisable inbound AI on a number (clears inbound config)numberIdSMS
send_smsSend an SMS messagefrom, to, bodyget_inboxGet inbound messages for a numbernumberId, limit?, otpOnly?get_messageGet a specific messagemessageIdwait_for_otpWait for an OTP code to arrivenumberId, timeout?Voice Calls
initiate_callStart an outbound phone callfrom, to, record?list_callsList call historylimit?get_callGet details of a specific callcallIdhangup_callTerminate an active callcallIdinitiate_ai_callStart an AI-powered voice call (Pro plan only)from, to, systemPrompt, voice?, firstMessage?, maxDurationSecs?, record?get_call_transcriptGet transcript of a completed AI callcallIdAuditable Call Memory (Read)
list_contactsList every contact your numbers have talked tolimit?, search?get_contactFull contact record including memory entries and recent callscontactIdget_contact_by_phoneLook up a contact by E.164 phone numberphoneget_next_call_contextThe one-paragraph brief loaded into the AI on the next inbound callcontactIdget_current_memoryCurrent memory entries (facts, preferences, commitments, decisions) for a contactcontactIdget_memoryFetch a single memory entry by IDmemoryIdget_memory_timelineFull edit history for a memory entry (extractor writes plus owner edits)memoryIdlist_memory_candidatesPending extractor candidates waiting for owner approvalcontactId?, limit?list_call_reportsList recent structured Call Reports across all your numberslimit?, contactId?, numberId?get_call_reportStructured Call Report for a single call (summary, intent, urgency, entities, facts, decisions, commitments, tasks, preferences, unresolved, risks, nextAction, nextCallContext, ownerBrief)callIdAuditable Call Memory (Write)
update_contactUpdate displayName, tags, ownerNotes, or verified on a contactcontactId, displayName?, tags?, ownerNotes?, verified?purge_contactDelete a contact (cascades to memory entries, candidates, briefs)contactIdupdate_memoryEdit a memory entry's text or expiresAt; prior version is kept in the timelinememoryId, text?, expiresAt?delete_memoryDelete a memory entry (timeline rows are retained)memoryIdapprove_memory_candidatePromote an extractor candidate into a permanent memory entrycandidateId, text?reject_memory_candidateDrop a candidate so it is not re-suggested from the same source callcandidateIdlist_briefsOwner-brief inbox; surfaces items that need human attentionstatus?, urgency?, contactId?acknowledge_briefMark a brief as seen without resolving itbriefIdresolve_briefClose a brief with an optional notebriefId, note?Webhooks
create_webhookRegister a webhook endpointurl, events[]list_webhooksList registered webhooksnonerotate_webhook_secretRotate the signing secret for a webhookwebhookIddelete_webhookDeactivate and remove a webhookwebhookIdAccount
set_memory_enabledTurn Auditable Call Memory on or off at the account level (on by default)enabledget_usageGet usage and cost breakdown for a billing periodperiod?Example Workflows
Test your app's SMS verification flow
Ask your AI agent to test the verification end-to-end:
provision_number → enters number in verification form → calls wait_for_otp → enters code → done.Send a notification via SMS
Agent calls: send_sms
from: "num_abc123"
to: "+14155551234"
body: "Your order #1234 has shipped. Track at https://..."
→ Returns: { id: "msg_xyz", status: "sent", cost: 0.015 }Make a recorded call
Agent calls: initiate_call
from: "num_abc123"
to: "+14155551234"
record: true
→ Returns: { id: "call_xyz", status: "initiated", record: true }
→ After call: recording URL delivered via webhookSet up a virtual agent plus email summaries in one prompt
The MCP configure_inbound_ai tool accepts an optional notify block, so the whole setup (provision, configure inbound AI, set the email destination) happens in a single conversation. No dashboard handoff.
provision_number → calls configure_inbound_ai with systemPrompt, voice, firstMessage, and notify.emailTo → done.Email-only for v1. The email contains caller name (when given), phone, intent, urgency, and a 1-2 sentence ask. Spam calls are auto-suppressed.
Configuration
Authentication
The MCP server needs your AgentCall API key. Provide it via environment variable (recommended) or CLI flag:
# Environment variable (recommended)
AGENTCALL_API_KEY=ac_live_xxx agentcall-mcp
# CLI flag
agentcall-mcp --api-key ac_live_xxxRequirements
- Node.js 18 or later
- API Key from agentcall.co (free tier available)
- AI Tool that supports MCP (Claude Code, Claude Desktop, Cursor, Windsurf, etc.)
How It Works
The MCP server runs locally on your machine as a subprocess of your AI tool. It translates MCP tool calls into secure HTTPS requests to the AgentCall API, which handles phone number provisioning, SMS, and voice calls on your behalf.
Webhook Events
Use create_webhook to subscribe to these events:
sms.inboundNew SMS received on your numbersms.otpOTP code detected and extracted from SMScall.inboundIncoming call to your numbercall.ringingOutbound call is ringingcall.statusCall status changed (includes duration, recording URL)call.recordingCall recording saved and availablecall.transcriptAI voice call transcript availablecall.report.readyStructured Call Report ready (fires a few seconds after call.transcript)number.releasedPhone number was releasedLinks
# REST API Quickstart
Don't use MCP? You can hit the AgentCall API directly with curl or any HTTP client. Get your API key from the dashboard, then:
1. Provision a phone number
curl -X POST https://api.agentcall.co/v1/numbers/provision \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"country": "US", "type": "local"}'2. Send an SMS
curl -X POST https://api.agentcall.co/v1/sms/send \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"from": "+15672901611", "to": "+14155551234", "body": "Hello from AgentCall!"}'3. Wait for an OTP code
curl https://api.agentcall.co/v1/sms/inbox/NUMBER_ID?otpOnly=true \ -H "Authorization: Bearer YOUR_API_KEY"
4. Make an AI voice call
curl -X POST https://api.agentcall.co/v1/calls/ai \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "+15672901611",
"to": "+14155551234",
"systemPrompt": "You are calling to confirm a reservation.",
"voice": "shimmer"
}'Full interactive API reference: api.agentcall.co/docs
Ready to get started?
Get your API key and install the MCP server in under 2 minutes.
Get API Key, Free