Inspiration

The people who keep our days running, like the office pantry, the driver, home help and grandparents, mostly don't use apps. They answer the phone. Every day I make the same short calls: "Can you bring the car?", "Tea for the client by 3", "Is it done?". I wanted Alexa+ to make those calls for me.

What it does

CallAssist is a remote MCP server that Alexa+ uses as an add-on. Say "Alexa, ask Raju to bring tea and snacks to the meeting room by 3." Alexa reads the task back and waits for your yes. CallAssist then phones Raju in a natural voice, says up front that it's an AI assistant calling for you, explains the task, and gets a clear yes and a time. If Raju has a question, it comes back to you, and your answer goes back to him. After the deadline it follows up on its own, and it tells you when the task is done. Preset errands ("get me a coffee") and messages with one question ("tell Grandma I'll pick her up at 5 and ask if she needs anything") work the same way.

The video includes a real story told through three recorded calls over an Airtel SIP line in India. Madhu asks Neeta (front desk) to set up a client meeting at 11. Neeta says she'll check the client's availability. On the follow-up call she reports the client is only free at 11:30 and asks whether to book it. CallAssist tells her it will check with Madhu, Alexa brings the question to Madhu, Madhu says yes, and a third call gets Neeta's confirmation back to Madhu.

Judges can try the whole loop at https://callassist.mobil80.com: Alexa+, the team's phone and a live MCP log side by side, with guided steps. No setup is needed, and no real numbers are called from the site.

How we built it

  • MCP server in TypeScript (official MCP SDK, Streamable HTTP, protocol 2025-11-25 with 2025-03-26 for Alexa+): 10 tools, an MCP Apps interactive card (ui://callassist/card.html), and an Agent Skill (skills/callassist/SKILL.md), also served as an MCP prompt.
  • Simulated Alexa+ experience that behaves like Alexa+: a real MCP client where Amazon Nova Pro on Amazon Bedrock understands free-form requests and picks the tool. Common phrases and yes/no take an instant rule path, and the rules are the fallback if the model is slow. Usually about 1.5 seconds per reply. The model can never claim an action it didn't take through a tool.
  • OAuth 2.0 account linking (authorization code with PKCE, plus client credentials), with server-issued one-time confirmation tokens so no call happens without the user's yes.
  • Safety in the server, not the prompt: AI disclosure on every call, recorded consent, an opt-out that sticks, calling hours in the callee's time zone, call caps and rate limits.
  • Voices: Amazon Polly generative (Danielle) for Alexa, the demo phones and real calls. Speech to text: Amazon Transcribe.
  • Telephony: Amazon Connect (outbound voice and browser calling) for US numbers, and a SIP bridge (Asterisk ARI over an Airtel SIP trunk) for real calls in India, with talk detection, silence trimming and the opening line prepared while the phone rings.
  • AWS: EC2 Graviton running Docker, CloudFront HTTPS on callassist.mobil80.com (ACM + Route 53), ECR with scan on push, Secrets Manager, SSM, CloudWatch metrics, IAM least privilege, all in CloudFormation and changed through reviewed change sets.
  • CI/CD: GitHub Actions with OIDC (no stored AWS keys): 143 automated tests, cfn-lint, cfn-guard, gitleaks, npm audit and Trivy, then ECR, then an SSM deploy with automatic rollback.

Challenges

New Amazon Connect instances start with very low default limits (claimed phone numbers, outbound call throttling), so outbound calls failed with "limit exceeded" until a quota increase. We raised a support case, kept Connect wired, added Connect browser calling, and built a SIP bridge so real calls could still be tested. On real phone lines, turn-taking was the hard part: the first version cut people off or waited too long. Talk detection, silence trimming, preparing the opening line while the phone rings, and an instant "Okay." made it feel like a normal call.

Accomplishments

A full loop (ask, confirm, call, follow up, report) that is safe by design, works on real phone lines across several calls, and is deployed with a production-style DevOps pipeline.

What we learned

Put the safety rules in the server, where the model can't skip them. Let a language model understand people, but let the server decide whether anyone is called.

What's next

A live Alexa+ connection when MCP add-ons open to developers, Hindi and Kannada, a WhatsApp fallback, and team dashboards.

Try it

Built With

Share this project:

Updates

Submission history