MCP server for open-cosmetics — ingredient query, formula review, multi-region compliance, synbio company metadata
Three tools with bilingual descriptions and clear regulatory focus, but significant gaps in schema completeness and parameter documentation. All tools have descriptions (10-150 chars), but input schemas lack parameter-level descriptions, critical for LLM parameter selection. No output schemas documented. Error handling is minimal. Tool names are action-oriented (ingredient_query, formula_review, compliance_check) but lack verb prefixes (search_, check_, validate_). Schema visibility is partial: formula_review and compliance_check have structured inputs with enums, but ingredient_query's input is minimal. No tool annotations (readOnlyHint, etc.) despite all being read-only operations.
Multi-region regulatory check for a single ingredient (CN/EU/US/KR/JP/ASEAN). / 多地区合规扫描 (中国/欧盟/美国/韩国/日本/东盟)
Check a formula against 65 rules (compatibility/pH/concentration/special population). / 65 规则审查 (兼容性 / pH / 浓度 / 特殊人群)
Query ingredient across CN (IECIC) + EU (CosIng + Annex II) regulatory sources. / 跨源查询成分监管状态 (中国 NMPA IECIC + EU CosIng + EU Annex II 禁用)
Input parameters lack descriptions. 'q' in ingredient_query, 'population' and 'region' in formula_review, 'regions' in compliance_check have no explanatory text. LLMs cannot infer parameter semantics from names alone.
No output schemas documented. Callers cannot predict response structure (e.g., does ingredient_query return cn_iecic_i as array or object? What fields?). Agents must guess or fail.
Tool names lack action verbs. 'ingredient_query' should be 'search_ingredient' or 'query_ingredient'; 'formula_review' should be 'check_formula' or 'validate_formula'. Verb-first naming improves LLM intent parsing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
No tool annotations despite all tools being read-only. Missing readOnlyHint in tool definitions. Agents cannot distinguish safe tools from destructive ones without explicit hints.
Error handling is minimal. Code returns generic errors (e.g., 'rules.json not loaded', 'DuckDB not found') without recovery guidance. No actionable error messages to guide LLM retry or fallback logic.