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 speech field 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 mcp 2.x, which renamed FastMCP and broke my imports. I pinned mcp>=1.23,<2.
  • Hidden formatting bug: the trend tool 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.csv wasn't in the data/ 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 /mcp in a browser returns "Not Acceptable", which looks like a failure but means the server is working, because browsers don't send the text/event-stream header 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.

Built With

Share this project:

Updates

Submission history