npx skills add ...
npx skills add mims-harvard/tooluniverse --skill tooluniverse-dataset-discovery
Find and evaluate research datasets for any scientific question. Maps research questions to required study designs (longitudinal vs cross-sectional, observational vs experimental, single-cohort vs multi-cohort). Use when the user asks 'find data about X', 'where can I get data on Y', or needs a specific cohort/survey/repository. Covers GEO, ArrayExpress, dbGaP, NHANES, UK Biobank, ClinicalTrials.gov, GWAS Catalog, and 30+ scientific repositories.
npx skills add mims-harvard/tooluniverse --skill tooluniverse-dataset-discovery
Before searching, determine the minimum data requirements:
Study design needed:
Variables needed:
Population needed:
Search from broadest to most specific. Use find_tools to discover available dataset search tools — don't rely on memorized tool names.
Layer 1 — Cross-repository search (cast wide net): Search tools that index datasets across thousands of repositories. These find datasets you didn't know existed.
re3data_search_repositories/re3data_get_repository — a registry of 3,000+ research data REPOSITORIES themselves (not individual datasets), covering every discipline; use this one level up from a dataset search when the question is "what repository should I even be looking in for this kind of data" (verified live: searching returns real health-research repositories, e.g. the "EPIC study" cohort and "Pacific Islands Families Study"). Once you've identified the right repository from re3data, go search inside it with the domain-specific tools in Layer 2 below.Layer 2 — Domain-specific repositories: Search repositories specialized for your data type.
DHSProgram_search_indicators/_get_data) for the international/LMIC equivalent -- fertility, maternal/child mortality, nutrition, immunization, HIV indicators across national surveys, filterable by country and yearDDBJ_search_entries/_get_entry/_get_cross_references) -- the third INSDC archive alongside SRA/ENA, plus GEA/MetaboBank entries; also GSA (GSA_get_accession) for China's national genomics archiveDbGaP_search_studies/_get_study) and EGA (EGA_get_study/_get_dataset/_get_study_datasets) -- both require a separate data-access request process; these tools return study/dataset metadata, not the underlying genotype data itselfSynapse_search_entities finds public Synapse projects/folders/files/tables/datasets by keyword (node_type narrows it), Synapse_get_entity returns the curated annotations (assay, species, tissue, disease), and Synapse_list_children browses a project. Anonymous and read-only: restricted entities return a clear "not public" error and file contents are not downloaded -- data access still goes through synapse.org.Layer 3 — Literature-based discovery: Many datasets aren't in any repository — they're described in paper methods sections.
For each candidate dataset, assess these dimensions:
Variables:
Design match:
Sample:
Access:
Quality:
Don't stop at finding datasets — download and analyze them. Write and run Python code via Bash. Never describe what you "would do" — execute it.
Choose the loader that matches your data source. When unsure of the format, download a small sample first and inspect.
Always run the code and report actual numbers (β, p-value, CI, N).
Structure the report as:
Critical honesty rules:
Never assume a dataset exists — search for it. Never assume access is public — check. Never assume variables are measured the way you need — verify the codebook.
# Merge multiple files on participant/sample ID
merged = df1.merge(df2, on="id_col", how="inner")
# Filter population
subset = merged[(merged["age"] >= 60) & (merged["age"] <= 80)].copy()
# Handle missing values
missing_pct = subset.isnull().mean() * 100
print("Missing % per variable:\n", missing_pct[missing_pct > 0].sort_values(ascending=False))
subset = subset.dropna(subset=["exposure_var", "outcome_var"])
# Quick regression
import statsmodels.formula.api as smf
model = smf.ols("outcome ~ exposure + age + sex", data=subset).fit()
print(model.summary())
# Visualization
import matplotlib.pyplot as plt
plt.scatter(subset["exposure"], subset["outcome"], alpha=0.3)
plt.xlabel("Exposure"); plt.ylabel("Outcome")
plt.savefig("/tmp/scatter.png", dpi=150, bbox_inches="tight")