How to give Claude a phone number (the booth73 MCP server)

2026-05-07 6 min read By The booth73 team claudemcptutorialvoice-aianthropic

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:

  1. Connect the booth73 MCP server to Claude (one-line config).
  2. Give Claude a card code — either a free $5 one from /promo or a paid one from /buy.
  3. 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:

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

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:

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

The booth73 team