tox-antitargets-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tox-antitargets-mcp-serverCompute inverse docking profile for aspirin"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tox-antitargets-mcp-server
An MCP server that reproduces the results of:
Nikitin, I.; Morgunov, I.; Safronov, V.; Kalyuzhnaya, A.; Fedorov, M. Towards Explainable Computational Toxicology: Linking Antitargets to Rodent Acute Toxicity. Pharmaceutics 2025, 17, 1573. https://doi.org/10.3390/pharmaceutics17121573
It exposes every figure, statistic and finding of the paper as MCP tools, computed deterministically from the openly published dataset (chemagents/ld50-antitargets): 12,654 ligands × 44 antitarget docking scores + mouse intravenous pLD50 (556,776 scores).
The dataset CSV is bundled in server/data/ (it is also auto-downloaded from
TOX_DATASET_URL if absent), so the server runs offline and reproducibly. The expensive
Vina-GPU docking was the one-time data generation step in the paper; its output is this
dataset, so all analyses here are exact and fast — no GPU required.
Tools
Three tool names (dataset_overview, reproduce_all, reproduce_claims) collided with the
heracleum-tox and cannabis-biopesticide servers, which are exposed to the agent at the same
time. They are therefore registered under antitarget_-prefixed agent-visible names via
@mcp.tool(name=...); the Python function names are unchanged, so server.tox_server.reproduce_all
etc. still exist. The table below lists the wire names the agent must call.
Tool | Reproduces | What it returns |
| Fig. 1 / §3.1 | counts, pLD50 range, KDE plot |
| Fig. 2 / §3.1.1 | RDKit MW/logP/HBA/HBD/RB/TPSA stats + histograms |
| Fig. 3 | t-SNE of ECFP4 space coloured by pLD50 |
| Fig. 4 / §3.2 | per-protein docking medians, violin plot, CHRM2 anomaly |
| Fig. 5 / §3.3 | proteins ranked by binder-subset pLD50 (top-5) |
| §3.4.2 | NIH + Brenk filtering (12,654 → 5,392) |
| Fig. 6 / §3.4 | Mann–Whitney U test (raw or filtered subset) |
| §2.6 | ECFP4 Butina cluster statistics |
| Fig. 9 / §3.6.1 | per-protein Spearman ρ + bar plot + inline |
| Fig. 10 / §3.6.2 | Spearman per cluster × protein heatmap |
| Fig. 11 | logP-as-hidden-variable warning for a cluster |
| Fig. 8 | 44-protein interaction profile of a molecule (target fishing) |
| Fig. 7/8 | profiles of anisodamine, butaperazine, soman, 3 cannabinoids |
| Table S1 | the 44 Bowes-panel targets + names + orthology note |
| — | recomputes all headline numbers and compares to the paper |
| all | the paper's 11 conclusions, each restated with reproduced numbers |
| §3.3–3.6 | one narrative: mechanistically justified vs hidden-variable (logP) correlations |
Routing: two questions → two forward-only tool sequences
The intended usage is a sequence of natural scientific questions, not one "reproduce the
paper" request. Each question starts at one canonical entry tool. The tools repeat the question's
natural phrasing (EN + RU) in their docstrings for retrieval, then each nonterminal result returns
only its immediate successor in metadata.next_tools. This makes the route deterministic and
prevents reciprocal loops or skipped evidence.
Question | Canonical tool order |
Is antitarget affinity related to acute toxicity in mice? / Which molecular initiating events correlate with acute toxicity? |
|
Does a strong affinity↔LD50 correlation prove a mechanism? |
|
The terminal protein_panel result has next_tools=[] and opens question 2 through
metadata.next_question.entry_tool=cluster_correlation_heatmap. The terminal
logp_confounder_analysis result has next_tools=[] and workflow_status=completed. See
REPRODUCTION_QUESTIONS.md for the full scenario.
Each recommended prompt explicitly asks the agent to return every generated figure artifact with
its kind and SHA-256, rather than returning an orchestration log or a bare confirmation.
Reproducing the paper's assertions (not just numbers)
The tools return numbers; the paper's conclusions are an interpretation of them. The
antitarget_reproduce_claims tool bridges this: for each of the paper's 11 assertions it returns the
question that elicits it, the paper's claim, and a reproduced_statement (the claim restated
with our numbers) plus the supporting evidence. In CoScientist the numbers flow
ExperimentAgent (FEDOT.MAS runs the tool) → OrchestratorAgent (LLM writes the conclusion);
the finding / reproduced_statement fields keep that synthesis faithful. See
REPRODUCTION_QUESTIONS.md for the exact question list to ask
CoScientist. The bulk "reproduce everything" tool is retained only as an audit fallback, not as
the recommended user flow.
Each tool returns {"answer": ..., "metadata": ...}. Figures are saved as PNG to a local
artifacts directory (TOX_ARTIFACTS_DIR) or, if S3 is configured, uploaded and returned as
presigned URLs. metadata.figure includes artifact, kind, sha256, content_type and,
for S3, bucket, key and expires_in, so callers can verify downloaded bytes. S3 is strict:
partial credentials or an unavailable bucket fail startup, and upload errors propagate instead
of silently returning a path inside the container. TOX_S3_ALLOW_LOCAL_FALLBACK=true is an
explicit development-only opt-in to degraded local storage.
Related MCP server: skore-mcp
Reproduction fidelity
antitarget_reproduce_all and pytest tests/ assert these against the paper:
Metric | Paper | This server |
compounds / proteins / scores | 12654 / 44 / 556776 | identical |
pLD50 range | 0.77 – 7.89 | 0.77 – 7.89 |
Mann–Whitney median diff (raw) | 0.38 (p<0.05) | 0.382 (p≈5e-132) |
Mann–Whitney median diff (filtered) | 0.70 (p<0.05) | 0.697 (p<0.05) |
Top-5 antitargets | KCNH2, AVPR1A, CACNA1C, KCNQ1, EDNRA | exact order |
CHRM2 anomalous median | ≈ −4 | −4.20 (highest) |
Rotatable-bond mean | 4.78 | 4.78 |
NIH+Brenk kept | 5391 | 5392 (1 molecule; RDKit version) |
Spearman ρ range | +0.2 … −0.3 | +0.22 … −0.30 |
Butina clusters | 9665 / largest 34 / 8326 singletons | see note |
Documented, version-related deviations (faithful method; values differ slightly):
NIH+Brenk: 5392 vs 5391 — a single molecule, from RDKit catalog version differences.
Spearman median: ≈ −0.24 vs the figure's −0.14. The range matches exactly; the median is more negative because the published CSV is post-denoising (positive scores set to 0).
Butina: the paper's 9665 clusters reproduce at Tanimoto distance ≈0.28 (similarity ≈0.72) with ECFP4/2048; the stated similarity threshold 0.65 yields ≈8260. Cluster counts are highly fingerprint/version-sensitive; the qualitative finding (high structural diversity,
80% singletons, small largest cluster) is robust. The threshold is a tool parameter.
Run locally
git clone https://github.com/chemagents/tox-antitargets-mcp-server.git
cd tox-antitargets-mcp-server
cp .env.example .env
uv sync
uv run python -m server.tox_server # serves http://0.0.0.0:7331/mcpRun with Docker (standalone)
cp .env.example .env
docker compose up -d --build # host port 7335 -> container 7331This standalone mode needs no changes to CoScientist. To run it in the shared CoScientist/MinIO
stack, follow COSCIENTIST_INTEGRATION.md; the separate
Dockerfile.coscientist keeps the monorepo build context explicit.
Attach to CoScientist
CoScientist discovers MCP tools via RAG (Postgres + Qdrant). Register this server once:
# from the CoScientist repo root, with the RAG stack running and .env configured
python scripts/rag_tools/cli.py load mcp-servers/tox-antitargets-mcp-server/rag_registration.json
# or directly:
python scripts/rag_tools/cli.py add \
--url http://localhost:7335/mcp \
--name tox-antitargets \
--description "Antitarget affinity vs rodent acute toxicity (LD50): is there a relationship between antitarget affinity and acute toxicity in mice; which molecular initiating events correlate with acute toxicity; does a strong affinity–LD50 correlation prove a mechanism or is it a logP confounder. Inverse docking, hERG/Bowes safety panel (Nikitin et al. 2025)"After registration the ToolRetrieverAgent will surface these tools for toxicity / LD50 /
mechanism-of-action queries, and ExperimentAgent (FEDOT.MAS) will call them by their URL.
If CoScientist runs in the same Docker network, register the in-network URL instead:
http://tox-antitargets-mcp-server:7331/mcp.
Tests
uv run pytest tests -v
uv run pytest tests -v -m "not slow"License / data
MIT for code (see LICENSE). The dataset is released by the paper authors at chemagents/ld50-antitargets. Please cite Nikitin et al. (2025) when using these results.
This server cannot be deployed
Maintenance
Related MCP Connectors
Remote MCP server for 4chems hosted IUCLID, CHESAR and QSAR Toolbox: onboarding, inquiries, admin.
321MCP server for Riveter's enrichment, scraping, and monitoring API
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Auditable MCP server for PubMed, Europe PMC, ClinicalTrials.gov, and bioRxiv/medRxiv queries
Related MCP Servers
FlicenseNot gradedqualityAmaintenanceProvides a collection of MCP servers for computational chemistry tasks including molecular generation and retrosynthesis. Also offers property prediction and molecule pricing capabilities.-- AlicenseNot gradedqualityDmaintenanceCommunity MCP server for Skore that exposes tools for projects, evaluate, compare, train_test_split, configuration, and a dispatcher for report methods like metrics, inspection, and data analysis.MIT
- AlicenseAqualityAmaintenanceAn MCP server that gives AI assistants access to biological and biomedical RDF databases via SPARQL at the RDF Portal, as well as selected REST APIs (NCBI E-utilities, UniProt, ChEMBL, PDB, Reactome, Rhea, MeSH, and more).2918MIT
- AlicenseAqualityCmaintenanceAn MCP server for chemistry: it computes molecular weights and isotope distributions from chemical formulae and resolves compound name/formula lookups, backed by NIST atomic-weight data and a cached finder over multiple online and offline sources.41GPL 3.0