A Model Context Protocol server that provides tools for querying and filtering beverages from a database. Includes beverage lookups by ID, name, type, ingredient, calories, and origin, plus a greeting tool.
This server has 8 tools with fundamental structural issues. Tool names use PascalCase with 'Json' suffix rather than the standard verb_noun pattern (pattern:tool). Descriptions are present but generic and lack depth about when/why to use each tool. Input schemas are defined with types and parameter descriptions, which is good, but output schemas are completely undocumented, callers don't know what structure to expect from the JSON responses. No error handling guidance, no recovery paths, and no distinction between tools (e.g., GetBeveragesByNameJson vs GetBeveragesByTypeJson are nearly identical in structure, forcing LLM to guess which to use). The 'Echo' tool is trivial and adds no value. Overall, this reads as a basic data-access layer wrapped with MCP bindings, not a production-grade agent tool suite.
Says Hello to a user
Get a beverage by ID and return as JSON
Get beverages by calories less than or equal to and return as JSON
Get beverages by ingredient and return as JSON
Get beverages by name and return as JSON
Get beverages by origin and return as JSON
Get beverages by type and return as JSON
Get a list of beverages and return as JSON array
Tool names violate verb_noun convention. Names like 'GetBeveragesJson' use PascalCase and include implementation detail ('Json') rather than following standard 'get_beverages' pattern. LLMs expect lowercase verb_noun format (get_, list_, search_, etc.). This reduces name clarity and tool discoverability.
No output schema documentation. All tools return `string` (JSON) with no documented structure. LLMs cannot predict the response fields or plan downstream tool composition. The response could contain 'id', 'beverage_id', 'beverageId', or any variation, callers have no way to know what to extract.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 34 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 29 | - | v1 |
Multiple near-identical search tools with no clear distinction. GetBeveragesByNameJson, GetBeveragesByTypeJson, GetBeveragesByIngredientJson, GetBeveragesByOriginJson all follow the same pattern but lack descriptions explaining the semantic difference or when to prefer one over another. LLMs will guess and potentially call the wrong tool.
Descriptions are generic and lack actionable guidance. 'Get beverages by name and return as JSON' tells the LLM WHAT it returns but not WHEN to use it, what 'name' means (exact match? substring? case-sensitive?), or prerequisites. Descriptions should be 50-200 characters and explain WHAT, WHEN, and any constraints.
Parameter descriptions lack specificity and constraints. The 'name', 'type', 'ingredient', 'origin' parameters are described as 'filter by X' with no detail on case sensitivity, exact vs substring match, or what happens if no results are found. LLMs need constraints like 'substring match, case-insensitive' to invoke correctly.
No error handling or recovery guidance. If a tool returns an empty result or an error, there is no guidance for the LLM on what to try next. Should it retry? Call a different tool? Ask the user for clarification? Absence of error documentation forces LLMs to guess.
GetBeveragesByCaloriesLessThanOrEqualJson has unnecessarily verbose name. The tool name is 42 characters (p90 baseline is 27). Simplify to 'get_beverages_by_max_calories' or 'search_beverages_by_calories'. Long names waste tokens and are harder for LLMs to parse.
Echo tool is trivial and not relevant to the beverage domain. It adds noise to the tool suite and forces LLMs to reason about an unrelated greeting function when focused on beverage queries. Remove or move to a separate utility server.