agentic · MCP-first

Your AI agent just
placed a call.

An MCP-first walkthrough. Install Voice MCP. Tell Claude to dial a number. Watch the tool fire — dial, speak, record, transcribe, classify — every step transparent and auditable. No campaign UI, no agent dashboard, no orchestration layer to learn.

npm i -g crixin && crixin install Install in 30 seconds
01
terminal · 30 seconds · once

Install the npm package.

A single global install. crixin voice install wires the MCP server into every AI host on your machine — Claude Code, Cursor, Codex CLI, Claude Desktop. No SaaS account. No webhooks. No API key swap.

~ — zsh
$ npm i -g crixin added 1 package in 4s $ crixin install claude code ~/.claude/settings.json + crixin-voice + crixin-coder cursor ~/.cursor/mcp.json + crixin-voice + crixin-coder codex cli ~/.codex/config.toml + crixin-voice + crixin-coder claude desktop ~/Library/.../claude_desktop_config.json restart your AI host once. $
02
claude code · same window you ship from

Tell Claude what you want done.

No new tab. No new dashboard. Just the AI host you already have open. Voice MCP's tools (make_call, send_sms, transcribe_call) are now first-class — the agent reasons about them like it would about read_file or bash.

you
use crixin-voice to call Tony's Pizza at +14155550142. confirm they're open and ask if they take orders for tomorrow's lunch (~20 pizzas). use Polly.Joanna-Neural and tag the call office-lunch-prep.
claude
on it. calling now via crixin-voice.make_call. i'll show you the SID + transcript when it lands.
03
voice mcp · one call · ~42 seconds

Voice MCP places the call. Every stage is visible.

No campaign UI, no fanout abstraction, no orchestration layer. make_call is one tool invocation: dial → connect → speak (Polly TwiML) → record (Twilio) → transcribe (Deepgram, optional) → return. Each stage emits to the MCP host so the agent — and you — can audit it.

stage 1 · dialCA94e1…
→ Tony's Pizza · +1 (415) 555-0142
queued → ringing → in-progress · 2.3s
stage 2 · speakPolly.Joanna-Neural
"Hi, this is Joanna calling — quick question for tomorrow's lunch order…"
TwiML <Say> · 6.1s
stage 3 · recordRE5b…
recipient speaking · max 60s · max silence 4s
recording · listening for hangup
stage 4 · transcribedeepgram · nova-2 · en-US
recording finalizes → POST to Deepgram → JSON back
pending (optional — needs DEEPGRAM_API_KEY)
stage 5 · returnmake_call → tool result
{ call_sid, status, duration, recording_url, transcript? }
the agent sees the result inline and decides next step
Meanwhile, you're on line 184 of routes/checkout.ts, rewriting the Stripe webhook. The call happens on the agent's task tree — it doesn't pause your editor, it doesn't steal your terminal, it doesn't ask you a single question.
04
claude · ~42 seconds later

Result comes back. Same chat. No context-switch.

The call settles, the agent reads the tool result, summarizes back into your chat, and the row lands in your local SQLite. Every artifact is auditable: Twilio call SID, recording URL (in your Twilio account), Deepgram transcript (if enabled), the exact tool args your AI sent. No black box.

claude
call done. 42s on the line.
42sduration
$0.04twilio
yesthey take orders
$11.50per large pizza

Tony's Pizza confirmed: open tomorrow 10am–10pm, can take an order of 20 large pizzas if I call back by 9am. Asked me to text the address. Tagged office-lunch-prep in your local DB.

transcript → ~/.crixin/crixin.db · recording lives in your Twilio account (RE5b…)

you
remind me to call them back at 8:30am tomorrow.
tool
cron.schedule · reminder set for 2026-05-13 08:30. done.