Skip to main content
Glama

Product Recommendation System with MCP Server

A comprehensive product recommendation system using ChromaDB vector store, Azure OpenAI embeddings, FastMCP HTTP server, and a custom MCP client for natural language product search.

๐ŸŽฏ Overview

This system enables natural language product search and recommendations through a Model Context Protocol (MCP) server. It uses semantic search with embeddings to find products based on user queries like "I'm looking for a waterproof tent" or "affordable hiking boots under $100".

๐ŸŒŸ Key Features

  1. Semantic Search: Uses embeddings for intelligent product matching

  2. Multi-Filter Support: Category, brand, and price filtering

  3. Natural Language: Understands queries like "affordable waterproof tent"

  4. 8 MCP Methods: Comprehensive product search capabilities

  5. Scalable: Can handle thousands of products

  6. Production-Ready: HTTP server with proper error handling

  7. Well-Tested: Full test suite with 10 test cases

๐Ÿ“‹ MCP Server Methods

The system provides 8 powerful MCP methods:

#

Method Name

Description

1

search_products

Search products using natural language

2

search_products_by_category

Search within a specific category

3

search_products_by_brand

Search products from a specific brand

4

search_products_by_category_and_brand

Combined category and brand search

5

get_categories

Get all available product categories

6

get_brands

Get all available brands

7

get_product_description

Get complete product information by name

8

search_products_with_price_filter

Search with price constraints (less/greater than)

๐Ÿ› ๏ธ Technology Stack

  • ChromaDB: Vector database for semantic search

  • Azure OpenAI: Text embeddings and chat completions

  • FastMCP: HTTP MCP server framework

  • Python 3.11: Core programming language

  • Pandas: Data processing

  • Uvicorn: ASGI server

๐Ÿš€ Quick Start

Prerequisites

  • Python 3.11+

  • Azure OpenAI account with:

    • Embedding deployment (text-embedding-ada-002 compatible)

    • Chat completion deployment (gpt-4o-mini or similar)

Installation

  1. Clone the repository:

git clone https://github.com/yourusername/Products-Recommendation-MCP-MAF.git cd Products-Recommendation-MCP-MAF
  1. Create and activate virtual environment:

python3.11 -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
  1. Install dependencies:

pip install -r requirements.txt
  1. Configure environment variables:

Copy .env.example to .env and fill in your Azure OpenAI credentials:

cp .env.example .env

Edit .env:

AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com AZURE_OPENAI_API_KEY=your-api-key-here AZURE_OPENAI_API_VERSION=2024-12-01-preview AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o-mini AZURE_OPENAI_EMBEDDING_DEPLOYMENT=text-embedding-ada-002 TOP_K=50 CHROMA_PERSIST_DIRECTORY=./chroma_db

Data Preparation

  1. Create price categories:

python create_price_categories.py

This generates products_v2.csv with quantile-based price categories:

  • Budget-Friendly: โ‰ค Q1 (25th percentile)

  • Affordable: Q1 < price โ‰ค Q2 (median)

  • Mid-Range: Q2 < price โ‰ค Q3 (75th percentile)

  • Premium: > Q3

  1. Index products into ChromaDB:

python index_products.py

This creates embeddings and stores products in ChromaDB with metadata.

Running the System

  1. Start the MCP Server (Terminal 1):

python mcp_server.py

The server will be available at: http://localhost:8000/mcp

  1. Test the MCP Server (Terminal 2):

python test_mcp_client_custom.py

This runs a comprehensive test suite with 10 different scenarios.

๐Ÿ“ Project Structure

Products-Recommendation-MCP-MAF/ โ”œโ”€โ”€ .env.example # Environment configuration template โ”œโ”€โ”€ .gitignore # Git ignore rules โ”œโ”€โ”€ README.md # This file โ”œโ”€โ”€ requirements.txt # Python dependencies โ”œโ”€โ”€ products.csv # Original product data โ”œโ”€โ”€ create_price_categories.py # Script to generate price categories โ”œโ”€โ”€ index_products.py # Script to index products in ChromaDB โ”œโ”€โ”€ mcp_server.py # FastMCP HTTP server โ””โ”€โ”€ test_mcp_client_custom.py # MCP client test suite

๐Ÿงช Testing Examples

Query: "I'm looking for a waterproof tent for camping" Tool: search_products Result: Returns tents with waterproof features, ranked by relevance

Example 2: Category Filter

Query: "Show me hiking boots from the Hiking Footwear category" Tool: search_products_by_category Arguments: {query: "hiking boots", category: "Hiking Footwear"}

Example 3: Price Filter

Query: "Find hiking clothing items that cost less than 100 USD" Tool: search_products_with_price_filter Arguments: { query: "Hiking Clothing", price_operator: "less_than", price_threshold: 100 }

Example 4: Product Details

Query: "Tell me everything about the TrailMaster X4 Tent" Tool: get_product_description Arguments: {product_name: "TrailMaster X4 Tent"}

๐Ÿ”ง Configuration

Environment Variables

Variable

Description

Example

AZURE_OPENAI_ENDPOINT

Azure OpenAI endpoint URL

https://xxx.openai.azure.com

AZURE_OPENAI_API_KEY

Azure OpenAI API key

your-key-here

AZURE_OPENAI_API_VERSION

API version

2024-12-01-preview

AZURE_OPENAI_DEPLOYMENT_NAME

Chat model deployment

gpt-4o-mini

AZURE_OPENAI_EMBEDDING_DEPLOYMENT

Embedding model deployment

text-embedding-ada-002

TOP_K

Default number of results

50

CHROMA_PERSIST_DIRECTORY

ChromaDB storage path

./chroma_db

๐Ÿ“Š Data Schema

Products CSV Format

id,name,price,category,brand,description 1,TrailMaster X4 Tent,250.0,Tents,OutdoorLiving,"Unveiling the TrailMaster..."

ChromaDB Metadata

Each product is stored with:

  • name: Product name

  • category: Product category

  • brand: Product brand

  • price: Numeric price

  • price_category: Text price category (Budget-Friendly, Affordable, Mid-Range, Premium)

  • description: Full product description

Embedding Document Format

Documents for embedding concatenate:

{name} {category} {brand} {description} {price_category}

๐Ÿ” MCP Server API

search_products

Search for similar products using natural language.

Parameters:

  • query (string): Natural language search query

  • limit (integer, optional): Maximum results (default: TOP_K)

search_products_by_category

Search products within a specific category.

Parameters:

  • query (string): Search query

  • category (string): Category name

  • limit (integer, optional): Maximum results

search_products_by_brand

Search products from a specific brand.

Parameters:

  • query (string): Search query

  • brand (string): Brand name

  • limit (integer, optional): Maximum results

search_products_by_category_and_brand

Search with both category and brand filters.

Parameters:

  • query (string): Search query

  • category (string): Category name

  • brand (string): Brand name

  • limit (integer, optional): Maximum results

get_categories

Get all unique product categories.

Parameters: None

Returns: Sorted list of category names

get_brands

Get all unique product brands.

Parameters: None

Returns: Sorted list of brand names

get_product_description

Get complete product information by name.

Parameters:

  • product_name (string): Exact or partial product name

Returns: Product metadata dictionary

search_products_with_price_filter

Search products with price constraints.

Parameters:

  • query (string): Search query

  • price_operator (string): "less_than", "greater_than", "less_or_equal", "greater_or_equal"

  • price_threshold (float): Price value to compare

  • limit (integer, optional): Maximum results

๐Ÿ› ๏ธ Troubleshooting

ChromaDB collection not found

Solution: Run python index_products.py to create and populate the collection

MCP server connection refused

Solution: Ensure the server is running on port 8000 and not blocked by firewall

Azure OpenAI authentication error

Solution: Verify your API key and endpoint in .env file

Solution: Check if products are indexed correctly by running the verification in index_products.py

๐Ÿ“ Development

Adding New Products

  1. Add products to products.csv

  2. Run python create_price_categories.py to regenerate price categories

  3. Run python index_products.py to re-index all products

Modifying Search Behavior

  • Adjust TOP_K in .env to change default result count

  • Modify embedding document format in index_products.py

  • Customize price categories in create_price_categories.py

Extending MCP Methods

Add new tools in mcp_server.py using the @mcp.tool() decorator:

@mcp.tool() def your_new_method(param: str) -> Dict: """Your method description""" # Implementation return result

๐Ÿ” Security

  • Store API keys securely in .env file (never commit to version control)

  • Use HTTPS in production deployments

  • Consider adding authentication to the MCP server

  • Implement rate limiting for public-facing deployments

๐Ÿ“š References

๐Ÿ“„ License

This project is available under the MIT License.

๐Ÿค Contributing

Contributions are welcome! Please:

  1. Fork the repository

  2. Create a feature branch

  3. Test thoroughly with the provided test suite

  4. Submit a pull request


Version: 1.0.0
Status: Production Ready โœ…

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/josephazar/Products-Recommendation-MCP-MAF'

If you have feedback or need assistance with the MCP directory API, please join our Discord server