mcp-drink-inventory
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-drink-inventorywhat cocktails can I make with my current inventory?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Drink Inventory
An independent Python MCP server for local drink inventory, cocktail recipes and food pairings.
Intended public repository name: mcp-drink-inventory. This checkout is mcp/mcp_redes.
It needs no Anthropic account, API key or host implementation. Only synthetic recipe/demo data
is distributed. Python >=3.12, official MCP SDK v2 (tested with 2.2.0), SQLite and Pydantic.
Installation and stdio
cd mcp/mcp_redes
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e '.[dev]'
export INVENTORY_DB_PATH="$PWD/data/demo.db"
python -m mcp_drink_inventory.server
# Equivalent installed entry point:
mcp-drink-inventoryThe process waits for MCP input; it is not an interactive terminal prompt. stdout belongs to
the protocol and logging goes to stderr. A database is created automatically on the first
inventory tool call. INVENTORY_DB_PATH is the only server setting. If unset, storage defaults
to ~/.local/share/mcp-drink-inventory/inventory.db. Relative paths resolve against process cwd.
The parent directory is created automatically. No network calls or scraping are performed.
Related MCP server: Recipe Manager MCP Server
Using any compatible MCP host
Replace both absolute paths below. Install this package in the referenced Python environment.
{
"mcpServers": {
"inventory": {
"command": "/absolute/path/to/.venv/bin/python",
"args": ["-m", "mcp_drink_inventory.server"],
"env": {"INVENTORY_DB_PATH": "/absolute/private/path/inventory.db"}
}
}
}Uses a hand-rolled NDJSON JSON-RPC stdio server (no SDK). Clients speak MCP initialize + tools/*.
The sibling course host deliberately uses Client(..., mode="legacy") to capture the required
initialize sequence while retaining the current v2 SDK.
Bottle data and validation
Each row represents quantity identical bottles with the same remaining percentage. Split rows
when bottles have different fill levels. A 750 ml row with quantity=2 and remaining_percent=50
means 2 bottles and 750 ml total, not 1 bottle. IDs are internal SQLite integers.
Field | Type / rule |
id | Generated integer; not editable |
beverage_name | Required nonblank string |
category | Required nonblank string; e.g. whisky, gin, red wine, lime juice |
brand | Required nonblank string; use a descriptive label for homemade mixers |
variant | Optional string/null |
bottle_volume_ml | Finite number >0 |
remaining_percent | Finite number 0–100, per bottle |
quantity | Integer >=1, default 1 |
country, notes | Optional strings/null |
created_at, updated_at | UTC ISO timestamps; managed by server |
String values are trimmed but original spelling is preserved. Search removes accents and ignores case, with literal substring matching (no SQL wildcard interpolation). All SQL values are bound parameters. Updates validate the whole resulting record and reject unknown fields. Transactions roll back on errors. Connections close after each operation; lock timeout is five seconds.
Tools and every parameter
All tools are advertised by tools/list, including JSON input/output schemas. Results have text
content for general MCP clients; dictionary returns also expose structuredContent, and list
returns use the SDK's {"result": [...]} structured wrapper. Errors use MCP isError=true.
Tool | Parameters | Return |
| Required: beverage_name:str, category:str, brand:str, bottle_volume_ml:float, remaining_percent:float. Optional: quantity:int=1, variant:str/null=null, country:str/null=null, notes:str/null=null | Complete Bottle row with generated id/timestamps |
| beverage_name:str/null=null, category:str/null=null, brand:str/null=null | Matching Bottle rows, ordered by ID; [] when empty |
| Same three optional filters as list_inventory | total_bottles, brands, variants, total_remaining_ml, by_category, bottles |
| bottle_id:int, changes:object (one or more editable Bottle fields above) | Complete updated Bottle; errors for missing ID/invalid fields |
| bottle_id:int, remaining_percent:float | Complete updated Bottle |
| bottle_id:int | {removed_id:int}; deletes the entire row and its quantity |
| None | fully_available, missing_optional, missing_required arrays |
| cocktail_name:str, servings:int=1 (1–1000) | name, ingredients, steps, glass, garnish, notes, servings |
| beverage_name:str, brand:str/null=null, variant:str/null=null, food_category:str/null=null, limit:int=5 (1–20) | Ordered [{rank, food, category, score, reason}] |
| allow_demo:bool=false | {seeded:true, ids:[...]} or {seeded:false, reason:"already seeded"} |
Summary bottles additionally contains remaining_ml_per_bottle and remaining_ml_total.
by_category maps normalized categories to {bottles, remaining_ml}. Empty inventory totals are 0.
Recipe ingredients contain {name, amount, unit, optional}; amounts scale by servings. The
collection contains 20 authored house versions of classics such as Negroni, Daiquiri, Margarita,
Martini, Manhattan, Paloma and Espresso Martini. Unknown names produce a useful error.
Recommendations compare the available ml with quantities for one serving. Match exact
normalized beverage names, categories or variants, with a small explicit Spanish alias map.
Use descriptive names such as white rum, sweet vermouth, gin and lime juice to match recipes.
Mixers must also be recorded to count as available. Rows cannot be spent twice within one recipe.
Different recommendations are alternatives, not a claim that all can be made together.
Each result is {name, missing_required:[names], missing_optional:[names], servings:1}.
Sort is fewest missing required ingredients, then optional, then name. Ice is assumed; garnish
is optional. Piece-based garnish availability is conservatively unverified by a volume-only DB.
Pairings use beverage category/variety characteristics, not exact brand lookup. For an unfamiliar wine brand pass its category and grape variety in beverage_name/variant. Food categories include cheese, charcuterie, meat, seafood, vegetables and dessert; queso/jamón/charcutería are aliases. Scores are deterministic preference heuristics, not scientific measurements. Unknown characteristics return [] rather than fabricated matches. Rules cover red/white/sparkling wine, whisky, gin, tequila/mezcal and rum.
Synthetic example and prompts
Choose a separate demo.db, then call seed_demo_inventory with {"allow_demo":true}.
It refuses a nonempty unseeded database and records the seed atomically to make retries idempotent.
The six demo rows include two Scotch bottles, one Bourbon, gin, bitter, sweet vermouth and red wine
(seven bottles total). They are fictional examples, not the user's inventory.
“¿Cuántas botellas de whisky tengo, qué marcas son y cuánto queda de cada una?”
“Recomienda queso para mi Cabernet Sauvignon.”
“Quiero preparar un Negroni. Dame medidas y pasos.”
“¿Qué puedo preparar con lo que tengo y qué me falta?”
Testing
ruff check .
pytest -qIncludes a real subprocess MCP initialize/tools/list/tools/call integration test, temporary SQLite storage, CRUD validation, recipe scaling, pairing ranking and stock-aware recommendations. No API credits or personal database are used.
Privacy, storage and source attribution
Never commit .env, databases, logs, captures, tokens or personal inventories. These are ignored;
review git ls-files before publication. Restrict OS access to your database; SQLite is not encrypted.
MCP hosts can read or change inventory through tools and may forward results to an LLM. This
server itself does not contact one. Seeding does not occur on startup.
Recipes and pairing prose are small, project-authored examples based on general culinary knowledge, not copied from a third-party recipe database. This project has not selected a redistribution license yet; choose one before public distribution if reuse permissions are intended. Technical references: official SDK, MCP documentation.
Available Tools
10 toolsadd_bottleB
Add a row of identical bottles; remaining_percent applies to each bottle.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | ||
| notes | No | ||
| country | No | ||
| variant | No | ||
| category | Yes | ||
| quantity | No | ||
| beverage_name | Yes | ||
| bottle_volume_ml | Yes | ||
| remaining_percent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It does add useful behavior: adding multiple identical bottles in one row and applying remaining_percent equally to each bottle. However, it does not disclose mutation consequences, whether existing entries are checked, or what the operation returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, front-loads the main action, and every clause earns its place by clarifying a meaningful behavior. There is no redundant wording or irrelevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with nine parameters, zero schema descriptions, no annotations, and no output schema, this description is too sparse. It omits field semantics, likely value ranges for remaining_percent, and any success or side-effect information an agent would need to call it correctly and confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining the nine parameters. It only clarifies remaining_percent, leaving beverage_name, category, brand, bottle_volume_ml, quantity, notes, country, and variant without any semantic explanation beyond their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add a row of identical bottles') and the resource (bottles), and the verb 'Add' naturally distinguishes it from sibling tools like update_bottle, update_remaining, and remove_bottle. It is clear and specific, though it does not explicitly name or contrast any sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use add_bottle versus alternatives such as update_remaining or seed_demo_inventory. The description implies this is the creation tool, but it never states prerequisites, exclusions, or conditions for choosing a sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cocktail_recipeA
Get structured ingredients and steps, scaled to 1–1000 servings.
| Name | Required | Description | Default |
|---|---|---|---|
| servings | No | ||
| cocktail_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It usefully discloses that servings are scaled from 1 to 1000 and that output is structured ingredients and steps. However, it does not mention error cases, unavailable cocktail names, or exact output formatting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler. The primary purpose is front-loaded, and the scaling constraint is presented as a compact, valuable addition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but with no output schema and no annotations, the description should clarify return structure and edge behavior. It adequately conveys core function and serving range, but gaps remain around valid cocktail names, ingredient/step structure, and error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning for the 'servings' parameter by stating the 1–1000 scaling range, which the schema does not specify. However, it provides no additional meaning for 'cocktail_name' beyond what the property name already implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') with a clear resource ('cocktail recipe') and specifies the output ('structured ingredients and steps'). This distinguishes it from sibling tools focused on inventory management and recommendations, and the unique 'recipe' scope makes confusion unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to use this tool versus alternatives like recommend_cocktails_from_inventory or get_inventory_summary. It states what the tool does but not the conditions that should lead an agent to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inventory_summaryC
Return counts, brands, variants and remaining ml per bottle and category.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | ||
| category | No | ||
| beverage_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does communicate that the tool returns summarized inventory data and implies a read-only operation, but it does not explain aggregation behavior, filter semantics, or what happens when no filters are supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the action and output contents. It is appropriately brief, though it is so terse that important behavioral and parameter context is omitted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With three optional parameters, no output schema, no annotations, and several sibling tools, the description is too incomplete. It does not explain how filters combine, whether results are aggregated globally or per filter, or when this tool should be preferred over list_inventory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention any of the three optional parameters (brand, category, beverage_name) or how they affect the returned summary. The description provides no added meaning beyond the parameter names themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Return counts, brands, variants and remaining ml') and identifies the tool as an inventory summary, distinguishing it somewhat from the sibling list_inventory by emphasizing summary-level aggregation. However, it does not explicitly contrast itself with siblings, so it is not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus list_inventory or other inventory tools. The description implies it provides a summary, but it does not state when to choose it over alternatives or how filters should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_inventoryB
List bottles using optional accent/case-insensitive substring filters.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | ||
| category | No | ||
| beverage_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the burden of behavioral disclosure. It adds useful matching semantics (accent-insensitive, case-insensitive, substring), but does not mention return shape, pagination, or explicitly confirm read-only behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one tight, front-loaded sentence with no filler. Every word contributes either the action or the filter behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list with three optional, self-explanatory parameters, the description gives the core invocation details and filter semantics. Missing return-shape details are a minor gap, but the lack of output schema and annotations makes the description merely adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It conveys that all filters are optional and use substring matching with accent/case-insensitivity, giving meaning beyond the raw param names. However, it does not explain how multiple filters combine or define each parameter's exact scope.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List bottles' with optional filters, which clearly identifies the operation. It is distinct from siblings like add_bottle or get_inventory_summary, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over siblings such as get_inventory_summary or recommend_cocktails_from_inventory, and no conditions or excluded cases are given. The description only states what the tool does, not when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_cocktails_from_inventoryB
Compare stock volumes for one serving; distinguish missing required and optional items.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the core behavior: comparing stock volumes against a one-serving baseline and distinguishing missing required versus optional items. However, there are no annotations to cover safety or side effects, and the description does not mention whether the tool is read-only, what it returns, or how it handles edge cases like insufficient stock for required items.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no filler, and it front-loads the main comparison action. It could be slightly clearer by explicitly saying it recommends cocktails, but for a zero-parameter tool it is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters, annotations, or output schema, the description states the essential logic but not the return shape or expected result format. An agent can infer that it returns cocktails with missing-item information, but the lack of any mention of output or follow-up behavior leaves a moderate gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there are no parameter details to explain. With schema description coverage at 100% and no parameters to document, the baseline of 4 is appropriate; the description need not add parameter-level semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource (cocktails from inventory) and a clear distinguishing behavior: comparing stock volumes for one serving and separating missing required from missing optional items. It does not use the verb 'recommend' and the phrasing reads more like an internal computation than a user-facing recommendation action, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus siblings such as get_cocktail_recipe or get_inventory_summary. The context of 'from inventory' and comparing stock volumes implies the use case, but the description does not state when to prefer this tool or when an alternative would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_food_pairingsC
Rank pairings from beverage characteristics; pass category/variety for unknown brands.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | ||
| limit | No | ||
| variant | No | ||
| beverage_name | Yes | ||
| food_category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full burden of behavioral disclosure. It only says the tool ranks pairings and offers a parameter fallback hint; it does not disclose whether the operation is read-only, what happens when a beverage/brand cannot be matched, how the ranking is ordered, or what the response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with the core action front-loaded and a usage hint added neatly after the semicolon. It avoids filler, though the phrase 'category/variety' introduces some ambiguity that a slightly more explicit phrasing could remove.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five parameters, no output schema, no annotations, and zero schema description coverage, this short description is not sufficient for an agent to reliably construct a correct call. The agent would not know the required beverage_name semantics, how optional parameters interact, or what result format to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters. The only guidance is 'pass category/variety for unknown brands,' which is ambiguous because there is no explicit category parameter and the mapping to variant and food_category is unclear. It does not explain beverage_name, brand, limit, or food_category semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (rank) and resource (pairings derived from beverage characteristics), which aligns with the tool name and distinguishes it from sibling cocktail-recommendation tools. It could be slightly more explicit that the pairings are food pairings, but the intent is reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides one useful usage hint: pass category/variety for unknown brands. However, it does not explain when to choose this tool over sibling tools like recommend_cocktails_from_inventory, nor does it mention any exclusions or prerequisites. The guidance is present but minimal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_bottleA
Delete an inventory row by ID, including all bottles counted in its quantity.
| Name | Required | Description | Default |
|---|---|---|---|
| bottle_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral disclosure. It does reveal what gets destroyed ('inventory row... including all bottles counted in its quantity'), which is valuable. However, it omits other behavioral details such as irreversibility, permission requirements, or any cascading effects beyond the quantity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly written sentence. 'Delete an inventory row by ID' front-loads the primary action, and the qualifying phrase about bottles counted in quantity earns its place by conveying important scope. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete tool, the description covers the core action and the destructive scope. Yet the absence of any annotations or output schema means more context would help: no mention of permanence, expected return/confirmation, or prerequisites. It is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for the undocumented 'bottle_id' parameter. It partially does so by saying deletion happens 'by ID', mapping the integer parameter to row identity. Yet it does not explicitly name 'bottle_id' or add format or constraint details, though the parameter name itself is self-descriptive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Delete'), a specific resource ('an inventory row'), and the exact selection mechanism ('by ID'). It clearly distinguishes itself from sibling update/list/add tools, and the added scope ('including all bottles counted in its quantity') clarifies the full extent of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no context on when to use this tool versus alternatives like update_bottle or update_remaining. There are no conditions, exclusions, or any 'use this when...' guidance, so the agent is left to infer usage from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seed_demo_inventoryA
Explicitly seed synthetic data once; refuses to mix with existing unseeded inventory.
| Name | Required | Description | Default |
|---|---|---|---|
| allow_demo | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses two behavioral traits: the operation is one-time ('once') and it refuses to run when unseeded inventory exists. However, it does not clarify side effects (e.g., whether it wipes existing data), idempotency, or exactly what happens when the refusal is triggered. Some transparency is present, but significant behavioral gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence. Every phrase adds information: 'Explicitly' signals deliberate action, 'synthetic data' names the payload, 'once' gives frequency, and the refusal clause states a hard constraint. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one optional boolean parameter, no output schema), but the description is still incomplete. It does not explain the allow_demo parameter, what 'unseeded inventory' means, what the return value is, or what happens on a refusal. An agent would need to guess or inspect other tools to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema exposes one parameter, allow_demo, with no description, and schema_description_coverage is 0%. The tool description never mentions this parameter, so an agent cannot determine what allow_demo controls or when to set it to true. The description provides zero value for parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('seed') with a clear resource ('demo inventory') and a distinguishing scope ('synthetic data once'). It also names a behavioral constraint ('refuses to mix with existing unseeded inventory') that separates it from sibling tools like add_bottle or update_bottle, which operate on real inventory entries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Explicitly seed synthetic data once' gives clear context for when to use the tool: a one-time demo setup. The refusal clause adds an implicit condition of use - it should not be run when inventory already contains unseeded data. However, it does not explicitly name alternatives or contrast with sibling tools such as add_bottle, so an agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_bottleC
Update editable BottleInput fields; rejects unknown fields and invalid values.
| Name | Required | Description | Default |
|---|---|---|---|
| changes | Yes | ||
| bottle_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does disclose that unknown fields and invalid values are rejected, which is useful, but it does not explain success/failure behavior, whether the update is partial, whether it validates the required `bottle_id` existence, or what the response looks like. A mutation tool with no annotation coverage needs more than this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no filler. The primary action is front-loaded and the validation behavior is stated in a secondary clause. Every word earns its place, even though more content is needed overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an opaque nested `changes` object, no output schema, no annotations, and a similarly named sibling `update_remaining`, this description is incomplete. The agent cannot reliably construct a valid call because the editable fields and the expected `changes` object format are never specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 0% description coverage, so the description must compensate. It mentions 'editable BottleInput fields' but does not enumerate those fields, explain the structure of the `changes` object, clarify acceptable value formats, or describe the role of `bottle_id`. The agent is left guessing at the shape of the required `changes` parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation ('Update') and resource ('editable BottleInput fields'), and it adds a useful validation detail ('rejects unknown fields and invalid values'). However, it does not explicitly differentiate itself from the sibling tool `update_remaining`, which likely has overlapping update semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives such as `update_remaining` or `add_bottle`. The description states what the tool does but gives no context for choosing it over sibling tools, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_remainingC
Set remaining percentage (0–100) for each bottle represented by this row.
| Name | Required | Description | Default |
|---|---|---|---|
| bottle_id | Yes | ||
| remaining_percent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the mutating action 'Set' and the percentage range, but it does not mention validation of out-of-range values, whether existing values are overwritten, side effects, or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler, and the core verb and resource are front-loaded. The phrasing 'each bottle represented by this row' is somewhat awkward, but the overall structure is efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter update, the description covers the essential operation and the percentage range. However, with no annotations and no output schema, it omits context about return behavior, error handling, and how this tool fits among the bottle-management siblings, making it minimally sufficient but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It gives meaning to remaining_percent by specifying a 0–100 range, but bottle_id is only loosely implied by 'each bottle represented by this row' and not explicitly identified as the target identifier. The compensation is partial at best.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Set' and names the resource 'remaining percentage' with a clear 0–100 range, making the tool's primary function obvious. However, the phrase 'each bottle represented by this row' is slightly ambiguous and does not explicitly differentiate it from the sibling update_bottle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus update_bottle or any other sibling. It does not mention conditions, exceptions, or alternatives, leaving usage entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
add_bottle - First observed
get_cocktail_recipe - First observed
get_inventory_summary - First observed
list_inventory - First observed
recommend_cocktails_from_inventory - First observed
recommend_food_pairings - First observed
remove_bottle - First observed
seed_demo_inventory - First observed
update_bottle - First observed
update_remaining
TDQS
Scored across 10 tools
Most tools are clearly distinct: CRUD operations, inventory views, and recommendation features each have separate purposes. The only mild overlap is between update_bottle and update_remaining (both modify a bottle row) and between list_inventory and get_inventory_summary, but the descriptions clarify the different intents well enough.
All tool names follow a consistent snake_case verb_noun pattern: add_bottle, list_inventory, remove_bottle, recommend_food_pairings, etc. Even longer names like recommend_cocktails_from_inventory remain structurally consistent and predictable.
With 10 tools, the server is well-scoped for a drink inventory domain that also includes cocktail recommendations and food pairings. Each tool addresses a distinct need without unnecessary redundancy or bloat.
The inventory lifecycle is well covered: add, list, summarize, update, adjust remaining, and remove bottles. Cocktail recipe lookup, inventory-based recommendations, food pairings, and demo seeding fill out the domain without obvious dead ends.
Maintenance
Related MCP Connectors
Cocktails MCP — TheCocktailDB API (free, no auth)
MCP server for the Émile wine cellar — list, add, recommend, scan and search 100k+ wines.
Unlock the power of food transparency with our Open Food Facts MCP server. Easily look up any food
Cross-vendor AI memory over MCP. One semantic store, readable and writeable from every MCP client.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables management of your home bar inventory and cocktail discovery through Bar Assistant. View shelf ingredients, find cocktails you can make, and add or remove items from your bar collection.6-
- FlicenseNot gradedqualityDmaintenanceEnables managing recipes via a web UI and MCP tools, allowing retrieval and saving of recipe data through natural language.-
- AlicenseBqualityDmaintenanceMCP server for Bar Assistant that enables searching cocktails, managing ingredients, shelves, shopping lists, and collections via natural language.41MIT
- AlicenseAqualityBmaintenanceRead-only MCP server exposing Brewfather brewing data—batches, recipes, fermentation readings, and inventory—as tools for natural language queries.9MIT