New to Claude Skills? Learn how to install them →

nousresearch on GitHub

Drug Discovery

Free

Streamline your pharmaceutical research and analysis.

Get this skill

Free · Opens the source repo

What Drug Discovery does

The Drug Discovery skill provides a comprehensive set of tools for pharmaceutical scientists and medicinal chemists engaged in drug discovery and cheminformatics. This skill allows users to access ChEMBL, the world's largest open bioactivity database, enabling efficient searches for bioactive compounds based on various criteria such as target, activity, or molecule name. Users can retrieve detailed bioactivity data, including pChEMBL values, for specific targets or molecules, facilitating informed decision-making in drug development.

In addition to compound searching, this skill includes drug-likeness calculations based on established oral bioavailability rules, specifically Lipinski's Rule of Five and Veber's rules. Users can assess the drug-likeness of any molecule without the need for additional software installations, streamlining the evaluation process for potential drug candidates.

Furthermore, the skill provides functionalities for drug interaction and safety lookups using the OpenFDA API. Users can quickly identify potential drug interactions and adverse events associated with specific medications, which is crucial for ensuring patient safety and effective therapeutic strategies. Lastly, the PubChem compound search feature allows users to retrieve essential information about compounds, including their IUPAC names and structural representations.

Overall, this skill is designed for researchers and professionals in the pharmaceutical and chemistry fields who require efficient access to drug discovery resources and tools for data analysis and validation.

When to use it

Use this skill when conducting pharmaceutical research, evaluating drug candidates, or analyzing drug interactions.

When not to use it

This skill may not be suitable for general programming tasks or when advanced cheminformatics tools are required beyond the provided functionalities.

What you can build with it

Searching for Bioactive Compounds

Use the ChEMBL search feature to find compounds related to specific biological targets, streamlining your research process.

Evaluating Drug-Likeness

Quickly assess the drug-likeness of potential candidates using Lipinski's and Veber's rules to ensure they meet oral bioavailability criteria.

Investigating Drug Interactions

Check for potential drug interactions and safety concerns using the OpenFDA API to enhance patient safety in clinical settings.

How to install Drug Discovery

View source

1. Install with the skills CLI

npx skills add nousresearch/hermes-agent/drug-discovery --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by nousresearch

Drug Discovery & Pharmaceutical Research

You are an expert pharmaceutical scientist and medicinal chemist with deep knowledge 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 compounds by target, activity, or molecule name. No API key required.

# Search compounds by target name (e.g. "EGFR", "COX-2", "ACE")
TARGET="$1"
ENCODED=$(python3 -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" \
  | python3 -c "
import json,sys
data=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()
"
# Get bioactivity data for a ChEMBL target ID
TARGET_ID="$1"   # e.g. CHEMBL203
curl -s "https://www.ebi.ac.uk/chembl/api/data/activity?target_chembl_id=${TARGET_ID}&pchembl_value__gte=6&limit=10&format=json" \
  | python3 -c "
import json,sys
data=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')}\")
"
# Look up a specific molecule by ChEMBL ID
MOL_ID="$1"   # e.g. CHEMBL25 (aspirin)
curl -s "https://www.ebi.ac.uk/chembl/api/data/molecule/${MOL_ID}?format=json" \
  | python3 -c "
import json,sys
m=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 using PubChem's free property API — no RDKit install needed.

COMPOUND="$1"
ENCODED=$(python3 -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" \
  | python3 -c "
import json,sys
data=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)

DRUG="$1"
ENCODED=$(python3 -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" \
  | python3 -c "
import json,sys
data=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()
"
DRUG="$1"
ENCODED=$(python3 -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" \
  | python3 -c "
import json,sys
data=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

COMPOUND="$1"
ENCODED=$(python3 -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" \
  | python3 -c "
import json,sys
p=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)

GENE="$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 } } } } } } } }\"}" \
  | python3 -c "
import json,sys
data=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, RotBonds
  2. Apply rule sets — Ro5 (Lipinski), Veber, Ghose filter where relevant
  3. Flag liabilities — metabolic hotspots, hERG risk, high TPSA for CNS penetration
  4. Suggest optimizations — bioisosteric replacements, prodrug strategies, ring truncation
  5. 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

TaskAPIEndpoint
Find targetChEMBL/api/data/target/search?q=
Get bioactivityChEMBL/api/data/activity?target_chembl_id=
Molecule propertiesPubChem/rest/pug/compound/name/{name}/property/
Drug interactionsOpenFDA/drug/label.json?search=drug_interactions:
Adverse eventsOpenFDA/drug/event.json?search=...&count=reaction
Gene-diseaseOpenTargetsGraphQL POST /api/v4/graphql

Frequently asked questions about Drug Discovery

Similar skills