
Unified search and fetch across scientific data repositories that researchers actually use. One search query fans out to Zenodo, DataCite members like Figshare and Dryad, NCBI omics databases (GEO, SRA, BioProject), PubMed, DataONE, OmicsDI, and HuggingFace datasets, then deduplicates by DOI and normalizes everything into a single model. The resolve tool pulls full file manifests with checksums, and fetch streams files to disk with MD5 verification. Handles taxonomy synonym expansion through NCBI so renamed species don't break queries, bridges papers to their underlying datasets via eLink and ScholeXplorer, and surfaces trust signals like citation counts and version freshness. The optional operate tool lets you preview schemas and run read-only SQL against remote Parquet files without downloading them first.
Search 20 research-data sources at once (data archives, omics repositories and papers) and get one list back. Organism, disease and tissue names are expanded with their synonyms in the 12 sources that accept them, records that share a DOI are collapsed to one, and downloads are checked against the source's checksum where it publishes one.
mcp-name: io.github.musharna/data-aggregator-mcp
Claude Code:
claude mcp add data-aggregator -- uvx data-aggregator-mcp
VS Code and Cursor: the buttons above. Any other MCP client: run
uvx data-aggregator-mcp as a stdio server.
operate extraClaude Desktop (claude_desktop_config.json) and most other clients:
{
"mcpServers": {
"data-aggregator": {
"command": "uvx",
"args": ["data-aggregator-mcp"],
"env": { "NCBI_API_KEY": "your-optional-key" }
}
}
}
With pip:
pip install data-aggregator-mcp
data-aggregator-mcp # or: python -m data_aggregator_mcp
operate (SQL and previews over remote files) needs an optional extra:
pip install "data-aggregator-mcp[operate]".
"Find transcriptomes for Orobanche aegyptiaca." The species has been renamed. NCBI Taxonomy maps it to Phelipanche aegyptiaca, and the sources that accept synonyms match both names (the demo above).
"What data came out of this paper?"
resolve("pubmed:40098680")
links geo:GSE284240, bioproject:PRJNA1198054, and 18 sra: experiments
files PMC11910882.xml (open-access full text)
"Can I train a model on this dataset?"
resolve("hf:scikit-learn/iris", use="ml-training")
license_compat ALLOW: "CC0-1.0 grants the permission(s) required for
ml-training: commercial-use, modifications"
The verdict is read from the record's licence metadata. It is advice, not a legal opinion.
resolve also renders citations in any CSL style, checks Crossref for
retractions, scores FAIRness, and exports Croissant or RO-Crate. relate reports
how a set of records connect (a shared accession, DOI or explicit link).
A source that fails is named in the result's errors, never dropped silently.
Six sources return only records holding every word of the query: DataCite,
OmicsDI, NCBI omics (GEO, SRA, BioProject), CELLxGENE, the Metabolomics Workbench
and MassIVE. A longer query can find nothing there, so DataCite, OmicsDI,
CELLxGENE and the Workbench are also searched for records holding only some of the
words. Those hits rank below hits naming more of the query, total does not count
them, and errors.all_words says when a source had no record with every word. For
NCBI omics and MassIVE, keep queries short. Details:
docs/reference.md.
| Server | Searches | One search | Checksum | Remote SQL | Licence check |
|---|---|---|---|---|---|
| data-aggregator-mcp | 20 sources: data archives, omics, papers | yes, DOI dedup | where published | yes | yes |
| Mobus | 20 general and ML data platforms | yes | — | row preview | yes |
| paper-search-mcp | papers: arXiv, PubMed, OpenAlex, Crossref and more | yes, deduplicated | — | — | — |
| ToolUniverse | 1000+ tools: models, datasets, APIs, packages | papers | — | — | — |
| BioMCP | genes, variants, trials, drugs, proteins, papers | yes (search all) | — | — | — |
— means the project's README doesn't describe it (READMEs read 2026-10-04). Where they are ahead: BioMCP reaches clinical trials, ChEMBL and AlphaFold, which this server doesn't; ToolUniverse covers far more ground overall; paper-search-mcp covers far more literature sources; Mobus also compares datasets and checks schema compatibility. More detail: docs/POSITIONING.md.
| Source | Discover | Fetch | Checksum |
|---|---|---|---|
| Zenodo | ✅ | ✅ | md5 |
| DataCite → Figshare | ✅ | ✅ | md5 |
| DataCite → Dataverse | ✅ | ✅ | md5 |
| DataCite → OSF | ✅ | ✅ | md5 |
| DataCite → Dryad | ✅ | manifest only¹ | sha-256 (listed) |
| DataCite → Mendeley & others | ✅ | — | — |
| NCBI SRA | ✅ | ✅ (ENA FASTQ) | md5 |
| NCBI GEO | ✅ | ✅ (suppl/) | none² |
| NCBI BioProject | ✅ | → SRA links | — |
| PubMed / OpenAIRE | ✅ | ✅ (OA full text) | none³ |
| Hugging Face datasets | ✅ | ✅ (resolve URL) | none² |
| DataONE (eco/env) | ✅ | ✅ (Member Node) | md5 / sha-256 |
| OmicsDI → PRIDE | ✅ | ✅ (HTTPS FTP) | none² |
| OmicsDI → MetaboLights | ✅ | ✅ (HTTPS FTP) | sha-256 |
| OmicsDI → other MS repos | ✅ | — | — |
| DataCite → OpenNeuro | ✅ | ✅ (snapshot) | none² |
| DANDI (neurophysiology) | ✅ | ✅ (302→S3) | sha-256 |
| CZ CELLxGENE (single-cell) | ✅ | ✅ (H5AD/RDS) | none² |
| OpenML (ML datasets) | ✅ | ✅ (ARFF) | md5 |
| RCSB PDB (structures) | ✅ | ✅ (.cif/.pdb) | none² |
| UniProtKB (proteins) | ✅ | ✅ (FASTA) | none² |
| BioStudies (EBI) | ✅ | ✅ (study files) | none² |
| GBIF (biodiversity) | ✅ | ✅ (Darwin Core)⁴ | none² |
| data.gov (DCAT-US) | ✅ | ✅ (file URL)⁴ | none³ |
| NASA CMR (Earth science) | ✅ | —⁵ | — |
| GWAS Catalog | ✅ | → PMID bridge | — |
| NGDC BioProject (China) | ✅ | → GSA read sets | — |
| Metabolomics Workbench | ✅ | — | — |
| MassIVE (mass spectrometry) | ✅ | — | — |
¹ Dryad downloads are token / bot-challenge gated, so fetch returns an error;
resolve still lists the files.
² No upstream checksum, so fetch does not verify these bytes. It still returns
an error on an HTTP error or when the download exceeds max_bytes.
³ No upstream checksum. Files declared as PDF or XML (literature full text, and data.gov distributions with that mediaType) get an HTML sniff: an HTML login or paywall page served in their place returns an error. Other files are not checked.
⁴ Only records that carry a downloadable file (a GBIF Darwin Core Archive, a data.gov distribution URL); metadata-only records are discovery-only.
⁵ Discovery-only: granule downloads need an Earthdata login, which is not wired.
resolve returns the DOI and a data-access portal link.
Every tool and parameter, the HTTP transport (--transport http), and the
environment variables: docs/reference.md.
uv venv && uv pip install -e ".[dev]"
uv run pytest -q
uv run ruff check src tests
DATA_AGGREGATOR_MCP_LIVE=1 uv run pytest -k live -q # real-API probes
The README demo (examples/assets/demo.svg) is recorded from live calls by
examples/_demo_search.py; its header has the commands to re-record it.
MIT — see LICENSE.
NCBI_API_KEYsecretOptional NCBI E-utilities API key; raises the rate limit 3->10 req/s for omics, literature, and taxonomy lookups.