Source: https://github.com/aipoch/medical-research-skills
When to Use
- Find candidate compounds by name or synonym (e.g., searching for “aspirin”) and retrieve their ChEMBL records.
- Filter molecules by physicochemical properties (e.g., molecular weight, LogP) to narrow down drug-like candidates.
- Look up targets (proteins/complexes) and connect them to ligands and known bioactivity measurements.
- Retrieve bioactivity data (e.g., IC50, Ki, EC50) for specific compound–target interactions to support SAR or benchmarking.
- Identify approved drugs and fetch mechanism-of-action information for target validation or competitive landscape analysis.
Key Features
- Molecule search by preferred name and other metadata fields.
- Property-based filtering (e.g., MW, LogP) using ChEMBL API filter syntax.
- Structure-aware querying via SMILES (where supported by the API/client).
- Target lookup and navigation between targets, molecules, and activities.
- Bioactivity retrieval for common endpoints (IC50, Ki, EC50) and related assay context.
- Access to drug-related records, including mechanism information for approved drugs.
Dependencies
- Python 3.9+ (recommended)
chembl_webresource_client (latest available via pip/uv)
Install:
uv pip install chembl_webresource_client
Additional references (optional, if present in this repository):
references/api_reference.md (filter syntax and resource list)
scripts/query_chembl.py (CLI wrapper example)
Example Usage
from chembl_webresource_client.new_client import new_client
def main():
molecule = new_client.molecule
target = new_client.target
activity = new_client.activity
mechanism = new_client.mechanism
# 1) Search for molecules by name (case-insensitive substring match)
mols = list(molecule.filter(pref_name__icontains="aspirin")[:5])
if not mols:
raise SystemExit("No molecules found for query.")
first = mols[0]
chembl_id = first.get("molecule_chembl_id")
print("Top molecule hit:", chembl_id, "-", first.get("pref_name"))
# 2) Filter molecules by a simple property constraint (example: MW <= 500)
# Note: exact field names and operators depend on ChEMBL API schema.
druglike = list(molecule.filter(molecule_properties__mw_freebase__lte=500)[:5])
print("Example drug-like hits (MW<=500):", [m.get("molecule_chembl_id") for m in druglike])
# 3) Get target information (example: targets containing "COX")
targets = list(target.filter(pref_name__icontains="cyclooxygenase")[:5])
print("Example targets:", [(t.get("target_chembl_id"), t.get("pref_name")) for t in targets])
# 4) Query bioactivity for a molecule (IC50/Ki/EC50 etc. depend on available records)
# Here we fetch a few activity records linked to the molecule.
acts = list(activity.filter(molecule_chembl_id=chembl_id)[:5])
for a in acts:
print(
"Activity:",
a.get("activity_id"),
"type=", a.get("standard_type"),
"value=", a.get("standard_value"),
"units=", a.get("standard_units"),
"target=", a.get("target_chembl_id"),
)
# 5) Retrieve mechanism-of-action records (often used for approved drugs)
mechs = list(mechanism.filter(molecule_chembl_id=chembl_id)[:5])
for m in mechs:
print(
"Mechanism:",
"target=", m.get("target_chembl_id"),
"action=", m.get("action_type"),
"mechanism=", m.get("mechanism_of_action"),
)
if __name__ == "__main__":
main()
Implementation Details
- Client/Resources: Uses
chembl_webresource_client.new_client.new_client to access resource endpoints such as molecule, target, activity, and mechanism.
- Filtering Model: Queries are built via
.filter(...) with field lookups and operators (e.g., __icontains, __lte). The exact available fields and supported operators are defined by the ChEMBL API schema; consult references/api_reference.md for the authoritative list and examples.
- Pagination/Slicing: Results are iterable and can be sliced (e.g.,
[:5]) to limit network calls and output size.
- Bioactivity Fields: Common normalized fields include
standard_type, standard_value, and standard_units. Not all records contain all fields; code should handle missing keys.
- Mechanism Retrieval: Mechanism-of-action data is accessed via the
mechanism resource and is typically most complete for approved/annotated drugs.
- Structure Queries (SMILES): Structure-based search support depends on the API endpoint and client capabilities; when enabled, it is typically performed by passing a SMILES string to the appropriate structure/compound endpoint or filter as documented in
references/api_reference.md.
1---2name: chembl-database3description: Query the ChEMBL database for bioactive molecules, targets, bioactivities, and approved drugs; use this when you need to filter by physicochemical properties (e.g., MW, LogP), chemical structure (SMILES), or retrieve drug mechanism information.4license: MIT5---6> **Source**: [https://github.com/aipoch/medical-research-skills](https://github.com/aipoch/medical-research-skills)
7
8## When to Use
9
10- Find candidate compounds by name or synonym (e.g., searching for “aspirin”) and retrieve their ChEMBL records.
11- Filter molecules by physicochemical properties (e.g., molecular weight, LogP) to narrow down drug-like candidates.
12- Look up targets (proteins/complexes) and connect them to ligands and known bioactivity measurements.
13- Retrieve bioactivity data (e.g., IC50, Ki, EC50) for specific compound–target interactions to support SAR or benchmarking.
14- Identify approved drugs and fetch mechanism-of-action information for target validation or competitive landscape analysis.
15
16## Key Features
17
18- Molecule search by preferred name and other metadata fields.
19- Property-based filtering (e.g., MW, LogP) using ChEMBL API filter syntax.
20- Structure-aware querying via SMILES (where supported by the API/client).
21- Target lookup and navigation between targets, molecules, and activities.
22- Bioactivity retrieval for common endpoints (IC50, Ki, EC50) and related assay context.
23- Access to drug-related records, including mechanism information for approved drugs.
24
25## Dependencies
26
27- Python 3.9+ (recommended)
28- `chembl_webresource_client` (latest available via pip/uv)
29
30Install:
31
32```bash
33uv pip install chembl_webresource_client
34```
35
36Additional references (optional, if present in this repository):
37
38- `references/api_reference.md` (filter syntax and resource list)
39- `scripts/query_chembl.py` (CLI wrapper example)
40
41## Example Usage
42
43```python
44from chembl_webresource_client.new_client import new_client
45
46def main():
47 molecule = new_client.molecule
48 target = new_client.target
49 activity = new_client.activity
50 mechanism = new_client.mechanism
51
52 # 1) Search for molecules by name (case-insensitive substring match)
53 mols = list(molecule.filter(pref_name__icontains="aspirin")[:5])
54 if not mols:
55 raise SystemExit("No molecules found for query.")
56
57 first = mols[0]
58 chembl_id = first.get("molecule_chembl_id")
59 print("Top molecule hit:", chembl_id, "-", first.get("pref_name"))
60
61 # 2) Filter molecules by a simple property constraint (example: MW <= 500)
62 # Note: exact field names and operators depend on ChEMBL API schema.
63 druglike = list(molecule.filter(molecule_properties__mw_freebase__lte=500)[:5])
64 print("Example drug-like hits (MW<=500):", [m.get("molecule_chembl_id") for m in druglike])
65
66 # 3) Get target information (example: targets containing "COX")
67 targets = list(target.filter(pref_name__icontains="cyclooxygenase")[:5])
68 print("Example targets:", [(t.get("target_chembl_id"), t.get("pref_name")) for t in targets])
69
70 # 4) Query bioactivity for a molecule (IC50/Ki/EC50 etc. depend on available records)
71 # Here we fetch a few activity records linked to the molecule.
72 acts = list(activity.filter(molecule_chembl_id=chembl_id)[:5])
73 for a in acts:
74 print(
75 "Activity:",
76 a.get("activity_id"),
77 "type=", a.get("standard_type"),
78 "value=", a.get("standard_value"),
79 "units=", a.get("standard_units"),
80 "target=", a.get("target_chembl_id"),
81 )
82
83 # 5) Retrieve mechanism-of-action records (often used for approved drugs)
84 mechs = list(mechanism.filter(molecule_chembl_id=chembl_id)[:5])
85 for m in mechs:
86 print(
87 "Mechanism:",
88 "target=", m.get("target_chembl_id"),
89 "action=", m.get("action_type"),
90 "mechanism=", m.get("mechanism_of_action"),
91 )
92
93if __name__ == "__main__":
94 main()
95```
96
97## Implementation Details
98
99- **Client/Resources**: Uses `chembl_webresource_client.new_client.new_client` to access resource endpoints such as `molecule`, `target`, `activity`, and `mechanism`.
100- **Filtering Model**: Queries are built via `.filter(...)` with field lookups and operators (e.g., `__icontains`, `__lte`). The exact available fields and supported operators are defined by the ChEMBL API schema; consult `references/api_reference.md` for the authoritative list and examples.
101- **Pagination/Slicing**: Results are iterable and can be sliced (e.g., `[:5]`) to limit network calls and output size.
102- **Bioactivity Fields**: Common normalized fields include `standard_type`, `standard_value`, and `standard_units`. Not all records contain all fields; code should handle missing keys.
103- **Mechanism Retrieval**: Mechanism-of-action data is accessed via the `mechanism` resource and is typically most complete for approved/annotated drugs.
104- **Structure Queries (SMILES)**: Structure-based search support depends on the API endpoint and client capabilities; when enabled, it is typically performed by passing a SMILES string to the appropriate structure/compound endpoint or filter as documented in `references/api_reference.md`.