Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Query the ChEMBL database for bioactive molecules, drug targets, bioactivity data, approved drugs, and chemical structures. Use when the user asks about compounds, targets, IC50/Ki values, drug mechanisms, or structure searches.
.claude/skills/mkurman-chembl-database/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 216% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 173% | 0% |
| case-20 | ✓→✓ | = Same ✓ | 248% | 0% |
| case-21 | ✓→✓ | = Same ✓ | 217% | 0% |
| case-22 | ✓→✓ | = Same ✓ | 375% | 0% |
uv: Read the uv skill and follow its Setup instructions to ensureuv is installed and on PATH.
this skill directory then (1) prominently notify the user to check the terms at https://chembl.gitbook.io/chembl-interface-documentation/about, then (2) create the file recording the notification text and timestamp.
utility script scripts/chembl_api.py for all ChEMBL API interactions, including checking status. NEVER use curl or custom Python requests to query the ChEMBL API directly. This ensures rate limit is enfoced and also retries on network errors.
--output flag is required for everysubcommand. All JSON results are written to the specified file. After running the command, read the output file with jq or your own code to extract the data. List results are typically wrapped in a JSON array keyed by the endpoint name (e.g., molecules, activities).
output.
All ChEMBL API queries use one script with subcommands:
bashuv run scripts/chembl_api.py <subcommand> --output <file> [options]
bashuv run scripts/chembl_api.py status --output /tmp/status.json
Fetch by ChEMBL ID: bash uv run scripts/chembl_api.py molecule --id CHEMBL25 --output /tmp/mol.json
Search by name: bash uv run scripts/chembl_api.py molecule --search "aspirin" --limit 3 --output /tmp/mol_search.json
Batch fetch: bash uv run scripts/chembl_api.py molecule --ids "CHEMBL25;CHEMBL1642" --limit 10 --output /tmp/mol_batch.json
Filter by properties: bash uv run scripts/chembl_api.py molecule --filter molecule_properties__mw_freebase__lte=500 --limit 5 --output /tmp/mol_filter.json
Filter by range: bash uv run scripts/chembl_api.py molecule --filter molecule_properties__mw_freebase__range=150,200 --limit 5 --output /tmp/mol_range.json
Download SDF structure file: bash uv run scripts/chembl_api.py molecule --id CHEMBL25 --dl_format sdf --output /tmp/aspirin.sdf
> Tip: SDF/MOL files can be passed directly to tools like PyMOL or RDKit for > 3D visualization and analysis.
Search for targets: bash uv run scripts/chembl_api.py target --search "EGFR" --limit 5 --output /tmp/targets.json
Fetch by ID: bash uv run scripts/chembl_api.py target --id CHEMBL203 --output /tmp/egfr.json
Fetch activity by ID: bash uv run scripts/chembl_api.py activity --id 31863 --output /tmp/act.json
Search activities: bash uv run scripts/chembl_api.py activity --search "EGFR" --limit 5 --output /tmp/act_search.json
Filter activities for a target: bash uv run scripts/chembl_api.py activity --filter target_chembl_id=CHEMBL203 standard_type=IC50 --limit 10 --output /tmp/egfr_ic50.json
Normalize bioactivity units to nM: bash uv run scripts/chembl_api.py activity --filter target_chembl_id=CHEMBL203 standard_type=IC50 --limit 5 --normalize --output /tmp/egfr_normalized.json
> Important: Bioactivity values come in various units (nM, µM, pM). Use > --normalize to convert all values to nM for consistent comparison. Each > record will include normalized_value_nM and normalization_note.
Fetch drug details: bash uv run scripts/chembl_api.py drug --id CHEMBL25 --output /tmp/drug.json
Drug indications: bash uv run scripts/chembl_api.py drug_indication --filter molecule_chembl_id=CHEMBL25 --limit 10 --output /tmp/indications.json
Filter indications by phase: bash uv run scripts/chembl_api.py drug_indication --filter molecule_chembl_id=CHEMBL25 max_phase_for_ind=4.0 --limit 10 --output /tmp/approved_indications.json
Drug warnings: bash uv run scripts/chembl_api.py drug_warning --limit 5 --output /tmp/warnings.json
Mechanisms of action: bash uv run scripts/chembl_api.py mechanism --filter molecule_chembl_id=CHEMBL25 --limit 5 --output /tmp/mech.json
> Note: Both similarity and substructure searches are performed > server-side on ChEMBL's pre-indexed database. They do not require a local > RDKit installation.
Similarity search (SMILES + threshold): bash uv run scripts/chembl_api.py similarity --smiles "CC(=O)Oc1ccccc1C(=O)O" --similarity 85 --limit 5 --output /tmp/similar.json
Substructure search (SMILES): bash uv run scripts/chembl_api.py substructure --smiles "c1ccccc1" --limit 5 --output /tmp/substruct.json
Download a 2D structure image (SVG by default, scalable for publication):
bashuv run scripts/chembl_api.py image --id CHEMBL25 --output /tmp/chembl25.svg
Options:
--dimensions: Image size in pixels (max 500, default 500).--engine: Rendering engine (default: rdkit).--img_format: Output format — svg (default, vector) or png (raster).ChEMBL integrates with UniProt, Ensembl, PubChem, and other databases. Common cross-referencing patterns:
Find a ChEMBL target from a UniProt accession: bash uv run scripts/chembl_api.py target --filter target_components__accession=P00533 --limit 5 --output /tmp/uniprot_target.json
Resolve any ChEMBL ID to its entity type: bash uv run scripts/chembl_api.py chembl_id_lookup --id CHEMBL203 --output /tmp/lookup.json
Look up cross-reference sources: bash uv run scripts/chembl_api.py xref_source --limit 10 --output /tmp/xrefs.json
> Tip: Use the target_component endpoint to find UniProt accessions, gene > names, and protein sequences for any ChEMBL target.
All list endpoints support --limit and --offset for pagination:
bash# First page: 2 results starting at offset 0 uv run scripts/chembl_api.py molecule --limit 2 --offset 0 --output /tmp/page1.json # Second page: next 2 results starting at offset 2 uv run scripts/chembl_api.py molecule --limit 2 --offset 2 --output /tmp/page2.json
The response includes page_meta with total_count, limit, offset, next, and previous links. Use successive --offset values to page through large result sets.
All remaining endpoints follow the same pattern:
bashuv run scripts/chembl_api.py <subcommand> --output <file> [--id ID | --ids ID1;ID2 | --search QUERY] [--limit N] [--offset N] [--filter KEY=VAL ...]
Key subcommands at a glance:
molecule (searchable: true): Molecules/compounds — the primary entry pointtarget (searchable: true): Drug targets (proteins, organisms, etc.)activity (searchable: true): Bioactivity data (IC50, Ki, EC50, etc.)drug (searchable: false): Approved drugsmechanism (searchable: false): Mechanisms of actionassay (searchable: true): Assay descriptionssimilarity (searchable: false): Similarity search (special)substructure (searchable: false): Substructure search (special)image (searchable: false): Compound image download (special)Full subcommand list:
activity_supp (searchable: false): Supplementary activity dataassay_class (searchable: false): Assay classificationsatc_class (searchable: false): ATC drug classificationsbinding_site (searchable: false): Binding site informationbiotherapeutic (searchable: false): Biotherapeutic moleculescell_line (searchable: false): Cell line detailschembl_id_lookup (searchable: true): ChEMBL ID resolutionchembl_release (searchable: false): Database release infocompound_record (searchable: false): Compound recordscompound_structural_alert (searchable: false): Structural alertsdocument (searchable: true): Literature documentsdocument_similarity (searchable: false): Document similaritydrug_indication (searchable: false): Drug indicationsdrug_warning (searchable: false): Drug safety warningsgo_slim (searchable: false): GO slim termsmetabolism (searchable: false): Metabolism datamolecule_form (searchable: false): Molecule forms (salts/parents)organism (searchable: false): Organismsprotein_classification (searchable: true): Protein classificationssource (searchable: false): Data sourcestarget_component (searchable: false): Target protein componentstarget_relation (searchable: false): Target relationshipstissue (searchable: false): Tissue typesxref_source (searchable: false): Cross-reference sourcesstatus (searchable: false): API status check (special)--output FILE: Required. Output file path for JSON results.--id ID: Fetch a single record by ID.--ids ID1;ID2;...: Batch fetch multiple records.--search QUERY: Free-text search (only for searchable endpoints, marked✓).
--limit N: Max results to return (default: 5).--offset N: Pagination offset.--filter KEY=VAL: Filter parameters (can specify multiple).--normalize: (activity only) Normalize values to nM.--dl_format sdf|mol: (molecule only) Download structure file.references/api_endpoints.md for the full list of endpoints and filter operators.
status --output /tmp/status.json to verify the API is available.activity with filters to get bioactivity data for targets/molecules.Use --normalize when comparing values across studies.
similarity or substructure for server-side structure-based queries.image or structure files with molecule--dl_format sdf.
target --filter target_components__accession=<UniProt> to cross-reference with UniProt.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 20,274 | 8,877 | -56% | 1 | 1 | 0% | 4,340 | 3,664 | -16% | 0 | 0 | — |
case-02 | fail→fail | 12,403 | 6,119 | -51% | 1 | 1 | 0% | 2,647 | 3,551 | +34% | 0 | 0 | — |
case-03 | fail→fail | 14,243 | 6,207 | -56% | 1 | 1 | 0% | 947 | 3,470 | +266% | 0 | 0 | — |
case-04 | fail→fail | 9,676 | 8,963 | -7% | 1 | 1 | 0% | 1,684 | 3,685 | +119% | 0 | 0 | — |
case-05 | fail→fail | 10,151 | 7,644 | -25% | 1 | 1 | 0% | 1,917 | 3,574 | +86% | 0 | 0 | — |
case-06 | fail→fail | 12,241 | 9,257 | -24% | 1 | 1 | 0% | 2,322 | 3,860 | +66% | 0 | 0 | — |
case-07 | fail→pass | 6,874 | 11,529 | +68% | 1 | 1 | 0% | 1,338 | 4,222 | +216% | 0 | 0 | — |
case-08 | fail→fail | 7,216 | 15,070 | +109% | 1 | 1 | 0% | 1,389 | 3,349 | +141% | 0 | 0 | — |
case-09 | fail→fail | 8,330 | 6,971 | -16% | 1 | 1 | 0% | 1,801 | 3,548 | +97% | 0 | 0 | — |
case-10 | fail→fail | 10,893 | 9,595 | -12% | 1 | 1 | 0% | 2,162 | 3,683 | +70% | 0 | 0 | — |
case-11 | fail→fail | 8,437 | 7,356 | -13% | 1 | 1 | 0% | 1,700 | 3,395 | +100% | 0 | 0 | — |
case-12 | fail→fail | 10,508 | 10,344 | -2% | 1 | 1 | 0% | 2,078 | 3,483 | +68% | 0 | 0 | — |
case-13 | fail→fail | 6,692 | 4,377 | -35% | 1 | 1 | 0% | 342 | 3,609 | +955% | 0 | 0 | — |
case-14 | fail→fail | 10,308 | 5,563 | -46% | 1 | 1 | 0% | 2,060 | 3,546 | +72% | 0 | 0 | — |
case-15 | fail→fail | 7,457 | 7,330 | -2% | 1 | 1 | 0% | 1,375 | 3,524 | +156% | 0 | 0 | — |
case-16 | fail→fail | 8,774 | 5,966 | -32% | 1 | 1 | 0% | 1,839 | 3,443 | +87% | 0 | 0 | — |
case-17 | fail→fail | 7,499 | 6,188 | -17% | 1 | 1 | 0% | 1,525 | 3,454 | +126% | 0 | 0 | — |
case-18 | fail→pass | 9,636 | 3,653 | -62% | 1 | 1 | 0% | 1,366 | 3,732 | +173% | 0 | 0 | — |
case-19 | fail→fail | 10,426 | 6,706 | -36% | 1 | 1 | 0% | 1,905 | 3,384 | +78% | 0 | 0 | — |
case-20 | pass→pass | 9,029 | 17,305 | +92% | 1 | 1 | 0% | 1,926 | 6,694 | +248% | 0 | 0 | — |
case-21 | pass→pass | 6,903 | 10,639 | +54% | 1 | 1 | 0% | 1,444 | 4,577 | +217% | 0 | 0 | — |
case-22 | pass→pass | 5,062 | 7,949 | +57% | 1 | 1 | 0% | 972 | 4,615 | +375% | 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. 22 cases were attempted, and 5 counted toward the lift figure. The other 17 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 +9 percentage points is the difference between those two pass rates over the 5 comparable cases. 6 cases got worse with the skill loaded, and they are included in that figure.
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.