Deterministic product evaluation for US packaged food: health scores, ingredient safety, state regulatory flags, FDA recalls, and corporate ownership. Stdio MCP server backed by api.scern.app.
Two well-defined tools with complete schemas, clear descriptions, and proper annotations. Both tools follow verb_noun naming (evaluate_product, compare_products) and include readOnlyHint/destructiveHint annotations. Schemas use Zod with proper type constraints (enums, unions, min/max). Descriptions are 150 - 250 chars, within the 10 - 1024 baseline. However, output schemas are not formally documented, responses are returned as JSON text + structuredContent without explicit field definitions. Error handling is minimal: no recovery guidance, no categorization of retryable vs fatal errors. Parameter descriptions could be more prescriptive about valid jurisdiction values and context defaults.
Compare 2–5 products by health score. Returns all evaluations, a ranking by health score (descending), and the best-scoring barcode. Products not found are included as { value, status: 'not_found' } and excluded from the ranking.
Evaluate a product's health score, ingredient safety, corporate ownership, and regulatory flags using the Scern database. Pass a UPC or EAN barcode value.
Output schemas not formally documented. Responses return structuredContent as untyped Record<string, unknown>, forcing LLMs to infer field names and types. No documentation of healthScore, status, ranking, or best_value fields.
Error handling lacks recovery guidance. When API returns non-200 status, response includes raw JSON with no actionable next steps. No distinction between retryable (timeout, 429) vs user-fixable (404, invalid barcode) vs fatal errors.
Parameter descriptions lack prescriptive detail. 'jurisdiction' accepts CA, TX, WV but description does not explain what happens if an invalid jurisdiction is passed, or whether the parameter is case-sensitive. 'context' defaults to 'retail' but this is not stated in the description.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2025-06-18+ | v2 |
No pagination or result limits documented. compare_products accepts 2 - 5 items (good), but evaluate_product returns a single product evaluation with no indication of response size or whether results could be truncated.
Timeout handling is implicit (8s AbortSignal.timeout) but not documented in tool descriptions. LLMs cannot know that calls may fail after 8 seconds or how to retry.