plugin/skills/tooluniverse-small-molecule-discovery/SKILL.md
Small molecule identification, characterization, and procurement — PubChem, ChEMBL, BindingDB, ADMET-AI, SwissADME, eMolecules, Enamine. Covers compound name to structure to activity to ADMET properties to commercial sourcing. Use for chemical biology, lead identification, probe selection, and the full small-molecule discovery pipeline.
npx skillsauth add mims-harvard/tooluniverse tooluniverse-small-molecule-discoveryInstall 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.
Systematic small molecule identification, characterization, and sourcing using PubChem, ChEMBL, BindingDB, ADMET-AI, SwissADME, eMolecules, and Enamine. Covers the full pipeline from compound name to structure, activity, ADMET properties, and commercial procurement.
Drug-likeness is not a binary property. Lipinski's Rule of 5 was derived from orally administered, passively absorbed drugs and has many well-known exceptions: natural products, macrocycles, PROTACs, and many approved drugs violate one or more rules. The relevant question is not "does this pass Ro5?" but "does this compound's physicochemical profile match the requirements of the target, the intended route of administration, and the therapeutic context?" Focus on the specific requirements, not rigid rules.
PubChem_get_CID_by_compound_name and ChEMBL_search_molecules; do not assume IDs from memory.SwissADME_calculate_adme or ADMETAI_predict_* on the actual SMILES; do not estimate logP, TPSA, or bioavailability.ChEMBL_search_activities or BindingDB_get_ligands_by_uniprot; never cite IC50 values from memory.eMolecules_search or Enamine_search_catalog; do not assume availability.KEY PRINCIPLES:
When analysis requires computation (statistics, data processing, scoring, enrichment), write and run Python code via Bash. Don't describe what you would do — execute it and report actual results. Use ToolUniverse tools to retrieve data, then Python (pandas, scipy, statsmodels, matplotlib) to analyze it.
| Tool | Purpose | Key Params |
|------|---------|-----------|
| PubChem_get_CID_by_compound_name | Name to CID lookup | compound_name |
| PubChem_get_CID_by_SMILES | SMILES to CID lookup | smiles |
| PubChem_get_compound_properties_by_CID | MW, formula, SMILES, InChIKey | cid, properties |
| PubChem_search_compounds_by_similarity | Find structurally similar compounds | smiles, threshold (0-100) |
| PubChem_search_compounds_by_substructure | Substructure search | smiles |
| PubChem_get_compound_synonyms_by_CID | All names/synonyms | cid |
| ChEMBL_search_molecules | Search ChEMBL by name or ID | query |
| ChEMBL_get_molecule | Full ChEMBL molecule record | chembl_id |
| ChEMBL_search_similar_molecules | Similarity search in ChEMBL | query (SMILES or ChEMBL ID) |
| ChEMBL_search_activities | Binding affinities and assay data | molecule_chembl_id, target_chembl_id, pchembl_value__gte |
| ChEMBL_get_drug_mechanisms | MOA for approved drugs | drug_chembl_id or drug_name |
| ChEMBL_search_targets | Find targets by name | query, organism |
| ChEMBL_get_target_activities | All ligands for a target | target_chembl_id |
| SwissADME_calculate_adme | Physicochemical + ADMET properties | operation="calculate_adme", smiles |
| SwissADME_check_druglikeness | Lipinski, Veber, Egan rules | operation="check_druglikeness", smiles |
| ADMETAI_predict_physicochemical_properties | MW, logP, TPSA, HBD/HBA | smiles (list) |
| ADMETAI_predict_bioavailability | Oral bioavailability prediction | smiles (list) |
| ADMETAI_predict_BBB_penetrance | Blood-brain barrier permeability | smiles (list) |
| ADMETAI_predict_toxicity | hERG, DILI, mutagenicity | smiles (list) |
| ADMETAI_predict_CYP_interactions | CYP450 inhibition/substrate | smiles (list) |
| SwissTargetPrediction_predict | Predict protein targets for compound | operation="predict", smiles |
| eMolecules_search | Find commercially available compounds | query (name or keyword) |
| eMolecules_search_smiles | Structure-based commercial search | smiles |
| eMolecules_get_vendors | Find vendors for a specific compound | compound_id |
| Enamine_search_catalog | Search Enamine screening library | query |
| Enamine_search_smiles | Search Enamine by structure | smiles |
| Enamine_get_libraries | List Enamine compound libraries | (none required) |
# Step 1: Name -> CID (PubChem canonical identity)
PubChem_get_CID_by_compound_name(compound_name="imatinib")
# -> CID: 5291
# Step 2: Get SMILES and properties (needed for all downstream tools)
PubChem_get_compound_properties_by_CID(
cid="5291",
properties="MolecularFormula,MolecularWeight,CanonicalSMILES,InChIKey,IUPACName"
)
# -> canonical SMILES, InChIKey (global identifier)
# Step 3: Get ChEMBL ID (for activity data)
ChEMBL_search_molecules(query="imatinib")
# -> ChEMBL ID (e.g., "CHEMBL941")
# Step 4: Get all synonyms (brand names, INN, etc.)
PubChem_get_compound_synonyms_by_CID(cid="5291")
ID resolution priority:
Similarity search (find analogs):
PubChem_search_compounds_by_similarity(
smiles="CANONICAL_SMILES",
threshold=85 # Tanimoto threshold 0-100; 85 = highly similar
)
# Returns: list of CIDs of similar compounds
ChEMBL_search_similar_molecules(query="CHEMBL941") # Or SMILES
# Returns: ChEMBL entries sorted by similarity
Substructure search (find compounds containing a scaffold):
PubChem_search_compounds_by_substructure(smiles="SCAFFOLD_SMILES")
# Returns: CIDs of compounds containing the scaffold
Get all activities for a compound (across all targets):
ChEMBL_search_activities(
molecule_chembl_id="CHEMBL941",
pchembl_value__gte=6, # pIC50/Ki >= 6 = IC50/Ki <= 1 µM
limit=50
)
# Returns: assay_type, target_name, pchembl_value, units
Get all ligands for a target:
# First find target ChEMBL ID
ChEMBL_search_targets(query="EGFR", organism="Homo sapiens")
# -> target_chembl_id, e.g., "CHEMBL203"
ChEMBL_get_target_activities(
target_chembl_id="CHEMBL203"
)
# Returns: all compounds with binding data against this target
BindingDB (when available — often times out):
BindingDB_get_ligands_by_uniprot(uniprot_id="P00533") # EGFR
# Returns: Ki, IC50, Kd data with literature references
# Note: BindingDB REST API is frequently unavailable; fall back to ChEMBL
pChEMBL Value interpretation: | pChEMBL | IC50 / Ki | Affinity | |---------|-----------|---------| | >= 9 | <= 1 nM | Very potent | | >= 7 | <= 100 nM | Potent | | >= 6 | <= 1 µM | Moderate | | >= 5 | <= 10 µM | Weak | | < 5 | > 10 µM | Inactive |
SwissADME (comprehensive, requires SMILES string — not list):
SwissADME_calculate_adme(
operation="calculate_adme",
smiles="CANONICAL_SMILES"
)
# Returns: physicochemical, lipophilicity, water solubility, pharmacokinetics,
# drug-likeness scores (Lipinski, Veber, Egan, Muegge), PAINS alerts
SwissADME_check_druglikeness(
operation="check_druglikeness",
smiles="CANONICAL_SMILES"
)
# Returns: Lipinski/Veber/Egan pass/fail + lead-likeness
ADMET-AI (ML-based, requires SMILES as list — install tooluniverse[ml]):
ADMETAI_predict_physicochemical_properties(smiles=["CANONICAL_SMILES"])
ADMETAI_predict_bioavailability(smiles=["CANONICAL_SMILES"])
ADMETAI_predict_BBB_penetrance(smiles=["CANONICAL_SMILES"])
ADMETAI_predict_toxicity(smiles=["CANONICAL_SMILES"])
ADMETAI_predict_CYP_interactions(smiles=["CANONICAL_SMILES"])
Note: ADMET-AI requires pip install tooluniverse[ml]. If unavailable, use SwissADME as fallback.
Key drug-likeness rules:
When you have a novel compound and want to predict targets:
SwissTargetPrediction_predict(
operation="predict",
smiles="CANONICAL_SMILES"
)
# Returns: predicted protein targets with probability scores
# Note: SwissTargetPrediction uses structure-similarity to known drug-target pairs
# May time out for complex molecules
eMolecules (aggregates 200+ suppliers — returns search URL, not direct data):
eMolecules_search(query="compound_name")
# -> Returns search_url to visit on eMolecules.com
eMolecules_search_smiles(smiles="CANONICAL_SMILES")
# -> Returns URL for exact/similar structure search
Enamine (37B+ make-on-demand compounds — returns URL when API unavailable):
Enamine_search_catalog(query="compound_name")
# -> If API available: returns catalog entries with catalog_id, price
# -> If API unavailable: returns search_url for manual search
Enamine_search_smiles(smiles="CANONICAL_SMILES")
# -> Exact or similarity structure search
Enamine_get_libraries()
# -> Lists available Enamine screening collections
Note: eMolecules and Enamine APIs frequently return search URLs rather than live data. Present these to the user as "search here" links.
| Tool | Required Params | Notes |
|------|----------------|-------|
| PubChem_get_CID_by_compound_name | compound_name | Returns list of CIDs; take first or most relevant |
| PubChem_get_CID_by_SMILES | smiles | Use canonical SMILES |
| PubChem_get_compound_properties_by_CID | cid, properties | cid as string; properties comma-separated |
| PubChem_search_compounds_by_similarity | smiles | threshold (int 0-100, default 90) |
| PubChem_search_compounds_by_substructure | smiles | Returns CIDs matching scaffold |
| ChEMBL_search_molecules | query | Name, ChEMBL ID, or InChIKey |
| ChEMBL_get_molecule | chembl_id | Full format: "CHEMBL941" not "941" |
| ChEMBL_search_similar_molecules | query | SMILES or ChEMBL ID |
| ChEMBL_search_activities | molecule_chembl_id OR target_chembl_id | Use pchembl_value__gte=6 to filter potent |
| ChEMBL_get_drug_mechanisms | drug_chembl_id or drug_name | For approved drugs only |
| ChEMBL_search_targets | query | Add organism="Homo sapiens" to filter human |
| ChEMBL_get_target_activities | target_chembl_id | Returns all ligands for target |
| SwissADME_calculate_adme | operation="calculate_adme", smiles | SMILES as string (not list) |
| SwissADME_check_druglikeness | operation="check_druglikeness", smiles | SMILES as string |
| ADMETAI_predict_* | smiles | Must be a list: ["SMILES"] not "SMILES" |
| SwissTargetPrediction_predict | operation="predict", smiles | May time out |
| eMolecules_search | query | Returns search URL (no live data) |
| eMolecules_search_smiles | smiles | Canonical SMILES |
| eMolecules_get_vendors | compound_id | eMolecules internal ID |
| Enamine_search_catalog | query | Returns URL when API unavailable |
| Enamine_search_smiles | smiles | search_type: "exact", "similarity", "substructure" |
| Enamine_get_compound | enamine_id | Enamine-specific catalog ID |
| BindingDB_get_ligands_by_uniprot | uniprot_id | Frequently unavailable — use ChEMBL as fallback |
| BindingDB_get_targets_by_compound | smiles | SMILES-based target lookup |
Input: Compound name (e.g., "imatinib")
Flow:
1. PubChem_get_CID_by_compound_name -> CID + SMILES
2. ChEMBL_search_molecules -> ChEMBL ID
3. PubChem_get_compound_properties_by_CID -> physicochemical props
4. SwissADME_calculate_adme / ADMETAI_predict_* -> ADMET profile
5. ChEMBL_search_activities(molecule_chembl_id) -> binding data
6. ChEMBL_get_drug_mechanisms -> MOA (if approved drug)
Output: Complete compound profile with identity, ADMET, and activity data
Input: Reference compound SMILES
Flow:
1. PubChem_search_compounds_by_similarity(smiles, threshold=85) -> similar CIDs
2. ChEMBL_search_similar_molecules(query=smiles) -> ChEMBL analogs
3. For each hit: PubChem_get_compound_properties_by_CID -> properties
4. SwissADME_check_druglikeness -> filter by drug-likeness
Output: Ranked list of analogs with activity data and drug-likeness scores
Input: Target name (e.g., "EGFR")
Flow:
1. ChEMBL_search_targets(query="EGFR", organism="Homo sapiens") -> target_chembl_id
2. ChEMBL_get_target_activities(target_chembl_id) -> all ligands with Ki/IC50
3. Filter by pchembl_value >= 7 (potent compounds)
4. For top hits: SwissADME_check_druglikeness -> assess drug-likeness
5. eMolecules_search(query=compound_name) -> check commercial availability
Output: Prioritized list of potent, drug-like, commercially available compounds
Input: Novel compound SMILES
Flow:
1. SwissADME_calculate_adme(operation="calculate_adme", smiles) -> full ADMET
2. ADMETAI_predict_toxicity(smiles=[smiles]) -> hERG, DILI, mutagenicity
3. ADMETAI_predict_CYP_interactions(smiles=[smiles]) -> drug-drug interaction risk
4. ADMETAI_predict_BBB_penetrance(smiles=[smiles]) -> CNS penetration
Output: ADMET risk profile with flagged liabilities
| Primary | Fallback | When |
|---------|----------|------|
| BindingDB_get_ligands_by_uniprot | ChEMBL_get_target_activities | BindingDB API unavailable |
| ADMETAI_predict_* | SwissADME_calculate_adme | ml dependencies not installed |
| Enamine_search_catalog | Returns URL only | API returns HTTP 500 (common) |
| SwissTargetPrediction_predict | ChEMBL_search_similar_molecules + known targets | Prediction times out |
| PubChem_get_CID_by_compound_name | ChEMBL_search_molecules(query=name) | Name not in PubChem |
pip install tooluniverse[ml]; not always available in base install["SMILES"]; SwissADME requires a string "SMILES""CHEMBL941", never just "941"tools
Post-market safety surveillance and recall/adverse-event RETRIEVAL across the full spectrum of FDA-regulated products that are NOT covered by the drug-AE signal skills: medical devices, food / dietary supplements / cosmetics, veterinary drugs, and drug supply (shortages). Orchestrates openFDA endpoints (MAUDE device adverse events + device recalls + 510(k), CAERS food/supplement/ cosmetic adverse events, veterinary adverse events, drug shortages, and cross-product enforcement/recall reports). USE WHEN the user asks: "are there adverse events for [device / pacemaker / infusion pump / insulin pump]", "device recalls for [firm/product]", "supplement / vitamin / cosmetic adverse reactions", "is [drug] in shortage", "what injectables are on shortage", "veterinary / animal adverse events for [drug] in [dog/cat/horse]", "food recall for listeria", "MAUDE report for [device]", "CAERS reactions for [brand]". DO NOT USE for drug adverse-event SIGNAL detection or disproportionality (PRR / ROR / IC) or drug-AE association scoring — that is `tooluniverse-pharmacovigilance` / `tooluniverse-adverse-event-detection`. This skill is multi-product surveillance and retrieval, not drug-AE statistical signal mining.
tools
--- name: tooluniverse-phewas description: Cross-ancestry / cross-biobank phenome-wide association (PheWAS) and replication. Given ONE variant (rsID) or ONE gene, look up every phenotype it associates with across European/UK (UKB-TOPMed), Finnish (FinnGen), Japanese (BioBank Japan), and Taiwanese (TPMI) biobanks, plus exome-wide gene-burden PheWAS (Genebass), then judge whether an association replicates across ancestries or is population-specific. Use whenever the user asks "what else is this va
tools
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).
tools
Genome-ASSEMBLY discovery, QC, and replicon mapping for any organism (bacteria, archaea, fungi, and beyond) using NCBI Datasets. Resolves an organism name or taxid to assemblies, picks the reference/representative or best-quality assembly, pulls assembly QC metrics (total length, contig/scaffold N50, contig count, GC%, assembly level, RefSeq category), enumerates chromosomes and plasmids via per-replicon sequence reports, and compares candidate assemblies on quality. Use for "what genomes are available for [organism]", "assembly stats / N50 / GC content for [GCF_/GCA_ accession]", "how many plasmids does [strain] have", "compare assemblies for [species]", "find the reference genome for [taxon]", "is this assembly Complete Genome or just contigs". NOT for gene-level orthology/synteny (use tooluniverse-comparative-genomics), plant gene structure (use tooluniverse-plant-genomics), de novo assembly from raw reads (no tool exists), or taxonomy-only name/lineage lookups.