chembl-mcp-server
Server Details
Link compounds to protein targets, rank bioactivity, and look up drug mechanisms and indications.
- Status
- Healthy
- Uptime
- 99.9% over 59 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/chembl-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/chembl-mcp-server
TDQS
Scored across 7 tools
Each tool targets a distinct resource/action: searching molecules, searching targets, retrieving bioactivities, assay details, drug info, and analyzing staged data. No two tools overlap in purpose; even the two dataframe tools are clearly complementary (describe schema vs query rows). High clarity.
All tools share the chembl_ prefix and snake_case. The pattern is mostly verb_noun (search_molecules, get_assay, get_bioactivities), but dataframe_describe and dataframe_query put the noun first, a minor inconsistency. Overall predictable and readable.
7 tools is well within the ideal range and covers the ChEMBL query domain without redundancy. Each tool has a distinct role and earns its place.
The set covers the full read-only workflow: identify targets/molecules, fetch bioactivity measurements, dive into assay provenance, retrieve drug pharmacology, and perform cross-row analysis. No obvious dead ends or missing operations for the stated purpose.
Available Tools
7 toolschembl_dataframe_describechembl-dataframe-describeARead-onlyIdempotentInspect
List the tables and columns staged on a canvas by chembl_get_bioactivities — inspect before calling chembl_dataframe_query to write correct SQL. Returns each table with its row count, kind (table | view), and column names + types. Requires CANVAS_PROVIDER_TYPE=duckdb.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | Yes | Canvas ID returned by chembl_get_bioactivities (spilled: true). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| tables | No | Tables and views staged on the canvas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful behavioral context: it lists the return contents, clarifies that the data is staged by chembl_get_bioactivities, and warns about the required duckdb provider. This goes meaningfully beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no redundancy. The main action is front-loaded, the return details follow, and the environment prerequisite closes the description. Every sentence adds information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only inspection tool with an output schema and safety annotations, the description is fully sufficient. It states what the tool returns, why to call it, when to call it, and a required environment condition. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents canvas_id completely (type, pattern, source, and spilled flag), so the parameter semantics are well covered structurally. The description adds context that the canvas is populated by chembl_get_bioactivities, but it does not need to add parametric detail. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a precise resource ('tables and columns staged on a canvas by chembl_get_bioactivities') and states the output contents (row count, kind, column names + types). It clearly differentiates itself from chembl_dataframe_query by framing itself as the inspection step before querying.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use it: 'inspect before calling chembl_dataframe_query to write correct SQL.' It also gives an environment prerequisite, CANVAS_PROVIDER_TYPE=duckdb. It does not explicitly describe when not to use it or compare against all siblings, but the sequential guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chembl_dataframe_querychembl-dataframe-queryARead-onlyIdempotentInspect
Run a read-only SQL SELECT over the bioactivity rows chembl_get_bioactivities spilled to a canvas — rank, group, dedupe, and aggregate across the FULL set, not the inline preview. Reference each staged table by the name chembl_get_bioactivities returned — bioactivities for its potency_ranked view, bioactivities_null_potency for null_potency; discover the staged tables and their columns with chembl_dataframe_describe. Compute honest aggregates here (e.g. SELECT molecule_chembl_id, MEDIAN(pchembl_value) AS med FROM bioactivities WHERE standard_type = 'IC50' GROUP BY 1 ORDER BY 2 DESC). Two independent bounds apply, each reported on its own field: truncated is true when the SQL result exceeded the canvas row cap, and rendered_rows says how many of the returned rows the markdown table holds once its character budget is reached (below row_count on a wide or long result). Page past either bound with SQL LIMIT/OFFSET — append e.g. LIMIT 500 OFFSET 500 and re-call; offsets reach rows beyond the canvas row cap. Requires CANVAS_PROVIDER_TYPE=duckdb.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | A read-only SELECT against the staged tables. Reference tables by the names chembl_get_bioactivities returned. | |
| canvas_id | Yes | Canvas ID returned by chembl_get_bioactivities (spilled: true). |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Result rows (capped at the canvas row limit). Each row is a column→value map. |
| error | No | Present when the call failed. Absent on success. |
| row_count | No | Number of rows materialized in this response. |
| truncated | No | True when the SQL result exceeded the canvas row cap and was truncated — the engine bounding the result set itself, not the rendering. Independent of rendered_rows; page past it with LIMIT/OFFSET. |
| rendered_rows | No | How many of those rows the markdown table in content[] holds. Below row_count when the rendered table reached its character budget — a rendering bound, INDEPENDENT of truncated: a response can be truncated:false and still render fewer rows than row_count. Re-run the same SQL with LIMIT/OFFSET to read the rows past it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing result cap behavior, the meaning of truncated and rendered_rows, paging semantics, and the CANVAS_PROVIDER_TYPE=duckdb requirement. It also confirms the read-only nature, consistent with readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: the core purpose appears in the first sentence, followed by necessary details, an illustrative SQL example, cap semantics, and paging instructions. Every sentence adds operational value, and the structure leads the agent from purpose to invocation details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a SQL-query tool with two parameters and rich runtime constraints, this description is complete. It covers prerequisites (spilled canvas, duckdb), table discovery, query scope, result limits, and paging, while the output schema handles return-value documentation. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the input schema already covers both parameters, the description adds substantial meaning: how to reference staged tables, the expected SQL shape, that canvas_id must come from a spilled chembl_get_bioactivities result, and how LIMIT/OFFSET interacts with the caps. This goes far beyond the bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run a read-only SQL SELECT over the bioactivity rows chembl_get_bioactivities spilled to a canvas.' It clearly states the operations (rank, group, dedupe, aggregate) and contrasts with 'the inline preview,' which helps distinguish it from the get_bioactivities sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use this tool: when you need full-set aggregation rather than inline preview. It names chembl_dataframe_describe as the discovery tool for staged tables and provides concrete SQL examples, plus a LIMIT/OFFSET pattern for paging beyond the canvas row cap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chembl_get_assaychembl-get-assayARead-onlyIdempotentInspect
Assay provenance behind a bioactivity row: description, type (binding / functional / ADMET / toxicity), the target it measures, organism, and ChEMBL's 1–9 confidence score (9 = direct assay on the protein target, lower = homologous or indirect). Supply assay_chembl_id from a chembl_get_bioactivities row. Call this to judge whether two measurements are comparable before ranking them together.
| Name | Required | Description | Default |
|---|---|---|---|
| assay_chembl_id | Yes | ChEMBL assay ID from a bioactivity row's assay_chembl_id, e.g. "CHEMBL674637". |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| organism | No | Assay organism. Null when unspecified. |
| assay_type | No | Assay type code: B=binding, F=functional, A=ADMET, T=toxicity, P=physicochemical, U=unclassified. Null when absent. |
| description | No | Assay description text. Null when absent. |
| assay_chembl_id | No | The ChEMBL assay ID queried. |
| confidence_score | No | ChEMBL confidence score, 1–9 (9 = direct single-protein assay; lower = homologous/indirect). Null when unscored. |
| target_chembl_id | No | ChEMBL target ID the assay measures — chain to chembl_search_targets/chembl_get_bioactivities. Null when unassigned. |
| assay_type_description | No | Human-readable assay type, e.g. "Binding". Null when absent. |
| confidence_description | No | Human-readable confidence description, e.g. "Direct single protein target assigned". Null when absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, open-world behavior, so the description is not required to repeat those. It adds real behavioral context by explaining the confidence score semantics (9 = direct assay, lower = homologous or indirect), which is not visible in the annotations and matters when comparing assays.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it defines the resource and its content, then states the input dependency and the intended use case. Every sentence earns its place, with no filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only lookup with a rich output schema and annotations already set, the description tells the agent what the tool returns, how to source its ID, and why it matters. Nothing material is missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers assay_chembl_id fully with format and an example, and schema coverage is 100%. The description repeats the dependency on bioactivity rows but does not add new semantic depth beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: exposing assay provenance for a bioactivity row, and enumerates meaningful fields (description, type, target, organism, confidence score). It clearly distinguishes itself from siblings by sourcing its ID from chembl_get_bioactivities rather than searching or querying dataframes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('Supply assay_chembl_id from a chembl_get_bioactivities row') and a clear decision context ('Call this to judge whether two measurements are comparable before ranking them together'). This tells an agent exactly when this tool is the right step in a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chembl_get_bioactivitieschembl-get-bioactivitiesARead-onlyIdempotentInspect
The flagship compound↔target bioactivity bridge: measurements for a molecule (target deconvolution / selectivity), a target (lead finding), or both together (how potently one compound hits one target). Supply at least one of molecule_chembl_id (from chembl_search_molecules) or target_chembl_id (from chembl_search_targets) — supplying both narrows to that compound–target pair, supplying neither is an error. Filter by standard_type (IC50/Ki/EC50/…), minimum potency pchembl_value_min, assay_type, and organism. Not every measurement has a derivable pchembl_value, so potency_view picks which side of that split you get: the default "potency_ranked" returns the measurements that have one, most potent first (ChEMBL sorts the rest first otherwise, which is why they are not merged), and "null_potency" returns exactly the measurements that have none. totalCount is the honest full match count across both views either way. Mixing measurement types (IC50 vs Ki) is a scientific error — set standard_type to compare like with like. A popular target carries tens of thousands of rows: results spill to a DataCanvas table (call chembl_dataframe_describe for its columns, then chembl_dataframe_query for honest aggregates across the staged set), while an inline preview answers the immediate question. Each view stages its own table (bioactivities / bioactivities_null_potency), so running both against one canvas_id lets a UNION ALL rebuild the full set. The staged table is capped at CHEMBL_MAX_SPILL_ROWS; when the cap is hit, truncated is true and the table is a bounded slice, not the complete view. The inline rows are always capped at limit, so compare that against totalCount before treating them as the whole answer. Spilling the rest requires CANVAS_PROVIDER_TYPE=duckdb; without it the inline preview is all there is.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows in the inline preview. Defaults to the server default (25). The full set still spills to the canvas. | |
| organism | No | Restrict to a target organism, e.g. "Homo sapiens" (case-insensitive exact match). | |
| canvas_id | No | Optional canvas ID from a prior call to reuse the same canvas. Each potency_view re-stages its own table, so a second query of the SAME view REPLACES (overwrites) its prior rows — it does not append — while the other view's table is left intact, which is what lets both coexist on one canvas. Omit to mint a fresh canvas. | |
| assay_type | No | Restrict to an assay type code: "B" (binding), "F" (functional), "A" (ADMET), "T" (toxicity). | |
| potency_view | No | Which side of the pchembl_value presence split to retrieve. "potency_ranked" (default) returns the measurements that have a derivable pchembl_value, most potent first. "null_potency" returns exactly the measurements that have none — the rows the ranked view excludes, otherwise unreachable. The two partition the match set and stage to separate canvas tables. | potency_ranked |
| standard_type | No | Restrict to one measurement type, e.g. "IC50", "Ki", "EC50". Set this to compare potencies validly. | |
| target_chembl_id | No | ChEMBL target ID (from chembl_search_targets), e.g. "CHEMBL203". Supply this, molecule_chembl_id, or both — both narrows to that compound–target pair. | |
| pchembl_value_min | No | Minimum pchembl_value (−log10 molar potency), e.g. 7 keeps sub-100 nM activities. Only valid on the potency_ranked view — the null_potency rows have no pchembl_value to compare against. | |
| molecule_chembl_id | No | ChEMBL molecule ID (from chembl_search_molecules), e.g. "CHEMBL941". Supply this, target_chembl_id, or both — both narrows to that compound–target pair. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no measurements matched, or how to SQL the spilled set. |
| spilled | No | True when the view exceeded the preview and was staged on the canvas. |
| canvas_id | No | Canvas ID holding the staged table — pass to chembl_dataframe_describe to list its columns, then to chembl_dataframe_query to run SQL over them. Null when canvas is disabled or nothing spilled. |
| truncated | No | True when the CHEMBL_MAX_SPILL_ROWS cap was hit before the upstream view was exhausted — the staged table is a bounded slice, NOT the complete view, so aggregates over it are a sample. Narrow the filters to bring the view under the cap. |
| activities | No | Bioactivity rows for the selected potency_view — the inline preview, or the full view when it fit without spilling. |
| table_name | No | Canvas table name holding the staged rowset, and the FROM target for chembl_dataframe_query SQL — "bioactivities" for potency_ranked, "bioactivities_null_potency" for null_potency. Null when not spilled. |
| totalCount | No | Total matching measurements upstream — the honest full count spanning BOTH potency views, before any preview cap. The staged/preview rows are the selected view of this. |
| potency_view | No | Which view these rows came from: "potency_ranked" = measurements with a derivable pchembl_value; "null_potency" = measurements with none. Re-call with the other value to reach the rest of totalCount. |
| appliedFilters | No | Filters as the server parsed them. |
| canvasDisabled | No | True when CANVAS_PROVIDER_TYPE is not duckdb, so large sets could not spill — the inline rows are a capped preview, not the full set. |
| staged_row_count | No | Rows actually registered on the canvas table. Null when nothing spilled. Below the view total when truncated is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, but the description adds substantial behavioral detail beyond that: it explains the pchembl_value split and the two views, how each view stages its own table and that re-running the same view overwrites (does not append) while the other view's table is preserved, the CHEMBL_MAX_SPILL_ROWS cap with the truncated flag, and the inline limit vs totalCount discrepancy. It also reveals the honest full match count across both views. This gives the agent a clear mental model of side effects and edge cases, far exceeding the bare hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, but well-structured: it opens with the core purpose and usage, then flows through filtering, the potency split, table staging, caps, and environment requirements. Every sentence adds information that is not already in the schema or annotations. It is not hasty or repetitive, though it could be tightened slightly (e.g., the sentence about ChEMBL sorting the rest first is verbose). It earns its length given the tool's complexity, so I do not penalize heavily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description correctly avoids re-explaining return fields. It covers all critical operational details: the requirement to supply at least one ID, the two views and their partitioning, how tables are staged and overwritten, the spill cap and truncation, the inline limit caveat, and the dependency on duckdb for spilling. For a 9-parameter tool with intricate behavior, this description leaves no practical gap for an agent to trip over.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema coverage is 100%, the description adds meaning beyond the schema for nearly every parameter. It explains that pchembl_value_min only applies to the potency_ranked view, that limit defaults to 25 and only affects the inline preview (the full set still spills), that canvas_id replacement semantics differ by view, and that standard_type should be set to compare like with like. It also clarifies the semantic difference between potency_ranked and null_potency. This is exactly the kind of contextual clarification that makes the tool safely usable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of the tool's purpose: 'the flagship compound↔target bioactivity bridge' that returns measurements for a molecule, a target, or both. It names the specific resource (bioactivity measurements) and the verbs (get/fetch), and distinguishes itself from sibling search tools by referencing chembl_search_molecules and chembl_search_targets as ID sources, and chembl_dataframe_describe/query for downstream analysis. The purpose is unambiguous and clearly differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: it maps use cases (target deconvolution, selectivity, lead finding) and states the condition for narrowing to a compound–target pair. It gives clear exclusion rules (neither molecule_chembl_id nor target_chembl_id is an error) and advises against mixing measurement types (scientific error). It also routes the agent to chembl_dataframe_describe/query for large result sets versus the inline preview, and notes when duckdb is required for spilling. This is thorough, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chembl_get_drug_infochembl-get-drug-infoARead-onlyIdempotentInspect
Pharmacology for a drug (molecule): mechanism(s) of action, the molecular target(s) it acts on, action type (inhibitor / agonist / …), first-approval year, and clinical indications with the max phase reached for each. Supply molecule_chembl_id (from chembl_search_molecules). Distinct from the openfda server's label/adverse-event view — this is the curated mechanism-and-indication record. A mechanism's target_chembl_id chains into chembl_get_bioactivities for compounds hitting the same target. Each list carries its own retrieval state: an empty mechanisms or indications array means the molecule has none recorded only when the matching mechanisms_status / indications_status is "complete" — "failed" means the upstream request was rejected and the array says nothing about the molecule, and "truncated" means the page cap bounded the list at fewer rows than the matching *_total_count.
| Name | Required | Description | Default |
|---|---|---|---|
| molecule_chembl_id | Yes | ChEMBL molecule ID (from chembl_search_molecules), e.g. "CHEMBL939" for gefitinib. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Disclosure of anything the two lists do not say for themselves: a list whose upstream fetch failed (so its emptiness means nothing), a list the page cap bounded, or — only when both lists came back complete and empty — that the molecule may be a research compound rather than a drug. |
| max_phase | No | Max clinical phase across indications: 4 = marketed. Null when unknown. |
| pref_name | No | Preferred drug name, e.g. "GEFITINIB". Null when unnamed. |
| mechanisms | No | Mechanisms of action. Empty is authoritative only when mechanisms_status is "complete". |
| indications | No | Clinical indications. Empty is authoritative only when indications_status is "complete". |
| first_approval | No | Year of first approval, e.g. 2003. Null when unapproved or unknown. |
| mechanisms_status | No | Retrieval state of the mechanism list. "complete" = every row ChEMBL records is present, so an empty array is a fact about the molecule. "truncated" = the single-request page cap bounded the list, so the array is a prefix of mechanisms_total_count rows. "failed" = the upstream request was rejected, so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry. |
| indications_status | No | Retrieval state of the indication list. "complete" = every row ChEMBL records is present, so an empty array is a fact about the molecule. "truncated" = the single-request page cap bounded the list, so the array is a prefix of indications_total_count rows. "failed" = the upstream request was rejected, so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry. |
| molecule_chembl_id | No | The ChEMBL molecule ID queried. |
| mechanisms_total_count | No | Total mechanism rows ChEMBL holds for this molecule (upstream page_meta.total_count). Exceeds the returned array length exactly when the status is "truncated". Null when the fetch failed — the count is unknown, never 0. |
| indications_total_count | No | Total indication rows ChEMBL holds for this molecule (upstream page_meta.total_count). Exceeds the returned array length exactly when the status is "truncated". Null when the fetch failed — the count is unknown, never 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, open-world, and idempotent, so the bar is lower, but the description adds valuable behavior: each list has a retrieval state, and empty arrays only mean 'none recorded' when the corresponding status is 'complete', while 'failed' and 'truncated' have distinct meanings. This prevents serious misinterpretation of outputs and does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with its core purpose and then adds only high-value details: source, differentiation, chaining to bioactivities, and status semantics. While dense, every sentence earns its place and there is no filler or repetitive content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with a rich output schema and strong annotations, the description is complete. It covers what is returned, where the input comes from, how to distinguish this tool from related views, and how to interpret partial or failed retrievals.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already provides the ChEMBL ID source and an example. The main description repeats 'from chembl_search_molecules' and adds no new parameter semantics beyond what the schema already documents, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource: it retrieves pharmacology for a drug, listing mechanisms of action, molecular targets, action type, approval year, and indications. It also differentiates itself from the openfda label/adverse-event view and from chembl_get_bioactivities, so an agent can tell it apart from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to supply molecule_chembl_id from chembl_search_molecules, giving a clear prerequisite. It also contrasts itself with the openfda server's label/adverse-event view, and explains that target_chembl_id chains into chembl_get_bioactivities, giving the agent context for related alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chembl_search_moleculeschembl-search-moleculesARead-onlyIdempotentInspect
Discovery entry point for compounds. Find by name / ChEMBL ID / InChIKey with the default search_type=name (supply query), or run a structure search with search_type exact | similarity | substructure (supply structure as a SMILES). At least one of query or structure is required, and structure is required for the three structure modes. Returns ChEMBL ID, preferred name, canonical SMILES, formula, MW, AlogP, Lipinski violations, QED, and max clinical phase on every row; only search_type=similarity adds a Tanimoto similarity percent. Chain molecule_chembl_id into chembl_get_bioactivities or chembl_get_drug_info. A capped result carries nextCursor — pass it back as cursor with the same filters to read the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum molecules to return. Defaults to the server default (25) when omitted. | |
| query | No | Search text for search_type=name — a drug name, ChEMBL ID, or InChIKey, e.g. "imatinib" or "CHEMBL25". | |
| cursor | No | Opaque continuation token from a previous call's nextCursor — resumes where that page ended. Omit for the first page. Re-send the same query/structure/filters that minted it (only limit may change; it sets this page's size); redeeming it against different filters walks a different result set. | |
| structure | No | SMILES string for structure search, e.g. "CC(=O)Oc1ccccc1C(=O)O". Required when search_type is exact/similarity/substructure. | |
| search_type | No | name = text lookup (query); exact = exact structure match; similarity = Tanimoto ≥ threshold; substructure = contains the structure. All structure modes need `structure`. | name |
| max_phase_min | No | For search_type=name, restrict to compounds at or above this max clinical phase (e.g. 4 for marketed drugs only). | |
| similarity_threshold | No | Minimum Tanimoto similarity percent for search_type=similarity (40–100; ChEMBL rejects below 40). Ignored for other modes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of molecules returned. |
| notice | No | Guidance when nothing matched — echoes the query and suggests how to broaden. |
| molecules | No | Matching compounds (up to the limit). |
| truncated | No | True when the result was capped at the limit. |
| nextCursor | No | Opaque token for the next page — pass it back as cursor with the same filters. Absent when this page is the last one. |
| totalCount | No | Total compounds matching before the limit was applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description discloses mode-dependent validation ('At least one of query or structure is required, and structure is required for the three structure modes'), output variance ('only search_type=similarity adds a Tanimoto similarity percent'), and pagination ('A capped result carries nextCursor — pass it back as cursor with the same filters'). These are operational behaviors the annotations cannot express, and nothing here contradicts them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and every subsequent clause earns its place: modes, input requirements, return fields, chaining, and pagination each get one clause with zero filler. Covering 7 parameters, 4 modes, and 2 downstream tools in under six sentences is remarkably economical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, 4-mode tool with an output schema and rich annotations, the description delivers everything needed to call it correctly: its role, mode-dependent inputs, per-mode return fields, downstream chains, and cursor semantics. The intentional omissions (limit, similarity_threshold details) are fully covered by the 100% schema documentation, and the output schema relieves the description of explaining return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — every parameter carries detailed documentation of defaults, ranges, and mode-coupling rules. The description's sentence on mode/parameter coupling is a useful consolidation but restates what the query, structure, and search_type schema entries already say. With the schema doing the heavy lifting, the rubric's baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening phrase 'Discovery entry point for compounds' stakes out a distinctive role among the siblings — a search/discovery tool rather than a record lookup. It enumerates the two search families (name lookups and the three structure modes) and names the accepted identifier types. The chaining guidance to chembl_get_bioactivities and chembl_get_drug_info makes it distinguishable from those get-lookup siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear usage context: it is the compound discovery entry point, and results should be chained via molecule_chembl_id into chembl_get_bioactivities or chembl_get_drug_info, which effectively names the downstream alternatives. It stops short of explicit when-not guidance, such as telling an agent to go straight to chembl_get_bioactivities when it already holds a ChEMBL ID, and it does not contrast itself with chembl_search_targets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chembl_search_targetschembl-search-targetsARead-onlyIdempotentInspect
Resolve a protein/gene/UniProt accession to the ChEMBL target ID that chembl_get_bioactivities needs for the target→leads workflow. Supply at least one of accession (UniProt, e.g. P00533), gene_symbol (e.g. EGFR), or query (free-text name); filter further by organism and target_type. Returns each target with its type, organism, and component UniProt accessions + gene symbols. A UniProt accession from the uniprot/protein server is the most precise input. A capped result carries nextCursor — pass it back as cursor with the same filters to read the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum targets to return. Defaults to the server default (25) when omitted. | |
| query | No | Free-text name match against the target preferred name, e.g. "kinase" or "growth factor receptor". | |
| cursor | No | Opaque continuation token from a previous call's nextCursor — resumes where that page ended. Omit for the first page. Re-send the same accession/gene_symbol/query/filters that minted it (only limit may change; it sets this page's size); redeeming it against different filters walks a different result set. | |
| organism | No | Restrict to a source organism, e.g. "Homo sapiens" (case-insensitive exact match). | |
| accession | No | UniProt accession of a target component, e.g. "P00533". The most precise resolver — from the uniprot/protein server. | |
| gene_symbol | No | Gene symbol of a target component, e.g. "EGFR" (case-insensitive exact match). | |
| target_type | No | Restrict to a target class, e.g. "SINGLE PROTEIN" or "PROTEIN COMPLEX". |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of targets returned. |
| notice | No | Guidance when no target matched — echoes the filters and suggests how to broaden. |
| targets | No | Matching targets (up to the limit). |
| truncated | No | True when the result was capped at the limit. |
| nextCursor | No | Opaque token for the next page — pass it back as cursor with the same filters. Absent when this page is the last one. |
| totalCount | No | Total targets matching the filters before the limit was applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the call read-only, open-world, and idempotent, and the description adds pagination behavior (capped results with nextCursor/resume rules) and the shape of each returned target (type, organism, component accessions + gene symbols). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads purpose in the first sentence, then packs input requirements, return contents, and pagination into three more sentences with no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter resolver with an output schema, the description covers input selection, filtering, result content, and pagination, and it names the downstream consumer (chembl_get_bioactivities). There are no missing details an agent would need to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though every parameter already has a schema description, the description adds cross-parameter semantics that the schema cannot: at least one of accession/gene_symbol/query is required, accession is the most precise resolver, and cursor must be reused with identical filters. Examples like P00533 and EGFR reinforce the mapping.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb ('Resolve'), a concrete resource (protein/gene/UniProt accession), and the exact output (ChEMBL target ID), and ties it to the target→leads workflow. This makes its role distinct from sibling search tools like chembl_search_molecules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when the tool is needed (before chembl_get_bioactivities in the target→leads workflow) and which inputs to supply, including the preference for UniProt accessions as 'the most precise input.' It does not explicitly list when to choose an alternative, so an agent receives clear context but no formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
- Changed
chembl_get_assay2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: ChEMBL has no record for the requested identifier or structure. `rate_limited`: ChEMBL rate-limits the upstream request. Other values are possible when a failure originates below the handler." - added
Output schema / properties / error / properties / data / properties / reason / examplesAdded value: +[ + "not_found", + "rate_limited" +]
- Changed
chembl_get_bioactivities2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `missing_filter`: Neither molecule_chembl_id nor target_chembl_id was supplied, so the query had nothing to scope to. `contradictory_potency_filter`: pchembl_value_min was supplied alongside potency_view \"null_potency\", whose rows have no pchembl_value for the floor to compare against — the combination can only ever match zero measurements. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: ChEMBL has no record for the requested identifier or structure. `rate_limited`: ChEMBL rate-limits the upstream request. `missing_filter`: Neither molecule_chembl_id nor target_chembl_id was supplied, so the query had nothing to scope to. `contradictory_potency_filter`: pchembl_value_min was supplied alongside potency_view \"null_potency\", whose rows have no pchembl_value for the floor to compare against — the combination can only ever match zero measurements. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "missing_filter", - "contradictory_potency_filter" -]New value: +[ + "not_found", + "rate_limited", + "missing_filter", + "contradictory_potency_filter" +]
- Changed
chembl_get_drug_info2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: ChEMBL has no record for the requested identifier or structure. `rate_limited`: ChEMBL rate-limits the upstream request. Other values are possible when a failure originates below the handler." - added
Output schema / properties / error / properties / data / properties / reason / examplesAdded value: +[ + "not_found", + "rate_limited" +]
- Changed
chembl_search_molecules2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `missing_input`: Neither query nor structure was supplied, or a structure search_type was chosen without a structure. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: ChEMBL has no record for the requested identifier or structure. `rate_limited`: ChEMBL rate-limits the upstream request. `missing_input`: Neither query nor structure was supplied, or a structure search_type was chosen without a structure. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "missing_input" -]New value: +[ + "not_found", + "rate_limited", + "missing_input" +]
- Changed
chembl_search_targets2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `missing_input`: None of query, accession, or gene_symbol was supplied. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: ChEMBL has no record for the requested identifier or structure. `rate_limited`: ChEMBL rate-limits the upstream request. `missing_input`: None of query, accession, or gene_symbol was supplied. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "missing_input" -]New value: +[ + "not_found", + "rate_limited", + "missing_input" +]
7 tool updates
- Changed
chembl_dataframe_describe1 field changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$"
- Changed
chembl_dataframe_query1 field changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$"
- Changed
chembl_get_assay14 fields changed- removed
Output schema / properties / assay_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / assay_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / assay_type_description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / assay_type_description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / confidence_description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / confidence_description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / confidence_score / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / confidence_score / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / organism / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / organism / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / target_chembl_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / target_chembl_id / typeAdded value: +[ + "string", + "null" +]
- Changed
chembl_get_bioactivities43 fields changed- added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - removed
Output schema / properties / activities / items / properties / assay_description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / assay_description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / assay_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / assay_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / molecule_pref_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / molecule_pref_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / pchembl_value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / pchembl_value / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / activities / items / properties / relation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / relation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / standard_relation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / standard_relation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / standard_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / standard_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / standard_units / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / standard_units / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / standard_value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / standard_value / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / activities / items / properties / target_organism / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / target_organism / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / target_pref_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / target_pref_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / units / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / units / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / activities / items / properties / value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / activities / items / properties / value / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / appliedFilters / properties / assay_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / appliedFilters / properties / assay_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / appliedFilters / properties / organism / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / appliedFilters / properties / organism / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / appliedFilters / properties / pchembl_value_min / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / appliedFilters / properties / pchembl_value_min / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / appliedFilters / properties / standard_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / appliedFilters / properties / standard_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / canvas_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / canvas_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / staged_row_count / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / staged_row_count / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / table_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / table_name / typeAdded value: +[ + "string", + "null" +]
- Changed
chembl_get_drug_info22 fields changed- removed
Output schema / properties / first_approval / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / first_approval / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / indications / items / properties / efo_term / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / indications / items / properties / efo_term / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / indications / items / properties / max_phase_for_ind / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / indications / items / properties / max_phase_for_ind / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / indications / items / properties / mesh_heading / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / indications / items / properties / mesh_heading / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / indications_total_count / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / indications_total_count / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / max_phase / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / max_phase / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / mechanisms / items / properties / action_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mechanisms / items / properties / action_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mechanisms / items / properties / mechanism_of_action / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mechanisms / items / properties / mechanism_of_action / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mechanisms / items / properties / target_chembl_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mechanisms / items / properties / target_chembl_id / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mechanisms_total_count / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / mechanisms_total_count / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / pref_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / pref_name / typeAdded value: +[ + "string", + "null" +]
- Changed
chembl_search_molecules22 fields changed- removed
Output schema / properties / molecules / items / properties / alogp / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / alogp / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / molecules / items / properties / canonical_smiles / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / canonical_smiles / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / molecules / items / properties / full_molformula / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / full_molformula / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / molecules / items / properties / max_phase / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / max_phase / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / molecules / items / properties / molecule_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / molecule_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / molecules / items / properties / mw_freebase / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / mw_freebase / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / molecules / items / properties / num_ro5_violations / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / num_ro5_violations / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / molecules / items / properties / pref_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / pref_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / molecules / items / properties / qed_weighted / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / qed_weighted / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / molecules / items / properties / similarity / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / similarity / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / molecules / items / properties / standard_inchi_key / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / molecules / items / properties / standard_inchi_key / typeAdded value: +[ + "string", + "null" +]
- Changed
chembl_search_targets8 fields changed- removed
Output schema / properties / targets / items / properties / components / items / properties / accession / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / targets / items / properties / components / items / properties / accession / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / targets / items / properties / organism / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / targets / items / properties / organism / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / targets / items / properties / pref_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / targets / items / properties / pref_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / targets / items / properties / target_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / targets / items / properties / target_type / typeAdded value: +[ + "string", + "null" +]
7 tool updates
- Changed
chembl_dataframe_describe6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "tables" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Called while CANVAS_PROVIDER_TYPE is not duckdb, so no canvas exists. Other values are possible when a failure originates below the handler.", + "examples": [ + "canvas_disabled" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "tables" -]
- Changed
chembl_dataframe_query6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "rows", + "row_count", + "rendered_rows", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Called while CANVAS_PROVIDER_TYPE is not duckdb, so no canvas exists. Other values are possible when a failure originates below the handler.", + "examples": [ + "canvas_disabled" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "rows", - "row_count", - "rendered_rows", - "truncated" -]
- Changed
chembl_get_assay6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "assay_chembl_id", + "description", + "assay_type", + "assay_type_description", + "target_chembl_id", + "organism", + "confidence_score", + "confidence_description" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "assay_chembl_id", - "description", - "assay_type", - "assay_type_description", - "target_chembl_id", - "organism", - "confidence_score", - "confidence_description" -]
- Changed
chembl_get_bioactivities6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "activities", + "totalCount", + "potency_view", + "spilled", + "canvas_id", + "table_name", + "staged_row_count", + "truncated", + "canvasDisabled", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `missing_filter`: Neither molecule_chembl_id nor target_chembl_id was supplied, so the query had nothing to scope to. `contradictory_potency_filter`: pchembl_value_min was supplied alongside potency_view \"null_potency\", whose rows have no pchembl_value for the floor to compare against — the combination can only ever match zero measurements. Other values are possible when a failure originates below the handler.", + "examples": [ + "missing_filter", + "contradictory_potency_filter" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "activities", - "totalCount", - "potency_view", - "spilled", - "canvas_id", - "table_name", - "staged_row_count", - "truncated", - "canvasDisabled", - "appliedFilters" -]
- Changed
chembl_get_drug_info6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "molecule_chembl_id", + "pref_name", + "max_phase", + "first_approval", + "mechanisms", + "mechanisms_total_count", + "mechanisms_status", + "indications", + "indications_total_count", + "indications_status" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "molecule_chembl_id", - "pref_name", - "max_phase", - "first_approval", - "mechanisms", - "mechanisms_total_count", - "mechanisms_status", - "indications", - "indications_total_count", - "indications_status" -]
- Changed
chembl_search_molecules6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "molecules", + "totalCount", + "truncated", + "shown", + "cap" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `missing_input`: Neither query nor structure was supplied, or a structure search_type was chosen without a structure. Other values are possible when a failure originates below the handler.", + "examples": [ + "missing_input" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "molecules", - "totalCount", - "truncated", - "shown", - "cap" -]
- Changed
chembl_search_targets6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "targets", + "totalCount", + "truncated", + "shown", + "cap" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `missing_input`: None of query, accession, or gene_symbol was supplied. Other values are possible when a failure originates below the handler.", + "examples": [ + "missing_input" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "targets", - "totalCount", - "truncated", - "shown", - "cap" -]
2 tool updates
- Changed
chembl_search_molecules3 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque continuation token from a previous call's nextCursor — resumes where that page ended. Omit for the first page. Re-send the same query/structure/filters that minted it (only limit may change; it sets this page's size); redeeming it against different filters walks a different result set.", + "type": "string" +} - changed
Output schema / properties / molecules / items / properties / similarity / descriptionPrevious value: -"Tanimoto similarity percent (0–100) to the query structure. Present only on similarity/substructure search."New value: +"Tanimoto similarity percent (0–100) to the query structure. Present only on search_type=similarity results; on every other search_type the key is absent, not null." - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Opaque token for the next page — pass it back as cursor with the same filters. Absent when this page is the last one.", + "type": "string" +}
- Changed
chembl_search_targets2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque continuation token from a previous call's nextCursor — resumes where that page ended. Omit for the first page. Re-send the same accession/gene_symbol/query/filters that minted it (only limit may change; it sets this page's size); redeeming it against different filters walks a different result set.", + "type": "string" +} - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Opaque token for the next page — pass it back as cursor with the same filters. Absent when this page is the last one.", + "type": "string" +}
2 tool updates
- Changed
chembl_dataframe_query3 fields changed- added
Output schema / properties / rendered_rowsAdded value: +{ + "description": "How many of those rows the markdown table in content[] holds. Below row_count when the rendered table reached its character budget — a rendering bound, INDEPENDENT of truncated: a response can be truncated:false and still render fewer rows than row_count. Re-run the same SQL with LIMIT/OFFSET to read the rows past it.", + "type": "number" +} - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the SQL result exceeded the canvas row cap and was truncated."New value: +"True when the SQL result exceeded the canvas row cap and was truncated — the engine bounding the result set itself, not the rendering. Independent of rendered_rows; page past it with LIMIT/OFFSET." - changed
Output schema / requiredPrevious value: -[ - "rows", - "row_count", - "truncated" -]New value: +[ + "rows", + "row_count", + "rendered_rows", + "truncated" +]
- Changed
chembl_get_drug_info8 fields changed- changed
Output schema / properties / indications / descriptionPrevious value: -"Clinical indications. Empty when none are recorded."New value: +"Clinical indications. Empty is authoritative only when indications_status is \"complete\"." - added
Output schema / properties / indications_statusAdded value: +{ + "description": "Retrieval state of the indication list. \"complete\" = every row ChEMBL records is present, so an empty array is a fact about the molecule. \"truncated\" = the single-request page cap bounded the list, so the array is a prefix of indications_total_count rows. \"failed\" = the upstream request was rejected, so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry.", + "enum": [ + "complete", + "truncated", + "failed" + ], + "type": "string" +} - added
Output schema / properties / indications_total_countAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Total indication rows ChEMBL holds for this molecule (upstream page_meta.total_count). Exceeds the returned array length exactly when the status is \"truncated\". Null when the fetch failed — the count is unknown, never 0." +} - changed
Output schema / properties / mechanisms / descriptionPrevious value: -"Mechanisms of action. Empty when none are recorded."New value: +"Mechanisms of action. Empty is authoritative only when mechanisms_status is \"complete\"." - added
Output schema / properties / mechanisms_statusAdded value: +{ + "description": "Retrieval state of the mechanism list. \"complete\" = every row ChEMBL records is present, so an empty array is a fact about the molecule. \"truncated\" = the single-request page cap bounded the list, so the array is a prefix of mechanisms_total_count rows. \"failed\" = the upstream request was rejected, so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry.", + "enum": [ + "complete", + "truncated", + "failed" + ], + "type": "string" +} - added
Output schema / properties / mechanisms_total_countAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Total mechanism rows ChEMBL holds for this molecule (upstream page_meta.total_count). Exceeds the returned array length exactly when the status is \"truncated\". Null when the fetch failed — the count is unknown, never 0." +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when no pharmacology was found — the molecule may be a research compound, not a drug."New value: +"Disclosure of anything the two lists do not say for themselves: a list whose upstream fetch failed (so its emptiness means nothing), a list the page cap bounded, or — only when both lists came back complete and empty — that the molecule may be a research compound rather than a drug." - changed
Output schema / requiredPrevious value: -[ - "molecule_chembl_id", - "pref_name", - "max_phase", - "first_approval", - "mechanisms", - "indications" -]New value: +[ + "molecule_chembl_id", + "pref_name", + "max_phase", + "first_approval", + "mechanisms", + "mechanisms_total_count", + "mechanisms_status", + "indications", + "indications_total_count", + "indications_status" +]
7 tool updates
- First observed
chembl_dataframe_describe - First observed
chembl_dataframe_query - First observed
chembl_get_assay - First observed
chembl_get_bioactivities - First observed
chembl_get_drug_info - First observed
chembl_search_molecules - First observed
chembl_search_targets
Related MCP Connectors
Biomedical data: compounds, drug info, and molecular targets
Search PubChem compounds, properties, safety data, bioactivity, and cross-references.
Pharma Intel MCP — Compound tools that chain ClinicalTrials.gov,
BindingDB — measured protein/small-molecule binding affinities.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables querying BindingDB for measured protein/small-molecule binding affinities, including finding ligands that bind a protein, protein targets for a compound, and affinities from PDB structures.19 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying ChEMBL drug discovery database for molecules, targets, activities, and drug indications. Part of Pipeworx MCP gateway.255 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying roughly 3.2 million measured protein–ligand binding affinities from a local, read-only DuckDB build of the BindingDB MySQL dump, with tools for searching compounds and targets, retrieving potency and selectivity profiles, fetching activity records with assay and citation details, and running read-only SQL.BSD 3-Clause
- AlicenseNot gradedqualityBmaintenanceProvides access to the NIH PubChem chemistry compound database, enabling queries for compound synonyms and other data through natural language.29 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.