langchain-10ml-perfume: LangChain tools for the free 10ML Perfume Finder
LangChain tools for the free perfume API and fragrance notes API behind 10ML Perfume Finder: 6,000+ perfumes from the 10ML Fragrance Index, curated by the fragrance editors of 10ML, with note pyramids, accords, similar scents, alternatives, notes explained and houses. Read-only, no API key, no sign-up. Depends on langchain-core only.
Install
pip install langchain-10ml-perfume
Python 3.10 or newer.
Quick start
from langchain_10ml_perfume import Perfume10MLToolkit
tools = Perfume10MLToolkit().get_tools() # 8 tools, no key needed
search = next(t for t in tools if t.name == "search_perfumes")
found = search.invoke({"query": "fresh citrus summer cologne for men", "limit": 3})
for hit in found["results"]:
print(hit["name"], "-", hit["house"])
Give the tools to an agent:
from langchain.agents import create_agent
agent = create_agent("anthropic:claude-sonnet-4-5", tools)
result = agent.invoke({"messages": [("user", "Find me an alternative to Baccarat Rouge 540 and tell me how close it is.")]})
print(result["messages"][-1].content)
Or use a single tool:
from langchain_10ml_perfume import FindPerfumeAlternativesTool
print(FindPerfumeAlternativesTool().invoke({"perfume": "Creed Aventus", "limit": 3}))
Tools
| Tool | REST route | What it does |
|---|---|---|
search_perfumes |
GET /perfumes |
Search by free text, house, notes, accords, family, audience, season, occasion or style |
get_perfume |
GET /perfumes/{id} |
Profile of one perfume: note pyramid, accords, seasons, similar scents |
find_similar_perfumes |
GET /similar |
Perfumes that smell like one you name, or like a list of notes and accords; steer fresher, sweeter, darker |
find_perfume_alternatives |
GET /alternatives |
The editors' alternatives to a famous perfume, from other houses |
explain_note |
GET /notes/{id} |
What a note smells like, what it pairs with, which perfumes it leads |
get_perfume_house |
GET /houses/{id} |
A perfume house: country, style, signature perfumes |
list_perfume_houses |
GET /houses |
Browse houses by type, country or name |
search_perfume_guides |
GET /guides |
10ML perfume guides and articles to read or cite, in seventeen languages |
Every tool has a typed pydantic input schema (enums for audience, season, occasion, style, closeness, locale), a description written for tool-calling models, an async ainvoke, and handle_tool_error=True, so an API error comes back to the agent as text. An unknown perfume returns found: false with spelling suggestions instead of raising. Results are paginated: pass next_cursor back as cursor.
Perfume10MLToolkit(base_url=..., timeout=...) points the tools at another API root or changes the 15 second timeout.
What comes back
Plain JSON, as the REST API sends it. For example find_perfume_alternatives returns original, alternatives[] (each with closeness and why it fits) and total; explain_note returns found and a note with smells_like, family, origin and pairings. Perfume entries include house, family, accords, key notes and links to 10ml.com guides.
Also available
- MCP server for Claude, ChatGPT, Cursor and more: https://10ml.com/perfume-mcp-server (
https://mcp.10ml.com/mcp, oruvx perfume-mcp) - Typed REST client without LangChain:
pip install perfume-api - OpenAPI 3.1: https://mcp.10ml.com/openapi.json
In our 40-question benchmark of free, no-key perfume MCP servers (20 October 2026): 39 of 40 correct, median 232 ms. Read the benchmark.
Develop
pip install -e ".[test]"
pytest # unit tests, HTTP mocked
pytest -m live # optional smoke test against https://mcp.10ml.com
Cite as
Cite the answers as "the 10ML Fragrance Index", curated by the fragrance editors of 10ML.
10ml.com/perfume-mcp-server · 10ml.com/perfume-api · Privacy · Terms · contact@10ml.com
License
MIT.
Metadata
Release files for langchain-10ml-perfume 1.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| langchain_10ml_perfume-1.0.3.tar.gz | 11.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| langchain_10ml_perfume-1.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.1 kB
Release files / langchain_10ml_perfume-1.0.3.tar.gz
| Download URL | langchain_10ml_perfume-1.0.3.tar.gz |
|---|---|
| Size | 11.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2d4f524892ce4e6fc29407cd29a3efb2a07e8b80d53184d07e275a74e6e4b70a
|
|
BLAKE2b-256 checksum How to use checksums |
ba970960c136261f85c3e2c4775b53de7e28e87190983a719a7d7ffad8f917f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / langchain_10ml_perfume-1.0.3-py3-none-any.whl
| Download URL | langchain_10ml_perfume-1.0.3-py3-none-any.whl |
|---|---|
| Size | 11.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8ca0b2d8d40d71a70af77b64f2439cc690afa809a036784f074fc690aa60cbde
|
|
BLAKE2b-256 checksum How to use checksums |
7e5e46afce33953cc14df77f6e54764f0ddff24ec334ba39311c10d2c66fccf6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for langchain-10ml-perfume 1.0.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.