Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Query gnomAD (Genome Aggregation Database) for population allele frequencies, variant constraint scores (pLI, LOEUF), and loss-of-function intolerance. Essential for variant pathogenicity interpretation, rare disease genetics, and identifying loss-of-function intolerant genes.
.claude/skills/gnomad-database/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | — | — |
| case-18 | ✓→✓ | = Same ✓ | — | — |
| case-01 | ✗→✗ | = Same ✗ | — | — |
| case-09 | ✗→✗ | = Same ✗ | — | — |
| case-08 | ✗→✗ | = Same ✗ | — | — |
The Genome Aggregation Database (gnomAD) is the largest publicly available collection of human genetic variation, aggregated from large-scale sequencing projects. gnomAD v4 contains exome sequences from 730,947 individuals and genome sequences from 76,215 individuals across diverse ancestries. It provides population allele frequencies, variant consequence annotations, and gene-level constraint metrics that are essential for interpreting the clinical significance of genetic variants.
Key resources:
Use gnomAD when:
gnomAD uses a GraphQL API accessible at https://gnomad.broadinstitute.org/api. Most queries fetch variants by gene or specific genomic position.
Datasets available:
gnomad_r4 — gnomAD v4 exomes (recommended default, GRCh38)gnomad_r4_genomes — gnomAD v4 genomes (GRCh38)gnomad_r3 — gnomAD v3 genomes (GRCh38)gnomad_r2_1 — gnomAD v2 exomes (GRCh37)Reference genomes:
GRCh38 — default for v3/v4GRCh37 — for v2pythonimport requests def query_gnomad_gene(gene_symbol, dataset="gnomad_r4", reference_genome="GRCh38"): """Fetch variants in a gene from gnomAD.""" url = "https://gnomad.broadinstitute.org/api" query = """ query GeneVariants($gene_symbol: String!, $dataset: DatasetId!, $reference_genome: ReferenceGenomeId!) { gene(gene_symbol: $gene_symbol, reference_genome: $reference_genome) { gene_id gene_symbol variants(dataset: $dataset) { variant_id pos ref alt consequence genome { af ac an ac_hom populations { id ac an af } } exome { af ac an ac_hom } lof lof_flags lof_filter } } } """ variables = { "gene_symbol": gene_symbol, "dataset": dataset, "reference_genome": reference_genome } response = requests.post(url, json={"query": query, "variables": variables}) return response.json() # Example result = query_gnomad_gene("BRCA1") gene_data = result["data"]["gene"] variants = gene_data["variants"] # Filter to rare PTVs rare_ptvs = [ v for v in variants if v.get("lof") == "LC" or v.get("consequence") in ["stop_gained", "frameshift_variant"] and v.get("genome", {}).get("af", 1) < 0.001 ] print(f"Found {len(rare_ptvs)} rare PTVs in {gene_data['gene_symbol']}")
pythonimport requests def query_gnomad_variant(variant_id, dataset="gnomad_r4"): """Fetch details for a specific variant (e.g., '1-55516888-G-GA').""" url = "https://gnomad.broadinstitute.org/api" query = """ query VariantDetails($variantId: String!, $dataset: DatasetId!) { variant(variantId: $variantId, dataset: $dataset) { variant_id chrom pos ref alt genome { af ac an ac_hom populations { id ac an af } } exome { af ac an ac_hom populations { id ac an af } } consequence lof rsids in_silico_predictors { id value flags } clinvar_variation_id } } """ response = requests.post( url, json={"query": query, "variables": {"variantId": variant_id, "dataset": dataset}} ) return response.json() # Example: query a specific variant result = query_gnomad_variant("17-43094692-G-A") # BRCA1 missense variant = result["data"]["variant"] if variant: genome_af = variant.get("genome", {}).get("af", "N/A") exome_af = variant.get("exome", {}).get("af", "N/A") print(f"Variant: {variant['variant_id']}") print(f" Consequence: {variant['consequence']}") print(f" Genome AF: {genome_af}") print(f" Exome AF: {exome_af}") print(f" LoF: {variant.get('lof')}")
gnomAD constraint scores assess how tolerant a gene is to variation relative to expectation:
pythonimport requests def query_gnomad_constraint(gene_symbol, reference_genome="GRCh38"): """Fetch constraint scores for a gene.""" url = "https://gnomad.broadinstitute.org/api" query = """ query GeneConstraint($gene_symbol: String!, $reference_genome: ReferenceGenomeId!) { gene(gene_symbol: $gene_symbol, reference_genome: $reference_genome) { gene_id gene_symbol gnomad_constraint { exp_lof exp_mis exp_syn obs_lof obs_mis obs_syn oe_lof oe_mis oe_syn oe_lof_lower oe_lof_upper lof_z mis_z syn_z pLI } } } """ response = requests.post( url, json={"query": query, "variables": {"gene_symbol": gene_symbol, "reference_genome": reference_genome}} ) return response.json() # Example result = query_gnomad_constraint("KCNQ2") gene = result["data"]["gene"] constraint = gene["gnomad_constraint"] print(f"Gene: {gene['gene_symbol']}") print(f" pLI: {constraint['pLI']:.3f} (>0.9 = LoF intolerant)") print(f" LOEUF: {constraint['oe_lof_upper']:.3f} (<0.35 = highly constrained)") print(f" Obs/Exp LoF: {constraint['oe_lof']:.3f}") print(f" Missense Z: {constraint['mis_z']:.3f}")
Constraint score interpretation: | Score | Range | Meaning | |-------|-------|---------| | pLI | 0–1 | Probability of LoF intolerance; >0.9 = highly intolerant | | LOEUF | 0–∞ | LoF observed/expected upper bound; <0.35 = constrained | | oe_lof | 0–∞ | Observed/expected ratio for LoF variants | | mis_z | −∞ to ∞ | Missense constraint z-score; >3.09 = constrained | | syn_z | −∞ to ∞ | Synonymous z-score (control; should be near 0) |
pythonimport requests import pandas as pd def get_population_frequencies(variant_id, dataset="gnomad_r4"): """Extract per-population allele frequencies for a variant.""" url = "https://gnomad.broadinstitute.org/api" query = """ query PopFreqs($variantId: String!, $dataset: DatasetId!) { variant(variantId: $variantId, dataset: $dataset) { variant_id genome { populations { id ac an af ac_hom } } } } """ response = requests.post( url, json={"query": query, "variables": {"variantId": variant_id, "dataset": dataset}} ) data = response.json() populations = data["data"]["variant"]["genome"]["populations"] df = pd.DataFrame(populations) df = df[df["an"] > 0].copy() df["af"] = df["ac"] / df["an"] df = df.sort_values("af", ascending=False) return df # Population IDs in gnomAD v4: # afr = African/African American # ami = Amish # amr = Admixed American # asj = Ashkenazi Jewish # eas = East Asian # fin = Finnish # mid = Middle Eastern # nfe = Non-Finnish European # sas = South Asian # remaining = Other
gnomAD also contains a structural variant dataset:
pythonimport requests def query_gnomad_sv(gene_symbol): """Query structural variants overlapping a gene.""" url = "https://gnomad.broadinstitute.org/api" query = """ query SVsByGene($gene_symbol: String!) { gene(gene_symbol: $gene_symbol, reference_genome: GRCh38) { structural_variants { variant_id type chrom pos end af ac an } } } """ response = requests.post(url, json={"query": query, "variables": {"gene_symbol": gene_symbol}}) return response.json()
lof field: HC = high-confidence LoF, LC = low-confidencelof_flags for issues like "NAGNAG_SITE", "PHYLOCSF_WEAK"ac_hom) are relevant for recessive disease analysis| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of 0 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.