An MCP server that provides tools to search, filter, and discover breweries using the Open Brewery DB API.
This server has basic tool definitions with clear naming and mostly adequate schemas, but lacks depth in parameter descriptions, output schema documentation, and error handling guidance. All four tools follow verb_noun naming conventions (search_, get_, filter_). Schemas are present and properly structured with JSON Schema types. However, parameter descriptions are minimal (most under 50 chars), output schemas are not documented, and error responses do not guide the LLM on recovery actions. The brewery.py implementation wraps exceptions into generic error objects without actionable error messages. Descriptions are serviceable but lack the context that would help LLMs distinguish these tools from similar discovery tools or understand when to use them.
Filter breweries by type (micro, nano, regional, brewpub, large, planning, bar, contract, proprietor, closed).
Find breweries in a specific city.
Get a random brewery's details.
Search for breweries by name/keyword.
Output schemas are not documented. Tools return raw JSON via brewery.py API responses without declaring the expected structure to LLMs. This forces LLMs to guess at response field names and nesting, inviting downstream lookup failures.
Error responses do not guide recovery. When brewery.py catches RequestException, it returns [{'error': str(e)}], a raw string with no actionable guidance for the LLM. For example, if OpenBreweryDB is down, the LLM has no hint that it should retry, ask the user, or try an alternative search.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 40 | 2024-11-05+ | v1 |
Parameter descriptions are minimal and lack usage context. 'Search keyword (e.g., dog, beer)' for search_breweries.query does not explain when to use this tool vs. get_breweries_by_city or filter_breweries_by_type. LLMs cannot determine tool selection without such context.
get_random_brewery has an empty inputSchema.properties object and no description beyond 'Get a random brewery's details.' This lacks explanation of what qualifies as useful output and when an LLM would call this vs. a search/filter tool.
No pagination or result limits declared. Tools may return arbitrary numbers of breweries, risking context window exhaustion. Description for get_breweries_by_city states per_page=10 in code but does not expose this to the LLM, and other tools have no limit declaration.
filter_breweries_by_type.city parameter description says 'Optional city to filter by' but does not clarify what happens if city is omitted, does it search all cities? Does it return no results? This ambiguity requires the LLM to guess or infer behavior from the implementation.