ShopBot AI MCP Server

AI customer support MCP server with order status lookup and RAG-powered knowledge base search for e-commerce stores.

Documentation

ShopBot AI — MCP-powered E-commerce Support Agent

ShopBot AI is an e-commerce support chatbot I built to explore how far you can push LLMs when they’re connected to real systems like databases and retrieval pipelines.

Instead of relying only on prompt-based answers, the bot can actually:

  • check real orders stored in MySQL
  • search a knowledge base using embeddings (FAISS)
  • decide when it should use tools vs when it should just answer normally

The idea was simple:
a chatbot that doesn’t hallucinate when it matters (like order status).

🔗 Live demo: https://shopbot-ai-os4z.onrender.com


Why I built this

Most chatbot demos feel impressive at first, but break down quickly when you ask:

  • “Where is my order?”
  • “What exactly is your refund policy?”
  • “Is this product in stock?”

They usually respond confidently… even when they shouldn’t.

I wanted to build something closer to how a real support system should behave:

  • if it’s factual → query a database
  • if it’s semantic → search knowledge base
  • otherwise → let the model respond normally

This pushed me into combining RAG, tool calling, and routing logic in one system.


How it works

User message ↓ Flask API ↓ Gemini decides intent (route query) ↓ MCP tool layer ├── MySQL tool → order / customer data └── FAISS tool → FAQ / policy retrieval ↓ ↓ Final response to user


Key design choices (and why I made them)

MCP instead of direct function calls

I used MCP because I didn’t want tool logic mixed directly into the LLM layer. It keeps things modular, so adding a new tool later doesn’t require rewriting the whole routing logic.


FAISS instead of a hosted vector DB

I went with FAISS mainly because I wanted everything to run locally without extra infrastructure costs. It keeps the project self-contained and easier to demonstrate.


Gemini for routing

Gemini is only used to decide what kind of question this is, not to store any “truth.” That separation was intentional to reduce hallucination risk.


Flask instead of FastAPI

This started as a prototype, so Flask was simply faster to iterate with. I prioritized building the system over framework perfection.


What I learned from building this

  • Tool use matters more than prompt engineering for real-world reliability
  • RAG alone isn’t enough unless retrieval is well scoped
  • A simple routing layer improves accuracy more than expected
  • Most “AI chatbot problems” are actually system design problems