bar-assistant-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BAR_ASSISTANT_URL | Yes | Base URL of your Bar Assistant API (e.g., https://erikbarapi.duckdns.org) | |
| BAR_ASSISTANT_TOKEN | Yes | API token from Bar Assistant | |
| BAR_ASSISTANT_BAR_ID | No | Bar 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
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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:
|
| 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):
|
| 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 Filters:
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:
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:
|
| 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:
|
| 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: 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 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
|
| bar_set_slot_metaA | Declare the category + tolerance for a recipe slot. Required before setting axis constraints. Args:
cocktail_id: BA cocktail_id.
sort: BA |
| 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 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 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 41 tools
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.
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.
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.
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.