Inspiration
Nobody wants to make the call. Booking a plumber means waiting on hold, haggling over price and pinning down a time, and many people put it off or can't do it at all. AI voice agents can now make these calls. But a household will hand one a phone only if it can trust it. It must say it is an AI, it must not spend more than you allow, and it must not book on a "yes" that was really a "maybe". We built Ambient to make those three promises hold in code, not just in a prompt.
What it does
Ambient is an AI caller for the household. Alexa hands it a call to a business. It says first that it is an AI, never spends past the owner's limit without asking, books only on a clean yes to the price and time it read back, and keeps that yes as proof.
You say "Alexa, ask Ambient to call Joe's Plumbing and book a visit to fix the kitchen sink, under 150." Ambient's first words to the business are "Hi, this is an AI assistant calling for Maya. This call is transcribed."
It refuses a false yes. Before it books, Ambient reads the total and the time back to the business. The plumber says "Yes, plus parts." Ambient answers "Sorry, I need one total price. What is the total with parts?" It books only on a reply like "Yes, that's right. See you then.", which agrees without adding, changing or questioning the terms. A dropped line always counts as unconfirmed.
It asks you before it spends more. The plumber quotes $180 against a $150 limit. The call holds, and an Echo Show card asks the owner: "Book $180", "Offer $150" or "Decline". The plumber counters at $160, so the card asks again before anything is booked.
It calls three plumbers at once, in two languages. "Get quotes from plumbers to fix the kitchen sink, under 150" asks the owner once, then calls three businesses and books the cheapest quote under the limit. In the demo, the cheapest plumber speaks Spanish, so Ambient discloses, reads back and books in Spanish while the owner reads English.
It also keeps the read-back and the reply that booked as proof, shows the business a receipt, never calls back a business that says "take us off your list", and can move or redial a booking on request.
Try to fool it. In the simulator you can play the business. Type any answer to the read-back, in English or Spanish. The same call reducer that runs every call decides, and the panel tells you why it booked or didn't.
What is real and what is simulated: the whole call runs end to end with zero keys, in a browser (pnpm demo) and through the MCP server (pnpm smoke:mcp). The business and the Alexa+ host are simulated. The AssemblyAI voice line, the Claude brain, the Alexa skill and the AWS stack are built but have not run live yet.
How we built it
One pure function owns the call: step(state, input, now). It has no clock, no network and no model inside it. Every honesty rule is a table test against it. A property test plays 4,000 generated calls with mixed event orders. It checks that every booking followed a clean yes to a fully played read-back of that exact amount. A labelled set of 192 business replies tests the yes check.
The surfaces are:
- an MCP server on
/mcp, using Streamable HTTP and MCP spec 2025-11-25 - a custom Alexa skill
- an MCP App card
- a browser simulator on
/sim, which is a real MCP client
On the voice line, AssemblyAI's Voice Agent API calls our own LLM endpoint. That endpoint passes each business turn into the reducer and speaks only what the reducer allows. Claude Opus 5.5 is the brain behind it. The reducer decides what may be said, so the rules don't depend on the model.
Built with TypeScript, Node.js, SQLite, Vitest and AWS CDK.
Challenges we ran into
- Free-text price parsing leaked. An agent's own offer once counted as the business's confirmation, and a street address once parsed as the price. We deleted the parser and replaced it with a read-back that needs a clean yes.
- No phone dial-out. AssemblyAI can't place outbound calls, and we had no budget for Twilio. The business answers on a web link that a phone browser opens like an incoming call.
- The Alexa+ MCP toolkit was gated for entrants as of 2026-10-18. We built our own MCP host to test the contract end to end.
- No first-party way for a skill to speak unprompted. Proactive Events shows only a fixed notification template, so the spoken "Ambient needs you" cue depends on a third-party service.
Accomplishments that we're proud of
- Across 4,000 generated calls, Ambient never books without a clean yes to the exact terms it read back.
- "Yes, plus parts." doesn't fool it, and any judge can try to fool it themselves in one minute with no keys, in GitHub Codespaces or with
pnpm install && pnpm demo. - Call-around and Spanish: it calls three businesses at once and books in the business's language while the owner reads English.
- An honest repo: the README says plainly what runs, what is simulated and what has not run live yet. The friction log has 11 entries, and each one comes with a script that reproduces it.
What we learned
Honesty belongs in a state machine. Prompt-level instructions leaked under review, and a pure reducer with property tests did not. We also learned an MCP detail that cost us time: elicitation inside a tool call reaches the client only on an SSE response tied to that request. In any other setup it hangs with no error.
What's next for Ambient
- Run the voice line against the live API and measure the time to the first word.
- Deploy the skill and run it on a real Echo Dot and Echo Show.
- Run a small pilot: 5 households and 15 real calls, reading every transcript. One booking the owner didn't approve fails the pilot.
- Before any public launch, get a legal review. The US FCC ruled in February 2024 that the TCPA covers AI-generated voices, and call-recording consent laws apply too.
Source: https://github.com/mukeshkbj/ambient · Friction log · Product feedback
Built With
- alexa-plus
- alexa-skills-kit
- amazon-web-services
- anthropic
- assemblyai
- aws-cdk
- claude
- github-codespaces
- mcp
- model-context-protocol
- node.js
- sqlite
- typescript
- vitest
- websockets
- zod
Log in or sign up for Devpost to join the conversation.