MCP server exposing the Percolate specialty coffee database (1,100+ curated coffees) as read-only tools for AI assistants. Search the catalog, dial in brew recipes, compare coffees, and get brew suggestions — with citation-ready attribution.
Percolate MCP demonstrates solid tool design with clear naming, comprehensive descriptions, and well-structured schemas. All 7 tools follow verb_noun conventions (search_, get_, find_, compare_, dial_in_). Descriptions are detailed (150-250 chars) and explain WHAT, WHEN, and WHAT-RETURNS. Input schemas use Zod with proper types, enums, and constraints. However, output schemas are not formally documented, responses are JSON stringified without explicit field definitions. Error handling is present but generic (wrapped in guarded() with basic error messages). No per-tool output schema documentation visible. Tool composition is clean: each tool has one responsibility, and search_coffees/get_coffee/find_similar form a coherent chain. Parameters accept human-friendly identifiers (coffee names alongside IDs). Rate limiting and telemetry are implemented. Missing: explicit output schema documentation, richer error recovery guidance, and confirmation patterns for any destructive operations (though all tools are read-only, so risk is low).
Side-by-side comparison: roast, body/acidity/sweetness, shared and distinct flavors, brew methods, and price difference.
Brew guidance for a specific coffee: curated recipes from the Percolate catalog (ratio, temperature, grind) when available, or a roast-based starting point. Optionally scoped to your brew method.
Coffees with a similar profile to a given one, ranked by shared flavor notes and roast/body/acidity/sweetness proximity. Deterministic scoring over Percolate's structured tasting data.
Detailed record for one coffee: roast level, body/acidity/sweetness profile, flavor notes, suited brew methods, food and brew pairings, price, and retailer links. Accepts a Percolate id or a name.
Personalized coffee picks from flavor preferences (e.g. 'chocolate', 'berry', 'caramel'), a budget in USD, roast preference, and the brew gear you own.
Output schemas not formally documented. Tools return JSON-stringified responses with fields like 'result_count', 'coffees', 'similarity', 'shared_flavors', but no explicit schema definition visible. LLMs cannot reliably extract nested fields without documented structure.
Error messages are generic ('error: <message>') without recovery guidance. When a coffee is not found or a query fails, the LLM receives no hint about next steps (e.g., 'Try search_coffees() with a partial name').
Parameter 'limit' in search_coffees and trending_coffees has max=25 and max=10 respectively, but no explanation in descriptions of why these caps exist or what happens if omitted. Defaults are mentioned but not justified.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 74 | 2026-07-28+ | v2 |
Search 1,100+ curated specialty coffees in the Percolate database. Filter by category (espresso, single_origin, blend, decaf, dark), roast level, brew method, and price (USD). Returns tasting profiles, brew methods, and where-to-buy links.
Coffees Percolate users are adding to their collections most over the last 30 days (falls back to catalog popularity when live activity data is unavailable). The method used is labeled in the response.
Tool 'dial_in_suggestion' accepts 'brew_method' as free-form string (e.g., 'V60', 'espresso', 'french press') but no enum or validation shown. Inconsistent with search_coffees which constrains 'brew_method' similarly but without enum. Risk of hallucinated brew method names.
No pagination support in get_recommendations or find_similar despite returning ranked lists. If 'limit' is omitted, default behavior is not explicit. Large result sets could bloat context.