Open-source agentic drug discovery workflows built on RDKit and permissively licensed tools. Exposes deterministic cheminformatics, bioactivity, structure, and docking tools via MCP.
Strong foundation with 18 well-named tools covering drug discovery workflows. All tools have descriptions (avg 180 chars, within 10-1024 baseline) and input schemas with typed parameters. Naming follows verb_noun pattern (standardize_, molecule_, get_, find_, check_, assess_, design_, profile_). However, output schemas are not explicitly documented in the visible code, responses are inferred from docstrings rather than formally declared. Parameter descriptions are present but some lack constraint details (e.g., max_records defaults but no min/max bounds stated). Error handling guidance is minimal, tools do not return recovery hints or categorized error types. Security is sound (read-only operations, no secrets in params), but descriptions could better explain when to use each tool vs. similar ones (e.g., molecule_properties vs. profile_compound).
Estimate synthetic accessibility of a molecule using the Synthetic Accessibility Score (SAS).
Check whether a compound structure is known in ChEMBL and PubChem, and if so, retrieve its ChEMBL ID and any reported bioactivity.
Screen a compound for developability liabilities: hERG risk, cationic amphiphile, metabolic soft spots, and other flags.
Assess whether a compound is promiscuous (hits many targets) using the selectivity window: the ratio of the number of targets hit above the median potency to the total number of targets.
Tanimoto similarity on ECFP4 fingerprints between two molecules, with their Bemis-Murcko scaffolds.
Propose analogs of a hit using matched molecular pairs from a target's bioactivity data. Each proposal carries the evidence for what the transformation did.
Output schemas not formally documented. Tool descriptions mention what is returned (e.g., 'Returns one row per compound with median potency') but JSON Schema output types are not visible in the code. LLMs cannot plan downstream tool calls without knowing the structure of returned fields.
Parameter constraints lack specificity. max_records has a default (3000, 10) but no min/max bounds are stated in descriptions. exhaustiveness defaults to 8 but the range 1-32 is only in the description, not enforced as JSON Schema constraints. LLMs may pass invalid values.
Error handling does not guide recovery. Tools do not return categorized errors (retryable vs. user-fixable vs. fatal) or suggest next steps. A failed docking or database lookup returns no guidance on whether to retry, adjust parameters, or try a different tool.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Run fpocket on a PDB structure to detect binding pockets. Requires fpocket to be installed.
Dock a molecule into a protein structure using smina/AutoDock Vina. Returns a docking score in kcal/mol, which is a ranking signal only -- not a predicted binding affinity. Docking scores correlate weakly with measured potency across diverse chemistry and cannot be compared between different targets. Use redocking controls to validate the protocol.
Resolve a gene symbol, protein name, or UniProt accession to ChEMBL targets. Single-protein human targets are returned first. ChEMBL also stores protein complexes, cell lines, and whole organisms as targets; selecting one of those yields activity data with no structural interpretation.
Search the PDB for structures matching a query: PDB ID, gene symbol, UniProt accession, or free text.
Fetch and curate bioactivity data for a ChEMBL target. Returns one row per compound with median potency on the pChEMBL scale, plus a full audit of what curation removed and why -- censored measurements, curator-flagged records, wrong-species data, unconvertible units, thermodynamically implausible potencies, and compounds whose replicate measurements disagree. Read the audit. If a large fraction of records was removed as inconsistent, the remaining SAR is correspondingly less reliable.
Fetch a PDB structure and report its chains, ligands, and metals. Identifies the most likely binding site from co-crystallized ligands.
Compute ligand efficiency (LE) and lipophilic efficiency (LLE) for a compound at a measured potency in nanomolar. LE is binding energy per heavy atom -- it stops you rewarding a compound for being large. LLE (pIC50 - cLogP) tracks whether potency is being bought with lipophilicity, which is the classic hit-to-lead failure mode. A moderately potent efficient fragment is usually a better starting point than a potent inefficient large molecule.
Compute physicochemical descriptors: MW, cLogP, TPSA, HBD/HBA, rotatable bonds, aromatic rings, fraction sp3, QED, Lipinski violations, and Veber pass. These are interpretable and comparable across targets, unlike a docking score. Lipinski violations are a guideline with well-known exceptions, not a filter -- report them, do not enforce them.
Comprehensive profile of a compound: properties, alerts, liabilities, synthesis difficulty, and novelty check.
Score a compound using a retrospective validation harness: how well does it rank against known actives for a target?
Normalize a molecule to a canonical form: strip salts and solvates, neutralize charges, and canonicalize the tautomer. Run this before comparing, deduplicating, or joining on structure. The same compound deposited as a hydrochloride salt, a zwitterion, and a neutral tautomer produces three different InChIKeys and three different fingerprints, which silently inflates dataset size and corrupts any split built on structural identity.
Screen a molecule against PAINS (A/B/C), Brenk, NIH, and ZINC alert catalogs. Returns every match with its catalog, severity, and literature reference. Treat these as annotations, not verdicts. Roughly 5% of approved drugs match a PAINS pattern and aspirin matches a Brenk one. PAINS_A carries the strongest evidence; PAINS_C was fit to very few observations. If you exclude a compound on an alert, say which catalog fired and why.
Tool selection ambiguity. molecule_properties, profile_compound, and check_liabilities all analyze a compound but with overlapping scope. Descriptions do not clearly state when to use each vs. the others, forcing LLMs to reason about subtle distinctions.
Pagination not documented. find_structures and get_target_actives accept max_records but do not document whether results are paginated, how to fetch the next page, or what the total count is. Large result sets may be truncated silently.