How to give Claude a phone number (the booth73 MCP server)
How to give Claude a phone number
Claude is good at language. It can compose an email, draft a contract clause, summarize a 40-page deposition. The one thing it has historically been bad at is the most universal piece of business infrastructure: a phone call.
booth73 is how you fix that. This post walks through the setup, what the tools look like, what happens during a call, and the consent flow Claude is required to run before dialing.
TL;DR
Three steps:
- Connect the booth73 MCP server to Claude (one-line config).
- Give Claude a card code — either a free $5 one from
/promoor a paid one from/buy. - Ask Claude to make the call.
Claude will ask you to confirm TCPA consent (this is required), then place the call. You'll get a transcript by email when it ends.
What "give Claude a phone number" actually means
Three things have to be true for an LLM to make a phone call:
The first is transport — a real telephone number that can dial outbound. Claude doesn't have one. Anthropic doesn't sell them. booth73 has Twilio numbers paid for through the prepaid card model.
The second is voice synthesis — a model that converts Claude's text outputs into speech in real time, latency low enough to feel like a conversation. booth73 uses Cartesia Sonic-2, multilingual, around 50ms first-token latency.
The third is speech recognition — converting the recipient's voice back to text Claude can read. booth73 uses Deepgram Nova-2.
The MCP server we operate at https://booth73.com/mcp exposes these three pieces as tools Claude can call. Claude says "place_call(...)"; the MCP server connects to the underlying voice stack; the recipient hears Claude (in Cartesia's voice) and Claude reads what the recipient says (via Deepgram).
The MCP install
In Claude Desktop or any MCP-compatible client, add an entry pointing at booth73's HTTP MCP endpoint. The exact config depends on your client, but for Claude Desktop:
{
"mcpServers": {
"booth73": {
"type": "http",
"url": "https://booth73.com/mcp",
"headers": {
"Authorization": "Bearer booth73-XXXXXXXX"
}
}
}
}
The Authorization header carries your card code — that's how booth73 knows which card to bill. If you want Claude to use a different card per conversation (say, a friend gives you a code), you don't need to hardcode it: each tool call accepts an optional card_code parameter that overrides the connector default.
If you don't have a card yet, claim a free $5 one at booth73.com/promo — it'll arrive in your email and you can paste the code straight into Claude.
The tool catalog
Once the MCP server is connected, Claude sees six tools:
place_call(phone_number, script_or_directions, caller_name, tcpa_attested, ...)
→ places a call, returns a call_id you can poll
place_call_and_wait(phone_number, script_or_directions, caller_name, tcpa_attested, ...)
→ places a call AND waits for it to end, returns the transcript in one shot
get_call_status(call_id)
→ "queued" / "ringing" / "in-progress" / "ended" / "failed"
get_call_transcript(call_id)
→ full transcript with "booth73:" / "User:" speaker labels
list_recent_calls(limit)
→ recent calls placed by this card
card_balance()
→ how much money is left on this card
Most tasks use place_call_and_wait because it's the "make this happen and tell me what they said" shape that fits naturally into a conversation.
A complete example: Claude calls the dentist
You: "Claude, my filling fell out. Can you call Dr. Park's office at +14155551234 and see if they have anything tomorrow morning?"
Claude (in real life — this is what actually happens, not a hypothetical): "Before I place the call, I want to confirm a few things. First, do you have prior consent from Dr. Park's office to receive AI-voice calls from you, OR a prior business relationship with them, OR is this a personal call to someone who would expect to hear from you (e.g., your dentist)? This is a TCPA requirement and I'm not allowed to set the attestation true on your own without you confirming."
You: "Yes, they're my dentist. I've been a patient for years."
Claude: "Great. Placing the call now." — runs place_call_and_wait with tcpa_attested=true, the script "Call Dr. Park's office and ask if there's a same-day or next-morning appointment available — Mr. Chen lost a filling," and caller_name="Alex Chen".
The call goes out. Claude (via Cartesia) opens with: "Hi, this is an AI assistant calling on behalf of Alex Chen, and the call may be recorded for transcript delivery. He lost a filling and was wondering if you have any same-day or next-morning openings."
The receptionist answers. Claude responds appropriately, doesn't go off-script, doesn't agree to charges or terms beyond what was authorized, doesn't share any of Alex's personal information beyond the name. If asked something out of scope, Claude says "I'll need to check with Mr. Chen and follow up." After the call ends, the transcript is emailed to whatever address is on the booth73 card.
What's hardcoded into the assistant
Every booth73 call carries a system prompt with non-negotiable rules:
- The opener discloses AI status by name and discloses recording.
- The tone is calm, measured, professional. No exclamation points.
- The AI never agrees to charges, signs up for services, accepts Terms of Service, or commits the caller to anything beyond the script.
- The AI never shares sensitive caller information (SSN, credit card, password, full home address) even if it appears in context.
- If the recipient indicates they're a minor (states their age, asks for a parent, mentions school), the AI ends politely.
- If the recipient asks to be removed from future calls, the AI confirms and ends.
- If the recipient becomes hostile or sexually inappropriate, the AI ends within one polite sentence.
- The AI is aware of the time budget (paid minutes on the card) and paces accordingly.
These aren't features Claude can override — they're baked into every call. The user-supplied script appears below them in the prompt and can adjust tone, language, specific objectives, but can't disable the safety floor.
TCPA — what Claude does before placing the call
The Telephone Consumer Protection Act applies to AI voice calls in the U.S., and similar laws exist in Canada, the UK, EU, Australia, and most major destinations. Penalties are real ($500–$1500 per call under TCPA, more under some state laws like Florida's FTSA).
booth73 enforces compliance at the API level: every call must include tcpa_attested: true, and that boolean must come from a confirmed user statement, not from Claude inferring on its own. The MCP tool description spells this out, and Claude is supposed to ask before calling.
What the user is attesting to: one of (a) prior express consent from the recipient to receive AI-voice calls, (b) a prior business relationship with the recipient, or (c) this is a personal call to someone who would expect to hear from them (your dentist counts, your friend counts, the hotel where you have a reservation counts).
booth73 also enforces the 8am–9pm calling window in the recipient's local timezone. Calls outside that window are rejected with a clear error.
Limitations
- Outbound only. booth73 doesn't currently provision per-user inbound numbers; calls only go out.
- $0.50/minute. If you're going to place hundreds of calls per day, the prepaid model is too expensive — build on Vapi directly.
- Recording is mandatory. We can't disable it; the transcript goes to the email on the card.
- One in-flight call per card. If you need parallelism, mint multiple cards.
- Telemarketing scripts are blocked at the API level. If your script reads as a sales pitch ("interested in our…", "extending your warranty", "you've been selected"), the call is rejected before placement.
What else this works with
booth73 is MCP-native, but MCP is a standard, not a Claude-specific thing. The same https://booth73.com/mcp endpoint works with:
- Cursor, when configured with an HTTP MCP server
- Custom agents built on the Anthropic, OpenAI, or Google SDKs that support MCP
- Cline, Continue, and other coding agents
- Any MCP-compatible client
It also works without MCP — the underlying REST API at /api/calls accepts the same arguments, with a Bearer card-code header. If you're writing a Python or TypeScript agent that doesn't speak MCP, point at the REST API directly.
Where to go next
- Claim a free $5 booth card — try this without paying
- Agent quickstart at /llms.txt — the technical reference
- Comparison: AI voice calling APIs — if you're shopping the category
- FAQ — TCPA, recording, transcripts, refunds, longer answers
— The booth73 team