Recipe API & MCP server

Free, read-only JSON access to 7,000+ cocktail recipes with exact measures, method, glass, garnish and a picture — in 36 languages. No key, no sign-up. The same data that renders the site.

Last updated:
BASE https://24cocktails.com
OPENAPI /api/v1/openapi.json
MCP https://24cocktails.com/mcp (Streamable HTTP)
TEXT /llms.txt · /llms-full.txt

REST endpoints

EndpointWhat it returns
GET /api/v1/search?q=negroniRecipes whose name or ingredients match the words. Filters: base (gin, vodka, rum, whiskey, tequila, brandy, other, na), method, glass, cat (classic, sour, long, strong, tiki, hot, quick…), limit ≤ 50, offset.
GET /api/v1/recipe/{slug}One recipe in full: ingredients with amounts and millilitres, steps, glass, ice, garnish, strength, difficulty, page URL and picture (an AI-generated illustration).
GET /api/v1/by-ingredients?have=gin,campari,sweet vermouthWhat can be mixed from the bottles listed — can_make and one_away (with the missing bottle). Brand names and Russian work.
GET /api/v1/random?base=rumA random recipe, optionally within a base spirit or category.

Every endpoint takes lang — an ISO 639-1 code for names, steps and the page link: en (default), ru, es, de, fr, it, pt, ja, zh and the rest of the 36. Responses are JSON with CORS enabled, so a browser page can call them directly.

Example

curl "https://24cocktails.com/api/v1/recipe/negroni?lang=en"
{
  "slug": "negroni",
  "name": "Negroni",
  "base": "gin", "abv": 24, "difficulty": 1,
  "method": "Stir", "glass": "Rocks", "ice": "Cubes", "garnish": "Orange",
  "prep_minutes": 3,
  "ingredients": [
    {"name": "Gin", "amount": "30 ml", "ml": 30, "key": "gin", "optional": false},
    {"name": "Campari", "amount": "30 ml", "ml": 30, "key": "campari", "optional": false},
    {"name": "Sweet vermouth", "amount": "30 ml", "ml": 30, "key": "sweet_vermouth", "optional": false}
  ],
  "steps": ["Fill the glass with ice.", "Pour and stir."],
  "url": "https://24cocktails.com/cocktail/negroni?utm_source=ai&utm_medium=api",
  "photo": "https://24cocktails.com/photo_web/negroni.jpg",
  "attribution": "24cocktails.com"
}

MCP server

The same catalogue as an MCP server over Streamable HTTP, stateless, no auth. Tools: search_cocktails, get_recipe, cocktails_by_ingredients, random_cocktail. Every tool is annotated read-only, idempotent and closed-world: it reads the catalogue and touches nothing else.

Claude Code

claude mcp add --transport http 24cocktails https://24cocktails.com/mcp

Claude Desktop, Cursor, other clients

{
  "mcpServers": {
    "24cocktails": { "type": "http", "url": "https://24cocktails.com/mcp" }
  }
}

Raw JSON-RPC

curl -X POST https://24cocktails.com/mcp \
  -H "Content-Type: application/json" -H "Accept: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"cocktails_by_ingredients",
                 "arguments":{"ingredients":["gin","campari","sweet vermouth"]}}}'

ChatGPT and other assistants

For a custom GPT, add an Action and import the schema from https://24cocktails.com/api/v1/openapi.json. Authentication: none. Privacy policy: https://24cocktails.com/privacy.html. Any agent framework that reads OpenAPI (LangChain, Semantic Kernel, Vertex AI extensions) works the same way.

Terms

The short version; the full Terms of Use and the support page apply to the API, the MCP server and every assistant built on them.

Data model in one paragraph

A recipe has a stable slug, a base spirit, a strength in abv percent, a method_key (shake, stir, build, blend, muddle, layer), a glass_key (rocks, coupe, highball, wine, shot, other), categories, ingredients with the amount as printed and a millilitre value where one exists, and ordered steps. The key of an ingredient is the slug of its encyclopedia entry. Photos are 900×900 JPEG under /photo_web/{slug}.jpg.