Codex Alimentarius CXS 193 — maximum levels for contaminants and toxins in food and feed: lead, cadmium, arsenic, methylmercury, tin, aflatoxins, ochratoxin A, patulin and others, by commodity.
Two tools with complete input schemas and detailed descriptions. Tool names lack action verbs (contaminants_max_levels, contaminants_for_commodity are noun-heavy). Descriptions are strong (194 - 250 chars, well above baseline 34 chars minimum) and include use-case examples. Input schemas properly typed with required fields. However, NO output schemas are documented, LLMs cannot predict response structure. Parameters lack type constraints (enums, ranges). Error handling is basic (generic error text only). Security is adequate (read-only tools, no secrets). Composition is sound (two complementary tools, no overlap).
Every Codex maximum level that applies to one food — "which contaminant limits apply to rice", "what are the Codex limits for milk". Returns each contaminant with its maximum level and unit for that commodity, from CXS 193.
Codex Alimentarius maximum levels (MLs) for a contaminant in food — lead, cadmium, arsenic, mercury, methylmercury, tin, aflatoxins, ochratoxin A, patulin, melamine, hydrocyanic acid. Returns each commodity with its maximum level, the unit it is expressed in, and the page of CXS 193 it came from. Use for "what is the Codex limit for lead in fish" or "which foods have cadmium maximum levels".
No output schemas documented. LLMs cannot predict response structure (fields, types, nesting). Baseline: 100% of A+ tools document return types.
Tool names lack action verbs. 'contaminants_max_levels' and 'contaminants_for_commodity' are noun-heavy; should be 'get_contaminant_max_levels' and 'get_commodity_contaminants'. Baseline: 90% of A+ tools start with action verb.
Parameters lack type constraints. 'contaminant' and 'commodity' are free-form strings with no enum, pattern, or length limits. Baseline: constrained inputs prevent hallucinated values.
Error handling is generic. src/server.ts catches errors and returns raw error.message with isError=true. No recovery guidance, no categorization (retryable vs user-fixable). Baseline: errors must tell LLM what to do next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2025-06-18+ | v2 |
STDIO transport only. Hard cap at 50 for protocol readiness. Not remotely accessible; cannot be used by hosted MCP clients.