Alko MCP Server
Uses Google Cloud Firestore for data storage and persistence of product catalog, store information, and enriched product data, with support for both production deployment and local emulator.
Retrieves wine ratings and reviews from Vivino by searching for wines by name or URL through web scraping.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Alko MCP Server find a good Finnish gin under 30 euros"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Alko MCP Server
A production-grade Model Context Protocol (MCP) server that provides AI assistants with access to the Alko.fi alcohol product catalog.
Features
Product Search: Search 11,900+ products by name, type, country, price range, alcohol %, and more
Product Details: Get detailed information including enriched data (taste profile, food pairings, certificates, serving suggestions)
Vivino Ratings: Get wine ratings from Vivino.com by name or URL
Store Hours: Check store opening hours with "open now" filtering
Store Availability: Check real-time stock availability at Alko stores (via web scraping)
Recommendations: Get product recommendations based on food pairings, occasions, and preferences
Store Listing: Browse 360+ Alko stores by city
All tools return compact JSON for efficient LLM token usage.
Related MCP server: Rohlik MCP Server
Demo
Claude Desktop using Alko MCP to search products, check availability, and get recommendations.
MCP Tools
Tool | Description |
| Search products by name, type, country, price range, alcohol % |
| Get product details. Set |
| Get store opening hours. Filter by city, name, or |
| Check store stock for a product (scrapes alko.fi) |
| List Alko stores by city |
| Get personalized product recommendations |
| Get Vivino wine rating by name or URL (scrapes vivino.com) |
| Sync database with latest Alko price list |
| Check sync status and product count |
Quick Start
Prerequisites
Node.js 24+
Google Cloud Firestore (or emulator for local dev)
Playwright (auto-installed for web scraping)
Installation
# Clone the repository
git clone https://github.com/yourusername/alko-mcp.git
cd alko-mcp
# Install dependencies
npm install
# Install Playwright browsers
npx playwright install chromium
# Build
npm run buildLocal Development with Firestore Emulator
Step 1: Start Firestore Emulator (keep running in background)
gcloud emulators firestore start --host-port=localhost:8081Step 2: Start Claude Desktop (or other AI assistant)
The MCP server will automatically load bundled seed data (~12,000 products, ~360 stores) on first query if the emulator is empty. No manual sync required!
Note: The emulator doesn't persist data. After restarting the emulator, seed data will be auto-loaded again on first use.
Optional: Fresh Data Sync
If you need the latest product data from Alko.fi:
export FIRESTORE_EMULATOR_HOST=localhost:8081
# Sync fresh products from Excel (~30 seconds)
npm run sync-data
# Sync fresh stores from website (~2 minutes)
npm run sync-stores
# Export to seed file (for sharing with team)
npm run export-seedAI Assistant Configuration
Claude Desktop
Config file: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
Local development:
{
"mcpServers": {
"alko": {
"command": "node",
"args": ["/absolute/path/to/alko-mcp/dist/server.js"],
"env": {
"FIRESTORE_EMULATOR_HOST": "localhost:8081"
}
}
}
}Production (Cloud Run):
{
"mcpServers": {
"alko": {
"url": "https://YOUR-CLOUD-RUN-URL.run.app/mcp",
"transport": "streamable-http"
}
}
}ChatGPT Desktop
Config file: ~/.config/chatgpt/mcp.json (macOS/Linux) or %APPDATA%\chatgpt\mcp.json (Windows)
Local development:
{
"servers": {
"alko": {
"command": "node",
"args": ["/absolute/path/to/alko-mcp/dist/server.js"],
"env": {
"FIRESTORE_EMULATOR_HOST": "localhost:8081"
}
}
}
}Production (Cloud Run):
{
"servers": {
"alko": {
"url": "https://YOUR-CLOUD-RUN-URL.run.app/mcp",
"transport": "streamable-http"
}
}
}Google Gemini (AI Studio)
For Gemini, use HTTP transport. Start the server with:
MCP_TRANSPORT=http PORT=3000 node dist/server.jsThen configure in AI Studio with the MCP endpoint URL:
http://localhost:3000/mcpFor production, deploy to Cloud Run with API token authentication (see below).
Claude Code CLI
Add to your project's .mcp.json:
{
"mcpServers": {
"alko": {
"command": "node",
"args": ["./dist/server.js"],
"env": {
"FIRESTORE_EMULATOR_HOST": "localhost:8081"
}
}
}
}Example Prompts
🔍 Basic Search
Etsi minulle hyviä italialaisia punaviinejä alle 20 euroa
Searches for Italian red wines under €20
🍷 Wine Recommendations
Suosittele viiniä grillatulle lohelle. Budjetti noin 15-25 euroa.
Recommends wine for grilled salmon within budget
🥂 Champagne & Sparkling
Mitä samppanjoita Alkossa on saatavilla? Näytä 5 parasta vaihtoehtoa.
Lists champagne options
🍺 Craft Beer Search
Etsi IPA-oluita Suomesta tai muista Pohjoismaista
Searches for Nordic IPA beers
📊 Product Details
Kerro lisää tuotteesta numero 906458
Gets detailed product information with taste profile
🏪 Store Hours
Mitkä Alkon myymälät ovat auki nyt Helsingissä?
Lists Helsinki stores that are open now
📍 Store Availability
Onko Barolo-viiniä saatavilla Helsingin myymälöissä?
Checks product availability in Helsinki stores
🎁 Gift Recommendations
Etsi lahjaideoita viininystävälle. Budjetti 50-100 euroa.
Premium gift ideas for wine lovers
🧀 Food Pairing (uses Alko's official pairing data)
Suosittele viiniä äyriäisille / Recommend wine for seafood
Uses Alko's food symbol search to find products officially tagged for seafood pairing
Tarvitsen viinin juustolautaselle. Juustot: brie, manchego ja sinihomejuusto.
Wine for cheese platter - matches "miedot juustot" and "voimakkaat juustot"
🌍 Region-specific Search
Hae espanjalaisia punaviinejä Rioja-alueelta
Spanish wines from Rioja region
💰 Budget Shopping
Parhaat viinit alle 10 eurolla arki-iltoihin
Best budget wines for weeknight dinners
🍾 Special Occasions
Suosittele kuohuviiniä uudenvuoden juhliin 20 hengelle
Sparkling wine for New Year's party
⭐ Vivino Ratings
Etsi punaviinejä 15-25€ ja tarkista niiden Vivino-arvostelut
Searches for red wines and checks their Vivino ratings
🏆 Best Rated Wines
Mikä on Alkon parhaiten arvioitu Barolo Vivinossa?
Finds Barolo wines and compares their Vivino ratings
📈 Wine Comparison
Vertaile näiden viinien Vivino-arvosanoja: Amarone, Brunello di Montalcino
Compares Vivino ratings for premium Italian wines
Data Sources
Product Catalog
Source: Alko's public Excel price list
URL:
https://www.alko.fi/INTERSHOP/static/WFS/Alko-OnlineShop-Site/-/Alko-OnlineShop/fi_FI/Alkon%20Hinnasto%20Tekstitiedostona/alkon-hinnasto-tekstitiedostona.xlsxProducts: ~11,900
Update: Run
npm run sync-data
Store Data
Source: Scraped from alko.fi store finder
Stores: ~360
Includes: Name, address, opening hours (today/tomorrow)
Update: Run
npm run sync-stores
Enriched Product Data
Source: Scraped from individual product pages
Includes: Taste profile, usage tips, serving suggestions, food pairings, certificates, ingredients
Cached: Persisted to Firestore after first scrape
Product Fields
Field | Description |
| Product ID (e.g., "004246") |
| Product name |
| Producer/manufacturer |
| Price in EUR |
| Price per liter |
| Volume (e.g., "0.75 l") |
| Category (punaviinit, valkoviinit, oluet, etc.) |
| Flavor profile (e.g., "Mehevä & Hilloinen") |
| Country of origin |
| Wine region |
| Alcohol % |
| Taste description from Excel |
| Detailed taste (enriched, scraped) |
| Usage suggestions (enriched) |
| Serving temperature (enriched) |
| Food pairing symbols (enriched) |
| Certification labels: Luomu, Vegaani, etc. (enriched) |
| Producer declared ingredients (enriched) |
| vakiovalikoima, tilausvalikoima, etc. |
Development
npm run build # Compile TypeScript
npm run dev # Run with tsx watch mode
npm run test # Run tests in watch mode
npm run test:run # Run tests once (232 tests)
npm run typecheck # Type check
npm run sync-data # Sync products from Excel
npm run sync-stores # Scrape stores from website
npm run export-seed # Export data to seed file (with diff)Logs
tail -f /tmp/alko-mcp.logDeployment to Google Cloud Run
The server can be deployed to Cloud Run with public access (no authentication) for compatibility with ChatGPT and other MCP clients.
# Enable APIs
gcloud services enable run.googleapis.com firestore.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
# Create Firestore database
gcloud firestore databases create --location=europe-north1
# Deploy using Cloud Build
gcloud builds submit --config=cloudbuild.yaml
# Or deploy directly from source
gcloud run deploy alko-mcp \
--source . \
--region europe-north1 \
--memory 2Gi \
--cpu 2 \
--execution-environment gen2 \
--set-env-vars="MCP_TRANSPORT=http" \
--allow-unauthenticatedTest the endpoint:
curl -X POST https://alko-mcp-xxx.a.run.app/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'See DEPLOYMENT.md for API token authentication and other options.
Legal Disclaimer
The Alko price list is publicly available data
Web scraping respects rate limits (2s between requests)
This is an unofficial project not affiliated with Alko Oy
Alcohol products can only be purchased by persons 18+ in Finland
License
MIT License
Available Tools
9 toolsget_availabilityCheck Product StockARead-onlyIdempotent
Check real-time product availability at Alko stores. Returns store names with stock quantities. Filter by city. Scrapes alko.fi for live data.
Inputs: productId (required), city, forceRefresh.
get_productGet Product by IDARead-onlyIdempotent
Retrieve detailed product info by Alko product ID. Optional: includeEnrichedData=true adds taste profile, food pairings, serving tips (slower, scrapes alko.fi).
Inputs: productId (required), includeEnrichedData.
get_recommendationsGet Wine/Drink RecommendationsARead-onlyIdempotent
Get personalized product recommendations. Specify occasion, food pairing (uses Alko official pairing data), price range, or preferences (organic, vegan). Supports 33 food categories.
Inputs: preferredTypes, priceRange, occasion, foodPairing, +4 more.
get_store_hoursGet Store Opening HoursARead-onlyIdempotent
Get Alko store opening hours for today and tomorrow. Filter by store name, city, or openNow=true for currently open stores. Auto-refreshes stale data.
Inputs: storeId, storeName, city, openNow, +1 more.
get_sync_statusGet Database StatusARead-onlyIdempotent
Check database health: product count, last sync timestamp, sync status. Use to verify data freshness before searches.
Inputs: no named parameters.
get_vivino_ratingGet Vivino Wine RatingARead-onlyIdempotent
Look up wine ratings from Vivino.com. Search by wine name/winery or provide direct URL. Returns: average rating (1-5 stars), rating count, wine details. Results are cached.
Inputs: wineName, winery, vivinoUrl.
list_storesList Alko StoresARead-onlyIdempotent
List all ~360 Alko stores in Finland. Filter by city name. Returns: store id, name, address, city, postal code.
Inputs: city, limit.
search_productsSearch Alko ProductsARead-onlyIdempotent
Search Finnish Alko alcohol catalog (~12,000 products). Filter by name, type, country, price, alcohol%. Returns: id, name, price, type, country, alcohol%, producer.
Inputs: query, type, country, region, +16 more.
sync_productsSync Product Database (Admin)AIdempotent
Admin: Download latest Alko price list and update product database. Takes 2-5 minutes. Updates ~12,000 products. Use get_sync_status to check progress.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 9 tools
Every tool has a clearly distinct purpose with no overlap. For example, get_availability checks stock, get_product retrieves product details, and get_recommendations provides personalized suggestions, each targeting different user needs. The descriptions reinforce this separation, making misselection unlikely.
All tool names follow a consistent verb_noun pattern using snake_case, such as get_availability, list_stores, and search_products. This predictability aids in agent navigation and understanding of tool functions without confusion from mixed conventions.
With 9 tools, the server is well-scoped for its domain of Alko product and store management. Each tool serves a specific role, from data retrieval to administrative tasks, avoiding bloat or thin coverage. This count supports comprehensive workflows without overwhelming complexity.
The toolset covers core operations like product search, availability checks, store information, and recommendations, with minor gaps such as missing update or delete operations for products or stores. However, these are likely intentional given the server's focus on read-only data access and synchronization from external sources.
Maintenance
Related MCP Connectors
Wine advice from Tasters, a Swiss online wine shop and wine guide. Ask what to drink with a dish, for a gift or on a budget, and get real in-stock bottles with current CHF prices and buy links. Also looks up wines, producers, grapes, regions and food pairings, and manages your own cellar. FR/DE/EN/IT. Free Tasters account (OAuth). Orders can currently be delivered in Switzerland only.
Search the wines of NEVINI, a Dutch wine importer, and build Shopify carts with a checkout link.
Recipe search, ingredient matching, nutrition filters and a private cookbook for any AI agent.
Wine cellar manager: bottles, racks, drink windows, pairings and a shared wine registry.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Rohlik Group's online grocery delivery services across multiple European countries, supporting product search, shopping cart management, order history analysis, and personalized meal suggestions based on purchase patterns.135 npm3MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to search grocery products, manage shopping carts, access account and order information, and find deals and delivery details across several European online grocery platforms.-
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to search grocery products, manage shopping carts, and access account, order, delivery, and discount information across multiple Rohlik Group online grocery platforms in several European countries.-
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to search grocery products, manage shopping carts, find deals, and review order, delivery, and account information across the Rohlik Group's grocery delivery platforms in several European countries. It supports switching between the Czech, German, Austrian, Hungarian, and Romanian storefronts via configuration.MIT