Production-grade comparison engine that computes weighted recommendation scores and outputs auto-formatted markdown feature grids for multi-product comparisons
Single tool 'compare' has a clear verb-noun name and documented input schema with parameter descriptions. However, the output schema is not formally documented in the tool definition, parameter descriptions lack depth and formatting constraints, and there is no error handling guidance. The tool is read-only but lacks explicit error recovery patterns. Description is adequate but brief (65 chars). Schema is present but incomplete (no documented return type structure). This server lands in the 'Fair' range with noticeable gaps in output documentation and error guidance.
Runs mathematical comparison scoring and constructs a markdown matrix table.
Output schema not documented. The tool description does not specify the structure of the returned dictionary (comparison_table_markdown, ranked_skus). LLMs cannot plan downstream operations or extract fields without knowing the response shape.
Parameter descriptions lack formatting and constraint details. 'products' is described as 'List of products to compare, each containing sku, name, price, rating, and features' but lacks minimum array length, field type specifics (is price an integer or float?), or range guidance. 'priorities' describes weights but does not specify valid numeric ranges (0-10? 0-100?).
No error handling guidance. The code returns a fallback message for <2 products ('Minimum of 2 products required') but this is not documented in the tool description. LLMs will not know what to do if this error occurs.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
No idempotency declaration. The tool performs mathematical scoring and constructs markdown. It is read-only and should return consistent results on repeated calls, but this is not explicitly stated for the LLM.
Generic numeric constraints. 'price_importance' and 'feature_richness' in priorities are described as weights but have no documented min/max values. Code uses defaults (3) and divides by (price_weight + feature_weight), risking division by zero or unexpected behavior if both weights are 0.