MCP server exposing the Pour Picks bourbon & whiskey database (4,700+ bottles) as read-only tools for AI assistants. Search the catalog, compare bottles, find cheaper alternatives, and get pour suggestions — with citation-ready attribution.
Strong tool naming (verb_noun pattern), comprehensive parameter schemas with enums and constraints, and good descriptions. All 7 tools have clear names, detailed descriptions (150-250 chars), and well-typed input schemas using Zod. Tool annotations present (readOnlyHint, destructiveHint, idempotentHint). Key gaps: output schemas are not formally documented (only visible in code via respond() helper), error messages are generic, and no pagination support despite search returning up to 25 results. Rate limiting exists but error guidance is minimal.
Side-by-side comparison of two bottles: flavor overlap, profile differences (body, sweetness, char), price, and ratings.
Bottles in the same style with a similar flavor profile at a lower price than the given bottle. Great for 'what tastes like X without the price tag' questions.
Bottles with a similar flavor profile to a given bottle, ranked by shared flavor notes and body/sweetness/char proximity. Deterministic scoring over the Pour Picks structured tasting data.
Detailed record for one bottle: tasting profile, flavor notes, pairings, price, community ratings. Accepts a Pour Picks bottle ID (UUID) or a bottle name.
Personalized bottle picks from taste preferences (flavor keywords like 'caramel', 'smoke', 'cherry'), a budget in USD, and an occasion (e.g. 'gift', 'everyday sipper', 'celebration', 'introducing a friend to bourbon').
Full-text search across 4,700+ bourbons, ryes, scotches, and other spirits in the Pour Picks database. Filter by category, price (USD), and proof. Returns structured tasting profiles with source attribution.
Output schemas not formally documented. Tool descriptions state what is returned (e.g., 'tasting profiles with source attribution') but JSON Schema output structure is not declared. LLMs cannot plan downstream operations without knowing response field names and types.
Error handling lacks recovery guidance. errorResult() returns bare JSON {error: message} with no actionable next steps. E.g., 'No bottle found matching X' should suggest 'Try search_bottles() with a partial name or different category filter.'
No pagination support despite search_bottles accepting limit up to 25. No cursor, offset, or total_count returned. Large result sets risk context window exhaustion and degrade LLM reasoning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Most-added bottles in the Pour Picks community cellar over the last 30 days. Requires the service-role key for access to aggregated cellar data.
Parameter 'slug_or_id' in get_bottle and 'bottle_id' in find_similar/find_cheaper_alternative accept both UUID and name but description does not clarify format or resolution order. LLMs may pass invalid formats.
trending_bottles requires SUPABASE_SERVICE_ROLE_KEY for access but this dependency is not declared in tool description or error messages. LLMs cannot diagnose why the tool fails if the key is missing.