MCP server exposing the Perfume Picks fragrance database (13,000+ scents) as read-only tools for AI assistants. Search the catalog, find dupes, compare fragrances, and get wear suggestions — with citation-ready attribution.
Strong tool naming (all verb-noun), comprehensive descriptions (150-250 chars), and well-structured schemas with enums and constraints. All 7 tools have explicit registrations with inputSchema, descriptions, and annotations. Parameters are typed and described. Main gaps: output schemas are not formally documented (only inferred from respond() wrapper), error messages are generic, and no pagination guidance for large result sets. Composition is clean, each tool has one responsibility. Rate limiting and telemetry are present but not exposed to the LLM.
Side-by-side comparison: note pyramids, shared and distinct accords, longevity/sillage/compliment scores, concentration, and price difference.
Curated dupes for a fragrance — cheaper scents documented to smell like the original, with match percentage and price comparison. The answer to 'what smells like X without the price tag'.
Fragrances most similar to a given one, from Perfume Picks' precomputed similarity ranking over notes and accords.
Detailed record for one fragrance: full note pyramid (top/heart/base), accords, concentration, community longevity/sillage/compliment scores, and MSRP. Accepts a Perfume Picks slug or a name like 'Bleu de Chanel'.
Personalized fragrance picks from note/accord preferences (e.g. 'vanilla', 'oud', 'citrus'), a budget in USD, an occasion ('office', 'date night', 'gift', 'signature scent'), and gender presentation.
Output schemas not formally documented. The respond() wrapper returns JSON with dynamic fields (attribution, result_count, fragrances, etc.), but LLMs cannot see the structure. Document return types for each tool.
Error messages are generic JSON blobs (errorResult returns {error: message}). No recovery guidance. E.g., if fragrance not found, suggest search_fragrances or list available brands.
search_fragrances and trending_fragrances lack explicit pagination guidance. With 13,000+ fragrances, large result sets could exhaust context. Limit is capped at 25, but no mention of next_cursor or total_count in description.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Full-text search across 13,000+ fragrances in the Perfume Picks database. Filter by brand, fragrance family, gender, and MSRP (USD). Returns note pyramids, accords, and community wear scores with source attribution.
Top trending fragrances by recent wardrobe adds, optionally filtered by gender and price range. Requires service-role key for live trending data.
get_recommendations has a 'preferences' array parameter but no enum or validation. LLMs may pass invalid note names. Document valid note/accord values or provide a discovery tool.
Tool descriptions mention 'Perfume Picks slug or name' but do not explain what a slug is or how to obtain one. LLMs may pass invalid slugs. Add a note: 'Slug is the URL-safe identifier (e.g., bleu-de-chanel); if unsure, use search_fragrances first.'