Read-only MCP server for cocktail.glass. Search a catalogue of 500 cocktail recipes, fetch full recipes with ingredients and preparation steps, find drinks by ingredient or by the films they appear in, and get random suggestions.
This is a high-quality MCP server with well-structured tool definitions, comprehensive descriptions, and proper JSON schemas. All 7 tools are explicitly defined in cocktail-tools.mjs with clear names, detailed descriptions (avg ~300 chars, well above the 194-char baseline), and complete input schemas. Tool naming follows verb_noun convention (search_, list_, get_, find_) consistently. Descriptions include WHEN to use each tool and how they relate to alternatives. Input schemas use proper JSON Schema with type declarations and minLength constraints. The server demonstrates excellent composition, tools are single-responsibility and chainable (search → get_recipe). Error handling returns structured { error } objects. The main limitation is lack of output schema documentation in the visible code, though the TypeScript definitions hint at structured returns. Tool annotations are present (readOnlyHint, openWorldHint) but could be more granular.
Find every cocktail in the catalogue that uses one specific ingredient. Matching is a case- and diacritic-insensitive substring match against each cocktail's ingredient names, so "gin" will also match "sloe gin" and "ginger beer" — use a more specific term if that matters. Returns up to 60 summary results (name, URL, family, glassware) in catalogue order. Takes one ingredient only; for "what can I make from X, Y, and Z?" use find_makeable_cocktails instead, which handles multiple ingredients and reports near-misses.
Find every cocktail that appears in a given film or TV show. Case- and diacritic-insensitive substring match against both the title and the scene description, so a character or actor works too — e.g. "Casablanca", "Bond", "Hemingway". Each result names the cocktail, the film/show title, the year, and the scene. Returns up to 60 appearances ordered oldest year first, then by cocktail name. A single cocktail can appear multiple times if it shows up in multiple scenes that match.
Given a set of two or more ingredients you have on hand, find every cocktail in the catalogue you can make, ordered by how close a match it is. Returns three groups: exact matches (every ingredient in the recipe is on hand), near misses (one missing ingredient), and partial matches (two to five missing). Each result names the cocktail, its family, glassware, and lists missing ingredients (if any). Designed for bar inventory questions: "what can I make from these bottles?" The ingredient matching is loose — "gin" covers "London dry gin", "sloe gin", etc. — so the drink is makeable if you have the base spirit; more specific terms like "absinthe" will not match a generic "anise" spirit. Returns up to 60 matches per group, ordered by catalogue sequence.
Output schemas not documented in tool definitions. While TypeScript types exist (CocktailWithUrl, Cocktail), the MCP tool definitions do not declare outputSchema fields. LLMs cannot know what fields to expect in responses, forcing them to infer structure or make discovery calls.
random_cocktail has no input parameters documented in schema, only empty properties object. While 'no input needed' is stated in description, the schema should either omit properties/required entirely or have additionalProperties: false for clarity.
Error handling returns { error } strings but does not categorize errors (retryable vs user-fixable vs fatal) or provide recovery guidance. E.g., 'Provide a search query' is clear, but search failures should hint at alternatives.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 85 | 2026-07-28+ | v2 |
Get the full recipe for one cocktail by name: ingredients with measures and units, preparation steps, garnish, glassware, family, page URL, and any film or TV appearances. Matching is case- and diacritic-insensitive: it tries an exact name match first, then falls back to the first substring match. Returns one cocktail object, or an { error } if nothing matches. Use this when you have a specific drink name; if the name is ambiguous or you want a list, call search_cocktails first.
List the whole catalogue: every cocktail as a summary (name, page URL, family, glassware), in catalogue order, optionally restricted to one drink family. Unlike search_cocktails and find_cocktails_by_ingredient — which cap their results and need a query — this takes no query and returns every matching cocktail, so use it to browse or enumerate the full set of 500 drinks (or a whole family) when there is nothing specific to search for. For one named drink use get_cocktail_recipe; to discover by ingredient use find_cocktails_by_ingredient.
Get a uniformly random cocktail from the whole catalogue. No input needed. Returns one cocktail object: full recipe with ingredients and measures, preparation steps, garnish, glassware, family, page URL, and film/TV appearances if any. Good for inspiration when the user has no specific request.
Search the cocktail catalogue by name (substring, case- and diacritic-insensitive, so "carre" matches "Carré"). Returns up to 25 summary results — name, page URL, family, glassware — ranked exact match first, then prefix, then suffix, then any substring. Use this when the user names a drink (even fuzzily) and you want to confirm it exists or disambiguate similar names; once you have a single name, call get_cocktail_recipe for the full recipe. For ingredient-based discovery use find_cocktails_by_ingredient instead.
Tool descriptions use example values inline (e.g., 'Negroni', 'margarita', 'carre'). While helpful for clarity, LLMs sometimes treat these as the only valid options and may hallucinate them in actual calls. Consider moving examples to the parameter examples field only.