Inspiration
India sells over a million electric two-wheelers a year, and every one of those brands runs the same three broken conversations by phone and WhatsApp: a prospect who wants a straight answer on range and charging cost before visiting a showroom, an owner with a battery problem who can't get a human fast enough, and a GM who finds out the service queue backed up by reading a spreadsheet a week late. Raptee.HV's CCS2 universal charging - letting a motorcycle owner use India's existing EV car charging network instead of a scarce motorcycle-specific grid - was exactly the kind of fact that deserves an instant, clear answer, not a brochure. Alexa+'s MCP standard made it possible to build that as a real agentic surface instead of another FAQ bot.
What it does
A self-hosted MCP server (spec 2025-11-25, Streamable HTTP) exposes 22 tools across three personas against a real seeded dataset: prospects get specs, running-cost math, live showroom availability, and the conversation itself becomes a sales action (capture_lead, book_test_ride); owners get real service actions - deduplicated fault reporting, computed warranty eligibility (from actual purchase date and odometer, not a canned answer), always-urgent roadside dispatch distinct from a routine ticket, insurance claims; leadership gets decision signals instead of raw tables - funnel conversion, an SLA-aware maintenance queue, unusual-breakdown flagging, a daily rollup. A simulated Alexa+ Echo Show web app (charcoal bezel, reactive cyan light bar, mic input, light response cards) is the only consumer of that data, talking to it exclusively through a real MCP client - nothing is hardcoded or bypassed.
How we built it
A pnpm monorepo: apps/mcp is an Express server using the real @modelcontextprotocol/sdk, stateless Streamable HTTP (a fresh server+transport per request, which turned out to be naturally serverless-friendly), node:sqlite for storage. apps/sim is Next.js/React, with a 3-tier agent - Groq (openai/gpt-oss-120b real function-calling) as the enforced primary tier, Gemini as a second tier, and a scripted keyword fallback as the final resort - all three calling the exact same MCP tools through the exact same client, no shortcut path. We deployed both to Vercel as separate projects wired together by real env vars, and pushed the whole thing to a public GitHub repo under MIT license.
Challenges we ran into
Getting voice responses to actually sound like voice and not like a report took real iteration - early replies read like technical paragraphs with raw JSON leaking through; we rewrote every response path (LLM system prompts and the scripted fallback's hand-written templates) around a strict one-breath rule and banned markdown/field-name dumps. We also hit a genuinely nasty bug where Next.js was silently caching our MCP client's fetch() calls across different requests, serving stale tool responses - diagnosed only by comparing live API output against the actual SQLite file on disk. A second real bug: the scripted agent never checked isError on a failed tool call, so a bad owner ID produced garbage like "reference undefined" instead of a graceful reply - fixed with a single callAndRender wrapper and a regression test so it can't regress silently.
Accomplishments that we're proud of
All 22 tools verified with real, live curl/script evidence against the deployed production server - not just unit tests with a mocked transport (docs/testing/test_results.json, 22/22 passing). The agent genuinely chains tools autonomously (e.g. choosing to call book_service_slot right after log_service_request without being told the second step is needed). The MCP server's stateless-by-design architecture meant it deployed to Vercel serverless with minimal changes, no rearchitecture needed.
What we learned
Amazon's own Alexa+ MCP guidance says it plainly: you influence what Alexa says through the data you return, not by scripting the sentence yourself — that reframed how we thought about structuredContent completeness and error-shape honesty, not just prompt wording. We also learned serverless statelessness is a feature, not a limitation, if you design for it from the start rather than bolting it on.
What's next for Alexa+ Raptee Ops Agent
Persist state across cold starts with a real hosted Postgres instead of ephemeral /tmp SQLite; wire a real Alexa+ Add-on once Preview access opens, instead of only the web simulation; add purchasing capability (a real checkout flow for parts/accessories) and rich card/carousel responses for Echo Show's visual surface; and package this as a white-label SaaS layer other EV two-wheeler OEMs (Ather, Ola Electric, TVS iQube) can stand up against their own dealership data in a day, not a quarter.
Built With
- alexa
- amazon-alexa
- express.js
- gemini
- groq
- mcp
- nextjs
- node.js
- pnpm
- react
- sqlite
- typescript
- vercel
- vitest
- webspeechapi
Log in or sign up for Devpost to join the conversation.