mmpa — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mmpa (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
MMPA identifies pairs of molecules (A, B) that differ by a single structural transformation (R₁ → R₂) at one site while sharing an identical molecular context. Aggregating ΔProperty across hundreds of such pairs extracts robust, context-free SAR rules.
Molecule A: [Context]-[R₁] → transform: R₁ → R₂
Molecule B: [Context]-[R₂]
ΔProperty = P(B) - P(A)
SAR rule: "R₁ → R₂ causes ΔlogP = +0.45 ± 0.12 (N=18 pairs)"Fragmentation (single-cut):
[R₁:1]>>[R₂:1] at attachment pointDouble-cut: both variable parts and a central linker can vary — rarer, more specific.
pip install mmpdb
# or: conda install -c conda-forge mmpdb
# Full pipeline: SMILES file → SAR rules
mmpdb fragment compounds.smi -o fragments.h5
mmpdb index fragments.h5 -o mmpdb.db
# Load experimental properties (CSV with: smiles, id, prop1, prop2)
mmpdb loadprops mmpdb.db properties.csv
# Query: what transforms improve LogD?
mmpdb transform --smiles "c1ccc(cc1)C(=O)O" mmpdb.db \
--property LogD \
--min-pairs 3 \
-o transform_results.csv
# Analyze SAR rules for a property
mmpdb analyze mmpdb.db --property pIC50 -o sar_rules.csvimport mmpdblib
from mmpdblib import do_fragment, do_index
# Fragment a SMILES list programmatically
from mmpdblib.analysis_algorithms import find_mmps
smiles_dict = {
"mol_A": "c1ccc(CC)cc1", # ethylbenzene
"mol_B": "c1ccc(CF)cc1", # fluoromethylbenzene
"mol_C": "c1ccc(CCl)cc1", # chloromethylbenzene
}
# Find matched molecular pairs
pairs = find_mmps(list(smiles_dict.values()), list(smiles_dict.keys()))
# pairs: list of (id1, id2, transform_SMIRKS, context_SMILES)| Task | Reference |
|---|---|
| MMP definition, fragmentation theory, SMIRKS transforms, property cliffs, statistical framework | references/mmpa-theory.md |
| mmpdb 4 CLI: fragment → index → loadprops → transform → analyze, full SAR workflow | references/mmpdb-workflow.md |
| RDKit programmatic MMP generation: bond cutting, attachment points, pair enumeration | references/rdkit-fragmentation.md |
| SAR delta statistics, activity cliff detection, bioisostere tables, visualization | references/sar-analysis.md |
| Applying transforms to query molecule, analogue library generation, integration with design tools | references/transform-application.md |
| Package | Install | Role |
|---|---|---|
mmpdb | pip install mmpdb | Core MMPA engine (AZ, Apache 2.0) |
rdkit | conda/pip | Fragmentation, SMILES parsing, visualization |
pandas | pip install pandas | SAR table analysis |
seaborn / matplotlib | pip | Activity cliff heatmaps, ΔP distributions |
mols2grid | pip install mols2grid | Interactive molecule grid visualization |
| Term | Definition | ||
|---|---|---|---|
| MMP | Two molecules differing by exactly one transformation at one site | ||
| Transform | SMIRKS notation: [*:1]>>[*:1] where [*:1] = attachment point | ||
| Variable part | The fragment that differs between the two molecules | ||
| Context | Shared molecular scaffold (everything outside the cut bond) | ||
| ΔProperty | P(B) − P(A) for any measured property | ||
| SAR rule | A transform + aggregated ΔP statistics across N≥3 pairs | ||
| Activity cliff | Large | ΔActivity | (> 1 log unit) for structurally similar molecules |
mmpdb.make_index); v4 uses CLI subcommands (mmpdb fragment/index/loadprops)--max-variable-heavies 13 for larger changesnum_pairs >= 3--stereo flag if neededrdkit — SMILES I/O, substructure matching, property calculation (QED, LogP)generative-design — MMPA-guided focused library generation (apply transforms at scale)pharmacophore — combine MMPA bioisostere rules with pharmacophore constraintsdocking — score MMPA-generated analogues via Vina/Gninascientific-skills:chembl-database — ChEMBL as MMPA input dataset for literature SAR mining~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.