DEV Community

10ML
10ML

Posted on Originally published at 10ml.com

Perfume MCP servers compared: a 40-question benchmark

If you search for a perfume MCP server you find a handful of options and very little data on how they behave. So on 20 October 2026 we ran the same 40 questions against five perfume MCP servers that answer without an API key or sign-in, and wrote down what happened.

One disclosure before the numbers: we built one of the servers in the test, 10ML Perfume Finder. That is an obvious conflict of interest, which is why the method, rubric, the 40 questions and the summary data are published and the limits are listed below. The full write-up is on 10ml.com.

What we measured

  • Date and place: Tuesday 20 October 2026, 06:24 to 06:32 UTC, from one machine on a home connection in Southeast Asia. Latency includes the trip to each server's nearest edge, so it is one vantage point, not a global figure.
  • Client: Node 25.9 with plain fetch, MCP Streamable HTTP (protocol 2025-06-18), one connection per server, no caching, no retries (one exception, see limits). No language model in the loop.
  • Politeness: at most one request per second to any server, ours included. Per server: one initialize, one tools/list, one unscored warm-up question, then the 40 questions once.
  • Questions: 40 fixed questions written before the run and not tuned to any index: 20 well-known perfumes, 10 niche or Middle-Eastern perfumes, 3 note questions, 2 similar-scent questions, 2 house questions and 3 questions in German, French and Spanish, passed to the tools as written. 10ML was also given its documented locale argument for those three.
  • Scoring: a lookup counts as correct when the answer contains the perfume name, the house and at least two of its headline notes. A note question is correct with at least 4 entries mentioning the note or 2 well-known perfumes from a fixed list; similar-scent and house questions need 1 or 3 perfumes from fixed lists. The rules were written before the run and applied the same way to every server.
  • Calls: each server was driven the way an agent would use its own tools: one detail call where the server accepts names, a search then a detail call where it needs an id. Where a server has no tool for a question type, its search tool was used.

Results

Server Correct /40 Median latency p95 Calls per question Tools
10ML Perfume Finder (10ML Fragrance Index 2.3.0) 39 232 ms 691 ms 1.00 15
ScentVerdict 2.0.0 36 698 ms 899 ms 1.85 6
Parfum Bible 1.0.0 33 3,150 ms 5,342 ms 2.60 4
Perfume Picks 1.0.5, called at 1 request/s 18 1,237 ms 2,832 ms 1.00 8
Perfume Picks 1.0.5, rate limit respected 32 not comparable not comparable 1.00 8
Parfica 1.0 7 1,099 ms 2,632 ms 1.88 3

Two notes on the table. Perfume Picks' 1/s latency includes the 19 instant refusals. Perfume Picks has a documented limit of 60 calls a minute, but at one request per second it began refusing at question 22 (19 refusals), so we re-ran the 19 unanswered questions four seconds apart after a 60-second pause and report both. Parfica returned note names in Ukrainian; with an agent translating them it would reach 34 of 40, but our scripted client does not translate.

ScentRev, Noteboxd, Fragella and Fraganty need a key or sign-in, so they could not be scored.

Where the servers differ

The scores tell part of the story. Measured on the responses and on each server's tools/list:

  • Output schemas: 10ML Perfume Finder declares them on all 15 tools and ScentVerdict on all 6; Parfum Bible, Perfume Picks and Parfica declare none.
  • Note pyramids: a full top, heart and base pyramid came back in 29 of 30 lookup answers for 10ML, and in 30 of 30 for Parfum Bible, Perfume Picks (21 in the 1/s run) and Parfica (in Ukrainian). ScentVerdict returns flat key notes from its lookup tool; a separate scent-profile tool returns the pyramid, but we did not call it.
  • Tool-list weight: 10ML's tools/list is the heaviest at 60.5 KB, against 39.2 KB for ScentVerdict's six tools and 6.6 KB for Perfume Picks' eight. If you care about context budget, that is a real cost.

Where we lose

  • Breadth. Perfume counts are each server's own figure and were not independently counted: ScentVerdict says 31,000+, Perfume Picks 13,000+, against 5,406 in the 10ML Fragrance Index. The questions were chosen to be answerable by a mainstream index, so the benchmark says nothing about perfumes beyond those 5,406. On a set of obscure perfumes, larger indexes would pull ahead.
  • Profile depth. 4,925 of the 5,406 entries are core profiles without longevity, projection or perfumers; 481 are full editorial profiles.
  • One miss. "Similar to Hermès Terre d'Hermès" returned plausible shared-note neighbours that were not on our fixed list. The similar-scent rubric is the weakest part of the benchmark: n is 2, and lists cannot hold every sound answer.
  • Extras. ScentVerdict adds a written verdict per perfume. Perfume Picks adds community wear scores and curated alternatives. Parfum Bible adds US retailer offers.

Limits of the test

One run, from one place. With n = 40, a one-question gap is within noise. The set leans mainstream by design. Two scoring faults were found after the initial pass (escaped accents in JSON, and note questions initially scored against a fixed perfume list alone); we fixed them for every server and rescored all saved responses. Initial-pass scores were 10ML 37, ScentVerdict 32, Parfum Bible 33, Perfume Picks 18 and Parfica 2. Parfica was run twice, the second time with a name-only retry, and that run is reported.

Also, every server was driven by a plain script. A model that retries or translates would lift Parfica and Perfume Picks and shrink the single-call advantage we measured. We plan to re-run the test monthly. The summary data is CC BY 4.0 as CSV and JSON on the benchmark page.

Try it

The MCP endpoint is one URL, free, with no API key and no account:

https://mcp.10ml.com/mcp
Enter fullscreen mode Exit fullscreen mode

In Claude Code:

claude mcp add --transport http perfume-finder https://mcp.10ml.com/mcp
Enter fullscreen mode Exit fullscreen mode

In Cursor, ~/.cursor/mcp.json:

{ "mcpServers": { "perfume-finder": { "url": "https://mcp.10ml.com/mcp" } } }
Enter fullscreen mode Exit fullscreen mode

Setup for Claude, ChatGPT, VS Code, Gemini CLI, Windsurf, Cline, Goose and Zed is on the perfume MCP server page.

If you would rather call it from your own code, the same answers are available as plain GET requests (open CORS, JSON back):

const res = await fetch("https://mcp.10ml.com/api/v1/perfumes/Baccarat%20Rouge%20540?format=detailed");
const { perfume } = await res.json();
console.log(perfume.name, perfume.pyramid);
Enter fullscreen mode Exit fullscreen mode

Curl and Python examples, the other endpoints and an OpenAPI 3.1 description are on the perfume API page. It is read-only; fair-use rate limiting may apply, so keep bulk jobs polite and cache what you fetch.

If you run a perfume server and want it in the next round, or you think a question type is missing from the set, tell us in the comments. The questions and rubric are on the benchmark page so you can rerun the questions yourself.

Top comments (0)