gnomad-genetics-mcp-server

v0.1.5 pre-1.0

Look up variant allele frequencies by ancestry, gene loss-of-function constraint, gene variant lists, and sequencing coverage over gnomAD — with ClinVar significance joined in — via MCP. STDIO or Streamable HTTP.

gnomad-genetics.caseyjhand.com/mcp
claude mcp add --transport http gnomad-genetics-mcp-server https://gnomad-genetics.caseyjhand.com/mcp
codex mcp add gnomad-genetics-mcp-server --url https://gnomad-genetics.caseyjhand.com/mcp
{
  "mcpServers": {
    "gnomad-genetics-mcp-server": {
      "url": "https://gnomad-genetics.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http gnomad-genetics-mcp-server https://gnomad-genetics.caseyjhand.com/mcp
{
  "mcpServers": {
    "gnomad-genetics-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://gnomad-genetics.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "gnomad-genetics-mcp-server": {
      "type": "http",
      "url": "https://gnomad-genetics.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://gnomad-genetics.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

8

read 7

gnomad_get_variant

open-world

Fetch the full gnomAD population record for one or more variants — allele count/number/frequency overall and broken down per genetic-ancestry group, homozygote and hemizygote counts, quality flags, transcript consequence, in-silico predictor scores, and joined ClinVar clinical significance. The "how common, is it benign" answer in one call. Accepts a batch of up to 25 IDs (chrom-pos-ref-alt or rsID) with per-item partial success: a malformed or absent ID lands in failed[] without failing the others. An empty found[] for a well-formed ID means the variant is not in the chosen dataset — pair with gnomad_get_coverage to confirm the position is callable before concluding true absence.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gnomad_get_variant",
    "arguments": {
      "variants": "<variants>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "variants": {
      "minItems": 1,
      "maxItems": 25,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "description": "Variant ID — chrom-pos-ref-alt (1-based, e.g. 1-55051215-G-GA) or an rsID (rs11591147). Obtain a variantId from ensembl_predict_variant or a VCF. Malformed IDs are reported per-item in failed[], not rejected wholesale."
      },
      "description": "1–25 variant IDs (chrom-pos-ref-alt or rsID) to look up in one batched call."
    },
    "dataset": {
      "description": "gnomAD dataset: gnomad_r4 (GRCh38, default), gnomad_r3 (GRCh38), gnomad_r2_1 (GRCh37), exac (GRCh37). Echoed in output.",
      "type": "string",
      "enum": [
        "gnomad_r4",
        "gnomad_r3",
        "gnomad_r2_1",
        "exac"
      ]
    },
    "reference_genome": {
      "description": "Reference build. Derived from dataset when omitted (v4/v3=GRCh38, v2.1/ExAC=GRCh37). If supplied it must match the dataset, or the call is rejected. Keep aligned with ensembl coordinates.",
      "type": "string",
      "enum": [
        "GRCh38",
        "GRCh37"
      ]
    }
  },
  "required": [
    "variants"
  ],
  "additionalProperties": false
}
view source ↗

gnomad_get_gene_constraint

open-world

Fetch gnomAD loss-of-function constraint for a gene — pLI (probability of LoF intolerance; >0.9 intolerant), LOEUF (oe_lof_upper, the headline metric; <0.6 intolerant in v4, <0.35 in v2) plus its lower bound, observed/expected ratios for LoF, missense, and synonymous variation, and the three Z-scores. This is the orthogonal axis to allele frequency: a loss-of-function variant matters far more in a gene intolerant to being broken. Accepts an HGNC symbol (PCSK9) or an Ensembl gene ID (ENSG00000169174). Many genes have null constraint (sparse upstream) — null fields are reported as such, never fabricated. v4 constraint is flagged beta by the gnomAD team; constraint_flags surfaces any caveats. Echoes the effective dataset and reference build.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gnomad_get_gene_constraint",
    "arguments": {
      "gene": "<gene>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "gene": {
      "type": "string",
      "minLength": 2,
      "description": "Gene — HGNC symbol (e.g. PCSK9) or Ensembl gene ID (e.g. ENSG00000169174). Obtain a stable ID from ensembl_lookup_gene."
    },
    "dataset": {
      "description": "gnomAD dataset: gnomad_r4 (GRCh38, default), gnomad_r3 (GRCh38), gnomad_r2_1 (GRCh37), exac (GRCh37). Echoed in output.",
      "type": "string",
      "enum": [
        "gnomad_r4",
        "gnomad_r3",
        "gnomad_r2_1",
        "exac"
      ]
    },
    "reference_genome": {
      "description": "Reference build. Derived from dataset when omitted (v4/v3=GRCh38, v2.1/ExAC=GRCh37). If supplied it must match the dataset, or the call is rejected. Keep aligned with ensembl coordinates.",
      "type": "string",
      "enum": [
        "GRCh38",
        "GRCh37"
      ]
    }
  },
  "required": [
    "gene"
  ],
  "additionalProperties": false
}
view source ↗

gnomad_list_gene_variants

open-world

List every gnomAD variant in a gene, transcript, or region with allele frequencies and predicted consequences, optionally filtered to one consequence class (lof, missense, synonymous, other) and/or a maximum allele frequency. The full result is staged on a DataCanvas table named gene_variants and an inline preview is returned alongside canvas_id and table_name — run gnomad_dataframe_query against them to rank by AF, count by consequence, or group across the complete set rather than the preview. When the canvas is disabled (CANVAS_PROVIDER_TYPE != duckdb) the tool returns a capped inline preview with spilled=false and canvas_id empty; the SQL path is then unavailable. Supply exactly one of gene, transcript_id, or region. Echoes the effective dataset and build.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gnomad_list_gene_variants",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "gene": {
      "type": "string",
      "minLength": 2,
      "description": "Gene — HGNC symbol (e.g. PCSK9) or Ensembl gene ID (e.g. ENSG00000169174). Obtain a stable ID from ensembl_lookup_gene."
    },
    "transcript_id": {
      "description": "Ensembl transcript ID (e.g. ENST00000302118). Mutually exclusive with gene and region.",
      "type": "string"
    },
    "region": {
      "description": "Genomic region chrom-start-stop (1-based inclusive). Mutually exclusive with gene and transcript_id.",
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "pattern": "^[0-9XYM]+-\\d+-\\d+$",
          "description": "Genomic region chrom-start-stop (1-based inclusive, e.g. 13-32315474-32400266)."
        }
      ]
    },
    "consequence_class": {
      "description": "Keep only variants in this consequence class. Omit to return all classes.",
      "type": "string",
      "enum": [
        "lof",
        "missense",
        "synonymous",
        "other"
      ]
    },
    "max_af": {
      "description": "Keep only variants with allele frequency ≤ this value (0–1). Variants with null AF are always kept.",
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "canvas_id": {
      "description": "Optional canvas ID from a prior call, to reuse the same canvas. Reusing it REPLACES (overwrites) the gene_variants table with this call's results — it does not append. Omit to start a fresh canvas; the response returns a new one.",
      "type": "string"
    },
    "dataset": {
      "description": "gnomAD dataset: gnomad_r4 (GRCh38, default), gnomad_r3 (GRCh38), gnomad_r2_1 (GRCh37), exac (GRCh37). Echoed in output.",
      "type": "string",
      "enum": [
        "gnomad_r4",
        "gnomad_r3",
        "gnomad_r2_1",
        "exac"
      ]
    },
    "reference_genome": {
      "description": "Reference build. Derived from dataset when omitted (v4/v3=GRCh38, v2.1/ExAC=GRCh37). If supplied it must match the dataset, or the call is rejected. Keep aligned with ensembl coordinates.",
      "type": "string",
      "enum": [
        "GRCh38",
        "GRCh37"
      ]
    }
  },
  "additionalProperties": false
}
view source ↗

gnomad_get_coverage

open-world

Fetch gnomAD sequencing-coverage summary across a gene, transcript, or region — mean and median read depth, plus the mean fraction of samples covered at each depth threshold (1× through 100×), separated by exome and genome track. Use this to disambiguate a true absent variant from an uncallable position: a variant missing from a well-covered region is informative, while one missing from a poorly-covered region is not. Supply exactly one of gene, transcript_id, or region. The optional coverage_source narrows to one track; by default both available tracks are returned. Echoes the effective dataset and build.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gnomad_get_coverage",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "gene": {
      "type": "string",
      "minLength": 2,
      "description": "Gene — HGNC symbol (e.g. PCSK9) or Ensembl gene ID (e.g. ENSG00000169174). Obtain a stable ID from ensembl_lookup_gene."
    },
    "transcript_id": {
      "description": "Ensembl transcript ID (e.g. ENST00000302118). Mutually exclusive with gene and region.",
      "type": "string"
    },
    "region": {
      "description": "Genomic region chrom-start-stop (1-based inclusive, e.g. 1-55039447-55064852). Mutually exclusive with gene and transcript_id.",
      "anyOf": [
        {
          "type": "string",
          "const": ""
        },
        {
          "type": "string",
          "pattern": "^[0-9XYM]+-\\d+-\\d+$",
          "description": "Genomic region chrom-start-stop (1-based inclusive, e.g. 1-55039447-55064852)."
        }
      ]
    },
    "coverage_source": {
      "description": "Restrict to one coverage track. Omit to return every available track.",
      "type": "string",
      "enum": [
        "exome",
        "genome"
      ]
    },
    "dataset": {
      "description": "gnomAD dataset: gnomad_r4 (GRCh38, default), gnomad_r3 (GRCh38), gnomad_r2_1 (GRCh37), exac (GRCh37). Echoed in output.",
      "type": "string",
      "enum": [
        "gnomad_r4",
        "gnomad_r3",
        "gnomad_r2_1",
        "exac"
      ]
    },
    "reference_genome": {
      "description": "Reference build. Derived from dataset when omitted (v4/v3=GRCh38, v2.1/ExAC=GRCh37). If supplied it must match the dataset, or the call is rejected. Keep aligned with ensembl coordinates.",
      "type": "string",
      "enum": [
        "GRCh38",
        "GRCh37"
      ]
    }
  },
  "additionalProperties": false
}
view source ↗

gnomad_search_clinvar

open-world

Search ClinVar (NCBI E-utilities) for a gene and return its classified variants — clinical significance, review status with a 0–4 star rating, associated conditions, molecular consequences, and submission counts — turning the variant-level significance gnomAD joins into a gene-panel curation view. Optionally filter by clinical_significance (e.g. pathogenic) and a minimum star rating. The full set is staged on a DataCanvas table named clinvar_variants with an inline preview; query it with gnomad_dataframe_query to rank or count across the complete set. Keyless, but honors NCBI_API_KEY for a higher rate limit. When the canvas is disabled the tool returns a capped inline preview with spilled=false. Credit: ClinVar, NCBI.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gnomad_search_clinvar",
    "arguments": {
      "gene": "<gene>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "gene": {
      "type": "string",
      "minLength": 2,
      "description": "Gene HGNC symbol (e.g. PCSK9). ClinVar indexes HGNC symbols only — Ensembl gene IDs (ENSG…) are not resolved here, unlike the other gnomAD tools; resolve one to its symbol via ensembl_lookup_gene."
    },
    "clinical_significance": {
      "description": "Filter by ClinVar clinical significance term (e.g. pathogenic, likely_pathogenic, benign).",
      "type": "string"
    },
    "min_review_stars": {
      "description": "Keep only variants with at least this gold-star review rating (0–4).",
      "type": "integer",
      "minimum": 0,
      "maximum": 4
    },
    "canvas_id": {
      "description": "Optional canvas ID from a prior call, to reuse the same canvas. Reusing it REPLACES (overwrites) the clinvar_variants table with this call's results — it does not append. Omit to start a fresh canvas; the response returns a new one.",
      "type": "string"
    }
  },
  "required": [
    "gene"
  ],
  "additionalProperties": false
}
view source ↗

gnomad_dataframe_query

Run a read-only SQL SELECT against a canvas table staged by gnomad_list_gene_variants (table gene_variants) or gnomad_search_clinvar (table clinvar_variants). Use the canvas_id and table_name those tools returned to rank by allele frequency, group by consequence class, count loss-of-function variants, or filter the full set the inline preview only sampled. SELECT statements only — writes, DDL, and file/HTTP table functions are rejected by the canvas gate. Call gnomad_dataframe_describe first to discover staged table and column names.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gnomad_dataframe_query",
    "arguments": {
      "canvas_id": "<canvas_id>",
      "sql": "<sql>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "canvas_id": {
      "type": "string",
      "minLength": 1,
      "description": "Canvas ID returned by gnomad_list_gene_variants or gnomad_search_clinvar."
    },
    "sql": {
      "type": "string",
      "minLength": 1,
      "description": "Read-only SQL SELECT. Reference tables by the names the staging tool returned (e.g. gene_variants)."
    }
  },
  "required": [
    "canvas_id",
    "sql"
  ],
  "additionalProperties": false
}
view source ↗

gnomad_dataframe_describe

List the tables staged on a canvas and their columns (name and type) so you can write correct SQL for gnomad_dataframe_query. Use the canvas_id returned by gnomad_list_gene_variants or gnomad_search_clinvar. Returns one entry per table with its row count and column schema.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "gnomad_dataframe_describe",
    "arguments": {
      "canvas_id": "<canvas_id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "canvas_id": {
      "type": "string",
      "minLength": 1,
      "description": "Canvas ID returned by a prior staging call (gnomad_list_gene_variants or gnomad_search_clinvar)."
    }
  },
  "required": [
    "canvas_id"
  ],
  "additionalProperties": false
}
view source ↗

disabled 1

gnomad_dataframe_drop

Drop a named table from a canvas to reclaim memory. Opt-in and off by default — a deliberate mutation on the otherwise read-only research surface. Use the canvas_id and table_name from a prior staging call. Per-table TTL already reclaims memory automatically, so this is a convenience for operators who want manual control.

disabledwould be destructive

Disabled. Canvas table drop is turned off in this deployment — the research surface stays read-only.

GNOMAD_DATAFRAME_DROP_ENABLED=true
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "canvas_id": {
      "type": "string",
      "minLength": 1,
      "description": "Canvas ID holding the table to drop."
    },
    "table_name": {
      "type": "string",
      "minLength": 1,
      "description": "Name of the table to drop (e.g. gene_variants, clinvar_variants)."
    }
  },
  "required": [
    "canvas_id",
    "table_name"
  ],
  "additionalProperties": false
}
view source ↗

Resources

2

Population record for one gnomAD variant — AC/AN/AF overall and per ancestry, counts, flags, consequence, in-silico predictors, and joined ClinVar significance. Mirrors gnomad_get_variant. The dataset segment (e.g. gnomad_r4) makes the URI self-describing.

uri gnomad://variant/{dataset}/{variantId} mime application/json

gnomAD loss-of-function constraint for a gene — pLI, LOEUF (oe_lof_upper) with CI, observed/expected ratios, and Z-scores. Mirrors gnomad_get_gene_constraint. The gene segment is an HGNC symbol or Ensembl gene ID.

uri gnomad://gene/{dataset}/{gene}/constraint mime application/json

Prompts

1

Guided rare-disease variant-triage workflow over gnomAD: pull the variant population record, weigh it against gene loss-of-function constraint, and — critically — confirm the position is well-covered before concluding a variant is absent. Emits the exact tool chain in order.

  • variantrequired — Variant to triage — a chrom-pos-ref-alt variantId (e.g. 1-55051215-G-GA) or an rsID (rs11591147).
  • gene — Gene symbol or Ensembl ID for the constraint step (e.g. PCSK9). Omit if not yet known.
  • dataset — gnomAD dataset to use (e.g. gnomad_r4, gnomad_r2_1). Defaults to the server default when omitted.