Alko MCP Server
Provides AI assistants with access to Finland's Alko alcohol product catalog, enabling product search across 11,900+ items, store availability checks, Vivino ratings lookup, and personalized recommendations based on food pairings and preferences.
README
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.
Demo
<video src="https://github.com/user-attachments/assets/ca9535c2-b3e4-44da-b509-5f55793b9d4a" controls width="100%"></video>
Claude Desktop using Alko MCP to search products, check availability, and get recommendations.
MCP Tools
| Tool | Description |
|---|---|
search_products |
Search products by name, type, country, price range, alcohol % |
get_product |
Get product details. Set includeEnrichedData=true for taste, food pairings, serving tips |
get_store_hours |
Get store opening hours. Filter by city, name, or openNow=true. Auto-refreshes if stale |
get_availability |
Check store stock for a product (scrapes alko.fi) |
list_stores |
List Alko stores by city |
get_recommendations |
Get personalized product recommendations |
get_vivino_rating |
Get Vivino wine rating by name or URL (scrapes vivino.com) |
sync_products |
Sync database with latest Alko price list |
get_sync_status |
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 build
Local Development with Firestore Emulator
Step 1: Start Firestore Emulator (keep running in background)
gcloud emulators firestore start --host-port=localhost:8081
Step 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-seed
AI Assistant Configuration
Claude Desktop
Config file: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
{
"mcpServers": {
"alko": {
"command": "node",
"args": ["/absolute/path/to/alko-mcp/dist/server.js"],
"env": {
"FIRESTORE_EMULATOR_HOST": "localhost:8081"
}
}
}
}
ChatGPT Desktop
Config file: ~/.config/chatgpt/mcp.json (macOS/Linux) or %APPDATA%\chatgpt\mcp.json (Windows)
{
"servers": {
"alko": {
"command": "node",
"args": ["/absolute/path/to/alko-mcp/dist/server.js"],
"env": {
"FIRESTORE_EMULATOR_HOST": "localhost:8081"
}
}
}
}
Google Gemini (AI Studio)
For Gemini, use HTTP transport. Start the server with:
MCP_TRANSPORT=http PORT=3000 node dist/server.js
Then configure in AI Studio with the MCP endpoint URL:
http://localhost:3000/mcp
For production, deploy to Cloud Run and use the public URL.
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/.../alkon-hinnasto-tekstitiedostona.xlsx - Products: ~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 |
|---|---|
id |
Product ID (e.g., "004246") |
name |
Product name |
producer |
Producer/manufacturer |
price |
Price in EUR |
pricePerLiter |
Price per liter |
bottleSize |
Volume (e.g., "0.75 l") |
type |
Category (punaviinit, valkoviinit, oluet, etc.) |
subtype |
Flavor profile (e.g., "Mehevä & Hilloinen") |
country |
Country of origin |
region |
Wine region |
alcoholPercentage |
Alcohol % |
description |
Taste description from Excel |
tasteProfile |
Detailed taste (enriched, scraped) |
usageTips |
Usage suggestions (enriched) |
servingSuggestion |
Serving temperature (enriched) |
foodPairings |
Food pairing symbols (enriched) |
certificates |
Certification labels: Luomu, Vegaani, etc. (enriched) |
ingredients |
Producer declared ingredients (enriched) |
assortment |
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.log
Deployment to Google Cloud Run
# Enable APIs
gcloud services enable run.googleapis.com firestore.googleapis.com
# Create Firestore database
gcloud firestore databases create --location=europe-north1
# Deploy
gcloud run deploy alko-mcp \
--source . \
--region europe-north1 \
--memory 1Gi \
--set-env-vars="MCP_TRANSPORT=http"
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
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。