Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Multi-agent system for automated drug discovery pipelines
.claude/skills/brycewang-stanford-madd-drug-discovery-guide/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -21% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -46% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -45% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -37% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -47% | 0% |
MADD (Multi-Agent Drug Discovery) is a multi-agent system that automates key stages of the drug discovery pipeline — target identification, molecule generation, property prediction (ADMET), docking simulation, and lead optimization. Specialized agents collaborate to propose, evaluate, and refine drug candidates, reducing the manual effort in early-stage drug discovery research.
Target Protein
↓
Target Analysis Agent (binding site, druggability)
↓
Molecule Generation Agent (de novo design)
↓
Property Prediction Agent (ADMET screening)
↓
Docking Agent (binding affinity estimation)
↓
Optimization Agent (lead optimization cycle)
↓
Report Agent (candidate ranking + rationale)pythonfrom madd import DrugDiscoveryPipeline pipeline = DrugDiscoveryPipeline( llm_provider="anthropic", tools=["rdkit", "autodock_vina", "admet_predictor"], ) # Run discovery pipeline results = pipeline.discover( target_protein="6LU7", # PDB ID (SARS-CoV-2 Mpro) target_site="active_site", constraints={ "molecular_weight": (200, 500), # Lipinski "logP": (-0.4, 5.6), "hbd": (0, 5), "hba": (0, 10), "tpsa": (0, 140), }, num_candidates=100, optimization_rounds=3, ) # Top candidates for i, mol in enumerate(results.top_candidates[:5]): print(f"\nCandidate {i+1}: {mol.smiles}") print(f" Docking score: {mol.docking_score:.2f} kcal/mol") print(f" QED: {mol.qed:.3f}") print(f" Synthetic accessibility: {mol.sa_score:.2f}") print(f" ADMET: {mol.admet_summary}")
pythonfrom madd.agents import ADMETAgent admet = ADMETAgent() # Predict ADMET properties for a molecule props = admet.predict("CC(=O)Oc1ccccc1C(=O)O") # Aspirin print(f"Absorption: {props.absorption}") print(f"Distribution: {props.distribution}") print(f"Metabolism: {props.metabolism}") print(f"Excretion: {props.excretion}") print(f"Toxicity: {props.toxicity}") print(f"BBB penetration: {props.bbb_penetration}") print(f"CYP inhibition: {props.cyp_inhibition}") print(f"hERG liability: {props.herg_risk}")
pythonfrom madd.agents import MolGenAgent gen = MolGenAgent(method="reinforcement_learning") # Generate molecules targeting a binding site molecules = gen.generate( target_pdb="6LU7", binding_site="active_site", num_molecules=500, diversity_threshold=0.5, # Tanimoto diversity constraints={ "drug_likeness": True, # Lipinski + Veber "novelty": True, # Not in ChEMBL }, ) print(f"Generated: {len(molecules)}") print(f"Drug-like: {sum(1 for m in molecules if m.is_drug_like)}") print(f"Novel: {sum(1 for m in molecules if m.is_novel)}")
pythonfrom madd.agents import OptimizationAgent optimizer = OptimizationAgent() # Optimize a lead compound optimized = optimizer.optimize( lead_smiles="c1ccc(-c2ncc(F)c(N)n2)cc1", objectives=[ ("docking_score", "minimize"), ("qed", "maximize"), ("sa_score", "minimize"), ("solubility", "maximize"), ], num_iterations=50, keep_scaffold=True, # Maintain core structure ) for mol in optimized.pareto_front[:5]: print(f"SMILES: {mol.smiles}") print(f" Docking: {mol.docking_score:.2f}") print(f" QED: {mol.qed:.3f}")
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 24,132 | 12,877 | -47% | 1 | 1 | 0% | 4,665 | 3,692 | -21% | 0 | 0 | — |
case-02 | fail→pass | 23,454 | 6,019 | -74% | 1 | 1 | 0% | 4,401 | 2,370 | -46% | 0 | 0 | — |
case-03 | fail→pass | 32,311 | 9,725 | -70% | 1 | 1 | 0% | 5,457 | 2,976 | -45% | 0 | 0 | — |
case-04 | fail→pass | 23,465 | 8,319 | -65% | 1 | 1 | 0% | 4,386 | 2,764 | -37% | 0 | 0 | — |
case-05 | fail→pass | 23,907 | 4,077 | -83% | 1 | 1 | 0% | 3,540 | 1,873 | -47% | 0 | 0 | — |
case-06 | fail→pass | 19,574 | 4,105 | -79% | 1 | 1 | 0% | 3,039 | 1,991 | -34% | 0 | 0 | — |
case-07 | pass→pass | 10,975 | 4,726 | -57% | 1 | 1 | 0% | 1,825 | 2,182 | +20% | 0 | 0 | — |
case-08 | fail→pass | 24,504 | 4,302 | -82% | 1 | 1 | 0% | 1,535 | 2,018 | +31% | 0 | 0 | — |
case-09 | fail→pass | 18,251 | 6,122 | -66% | 1 | 1 | 0% | 3,207 | 2,380 | -26% | 0 | 0 | — |
case-10 | fail→pass | 12,549 | 2,500 | -80% | 1 | 1 | 0% | 2,088 | 1,647 | -21% | 0 | 0 | — |
case-11 | pass→pass | 15,126 | 2,412 | -84% | 1 | 1 | 0% | 2,699 | 1,570 | -42% | 0 | 0 | — |
case-12 | fail→pass | 11,944 | 2,574 | -78% | 1 | 1 | 0% | 1,728 | 1,631 | -6% | 0 | 0 | — |
case-13 | fail→pass | 15,352 | 2,863 | -81% | 1 | 1 | 0% | 2,226 | 1,719 | -23% | 0 | 0 | — |
case-14 | pass→pass | 17,798 | 5,070 | -72% | 1 | 1 | 0% | 2,390 | 2,079 | -13% | 0 | 0 | — |
case-15 | pass→pass | 11,948 | 2,505 | -79% | 1 | 1 | 0% | 1,887 | 1,609 | -15% | 0 | 0 | — |
case-16 | fail→pass | 9,368 | 3,675 | -61% | 1 | 1 | 0% | 1,323 | 1,782 | +35% | 0 | 0 | — |
case-17 | fail→pass | 12,089 | 2,440 | -80% | 1 | 1 | 0% | 2,118 | 1,659 | -22% | 0 | 0 | — |
case-18 | fail→pass | 17,258 | 2,726 | -84% | 1 | 1 | 0% | 2,856 | 1,715 | -40% | 0 | 0 | — |
case-19 | fail→pass | 18,964 | 2,985 | -84% | 1 | 1 | 0% | 2,897 | 1,708 | -41% | 0 | 0 | — |
case-20 | pass→pass | 10,292 | 2,533 | -75% | 1 | 1 | 0% | 1,546 | 1,678 | +9% | 0 | 0 | — |
case-21 | fail→pass | 10,806 | 7,076 | -35% | 1 | 1 | 0% | 1,669 | 2,307 | +38% | 0 | 0 | — |
case-22 | pass→pass | 29,169 | 22,062 | -24% | 1 | 1 | 0% | 5,892 | 5,594 | -5% | 0 | 0 | — |
case-23 | pass→pass | 14,396 | 14,198 | -1% | 1 | 1 | 0% | 2,732 | 3,911 | +43% | 0 | 0 | — |
case-24 | pass→pass | 13,378 | 10,290 | -23% | 1 | 1 | 0% | 2,589 | 3,221 | +24% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +67 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.