Skip to main content
Glama
ferrerj

pizza-analytics

by ferrerj

๐Ÿ• Pizza Analytics: Local dbt + DuckDB + FastMCP Pipeline

An end-to-end local data analytics stack featuring a dbt transformation pipeline on DuckDB, fully containerized with Docker, and exposed as a Model Context Protocol (MCP) server for local LLMs via LM Studio.

๐Ÿ“ Architecture Overview

Data Ingestion & Transformation: Raw CSV data is transformed using modular dbt models into Staging (stg_*), Fact (fct_*), and Dimension (dim_*) layers within a single-file DuckDB database (dev.duckdb).

MCP Tool Server: A Python-based FastMCP server connects to DuckDB in read-only mode to expose structured analytical tools over standard input/output (stdio).

LLM Orchestration: Local LLMs in LM Studio invoke these tools on demand to answer complex analytical questions with real-time database queries.

๐Ÿ“ Repository Structure

.

โ”œโ”€โ”€ dbt_project/

โ”‚ โ”œโ”€โ”€ models/ # dbt transformation models (stg_*, fct_*, dim_*)

โ”‚ โ”œโ”€โ”€ seeds/ # Raw sample data CSVs

โ”‚ โ”œโ”€โ”€ dbt_project.yml # dbt project configurations

โ”‚ โ””โ”€โ”€ profiles.yml # DuckDB profile settings

โ”œโ”€โ”€ Dockerfile # Container definition for dbt & Python environment

โ”œโ”€โ”€ docker-compose.yml # Multi-container service orchestration

โ”œโ”€โ”€ mcp_server.py # FastMCP server exposing database tools to LLMs

โ”œโ”€โ”€ requirements.txt # Local Python dependencies for MCP host

โ”œโ”€โ”€ .gitignore # Ignores compiled DuckDB binaries & temporary logs

โ””โ”€โ”€ README.md

โšก Quickstart Guide

Prerequisites

Docker Desktop installed with WSL2 backend.

Python 3.10+ installed locally (for running the host MCP server).

LM Studio installed.

Step 1: Clone & Build Containers

Clone this repository to your local machine:

git clone https://github.com/YOUR\_USERNAME/pizza-analytics-mcp.git

cd pizza-analytics-mcp

Build and spin up the Docker services in the background:

docker compose up -d --build

Step 2: Build the dbt Data Pipeline

Run dbt seeds and models inside the container to build your local DuckDB database:

# Populate raw CSV seed files into DuckDB

docker compose exec dbt dbt seed

# Execute staging, fact, and dimension transformations

docker compose exec dbt dbt run

Note: This creates the database file at ./dbt_project/dev.duckdb.

Step 3: Install Local Dependencies for MCP

Install the required Python packages on your local host system so LM Studio can execute the MCP server script:

pip install -r requirements.txt

(Or install manually: pip install duckdb fastmcp pandas)

Step 4: Configure LM Studio

Open LM Studio and navigate to the MCP / Integrations settings.

Edit your mcp.json file to register the pizza-analytics server:

{

  "mcpServers": {

  "pizza-analytics": {

  "command": "python",

  "args": [

  "-u",

  "C:\\FULL\\PATH\\TO\\pizza-analytics-mcp\\mcp_server.py"

  ]

  }

  }

}

Note: Ensure you use the -u flag to disable Python's standard output buffering, and replace C:\\FULL\\PATH\\TO\\ with your exact absolute path.

Save the file and click Refresh in LM Studio. The tool indicators should turn green!

๐Ÿ› ๏ธ Available MCP Tools

get_store_sales

Queries store-level performance metrics directly from fct_orders.

Parameters: store_id (optional string, e.g., "1")

Returns: JSON array with store_id, total_orders, and total_revenue.

get_total_sales

Queries overall performance metrics (total revenue and total pizza order counts across all stores) directly from fct_orders.

Parameters: None

Returns: JSON array with total_orders and total_revenue.

๐Ÿ’ก Key Design & Troubleshooting Notes

DuckDB Concurrency & Locking: FastMCP connects to DuckDB using read_only=True and a Python with context manager. This ensures connections are released immediately after queries execute and prevents file lock deadlocks.

Serialization: Data types such as Decimal and Date from DuckDB queries are serialized using json.dumps(data, default=str) to ensure clean JSON transmission over stdio.

Speculative Decoding: When using local models (e.g., Gemma, Llama) with tool calling in LM Studio, disable Speculative Decoding / Draft Models in your model parameters to prevent context cache decoding crashes.

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A production-grade MCP server for enterprise sales analytics, enabling LLM clients to query, analyze, and visualize sales data from a SQLite database through structured tools, resources, and prompts.
    6
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Provides read-only access to a sales database, letting LLMs answer analytics questions like revenue by region or top customers via MCP tools.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables natural-language sales queries against a SQLite database, generating and executing read-only SQL through a secure MCP server with table listing, schema description, and query execution.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    A natural-language data analyst MCP server that lets users query SQLite sales datasets via MCP tools (list_tables, aggregate, time_series, run_sql) with read-only SQL safety guards, returning results through a FastAPI dashboard.
    MIT