From jambonz-skills
Build voice applications on jambonz, a voice AI orchestration platform and CPaaS. Use when planning or reasoning about jambonz call flows — selecting verbs (say/gather/dial/agent/transcribe/s2s), choosing between webhook and WebSocket transport, understanding session lifecycle, or avoiding common pitfalls. Works with @jambonz/sdk (JavaScript or TypeScript, preferred) or raw JSON from Python. Pair with jambonz-recipes for implementation patterns, jambonz-starters for runnable scaffolds, and the jambonz MCP server for schema lookups.
How this skill is triggered — by the user, by Claude, or both
Slash command
/jambonz-skills:jambonzThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
jambonz is an open-source CPaaS (Communications Platform as a Service) for building voice and messaging applications. It handles telephony infrastructure — SIP, carriers, phone numbers, media processing — so you can focus on application logic. Your application controls calls by returning **arrays of verbs** — JSON instructions that execute sequentially.
jambonz is an open-source CPaaS (Communications Platform as a Service) for building voice and messaging applications. It handles telephony infrastructure — SIP, carriers, phone numbers, media processing — so you can focus on application logic. Your application controls calls by returning arrays of verbs — JSON instructions that execute sequentially.
This skill covers decision-making: which verb to pick, which transport to use, what mistakes to avoid. For implementation code, load the jambonz-recipes skill. For runnable starter apps, load jambonz-starters. For schema lookups, use the jambonz MCP server.
jambonz_developer_toolkit for the complete SDK guide and schema index.get_jambonz_schema with the verb, component, or callback name.get_sdk_example with the example name.If MCP tools are unavailable, read AGENTS.md from the repo root and schema files from schema/verbs/, schema/components/, schema/callbacks/.
Workflow: Use this skill to decide what to build → use MCP tools to look up how to build it → load jambonz-recipes for the implementation pattern.
jambonz has two editions: v0.9.x (open source) and v10.x (commercial). Each verb schema includes a minVersion field. Only ask the user about their server version if a verb requires minVersion higher than 0.9.6. If all verbs needed have minVersion: "0.9.6", the code works on both editions.
Choose the transport based on what the application needs.
openai_s2s, google_s2s, deepgram_s2s, ultravox_s2s, elevenlabs_s2s, s2s) or the cascaded agent verb — mandatorystream verb with bidirectional audio)Rule: If ANY verb in the application requires WebSocket, the entire application must use WebSocket transport. The verb JSON structure is identical in both modes — only the transport differs.
Use this decision tree to pick the right verb(s) for the task. For implementation details on any verb listed here, load the jambonz-recipes skill.
The user wants a caller to have a conversation with an LLM. There are two main patterns:
openai_s2s, google_s2s, deepgram_s2s, ultravox_s2s, elevenlabs_s2s, or generic s2s)agent)Never use llm in generated code — it is a legacy name. Use either a vendor shortcut or s2s.
Use gather with nested say (for TTS prompt) or play (for audio file). Supports speech recognition, DTMF digits, or both.
dial with a target (phone number, SIP URI, registered user, Teams user)sip-referredirectenqueue (with waitHook for hold music)dequeueTwo options:
Use stream (preferred name; listen is a synonym — always use stream). This is also known as "bidirectional streaming". Customers that have their built-out back end for media processing and AI often prefer this low-level access to the audio.
Use transcribe with a transcriptionHook.
say (supports SSML, multiple voices)play (from URL)dub (mixes alongside the call)Use sip-decline with a SIP status code.
llm verb name — Always use vendor shortcuts (openai_s2s, etc.) or s2s. Never llm.listen verb name — Always use stream. They are synonyms; stream is preferred..send() vs .reply() confusion — .send() is the initial response only. .reply() is for all actionHook responses. Using .send() in an actionHook handler will fail.process.env — jambonz apps should generally use application environment variables (session.data.env_vars / req.body.env_vars), not process.env.env_vars only on initial call — The env_vars object is only present in the first webhook POST or session:new. Store values in a variable if needed in actionHook handlers.createEndpoint from @jambonz/sdk/websocket.model or messages — ElevenLabs uses agent_id auth. The model and prompt are configured in the ElevenLabs dashboard. Pass llmOptions: {}.bidirectionalAudio: { enabled: true, streaming: true } on the listen/stream verb. Without streaming mode, marks are accepted but never fire..send() — In WebSocket mode, if no listener is bound for an actionHook, the SDK auto-replies with an empty verb array, which usually means the call hangs up unexpectedly./call-status handler — Webhook apps must handle call status POST requests. Missing this causes errors in the jambonz logs.@jambonz/sdk.src/app.ts + src/routes/ layout (use .js for JavaScript projects).@jambonz/sdk always. Add express for webhook apps. WebSocket apps need no additional deps."module": "nodenext", "moduleResolution": "nodenext".For complete runnable scaffolds, load the jambonz-starters skill — it indexes 17+ ready-to-clone starter apps.
This skill is part of the jambonz-skills plugin. Load these companion skills based on the task:
jambonz-recipes — Load when implementing a specific feature. Contains @jambonz/sdk patterns and raw-JSON examples for voice AI agents, IVR menus, call control (dial/transfer/queue/conference/recording), and env_vars configuration.jambonz-starters — Load when the user wants to clone a complete runnable app rather than assemble one from recipes.jambonz-setup-mcp — Load when wiring the jambonz MCP server into Claude Code, Cursor, Codex, Windsurf, or VS Code Copilot.npx claudepluginhub jambonz/skills --plugin jambonz-skillsCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.