Inspiration
Small businesses answer the same questions all day: when do you open, can I get a refund, how long does delivery take. Most can't afford a developer to build a chatbot, and none of them have a way to put that knowledge on a voice assistant. When we saw that Alexa+ can now call outside tools over MCP, we saw a way to fix both at once: a business writes down what it knows once, and customers can reach it from a website or by voice.
What it does
Parlo lets a business create an AI assistant from its own knowledge.
- A business creates a bot and adds its knowledge. Parlo splits it into chunks, embeds them with Gemini, and stores them in PostgreSQL with pgvector.
- Visitors chat with the bot through an embeddable website widget.
- For Alexa+, Parlo runs a self-hosted MCP server (Streamable HTTP). Each business connects with its own key as a bearer token, so one server serves many businesses and each can only reach its own data. Requests without a valid key get a 401.
The server has three tools:
search_knowledge: fast, retrieval-only lookup that returns the matching passages and their source, so the assistant can phrase the reply itself. This is the tool built for voice.ask_business_assistant: a finished answer from the business's own bot, with follow-up questions in the same conversation.get_business_info: the business name, greeting and the topics it knows.
A simulated Alexa+ web page (clearly labelled as simulated) talks to the real MCP server and shows every tool call, its timing, and the passages it found.
How we built it
- Backend: Django and Django REST Framework, JWT authentication, Celery and Redis for processing sources in the background.
- Search: PostgreSQL 16 with pgvector (768-dimension embeddings, HNSW index, cosine distance).
- AI: Gemini for embeddings and written answers, behind small adapters so the model can be swapped.
- MCP server: the official MCP Python SDK in stateless HTTP mode, with a small ASGI middleware that checks the bot key and passes the business identity to the tools.
- Widget: vanilla JavaScript in a Shadow DOM so it can't clash with a host website's styles.
- Delivery: Docker Compose, with 111 automated tests, including real pgvector searches.
Challenges we ran into
- Voice needs speed. Generating an answer with a language model is too slow for a voice assistant's latency target, so we split the job.
search_knowledgeonly retrieves and returns in tens of milliseconds, while the slowerask_business_assistantis separate. - One server, many businesses. The server has to know which business each request is for without mixing data. We carry the caller's identity through each request in a context variable and added tests proving one business can never see another's knowledge.
- Prompt injection. A business's text could try to give the model new instructions. Knowledge is passed inside a clearly marked block that the system prompt says is data, not instructions.
- No real device. We couldn't test on a physical Alexa+ device, so we built a simulator that exercises the MCP server exactly as an assistant would.
Accomplishments that we're proud of
- A working end-to-end path from a business's own text to a spoken answer, through a real MCP server.
- Strict per-business isolation, enforced in every search and covered by tests.
- A voice-first tool design: a fast retrieval-only tool next to a slower finished-answer tool.
- 111 automated tests, including real vector search, and the whole project built from scratch for this hackathon and released under the MIT license.
What we learned
How MCP servers work over Streamable HTTP, how to make them stateless and multi-tenant, and how to design tools for voice, where the calling assistant writes the reply. We also learned to test vector search against a real database instead of mocks, and how much a retrieval-only tool matters for latency.
What's next for Parlo
OAuth 2.1 account linking for real Alexa+ deployment, file and URL ingestion (PDFs, websites), a React dashboard for businesses, and billing.
Built With
- alexa
- alexa-plus
- celery
- django
- django-rest-framework
- docker
- docker-compose
- gemini
- javascript
- jwt
- mcp
- model-context-protocol
- pgvector
- postgresql
- python
- rag
- redis
Log in or sign up for Devpost to join the conversation.