-
-
VoiceStack’s customer view introduces conversational bookings, with no shops loaded yet.
-
The Developer view shows MCP request monitoring, server details, and the booking race control.
-
A shop owner enters Raj Salon’s services, prices, hours, and chair capacity.
-
VoiceStack extracts the shop details into an editable draft for owner approval.
-
Raj Salon is published, with its bookings dashboard, calendar, and audit log ready.
-
The customer view lists Raj Salon and offers example booking requests.
-
A Hindi haircut request is entered in the booking assistant.
-
VoiceStack reads back the selected service, time, and price before asking for confirmation.
-
The assistant confirms the booking and displays the completed conversation state.
-
The customer’s receipt shows the confirmed appointment details and booking ID.
-
Retrying the same confirmation returns the existing booking without creating a duplicate.
-
A second customer’s request for the occupied slot is declined and added to the waitlist.
-
Cancelling the original booking frees the slot and offers it to the next customer on the waitlist.
-
Rahul accepts the offered slot and receives a confirmed booking.
-
The race test shows one winner and 19 rejected requests competing for a single chair.
Inspiration
Booking a haircut should not require downloading another app or navigating a calendar. Sometimes, the most natural request is simply, "Kal shaam 5 baje haircut."
That was our starting point for VoiceStack: make local appointment booking feel like a conversation, while giving the business a schedule it can trust.
But understanding a request is only half the problem. What happens when two people ask for the same slot? Or when a customer presses confirm again because the connection dropped? We wanted to build the less visible part of a voice experience too: making sure the action behind the conversation is reliable.
What it does
VoiceStack connects conversational requests to a working appointment-booking system through the Model Context Protocol (MCP).
A shop owner can turn a short description of services, prices, and opening hours into an editable draft, then approve it for publication. Customers can search for businesses and request appointments using supported Hindi or English phrases, through browser speech input or typed text.
Before booking, VoiceStack reads back the details and temporarily holds the slot for two minutes. The customer must explicitly confirm. Repeating the same confirmation request returns the original booking instead of creating another one.
If a slot is occupied, another customer can join its waitlist. When the booking is cancelled, the waiting customer can receive a temporary offer.
Our browser demo simulates the Alexa+ interaction while calling a real MCP server. It is not a deployed Alexa+ integration.
How we built it
We built the backend in Python using the official MCP SDK, with eight tools covering business onboarding, discovery, availability, holds, confirmation, cancellation, and waitlisting.
The server uses Streamable HTTP. A lightweight HTML and JavaScript interface provides Customer, Shop owner, and Developer views, including visibility into tool calls.
For the prototype, we deliberately used rule-based parsing rather than an LLM. That kept supported requests predictable and let us focus on the booking workflow without requiring cloud services or API keys.
SQLite handles persistence. Transactions and occupancy constraints protect reserved time intervals, while confirmation idempotency makes retries safe. Longer services reserve multiple intervals so they cannot overlap another appointment.
Challenges we ran into
The hardest part was deciding what should happen between "that slot looks available" and "your booking is confirmed." Availability can change during a conversation, so checking it once was not enough. Temporary holds gave that interaction a clear boundary.
We also had to distinguish a retry from a new request. A repeated confirmation should return the same receipt, but a different customer requesting an occupied slot must be rejected.
Language introduced another challenge: keeping the experience approachable without suggesting that our parser understands every possible sentence. Editable input and explicit confirmation help customers catch mistakes before a booking is made.
Accomplishments that we're proud of
We completed an end-to-end workflow from owner onboarding to customer confirmation, cancellation, and a waitlist offer.
We also made booking conflicts visible. The Developer view can send competing requests for a slot, showing which request succeeds and which are rejected.
Our verification included 33 passing automated tests and a successful integration smoke test against the running MCP server. Seeing the workflow hold up beyond the happy path was an important milestone.
What we learned
MCP provides a way for a client to discover and call tools. It does not supply the business rules, permissions, or conversational understanding behind them. Those still need careful design.
We also learned that reliability is part of the user experience. A clear read-back, an explicit confirmation, and a receipt that survives a retry matter just as much as accepting a spoken request.
What's next for VoiceStack
Our next priorities are authentication, stronger business-owner verification, and validation with an external MCP client and a real Alexa+ integration.
We also want to expand language coverage, evaluate speech recognition with real users, and improve scheduling and waitlist handling, including passing expired offers to the next person.
VoiceStack is currently a local prototype. The next step is to test it with small businesses and learn which parts of their booking workflow it genuinely makes easier.
Built With
- css
- fastmcp
- html
- javascript
- mcp
- model-context-protocol
- python
- sqlite
- starlette
- streamable-http
- web-speech-api
Log in or sign up for Devpost to join the conversation.