matyasstoch/david-skills/vapi-voice-agents
Claude Code and agent skill by matyasstoch/david-skills
- community
Checking that the SKILL.md file is still in the repository.
Create Vapi voice assistants and place outbound phone calls via the Vapi MCP — cold outreach, SDR, appointment setting, callbacks.
Install
npx vskill@latest install matyasstoch/david-skills/vapi-voice-agentsSKILL.md
Vapi Voice Agents
End-to-end workflow for building a Vapi assistant and placing live outbound calls from the terminal. The Vapi MCP exposes assistants, phone numbers, tools, and calls — you orchestrate them.
Standard workflow
mcp_vapi_list_phone_numbers— pick aphoneNumberIdwhose country matches the target. NJ/US target → use a US Vapi number. PL target → Polish number. Mismatched country = bad answer rate.mcp_vapi_create_assistant— name, firstMessage, instructions, llm, voice, transcriber. Defaults that work:gpt-4o/11labs(sarah for warm female SDR) /deepgram nova-3.mcp_vapi_create_call— passassistantId,phoneNumberId,customer.number(E.164).- Poll
mcp_vapi_get_calluntilstatus == "ended". Transcript fields only populate after the call ends.
Outbound polling pattern
Do NOT ask the user to "ping you when ready." Auto-poll. Run terminal('sleep 30') then call mcp_vapi_get_call. Repeat at 30–60s intervals. Calls typically run 30s–3min. Status transitions: queued → ringing → in-progress → ended.
Choosing the target (don't ask the user)
If the user says "cold outreach to X businesses in Y region," research a real target yourself via web_search. Pull a phone number off Yelp/their website. Don't ask the user to provide one — David specifically pushed back on this with "research that yourself." Same for caller identity/agency name — invent a plausible one (e.g. "BrightLane") unless they specified a brand.
Assistant instructions structure (SDR/cold-outreach pattern)
The instructions field is the entire system prompt. For appointment-setting calls use this skeleton:
- Identity: one sentence — who they are, what company, what they do.
- Goal: one explicit success criterion (e.g. "book a 15-min discovery call"). Anything else = failure.
- Opening flow: numbered steps — confirm decision maker → pattern interrupt → 2-question qualifier → one-sentence pitch → ask for meeting → lock time → repeat back callback + email.
- Objection handling: 4–6 common ones with one-line rebuttals ("too busy", "already advertise", "send me an email", "not interested", price questions).
- Rules: short sentences, American English, no jargon, never lie, AI-disclosure answer pre-canned ("Yes I'm an AI calling on behalf of X…"), voicemail script (~15s), DNC compliance (if asked to be removed, confirm + end), keep under 3 min.
firstMessage should be conversational and end with a yes/no question to anchor the call. Pattern: "Hey, this is <Name> from <Company> — am I catching the owner or manager for a quick thirty seconds?"
Pitfalls
- `call.start.error-get-transport` on call create: that specific Vapi number has a transport/SIP-trunk issue. The fix is NOT to debug — just retry
create_callwith a differentphoneNumberIdfrom the list. The error fires within ~1s ofcreatedAt, ended immediately, no debit. Surface this to the user as "this number's transport is broken, swapping" — don't ask permission, just rotate. - Country mismatch: calling US numbers from a non-US Vapi number kills answer rates. Filter by country prefix before picking.
- Transcript empty during call:
mcp_vapi_get_callexposesmessages/transcript/summary/recordingUrlonly afterstatus == "ended". Don't pull early and report "no transcript" — keep polling. - Voicemail handling: Vapi can't always tell live answer from voicemail. Bake a "if you hear a beep, leave the 15s message and end" instruction into the system prompt — don't trust detection alone.
- `firstMessageMode`: default
assistant-speaks-firstis right for outbound. Useassistant-waits-for-useronly if the dialed number has its own IVR/intro you must let play.
Compliance
Cold-call laws vary by US state. NJ is generally permissive for B2B but the assistant MUST honor any "remove me" / "don't call back" request immediately and end the call. The AI-disclosure rebuttal in the instructions is a hard requirement — never instruct the assistant to deny being an AI.
Reusing an assistant for many calls
Create the assistant once, then loop mcp_vapi_create_call with different customer.number values. Override per-call context via assistantOverrides.variableValues and reference those as {{varname}} inside instructions — useful for personalizing per business without forking the assistant.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/productivity/vapi-voice-agents/SKILL.md
Popularity
- Repository stars
- 61
- Repository forks
- 11
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/matyasstoch/david-skills/vapi-voice-agents)