Skip to main content
Glama
talvola

bar-assistant-mcp

by talvola

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
BAR_ASSISTANT_URLYesBase URL of your Bar Assistant API (e.g., https://erikbarapi.duckdns.org)
BAR_ASSISTANT_TOKENYesAPI token from Bar Assistant
BAR_ASSISTANT_BAR_IDNoBar ID (default: 1)1

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
bar_search_cocktailsC

Search for cocktails by name. Returns matching cocktails with their ingredients.

bar_get_cocktailC

Get detailed information about a specific cocktail by ID or slug.

bar_list_cocktailsA

List and filter cocktails. Use to browse or audit the collection.

Filters:

  • name: substring match on the cocktail name.

  • favorites_only: only favorited cocktails.

  • tag_id / ingredient_id / method_id / glass_id / collection_id: restrict by tag, an ingredient used, prep method, glass, or collection (IDs from the matching list_* tools).

  • parent_cocktail_id: only variants/riffs of a given cocktail.

  • abv_min / abv_max: ABV bounds.

  • missing_image_only: only cocktails with no image attached (audit helper).

  • sort: "name" (default), "-name", "abv", "-abv", "average_rating", "total_ingredients", "created_at", "random".

bar_makeable_cocktailsB

Get cocktails that can be made with ingredients currently on the shelf.

bar_favorite_cocktailsC

Get user's favorite cocktails.

bar_search_ingredientsA

Search for ingredients by name.

Optional flags narrow the results (handy for cleanup work):

  • specific_only: only specific bottles (leaf ingredients), skipping the generic category/parent ingredients.

  • missing_image_only: only matches that have no image attached.

  • exclude_commodities: drop non-bottle commodities (juices, syrups, produce, dairy, ice/salt). Combine with missing_image_only for a clean "bottles that still need artwork" list.

bar_get_ingredientC

Get detailed information about a specific ingredient.

bar_list_ingredientsA

List and filter ingredients.

For an "incomplete entries" worklist (bottles missing an image / ABV / flavor profile), prefer bar_audit_ingredients — it already scopes to real bottles and groups the gaps. Use this tool for general browsing/filtering.

Filters:

  • category: restrict to a category's whole subtree (recursive). Pass the category ingredient's ID — in Bar Assistant categories ARE ingredients (e.g. Rye Whiskey 347, London Dry Gin 384, Rhum Agricole 380). Returns every bottle filed anywhere under it.

  • name: substring match on the ingredient name.

  • specific_only: only specific bottles (leaf ingredients), excluding the generic category/parent ingredients themselves. NOTE: "leaf" is structural — it still includes commodity leaves (juices, syrups, produce). Add exclude_commodities for a real-bottle list.

  • missing_image_only: only ingredients with no image attached — use this to find bottles whose artwork still needs filling in.

  • exclude_commodities: drop non-bottle commodities (juices, syrups, produce, dairy, ice/salt). The combo specific_only + missing_image_only + exclude_commodities is the clean "real bottles still missing artwork" list.

  • on_shelf_only: only ingredients currently in the bar's inventory.

  • origin: substring match on origin (country/region).

  • strength_min / strength_max: ABV bounds (e.g. strength_min=40).

  • sort: "name" (default), "-name", "created_at", "strength", "total_cocktails", "-total_cocktails" (most-used first).

Output marks each ingredient's cocktail count and flags "NO IMAGE" so the list is directly actionable.

bar_ingredient_cocktailsC

Get cocktails that use a specific ingredient.

bar_audit_ingredientsA

Audit real bottles for incomplete data, so historical gaps can be cleaned up.

This is the canonical "what's incomplete" worklist — it reports real bottles, not commodity leaves. (For raw structural listing use bar_list_ingredients.)

Reports, per specific bottle (leaf ingredient — generic parent categories are skipped), which of these are missing:

  • image — commodity leaves (juices, syrups, produce, dairy, ice) are excluded by default, so this is "bottles needing artwork".

  • ABV / strength (only for bottles in a tracked spirit/liqueur category)

  • flavor profile — only for bottles whose category supports flavor axes (gin, rye, bourbon, scotch, american_single_malt, aquavit, amaro, herbal_liqueur, rum, vermouth, fruit_liqueur). Bottles in categories with no axes are never flagged for a missing profile.

Axis support is seeded from a known map AND learned live from bottles that already have a profile, so it stays correct as the taxonomy grows.

Args:

  • category: restrict to one category's subtree (pass the category ingredient's ID, e.g. 347 Rye). Strongly recommended — it makes the flavor scan far cheaper.

  • on_shelf_only: only audit bottles currently in the bar.

  • check_flavor: set False to skip the per-bottle flavor-profile scan (faster; reports only image/ABV gaps).

  • include_uncategorized: also audit root-level leaves not filed under any category. Off by default.

  • include_commodities: include commodity items (juices, syrups, produce…) in the missing-image list. Off by default.

bar_get_shelfB

Get ingredients currently on the user's shelf (what they have available).

bar_add_to_shelfC

Add ingredients to the shelf.

bar_remove_from_shelfC

Remove ingredients from the shelf.

bar_get_shopping_listC

Get the user's shopping list.

bar_add_to_shopping_listC

Add ingredients to the shopping list.

bar_list_collectionsB

List cocktail collections.

bar_get_collectionC

Get a specific cocktail collection with its cocktails.

bar_list_tagsB

List all cocktail tags.

bar_list_glassesB

List all glass types.

bar_list_methodsB

List cocktail preparation methods.

bar_statsB

Get bar statistics (total cocktails, ingredients, etc).

bar_upload_imageB

Upload an image from a URL. Returns the image ID to use when creating cocktails or ingredients.

bar_upload_image_fileB

Upload an image from a local file path. Returns the image ID to use when creating cocktails or ingredients.

bar_create_ingredientA

Create a new ingredient. Use parent_ingredient_id to place it in the hierarchy (e.g., under 'Gin' or 'Bourbon').

Only create a NEW specific bottle when a recipe genuinely needs that brand (see the server instructions' "Generic vs. specific" rule); for ordinary base-spirit slots, reuse the existing generic category instead of adding a brand.

Fill a new specific bottle in COMPLETELY — don't leave historical gaps:

  • set strength (ABV; look it up), description, and origin;

  • upload and attach an image (bar_upload_image / bar_upload_image_file);

  • if its category supports flavor axes (gin, rye, bourbon, scotch, american_single_malt, aquavit, amaro, herbal_liqueur, rum, vermouth, fruit_liqueur), score a flavor profile with bar_set_flavor_profile right after creating it. Run bar_audit_ingredients to find existing bottles still missing any of these.

bar_create_cocktailB

Create a new cocktail recipe with ingredients, instructions, and optional image.

For each ingredient slot, prefer the GENERIC category (e.g. Rye Whiskey, London Dry Gin, Tequila Blanco) over a specific bottle — see the server instructions' "Generic vs. specific" rule. Only use a specific brand when the recipe names it, the brand defines the drink (Fernet-Branca, Chartreuse, Campari, Luxardo Maraschino), or Erik asks.

bar_update_cocktailB

Update an existing cocktail. Only provide fields you want to change.

bar_delete_cocktailC

Delete a cocktail by ID or slug.

bar_update_ingredientB

Update an existing ingredient. Only provide fields you want to change.

bar_delete_ingredientC

Delete an ingredient by ID or slug.

bar_list_flavor_axesA

List the flavor axes defined for a category (e.g. 'gin').

Axes are per-category and integer-scored. Gin uses The Gin Is In's 7-axis 0–3 system. Use this to discover valid axis names before setting profiles or slot constraints.

bar_get_flavor_profileA

Return the flavor profile recorded for an ingredient (specific bottle).

Profiles are per-axis integer scores on the category's scale (gin: 0–3 on juniper/citrus/floral/heat/spice/herbal/fruited). Returns provenance too (source = tgii / llm_from_description / manual; confidence; notes).

bar_set_flavor_profileA

Set or update the flavor profile for an ingredient.

Partial updates are supported: profile may contain only the axes you want to change — they're merged over the existing profile before saving. If the ingredient has no profile yet, you must pass category (and ideally the full axis set for that category).

Args: ingredient_id: BA ingredient_id of the specific bottle. profile: dict of axis → integer score (0–3). Merged over existing axes. category: required only when the ingredient has no profile yet (e.g. "gin", "amaro"). See bar_list_flavor_axes for valid axes. source: provenance — "tgii", "llm_from_description", "manual", etc. confidence: "high" | "medium" | "low" | None. notes: free-text reasoning. suggestable_for_classics: set False for novelty/allocated bottles the matcher should never surface even if their profile fits.

bar_describe_slotsA

List a cocktail's ingredient slots with their sort index and current ingredient.

Each line shows the sort index (the canonical slot identifier), the ingredient currently in the slot, and whether the slot has flavor constraints declared in the flavor DB. Use this to find the right slot_sort before calling bar_alternatives_for_slot or constraint setters.

bar_set_slot_metaA

Declare the category + tolerance for a recipe slot.

Required before setting axis constraints. sort is the 1-based BA sort index of the ingredient in the recipe (see bar_describe_slots).

Args: cocktail_id: BA cocktail_id. sort: BA sort index of the slot (1-based). category: e.g. "gin", "rum", "whiskey". tolerance: "exact" (named bottle required) | "style" (match by vector) | "any" (any in-category bottle works). exact_ingredient_id: required when tolerance="exact". also_accept_categories: list of other categories that can sub here (e.g. ["bourbon"] on a rye slot). Cross-category subs get a small flat penalty so in-category ranks first. proof_min / proof_max: enforce a proof range (US proof).

bar_set_band_constraintA

Set a Band constraint on one axis of a recipe slot.

Band = "acceptable range; zero penalty inside, graded penalty outside." Use Band for the forgiving axes of a slot — most slots are wide on most axes. Set hard=True for the one or two axes that truly disqualify a candidate (e.g. Negroni gin → floral Band(0,2,hard=True): aggressive floral fights Campari).

For gin axes are 0–3; lo/hi are inclusive integer bounds.

bar_set_point_constraintB

Set a Point constraint on one axis of a recipe slot.

Point = "exact-ish target; penalty grows with distance." Use Point for the exposed axes of a slot — where the spirit's level on that axis genuinely matters (e.g. Martinez gin → juniper Point(2): we want a moderately juniper-forward but not over-the-top gin).

For gin axes are 0–3; value is an integer.

bar_delete_slot_constraintC

Remove a single axis constraint from a recipe slot.

bar_get_slot_constraintsB

List all flavor constraints declared for a cocktail's slots.

bar_alternatives_for_slotA

Rank bottles by fit for a recipe's slot.

The killer feature: given a recipe slot (declared via bar_set_slot_meta + bar_set_band_constraint / bar_set_point_constraint), rank in-stock bottles of the appropriate category by how well their flavor profiles match the slot's constraints. Includes "off-pattern" picks (disqualified by hard bands) when include_strays=True, with explanations.

Args: cocktail_id: BA cocktail_id. sort: 1-based slot index (see bar_describe_slots). on_shelf_only: if true, restrict to bottles currently on shelf. include_strays: surface hard-disqualified picks too, with reasons. top_n: max bottles to return.

bar_uses_for_bottleA

Given a bottle, list recipes (with declared slot constraints) that welcome it.

Useful when a new bottle arrives — find which existing constrained recipes welcome it before adding the bottle to your shelf.

bar_find_gapsA

Find recipe slots where the best in-stock bottle is a stretch — the shopping list.

Loads constrained slots (all by default, or the subset matching cocktail_ids), pits them against in-stock bottles, and reports any slot whose best match is hard-disqualified or accumulates penalty ≥ threshold. Sorted worst-gap-first.

Args: cocktail_ids: restrict to these cocktails; None = every constrained slot. threshold: penalty above which a slot counts as a gap (defaults to 3.0, roughly "two-axis miss or one hard-cap brush").

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.2/5.0

Scored across 41 tools

Disambiguation4/5

Most tools have clearly distinct purposes, and the detailed descriptions explicitly guide users between lookalikes (e.g. bar_audit_ingredients vs bar_list_ingredients, search vs list). The main overlap is bar_search_cocktails vs bar_list_cocktails and bar_search_ingredients vs bar_list_ingredients, where the boundary (name search vs filtered browse) is real but somewhat blurry.

Naming Consistency4/5

Nearly all tools follow a consistent bar_ + snake_case pattern (bar_get_/list_/create_/update_/delete_/set_/add_). A handful deviate from the verb_noun convention (bar_makeable_cocktails, bar_favorite_cocktails, bar_uses_for_bottle, bar_alternatives_for_slot), but these remain readable and uniformly prefixed.

Tool Count3/5

41 tools is heavy and pushes into territory where an agent must scan a large surface. The domain (cocktails, ingredients, flavor matching, shelf, constraints) is genuinely broad and justifies many of these, but some tools stretch the scope beyond what a single server comfortably handles.

Completeness4/5

Strong CRUD coverage for cocktails and ingredients plus flavor profiling, slot constraints, shelf, and matching workflows. Minor gaps: shopping list supports add/get but no remove, and collections/tags/glasses/methods are list-only, though these may be read-only reference data.

Maintenance

ActivitySlowing
ResponsivenessUnresponsive