Inspiration
I'm an aspiring data analyst, and I kept noticing the same gap: the people who most need answers from their data, like shop owners and managers, are usually the ones who can't easily get them. The data sits in a spreadsheet, and the answer is a pivot table away. I wanted to see if asking out loud could replace that. Alexa+ and the open MCP standard made it possible to try.
What it does
AskData is an MCP server for Alexa+ that turns any CSV file into something you can talk to. Every tool returns a short, speakable sentence plus the structured numbers behind it.
| Ask | Tool |
|---|---|
| "What data do you have?" | list_datasets |
| "Describe the sales data." | describe_dataset |
| "Top three regions by revenue?" | top_n |
| "How is revenue trending?" | trend |
| "Compare South and North revenue." | compare |
Example answers from the included sample data:
- "Top 3 by revenue: East, 217,528; North, 210,946; South, 191,504."
- "Revenue is up 44 percent from January to December. The best month was November, at 78,657."
Drop any CSV into the data/ folder and it becomes a new dataset. Columns with "date" in the name are parsed as dates automatically.
How I built it
- Python with the official MCP Python SDK (
FastMCP), served over Streamable HTTP at/mcp, in stateless mode. - pandas for the analysis: grouping, ranking, and monthly trends.
- Each tool returns a
speechfield written to be read aloud, and a structured payload for clients that want the data. - Dataset names are validated against a strict pattern, so a request can only read CSVs inside the
data/folder. - A small test client (
test_client.py) connects over Streamable HTTP and calls all five tools. I used it locally and through an ngrok HTTPS tunnel to confirm the server works over a public URL.
Challenges
- SDK version change: a fresh install pulled
mcp2.x, which renamedFastMCPand broke my imports. I pinnedmcp>=1.23,<2. - Hidden formatting bug: the
trendtool crashed because pandas month periods don't accept date formats inside f-strings. Switching to.strftime()fixed it. - Silent data failure: the server started fine but reported "no datasets" because
sales.csvwasn't in thedata/folder. It was a path problem, not a code problem. - Inspector install: the MCP Inspector failed with an npm native-binding error, so I built a Python test client and used that instead.
- Confusing browser error: opening
/mcpin a browser returns "Not Acceptable", which looks like a failure but means the server is working, because browsers don't send thetext/event-streamheader MCP requires.
What I learned
- How MCP works in practice: tools, Streamable HTTP, and why a protocol error in a browser can actually be a success.
- That tool output for voice has to be designed. A table of numbers is useless when spoken, but one clear sentence is not.
- Pin your dependencies. A major version change can break a working project overnight.
What's next
- Support for more datasets at once, plus filters such as "only electronics" or "last quarter".
- Charts and summaries delivered to a companion screen.
- Deploying on AWS so the server runs permanently, not just through a tunnel.
Open source
MIT licensed. Code: see the repository link.
Log in or sign up for Devpost to join the conversation.