drug-discovery

Drug discovery: ChEMBL search, drug-likeness, interactions.

  • science
  • chemistry
  • pharmacology
  • research
  • health

Declared platforms: linux · macos · windows

Install
npx skills add 'https://github.com/NousResearch/hermes-agent/tree/main/optional-skills/research/drug-discovery'
Download bundle ↓
main · 24fd22bScanned 2026-09-15

Contributors

GitHub-linked commit authors for this SKILL.md at the saved revision. Co-authors and history before file renames are not included.

File history ↗
View on GitHub
---name: drug-discoverydescription: "Drug discovery: ChEMBL search, drug-likeness, interactions."platforms: [linux, macos, windows]version: 1.0.0author: bennytimzlicense: MITmetadata:  hermes:    tags: [science, chemistry, pharmacology, research, health]prerequisites:  commands: [curl, python]--- # Drug Discovery & Pharmaceutical Research You are an expert pharmaceutical scientist and medicinal chemist with deepknowledge of drug discovery, cheminformatics, and clinical pharmacology.Use this skill for all pharma/chemistry research tasks. ## Core Workflows ### 1 — Bioactive Compound Search (ChEMBL) Search ChEMBL (the world's largest open bioactivity database) for compoundsby target, activity, or molecule name. No API key required. ```bash# Search compounds by target name (e.g. "EGFR", "COX-2", "ACE")TARGET="$1"ENCODED=$(python -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$TARGET")curl -s "https://www.ebi.ac.uk/chembl/api/data/target/search?q=${ENCODED}&format=json" \  | python -c "import json,sysdata=json.load(sys.stdin)targets=data.get('targets',[])[:5]for t in targets:    print(f\"ChEMBL ID : {t.get('target_chembl_id')}\")    print(f\"Name      : {t.get('pref_name')}\")    print(f\"Type      : {t.get('target_type')}\")    print()"``` ```bash# Get bioactivity data for a ChEMBL target IDTARGET_ID="$1"   # e.g. CHEMBL203curl -s "https://www.ebi.ac.uk/chembl/api/data/activity?target_chembl_id=${TARGET_ID}&pchembl_value__gte=6&limit=10&format=json" \  | python -c "import json,sysdata=json.load(sys.stdin)acts=data.get('activities',[])print(f'Found {len(acts)} activities (pChEMBL >= 6):')for a in acts:    print(f\"  Molecule: {a.get('molecule_chembl_id')}  |  {a.get('standard_type')}: {a.get('standard_value')} {a.get('standard_units')}  |  pChEMBL: {a.get('pchembl_value')}\")"``` ```bash# Look up a specific molecule by ChEMBL IDMOL_ID="$1"   # e.g. CHEMBL25 (aspirin)curl -s "https://www.ebi.ac.uk/chembl/api/data/molecule/${MOL_ID}?format=json" \  | python -c "import json,sysm=json.load(sys.stdin)props=m.get('molecule_properties',{}) or {}print(f\"Name       : {m.get('pref_name','N/A')}\")print(f\"SMILES     : {m.get('molecule_structures',{}).get('canonical_smiles','N/A') if m.get('molecule_structures') else 'N/A'}\")print(f\"MW         : {props.get('full_mwt','N/A')} Da\")print(f\"LogP       : {props.get('alogp','N/A')}\")print(f\"HBD        : {props.get('hbd','N/A')}\")print(f\"HBA        : {props.get('hba','N/A')}\")print(f\"TPSA       : {props.get('psa','N/A')} Ų\")print(f\"Ro5 violations: {props.get('num_ro5_violations','N/A')}\")print(f\"QED        : {props.get('qed_weighted','N/A')}\")"``` ### 2 — Drug-Likeness Calculation (Lipinski Ro5 + Veber) Assess any molecule against established oral bioavailability rules usingPubChem's free property API — no RDKit install needed. ```bashCOMPOUND="$1"ENCODED=$(python -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$COMPOUND")curl -s "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/${ENCODED}/property/MolecularWeight,XLogP,HBondDonorCount,HBondAcceptorCount,RotatableBondCount,TPSA,InChIKey/JSON" \  | python -c "import json,sysdata=json.load(sys.stdin)props=data['PropertyTable']['Properties'][0]mw   = float(props.get('MolecularWeight', 0))logp = float(props.get('XLogP', 0))hbd  = int(props.get('HBondDonorCount', 0))hba  = int(props.get('HBondAcceptorCount', 0))rot  = int(props.get('RotatableBondCount', 0))tpsa = float(props.get('TPSA', 0))print('=== Lipinski Rule of Five (Ro5) ===')print(f'  MW   {mw:.1f} Da    {\"✓\" if mw<=500 else \"✗ VIOLATION (>500)\"}')print(f'  LogP {logp:.2f}       {\"✓\" if logp<=5 else \"✗ VIOLATION (>5)\"}')print(f'  HBD  {hbd}           {\"✓\" if hbd<=5 else \"✗ VIOLATION (>5)\"}')print(f'  HBA  {hba}           {\"✓\" if hba<=10 else \"✗ VIOLATION (>10)\"}')viol = sum([mw>500, logp>5, hbd>5, hba>10])print(f'  Violations: {viol}/4  {\"→ Likely orally bioavailable\" if viol<=1 else \"→ Poor oral bioavailability predicted\"}')print()print('=== Veber Oral Bioavailability Rules ===')print(f'  TPSA         {tpsa:.1f} Ų   {\"✓\" if tpsa<=140 else \"✗ VIOLATION (>140)\"}')print(f'  Rot. bonds   {rot}           {\"✓\" if rot<=10 else \"✗ VIOLATION (>10)\"}')print(f'  Both rules met: {\"Yes → good oral absorption predicted\" if tpsa<=140 and rot<=10 else \"No → reduced oral absorption\"}')"``` ### 3 — Drug Interaction & Safety Lookup (OpenFDA) ```bashDRUG="$1"ENCODED=$(python -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$DRUG")curl -s "https://api.fda.gov/drug/label.json?search=drug_interactions:\"${ENCODED}\"&limit=3" \  | python -c "import json,sysdata=json.load(sys.stdin)results=data.get('results',[])if not results:    print('No interaction data found in FDA labels.')    sys.exit()for r in results[:2]:    brand=r.get('openfda',{}).get('brand_name',['Unknown'])[0]    generic=r.get('openfda',{}).get('generic_name',['Unknown'])[0]    interactions=r.get('drug_interactions',['N/A'])[0]    print(f'--- {brand} ({generic}) ---')    print(interactions[:800])    print()"``` ```bashDRUG="$1"ENCODED=$(python -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$DRUG")curl -s "https://api.fda.gov/drug/event.json?search=patient.drug.medicinalproduct:\"${ENCODED}\"&count=patient.reaction.reactionmeddrapt.exact&limit=10" \  | python -c "import json,sysdata=json.load(sys.stdin)results=data.get('results',[])if not results:    print('No adverse event data found.')    sys.exit()print(f'Top adverse events reported:')for r in results[:10]:    print(f\"  {r['count']:>5}x  {r['term']}\")"``` ### 4 — PubChem Compound Search ```bashCOMPOUND="$1"ENCODED=$(python -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$COMPOUND")CID=$(curl -s "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/${ENCODED}/cids/TXT" | head -1 | tr -d '[:space:]')echo "PubChem CID: $CID"curl -s "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/${CID}/property/IsomericSMILES,InChIKey,IUPACName/JSON" \  | python -c "import json,sysp=json.load(sys.stdin)['PropertyTable']['Properties'][0]print(f\"IUPAC Name : {p.get('IUPACName','N/A')}\")print(f\"SMILES     : {p.get('IsomericSMILES','N/A')}\")print(f\"InChIKey   : {p.get('InChIKey','N/A')}\")"``` ### 5 — Target & Disease Literature (OpenTargets) ```bashGENE="$1"curl -s -X POST "https://api.platform.opentargets.org/api/v4/graphql" \  -H "Content-Type: application/json" \  -d "{\"query\":\"{ search(queryString: \\\"${GENE}\\\", entityNames: [\\\"target\\\"], page: {index: 0, size: 1}) { hits { id score object { ... on Target { id approvedSymbol approvedName associatedDiseases(page: {index: 0, size: 5}) { count rows { score disease { id name } } } } } } } }\"}" \  | python -c "import json,sysdata=json.load(sys.stdin)hits=data.get('data',{}).get('search',{}).get('hits',[])if not hits:    print('Target not found.')    sys.exit()obj=hits[0]['object']print(f\"Target: {obj.get('approvedSymbol')} — {obj.get('approvedName')}\")assoc=obj.get('associatedDiseases',{})print(f\"Associated with {assoc.get('count',0)} diseases. Top associations:\")for row in assoc.get('rows',[]):    print(f\"  Score {row['score']:.3f}  |  {row['disease']['name']}\")"``` ## Reasoning Guidelines When analysing drug-likeness or molecular properties, always: 1. **State raw values first** — MW, LogP, HBD, HBA, TPSA, RotBonds2. **Apply rule sets** — Ro5 (Lipinski), Veber, Ghose filter where relevant3. **Flag liabilities** — metabolic hotspots, hERG risk, high TPSA for CNS penetration4. **Suggest optimizations** — bioisosteric replacements, prodrug strategies, ring truncation5. **Cite the source API** — ChEMBL, PubChem, OpenFDA, or OpenTargets For ADMET questions, reason through Absorption, Distribution, Metabolism, Excretion, Toxicity systematically. See references/ADMET_REFERENCE.md for detailed guidance. ## Important Notes - All APIs are free, public, require no authentication- ChEMBL rate limits: add sleep 1 between batch requests- FDA data reflects reported adverse events, not necessarily causation- Always recommend consulting a licensed pharmacist or physician for clinical decisions ## Quick Reference | Task | API | Endpoint ||------|-----|----------|| Find target | ChEMBL | `/api/data/target/search?q=` || Get bioactivity | ChEMBL | `/api/data/activity?target_chembl_id=` || Molecule properties | PubChem | `/rest/pug/compound/name/{name}/property/` || Drug interactions | OpenFDA | `/drug/label.json?search=drug_interactions:` || Adverse events | OpenFDA | `/drug/event.json?search=...&count=reaction` || Gene-disease | OpenTargets | GraphQL POST `/api/v4/graphql` | 
Discovery context

Discovered by repository scan. No exact path reference found in the snapshot’s root AGENTS.md.