Skip to content

PerfuMate

by perfumate.app · remote · no sign-in to list tools · v1.1.0 · published by app.perfumate

Perfumery materials, IFRA Category 4, EU allergens, and your formulas and shelf via OAuth.

Deletes · 3Final · 1Changes · 26

45 tools: 3 can delete or cancel things, 1 do something that can't be undone, 26 change things and 15 only read.

Scanned Oct 21, 2026

3 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http perfumate https://perfumate.app/mcp

Findings

Matches of fixed checks, with the text they matched.

3 warn
  • The server marks "shopping_list" destructive (destructiveHint: true), and its name says "list", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}; The name "shopping_list" says "list": a word for reading.

    What this check looks for
  • The server marks "delete_items" read-only (readOnlyHint: true), and its own name, description or input give the class "destructive".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "delete_items" says "delete": a word for removing or ending something.

    What this check looks for
  • The server marks "delete_items" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "delete_items" says "delete": a word for removing or ending something.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

45 tools

Deletes or cancels 3Claude Code: deny
  • confirm_deleteUse this only after the user has said yes to the list delete_items showed.No findings

    Why it is in this group

    • The name "confirm_delete" says "delete": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this only after the user has said yes to the list delete_items showed. Deletes exactly that list, with its token. If the list included a protected item, confirmName must be the formula's name as the user typed it. Items stay restorable for 30 days.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
    • idempotentHint: false
    • title: Delete (step 2 of 2)
  • delete_itemsUse this when the user asks to delete a formula, version, material, bottle, batch or note.2 findings

    Why it is in this group

    • The name "delete_items" says "delete": a word for removing or ending something.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    • The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "delete_items" read-only (readOnlyHint: true), and its own name, description or input give the class "destructive".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "delete_items" says "delete": a word for removing or ending something.

      What this check looks for
    • Warn

      The server marks "delete_items" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "delete_items" says "delete": a word for removing or ending something.

      What this check looks for
    Description, as the server wrote it
    Use this when the user asks to delete a formula, version, material, bottle, batch or note. It is step 1 of 2 and deletes NOTHING: it shows exactly what would be removed, with any protection, and returns a confirmation token valid for 10 minutes. Show the list to the user; only after they agree, call confirm_delete. Locked formulas cannot be deleted here.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Prepare a deletion (step 1 of 2)
  • shopping_listUse this when the user wants to add materials or free text to a Shopping cart list (the default list unless one is named; a new name makes that list), tick items as received or bac…1 finding

    Why it is in this group

    • The name "shopping_list" says "list": a word for reading.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Warn

      The server marks "shopping_list" destructive (destructiveHint: true), and its name says "list", a word for reading.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}; The name "shopping_list" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Use this when the user wants to add materials or free text to a Shopping cart list (the default list unless one is named; a new name makes that list), tick items as received or back to needed, or remove them.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • openWorldHint: false
    • idempotentHint: false
    • title: Change your shopping cart
Can't be undone 1Claude Code: ask
  • rename_folderUse this when the user wants to rename a formula folder: every formula filed in it moves (an empty name unfiles them).No findings

    Why it is in this group

    • The name "rename_folder" says "rename": a word for a change.
    • The input addresses people (input.to): what it sends cannot be taken back.
    Description, as the server wrote it
    Use this when the user wants to rename a formula folder: every formula filed in it moves (an empty name unfiles them).

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Rename a formula folder
Changes things 26Claude Code: ask
  • add_to_shelfUse this when the user says they have bought or own materials and wants them on their shelf.No findings

    Why it is in this group

    • The name "add_to_shelf" says "add": a word for a change.
    Description, as the server wrote it
    Use this when the user says they have bought or own materials and wants them on their shelf. Adds catalog materials by name or CAS, or their own new ones; each item can carry the bottle strength, solvent, stock in grams, price per gram, supplier and lot. Without a strength, a catalog material gets its usual working dilution (in DPG unless a solvent is given), else neat. A list can also come as pasted text or an attached file: one material per line, or a table whose header row names the columns. Names that match nothing come back with suggestions.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Add materials to your shelf
  • branch_versionUse this when the user wants to start a new line of work from a past version; the old working copy stays in the tree.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user wants to start a new line of work from a past version; the old working copy stays in the tree.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Branch from a version
  • check_formulaUse this when the user has a perfume or accord formula, pasted or drafted earlier in this conversation, and wants to know whether it is IFRA compliant, how much of the finished pro…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Use this when the user has a perfume or accord formula, pasted or drafted earlier in this conversation, and wants to know whether it is IFRA compliant, how much of the finished product it may be, which line to reduce, or which EU allergens the label must declare. Checks IFRA Category 4 (fine fragrance) at the concentration the user chooses, finds the highest safe concentration and says how far to reduce a line that is over a limit. Give the formula as pasted text (one material per line with an amount) or as structured lines, every line in grams or every line in percent. Lines that match no catalog material are listed and not counted. Does not save anything and does not change the amounts. Returns a link that opens the formula in PerfuMate. For one material's limit use get_material; for a starting recipe use find_starting_formula.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Check a formula (IFRA and EU allergens)
  • create_formulaUse this when the user wants a new formula on their PerfuMate bench, empty or with lines they give (structured, pasted text or an attached file), for example after building one tog…No findings

    Why it is in this group

    • The name "create_formula" says "create": a word for a change.
    Description, as the server wrote it
    Use this when the user wants a new formula on their PerfuMate bench, empty or with lines they give (structured, pasted text or an attached file), for example after building one together in this chat. Lines are matched to the catalog and the user's own materials; if any line does not match, nothing is saved and the unmatched names come back with suggestions. Bottles the user does not own are added off the shelf, as an import does. To only check a formula without saving it use check_formula.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Create a formula on your bench
  • decompose_accordUse this when the user wants an accord line replaced by the materials it holds, at the same dose, in place (undo_last_change takes it back).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user wants an accord line replaced by the materials it holds, at the same dose, in place (undo_last_change takes it back).

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Decompose an accord
  • duplicate_formulaUse this when the user wants a copy of a formula to try changes on: an independent copy of its working copy with the same bottles, named "<name> copy" unless named.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user wants a copy of a formula to try changes on: an independent copy of its working copy with the same bottles, named "<name> copy" unless named.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Duplicate a formula
  • edit_formulaUse this when the user wants to change a formula on their bench: add or remove a material, set an amount or a bottle strength, swap a material, flag or note a line, reorder, or sca…No findings

    Why it is in this group

    • The name "edit_formula" says "edit": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to change a formula on their bench: add or remove a material, set an amount or a bottle strength, swap a material, flag or note a line, reorder, or scale the whole formula. Changes the working copy in place, as one hand edit in the editor does. No version is made; undo_last_change reverses the change, save_version keeps a version when the user asks. Only when a batch was made from the working copy does the first change start one new working version (the result says so). A formula open in the app updates within seconds. Lines are named by material or id. For add/set_amount always specify unit: g is a weighed amount; % is the final weighed share of the whole formula (including solvent, not the pure aromatic relative/absolute percent). Other weighed lines are held fixed; several % targets are solved together. Never copy relativePct or absolutePct as grams. Read get_formula first and use weighedPct for this kind of percentage edit.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Edit a formula's lines
  • insert_accordUse this when the user wants to use one of their saved formulas as a single ingredient inside another, as the app's accords do: a virtual material carrying the flattened compositio…No findings

    Why it is in this group

    • The name "insert_accord" says "insert": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to use one of their saved formulas as a single ingredient inside another, as the app's accords do: a virtual material carrying the flattened composition (so IFRA, allergens, cost and the scent profile see what is inside) on a bottle at the accord's own aromatic strength. Optionally at an amount in grams.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Use a formula as an accord
  • journal_noteUse this when the user wants to add a dated line to a batch's maceration journal, or correct one.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user wants to add a dated line to a batch's maceration journal, or correct one.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Write in a batch's journal
  • log_batchUse this when the user has made a batch of a formula and wants it recorded: total weight, date, label and notes, optionally at a weaker strength, and optionally deducting what it u…No findings

    Why it is in this group

    • The name "log_batch" says "log": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    Description, as the server wrote it
    Use this when the user has made a batch of a formula and wants it recorded: total weight, date, label and notes, optionally at a weaker strength, and optionally deducting what it used from stock. Works from the working copy or a version.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Log a batch
  • make_dilutionUse this when the user has made, or wants to record, a dilution from a bottle they own; the material used is taken from the source bottle's stock.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user has made, or wants to record, a dilution from a bottle they own; the material used is taken from the source bottle's stock.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Make a dilution from stock
  • my_accountUse this when the user asks about their PerfuMate account or how big their bench is.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Use this when the user asks about their PerfuMate account or how big their bench is. Returns the linked account's plan ("unlimited" or "ai_studio") and its counts of formulas, shelf materials and notebooks; says so when the bench has not synced from the app yet.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Your PerfuMate account
  • open_versionUse this when the user wants to go back and edit a past version directly, without cloning it.No findings

    Why it is in this group

    • The name "open_version" says "open": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to go back and edit a past version directly, without cloning it. Refused for a version a batch was made from.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Edit a past version in place
  • rebuild_from_shelfUse this when the user asks what they can make with the materials they own, or wants a formula rebuilt using only their shelf: the app's Replace with materials I own, showing how t…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user asks what they can make with the materials they own, or wants a formula rebuilt using only their shelf: the app's Replace with materials I own, showing how the formula can stand entirely on the shelf (what stays, what a stand-in replaces, what has to go). Without apply it only shows the plan; with apply: true it rewrites the working copy in place (undo_last_change takes it back).

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Rebuild with materials you own
  • rename_versionUse this when the user wants to change a version's note or the number it carries.No findings

    Why it is in this group

    • The name "rename_version" says "rename": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to change a version's note or the number it carries.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Rename or renumber a version
  • restore_deletedUse this when the user wants something back from Recently deleted (deleted in the last 30 days).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user wants something back from Recently deleted (deleted in the last 30 days).

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Restore deleted items
  • resync_accordUse this when the source formula of an accord has changed and the user wants the accord line to follow: re-reads its composition, families and price as it is now, as the app's Re-s…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the source formula of an accord has changed and the user wants the accord line to follow: re-reads its composition, families and price as it is now, as the app's Re-sync does.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Re-sync an accord
  • save_versionUse this when the user wants to keep the current state of a formula as a named version in its evolution tree and carry on editing on a fresh copy.No findings

    Why it is in this group

    • The name "save_version" says "save": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to keep the current state of a formula as a named version in its evolution tree and carry on editing on a fresh copy.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Save a version to the tree
  • scale_to_concentrationUse this when the user wants to change a formula's concentration (for example from an eau de parfum to an eau de toilette) or its finished weight: the app's Scale sheet.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user wants to change a formula's concentration (for example from an eau de parfum to an eau de toilette) or its finished weight: the app's Scale sheet. The concentrate scales and the finishing alcohol makes up the rest, added from the catalog's perfumer's ethanol when there is none. Capped at the concentrate's own strength. In place.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Scale to a concentration
  • set_preferencesUse this when the user wants to change the account's currency symbol or its default low-stock warning (grams; 0 turns it off).No findings

    Why it is in this group

    • The name "set_preferences" says "set": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to change the account's currency symbol or its default low-stock warning (grams; 0 turns it off).

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Change account preferences
  • undo_last_changeUse this when the user wants to take back the last change made from the chat, to one formula or the last of any, from any chat.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user wants to take back the last change made from the chat, to one formula or the last of any, from any chat. Pass the exact changeId from a write result or this tool's preview. Without changeId this only previews the latest change and changes nothing. Reuse the SAME changeId after an error or retry: a completed undo is idempotent and never steps farther back. Only preview/select another ID when the user asks for another step (20 changes per formula,30 days). A concurrent edit aborts the whole restore; newer app work is not overwritten.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Undo the last change
  • update_bottleUse this when the user wants to record stock for a bottle (a weighed count, or grams bought or used, through the stock ledger) or change its price per gram, supplier, lot, low-stoc…No findings

    Why it is in this group

    • The name "update_bottle" says "update": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to record stock for a bottle (a weighed count, or grams bought or used, through the stock ledger) or change its price per gram, supplier, lot, low-stock warning, strength, solvent or notes, take it on or off the shelf, or make it the preferred bottle.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Update a bottle
  • update_formulaUse this when the user wants to rename a formula or change its description, bench notes, kind (perfume or accord), folder, favourite star, pin, target concentration, IFRA category …No findings

    Why it is in this group

    • The name "update_formula" says "update": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to rename a formula or change its description, bench notes, kind (perfume or accord), folder, favourite star, pin, target concentration, IFRA category or bottle size.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Rename, describe or file a formula
  • update_materialUse this when the user wants to change a material on their bench: their notes, odour description, families, note, impact, blotter hours, shelf life, synonyms, flash point or consti…No findings

    Why it is in this group

    • The name "update_material" says "update": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to change a material on their bench: their notes, odour description, families, note, impact, blotter hours, shelf life, synonyms, flash point or constituent breakdown; name and CAS only for their own materials.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Edit a material
  • use_substituteUse this when the user picks one of find_substitutes' suggestions: replaces the line with it (pass its member names), in place, with the app's own amounts, the same smell carried t…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Use this when the user picks one of find_substitutes' suggestions: replaces the line with it (pass its member names), in place, with the app's own amounts, the same smell carried through each bottle's dilution, merged into a line that already holds that bottle.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Swap in a stand-in
  • write_noteUse this when the user wants to create a notebook or change one: its title, body, appended text or pin.No findings

    Why it is in this group

    • The name "write_note" says "write": a word for a change.
    Description, as the server wrote it
    Use this when the user wants to create a notebook or change one: its title, body, appended text or pin.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: false
    • title: Write in a notebook
Only reads 15Claude Code: allow
  • find_starting_formulaUse this when the user wants to build, create, compose or formulate a perfume, fragrance or accord and needs a starting recipe (a rose, a citrus cologne, a clean musk, an amber), o…No findings

    Why it is in this group

    • The name "find_starting_formula" says "find": a word for reading.
    Description, as the server wrote it
    Use this when the user wants to build, create, compose or formulate a perfume, fragrance or accord and needs a starting recipe (a rose, a citrus cologne, a clean musk, an amber), or asks what they could make with materials they list. Matches the idea to PerfuMate's reference accords, the vetted recipes published at perfumate.app/accords, and returns the closest match with its percentages and grams for a batch, already checked against IFRA Category 4 at the concentration given (verdict, highest safe concentration, allergens to declare), plus a link that opens it in PerfuMate and a few alternatives. The ratios are the library's own; nothing is invented, and an idea no accord fits returns the list of available accords instead. Re-check any edited version with check_formula. Not for copying a named commercial perfume. Does not save anything.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Find a starting formula
  • find_substitutesUse this when the user lacks a material in a formula, or asks what they could use instead from the materials they own: the app's Find on shelf for one line, with single bottles and…No findings

    Why it is in this group

    • The name "find_substitutes" says "find": a word for reading.
    Description, as the server wrote it
    Use this when the user lacks a material in a formula, or asks what they could use instead from the materials they own: the app's Find on shelf for one line, with single bottles and two- or three-bottle blends from the shelf that can play that material's part, best first, with a match percent and what each carries or misses. Never offers an IFRA-prohibited material. Changes nothing; use_substitute swaps one in.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Find a stand-in on your shelf
  • get_formulaUse this when the user wants to see one of their formulas: every line with material, bottle strength, amount, relative and absolute percent, flags and notes, plus totals, concentra…No findings

    Why it is in this group

    • The name "get_formula" says "get": a word for reading.
    Description, as the server wrote it
    Use this when the user wants to see one of their formulas: every line with material, bottle strength, amount, relative and absolute percent, flags and notes, plus totals, concentration, cost and the note pyramid. Optionally adds an IFRA Category 4 and EU allergen check of it ("is my formula IFRA compliant"). Can read a past version by number or id.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Show one of your formulas
  • get_materialUse this when the user asks what one perfumery material smells like, how it is used, how strong or long-lasting it is, or how much of it IFRA allows (its Category 4 fine-fragrance …No findings

    Why it is in this group

    • The name "get_material" says "get": a word for reading.
    Description, as the server wrote it
    Use this when the user asks what one perfumery material smells like, how it is used, how strong or long-lasting it is, or how much of it IFRA allows (its Category 4 fine-fragrance limit, e.g. "how much Iso E Super can I use"). Returns the odour description, family, note, impact, blotter life, synonyms, whether IFRA restricts it and its limit, whether the EU prohibits it, and a link to start a formula with it. The limit is the regulatory ceiling in the finished product, not a recommended dose. Without an exact match it returns the closest catalog names. To check a whole formula use check_formula.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Show a perfumery material
  • get_scent_profileUse this when the user asks what a formula of theirs will smell like, how it evolves or how long it lasts, by PerfuMate's own scent model, exactly as the app's scent profile sheet …No findings

    Why it is in this group

    • The name "get_scent_profile" says "get": a word for reading.
    Description, as the server wrote it
    Use this when the user asks what a formula of theirs will smell like, how it evolves or how long it lasts, by PerfuMate's own scent model, exactly as the app's scent profile sheet shows it: families and sub-notes by weight and by perceived impact, the drydown at 0, 1, 4, 8 and 24 hours, the wear line (projection and longevity, e.g. "Bold · moderate wear") with its confidence, the genre, and the five-part note pyramid. Accords count by what they hold.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Scent profile of a formula
  • get_shelf_materialUse this when the user asks about one material they own: their notes, its bottles with recent stock movements, and the formulas that use it.No findings

    Why it is in this group

    • The name "get_shelf_material" says "get": a word for reading.
    Description, as the server wrote it
    Use this when the user asks about one material they own: their notes, its bottles with recent stock movements, and the formulas that use it.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Show one of your materials
  • list_batchesUse this when the user asks about batches they have made, all or one formula's, with their maceration journal and days resting.No findings

    Why it is in this group

    • The name "list_batches" says "list": a word for reading.
    Description, as the server wrote it
    Use this when the user asks about batches they have made, all or one formula's, with their maceration journal and days resting.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: List your batches
  • list_deletedUse this when the user wants to see what they deleted in the last 30 days and can still restore.No findings

    Why it is in this group

    • The name "list_deleted" says "list": a word for reading.
    Description, as the server wrote it
    Use this when the user wants to see what they deleted in the last 30 days and can still restore.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Recently deleted
  • list_formulasUse this when the user asks what formulas they have, wants to find one by name, folder or favourite, or before you read or change a formula (it returns the ids the other tools use)…No findings

    Why it is in this group

    • The name "list_formulas" says "list": a word for reading.
    Description, as the server wrote it
    Use this when the user asks what formulas they have, wants to find one by name, folder or favourite, or before you read or change a formula (it returns the ids the other tools use). Lists the formulas on the user's PerfuMate bench, pinned first then most recently edited, with folders. Locked formulas show their name only.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: List your formulas
  • list_notesUse this when the user asks to read their PerfuMate notebooks: titles and previews, or one notebook in full by id.No findings

    Why it is in this group

    • The name "list_notes" says "list": a word for reading.
    Description, as the server wrote it
    Use this when the user asks to read their PerfuMate notebooks: titles and previews, or one notebook in full by id.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Read your notebooks
  • list_shelfUse this when the user asks which materials they own, what is in stock or running low, or as the first step to suggest what they can make with their shelf.No findings

    Why it is in this group

    • The name "list_shelf" says "list": a word for reading.
    Description, as the server wrote it
    Use this when the user asks which materials they own, what is in stock or running low, or as the first step to suggest what they can make with their shelf. Lists the materials on the user's shelf, each with its bottles: strength, solvent, stock, price, supplier, lot and running low.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: List your shelf
  • list_shoppingUse this when the user asks what they need to buy: the Shopping cart's lists and their items (with list and category), and the materials running low.No findings

    Why it is in this group

    • The name "list_shopping" says "list": a word for reading.
    Description, as the server wrote it
    Use this when the user asks what they need to buy: the Shopping cart's lists and their items (with list and category), and the materials running low. Optionally one list only.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Your shopping cart
  • list_versionsUse this when the user asks about a formula's history: its version tree with notes and parents, which version is the working copy and which have batches.No findings

    Why it is in this group

    • The name "list_versions" says "list": a word for reading.
    Description, as the server wrote it
    Use this when the user asks about a formula's history: its version tree with notes and parents, which version is the working copy and which have batches.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: List a formula's versions
  • search_materialsUse this when the user wants to find perfumery materials by scent, family, name or CAS number, for example musks, woods or citrus to put in a formula, or the catalog name of a mate…No findings

    Why it is in this group

    • The name "search_materials" says "search": a word for reading.
    Description, as the server wrote it
    Use this when the user wants to find perfumery materials by scent, family, name or CAS number, for example musks, woods or citrus to put in a formula, or the catalog name of a material they typed loosely. Returns up to 10 catalog materials (aroma chemicals, essential oils, absolutes, bases) with CAS, family, note, impact, scent facets and a page link; a material IFRA prohibits or the EU bans is marked prohibited and ranked lower. For the full detail of one material use get_material; to check a whole formula use check_formula. Not for finished perfumes or shopping advice.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Search perfumery materials
  • view_accordUse this when the user asks what is inside an accord line of a formula: its materials at the dose it is used in, each with its share of the accord, read live from its source formul…No findings

    Why it is in this group

    • The name "view_accord" says "view": a word for reading.
    Description, as the server wrote it
    Use this when the user asks what is inside an accord line of a formula: its materials at the dose it is used in, each with its share of the accord, read live from its source formula, and whether it can be decomposed.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • idempotentHint: true
    • title: Show what an accord holds

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.1.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http perfumate https://perfumate.app/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__perfumate__search_materials",
      "mcp__perfumate__get_material",
      "mcp__perfumate__find_starting_formula",
      "mcp__perfumate__list_formulas",
      "mcp__perfumate__get_formula",
      "mcp__perfumate__list_versions",
      "mcp__perfumate__list_shelf",
      "mcp__perfumate__get_shelf_material",
      "mcp__perfumate__list_batches",
      "mcp__perfumate__list_notes",
      "mcp__perfumate__list_shopping",
      "mcp__perfumate__list_deleted",
      "mcp__perfumate__get_scent_profile",
      "mcp__perfumate__find_substitutes",
      "mcp__perfumate__view_accord"
    ],
    "ask": [
      "mcp__perfumate__check_formula",
      "mcp__perfumate__my_account",
      "mcp__perfumate__create_formula",
      "mcp__perfumate__edit_formula",
      "mcp__perfumate__update_formula",
      "mcp__perfumate__rename_folder",
      "mcp__perfumate__duplicate_formula",
      "mcp__perfumate__save_version",
      "mcp__perfumate__branch_version",
      "mcp__perfumate__open_version",
      "mcp__perfumate__rename_version",
      "mcp__perfumate__add_to_shelf",
      "mcp__perfumate__update_bottle",
      "mcp__perfumate__make_dilution",
      "mcp__perfumate__update_material",
      "mcp__perfumate__log_batch",
      "mcp__perfumate__journal_note",
      "mcp__perfumate__write_note",
      "mcp__perfumate__set_preferences",
      "mcp__perfumate__restore_deleted",
      "mcp__perfumate__undo_last_change",
      "mcp__perfumate__use_substitute",
      "mcp__perfumate__rebuild_from_shelf",
      "mcp__perfumate__insert_accord",
      "mcp__perfumate__decompose_accord",
      "mcp__perfumate__resync_accord",
      "mcp__perfumate__scale_to_concentration"
    ],
    "deny": [
      "mcp__perfumate__shopping_list",
      "mcp__perfumate__delete_items",
      "mcp__perfumate__confirm_delete"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as perfumate. Review it before you use it.