plugin/skills/tooluniverse-natural-product-dereplication/SKILL.md
Dereplicate a putative natural product and assign its chemical taxonomy. Use to answer "is [compound] a known natural product", "what microbe/organism produces [compound]", "what chemical class is [compound]", "dereplicate this metabolite (by formula/exact mass/InChIKey/SMILES)", or "classify this molecule into ChemOnt". Searches NPAtlas for known microbial natural products (producing organism + literature reference), assigns the ChemOnt kingdom→superclass→class→subclass hierarchy via ClassyFire, resolves systematic IUPAC names to structure via OPSIN, and cross-references identity in PubChem. NOT for general drug/compound identity or ADMET (use tooluniverse-chemical-compound-retrieval / tooluniverse-small-molecule-discovery) and NOT for metabolomics pathway/enrichment analysis (use tooluniverse-metabolomics skills).
npx skillsauth add mims-harvard/tooluniverse tooluniverse-natural-product-dereplicationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Decide whether a putative natural product is already known, identify the microbe that produces it, attach the literature reference, and assign its ChemOnt chemical class. This is the dereplication question every NP chemist and metabolomics analyst asks of a new feature: "have we seen this before, and what makes it?"
LOOK UP DON'T GUESS: Never assume an NPAID, producing organism, exact mass, or chemical class. Every identity, provenance, and taxonomy claim must come from a live tool call.
Scope (microbial NPs only): NPAtlas covers natural products from bacteria and fungi. It does NOT cover plant, animal, or marine-invertebrate metabolites unless a microbial producer was reported. A "no NPAtlas hit" therefore means not a known microbial NP — it does not prove the molecule is novel in an absolute sense.
| Tool | Input | Returns |
|------|-------|---------|
| NPAtlas_search_compounds | name / inchikey / formula / smiles, limit | list of {npaid, name, molecular_formula, molecular_weight, exact_mass, inchikey, smiles}. (origin_organism is null here — fetch the full record for provenance) |
| NPAtlas_get_compound | npaid (e.g. NPA014588) | full record incl. origin_organism (producing microbe + taxonomic lineage) and origin_reference (title/doi/journal/year) |
| ClassyFire_classify_by_inchikey | inchikey (full 27-char) | ChemOnt kingdom→superclass→class→subclass→direct_parent, molecular_framework, substituents. classified:false if not in cache |
| OPSIN_name_to_structure | name (systematic IUPAC) | smiles / inchi / inchikey. parsed:false for trade/trivial names |
| PubChem_get_CID_by_compound_name | name | {IdentifierList:{CID:[...]}} |
| PubChem_get_compound_properties_by_CID | cid, properties (e.g. ["MolecularFormula","MolecularWeight","InChIKey","IUPACName"]) | property table — use to obtain an InChIKey for arbitrary compounds |
Phase 0: Classify input — name / formula / exact mass / InChIKey / SMILES?
Phase 1: Obtain an InChIKey (the universal key for ClassyFire & precise NPAtlas match)
Phase 2: Dereplicate against NPAtlas (known microbial NP? which organism? which paper?)
Phase 3: Assign ChemOnt chemical class via ClassyFire
Phase 4: Cross-reference identity in PubChem
Phase 5: Report — known/novel call + provenance + class hierarchy + interpretation note
XXXXXXXXXXXXXX-XXXXXXXXXX-X) → skip to Phase 2; it is already the universal key.NPAtlas_search_compounds(smiles=...); also feed to PubChem for an InChIKey.2-acetyloxybenzoic acid) → Phase 1 via OPSIN.staurosporine, penicillin) → Phase 1 via PubChem (OPSIN will return parsed:false for these).# Systematic IUPAC name → structure (OPSIN). parsed:false ⇒ fall through to PubChem.
op = tu.tools.OPSIN_name_to_structure(name="2-acetyloxybenzoic acid")
inchikey = op["data"]["inchikey"] # only if op["data"]["parsed"]
# Trivial/common name → PubChem CID → properties (incl. InChIKey)
cid = tu.tools.PubChem_get_CID_by_compound_name(name="staurosporine")["data"]["IdentifierList"]["CID"][0]
props = tu.tools.PubChem_get_compound_properties_by_CID(
cid=cid, properties=["MolecularFormula","MolecularWeight","InChIKey","IUPACName"])
inchikey = props["data"]["PropertyTable"]["Properties"][0]["InChIKey"]
The InChIKey is what makes dereplication exact: an InChIKey match is a structure match; a name match is not (synonyms, analogs, and salts share names).
Search by the most specific key available. Prefer InChIKey (exact structure), then formula (catches isomers — useful for an MS feature with only a formula), then name (loosest — returns analogs).
# Exact, structure-level
hits = tu.tools.NPAtlas_search_compounds(inchikey="HKSZLNNOFSGOKW-FYTWVXJKSA-N", limit=5)
# MS-feature style (formula or exact mass) — expect multiple isomeric hits
hits = tu.tools.NPAtlas_search_compounds(formula="C28H26N4O3", limit=10)
For each candidate NPAID, fetch the full record to get the producing organism and reference (search results carry origin_organism: null):
rec = tu.tools.NPAtlas_get_compound(npaid="NPA014588")["data"]
organism = rec["origin_organism"]["name"] # e.g. "Streptomyces"
lineage = rec["origin_organism"]["ancestors"] # domain→...→family
reference = rec["origin_reference"] # title, doi, journal, year
cf = tu.tools.ClassyFire_classify_by_inchikey(inchikey=inchikey)["data"]
# cf["kingdom"], cf["superclass"], cf["class"], cf["subclass"], cf["direct_parent"]
# cf["molecular_framework"], cf["substituents"]
If classified:false, the InChIKey is not in the ClassyFire cache — report the class as unavailable (do not invent one). A correct InChIKey is required; a wrong stereo/protonation layer will miss the cache.
Confirm the same molecule exists in PubChem (CID, IUPAC name, formula, MW) so the identity is anchored to a second independent database. Disagreement in molecular formula between NPAtlas and PubChem is a red flag that the name/structure resolution went astray.
Deliver:
C28H26N4O3, 466.2005 Da, returns both staurosporine and an ardeemin derivative). Treat these as a ranked candidate list, not an identification — confirm with InChIKey, MS/MS, or NMR before claiming identity.classified:false = ChemOnt has no cached classification for that exact InChIKey (often because the InChIKey's stereo/charge layer differs from the cached entry, or the compound is new). Report class as unavailable rather than guessing.parsed:false = the name was not systematic IUPAC (trade/trivial name); route to PubChem for an InChIKey instead.Input: staurosporine (a trivial name).
name=staurosporine → parsed:false (not systematic IUPAC) → fall through to PubChem.44259; properties → MolecularFormula C28H26N4O3, MW 466.5, InChIKey HKSZLNNOFSGOKW-FYTWVXJKSA-N.inchikey=HKSZLNNOFSGOKW-FYTWVXJKSA-N → 1 exact hit: NPA014588 Staurosporine, exact_mass 466.2005. → Known microbial NP.get_compound NPA014588 → producing organism Streptomyces (genus; lineage Bacteria → Actinobacteria → Actinobacteria → Streptomycetales → Streptomycetaceae); reference "X-Ray crystal structure of staurosporine: a new alkaloid from a Streptomyces…", DOI 10.1039/C39780000800, 1978.inchikey=HKSZLNNOFSGOKW-FYTWVXJKSA-N → Organic compounds → Organoheterocyclic compounds → Indoles and derivatives → Carbazoles → direct parent Indolocarbazoles; molecular framework: aromatic heteropolycyclic.Call: Known microbial natural product (NPA014588), an indolocarbazole alkaloid produced by Streptomyces, first reported 1978.
Dereplication-logic footnote: the formula C28H26N4O3 (exact mass 466.2005) alone is not unique — NPAtlas formula search returns 2 isomers (staurosporine and 5-N-acetyl-15b-didehydroardeemin). The InChIKey is what pins the identity to staurosporine specifically. An MS feature with only this formula would need MS/MS or NMR to choose between the isomers.
Input IUPAC 2-acetyloxybenzoic acid.
parsed:true, InChIKey BSYNRYMUTXBXSQ-UHFFFAOYSA-N.inchikey=BSYNRYMUTXBXSQ-... → no microbial NP record ⇒ not a known microbial natural product (it is a semisynthetic drug — consistent with NPAtlas scope).Call: Classified into ChemOnt (acylsalicylic acid), but no NPAtlas microbial-NP provenance — illustrating a legitimate "no hit" that is not a novel NP.
classified:false means "not cached for this exact InChIKey", not "unclassifiable". Wrong stereo/charge layers miss the cache.parsed:false; route them through PubChem.origin_organism: null; provenance requires the NPAtlas_get_compound full record.classified:false.tools
Generate the success criteria for a task or question, then review work against them. Given a task, goal, or open-ended question, decompose it into scenarios, evaluation perspectives, and fine-grained weighted YES/NO criteria using the Recursive Expansion Tree (RET) method; if work is supplied, score it criterion-by-criterion and surface what is missing or could be better. Use when asked to self-review or check your own work, judge whether a task is done well or completely, build a definition-of-done or completeness checklist, create an evaluation rubric or grading criteria, score or grade answers to a question, set up an LLM-as-judge rubric, or when the user mentions self-review, completeness check, success criteria, evaluation criteria, scoring rubric, Qworld, or the RET algorithm.
tools
Find the real protein target(s) of a peptide from its sequence — peptide target deorphanization / off-target identification, for ANY target class (GPCR, ion channel, protease, cytokine/growth-factor receptor, enzyme, integrin), not only GPCRs. Use when a peptide has a phenotype but does not bind its hypothesized target, when a peptide binds a target in one species or assay but not another, or to screen candidate targets for an orphan peptide. A target-class router steers a multi-route keyless pipeline (PROSITE/ELM motif, BLAST homology, HGNC/InterPro/GPCRdb/GtoPdb target-family enumeration, OpenTargets phenotype anchor, EnsemblCompara/Alliance cross-species reconciliation) plus optional NVIDIA-NIM co-folding (Boltz2, AlphaFold2-Multimer, OpenFold3) for structural confirmation.
tools
Install or update ToolUniverse in Claude Science — create the conda env, install the tooluniverse pip package, and (re)build the tooluniverse-research skill by fetching the current workflow library from GitHub. Use for first-time setup, upgrading the ToolUniverse version, refreshing the bundled workflows after an upstream release, or reinstalling on a new machine.
tools
Install, set up, verify, update, pin, uninstall, or troubleshoot the ToolUniverse plugin on OpenAI Codex. ALWAYS consult this skill for any of those — don't answer from memory, because the exact marketplace name (mims-harvard/ToolUniverse), the "codex plugin marketplace add" then "codex plugin add -m tooluniverse" flow, Codex's startup auto-upgrade behavior, the uvx tooluniverse MCP server, and the API-key env vars are easy to get wrong. Use it whenever someone wants to get ToolUniverse (or "the 1000+ scientific tools" / "the harvard tools") working on Codex, says the Codex plugin or its tools/skills won't load, hits a uvx or MCP-server startup error, asks how Codex updates it, wants to pin or remove it, or finds it running an old tool version — even if they never say the word "plugin". Not for the Claude Code plugin (use tooluniverse-claude-code-plugin), for running research with the tools, or for authoring new tools or skills.