The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Gnomad Genetics MCP Server listing page.
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.
Public Hosted Server: https://gnomad-genetics.caseyjhand.com/mcp
Five gnomAD tools, plus three for SQL analytics over the DuckDB-backed canvas tables the list tools materialize:
| Tool | Description |
|---|---|
gnomad_get_variant | Full population record for one or more variants — AC/AN/AF overall and per genetic-ancestry group, homozygote/hemizygote counts, quality flags, transcript consequence, in-silico predictors, and joined ClinVar significance. Batch up to 25 IDs with per-item partial success. |
gnomad_get_gene_constraint | Gene loss-of-function constraint — pLI, LOEUF (oe_lof_upper) with CI, observed/expected ratios, and Z-scores. By HGNC symbol or Ensembl gene ID. |
gnomad_list_gene_variants | Every variant in a gene, transcript, or region with allele frequencies and predicted consequences, filterable by consequence class and max AF. Spills to the gene_variants canvas table. |
gnomad_get_coverage | Sequencing coverage across a gene, transcript, or region — mean/median depth and the fraction of samples over depth thresholds, per callset track. Tells a true absent variant from an uncallable position. |
gnomad_search_clinvar | Gene-level ClinVar detail via NCBI E-utilities — classified variants, review status (star rating), conditions, and submission counts. Spills to the clinvar_variants canvas table. |
gnomad_dataframe_query | Run a read-only SQL SELECT across canvas tables staged by the list tools. |
gnomad_dataframe_describe | List the tables staged on a canvas and their columns before writing SQL. |
gnomad_dataframe_drop | Drop a named table from a canvas to reclaim memory. Opt-in via GNOMAD_DATAFRAME_DROP_ENABLED=true — off by default since per-table TTL already handles cleanup. |
gnomad_get_variantThe "how common, is it benign" answer in one call.
chrom-pos-ref-alt variantId (e.g. 1-55051215-G-GA) or an rsID (e.g. rs11591147)failed[] without failing the othersexome / genome) carry the variant, quality flags, transcript consequence, in-silico predictor scores, and the ClinVar significance gnomAD joins per variantfound[] 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 absencegnomad_get_gene_constraintThe orthogonal axis to allele frequency — a loss-of-function variant matters far more in a gene intolerant to being broken.
PCSK9) or an Ensembl gene ID (ENSG00000169174)oe_lof_upper (<0.6 intolerant in v4, <0.35 in v2) with its lower bound, observed/expected ratios for LoF / missense / synonymous, and the three Z-scoresconstraint_flags surfaces v4 beta caveats flagged by the gnomAD teamgnomad_list_gene_variantsList variants across a gene, transcript, or region, then SQL the full set.
gene, transcript_id, or region (chrom-start-stop, 1-based inclusive)consequence_class (lof / missense / synonymous / other) and/or a maximum allele frequencygene_variants with an inline preview returned alongside canvas_id and table_name — query it with gnomad_dataframe_query to rank by AF, count by consequence, or group across the complete setcanvas_id REPLACES the staged table; it does not appendCANVAS_PROVIDER_TYPE != duckdb) the tool returns a capped inline preview with spilled=false and the SQL path is unavailablegnomad_get_coverageDisambiguate a true absent variant from an uncallable position.
gene, transcript_id, or regioncoverage_source narrows to one track (exome / genome); omit to return every available trackgnomad_search_clinvarGene-panel curation depth beyond the per-variant ClinVar join, via NCBI E-utilities.
clinical_significance (e.g. pathogenic) and a minimum star rating (min_review_stars, 0–4)clinvar_variants canvas table with an inline preview; reusing a canvas_id REPLACES that tableNCBI_API_KEY for a higher rate limit (10 vs 3 req/s)gnomad_dataframe_query, gnomad_dataframe_describe, and gnomad_dataframe_drop operate on the canvas tables the list tools stage.
gnomad_dataframe_query runs single-statement SELECTs only — writes, DDL, and file/HTTP table functions are rejected by the canvas gategnomad_dataframe_describe returns each staged table's name, row count, and column schema — call it before writing SQLgnomad_dataframe_drop is a deliberate mutation (readOnlyHint: false); it stays absent from tools/list unless GNOMAD_DATAFRAME_DROP_ENABLED=trueCANVAS_PROVIDER_TYPE=duckdb; without it they return a canvas_disabled error| Type | Name | Description |
|---|---|---|
| Resource | gnomad://variant/{dataset}/{variantId} | Population record for one variant — mirrors gnomad_get_variant. The dataset segment keeps the URI self-describing. |
| Resource | gnomad://gene/{dataset}/{gene}/constraint | Gene loss-of-function constraint — mirrors gnomad_get_gene_constraint. |
| Prompt | gnomad_variant_triage | Guided rare-disease variant-triage workflow: population frequency → gene constraint → callability check, in order. |
All resource data is also reachable via tools. The list tools (gnomad_list_gene_variants, gnomad_get_coverage, gnomad_search_clinvar) return analytical row sets rather than stable single-URI documents, so they are not exposed as resources — call the tools instead.
Built on @cyanheads/mcp-ts-core:
none, jwt, oauthgnomAD-specific:
dataset and reference_genome are distinct, coherence-validated parameters (v4/v3 ⇒ GRCh38, v2.1/ExAC ⇒ GRCh37); both are echoed in every tool's output so a wrong-build coordinate mismatch is visiblegnomad_list_gene_variants and gnomad_search_clinvar stage their full result on a DuckDB-backed canvas table queryable via gnomad_dataframe_queryAgent-friendly output:
gnomad_get_variant returns per-item failed[] rows with actionable messages instead of failing the whole batchdataset and reference_genome echoed back; null upstream fields preserved as null, never fabricatedincoherent_build, invalid_target, gene_not_found, canvas_disabled) so callers know the next moveA public instance is available at https://gnomad-genetics.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
Add the following to your MCP client configuration file. gnomAD is a free, keyless API — no credentials required.
Or with npx (no Bun required):
Or with Docker:
For Streamable HTTP, set the transport and start the server:
To enable the SQL analytics path, also set CANVAS_PROVIDER_TYPE=duckdb (requires the @duckdb/node-api peer dependency; unavailable on Cloudflare Workers).
NCBI_API_KEY raises the gnomad_search_clinvar rate limit.All variables are optional; the server runs keyless with the defaults below.
| Variable | Description | Default |
|---|---|---|
GNOMAD_API_BASE_URL | gnomAD GraphQL endpoint. Override for a private mirror or testing. | https://gnomad.broadinstitute.org/api |
GNOMAD_DEFAULT_DATASET | Dataset used when a tool call omits dataset (gnomad_r4 / gnomad_r3 / gnomad_r2_1 / exac). | gnomad_r4 |
GNOMAD_REQUEST_TIMEOUT_MS | Per-request timeout against the GraphQL endpoint, in milliseconds. | 30000 |
GNOMAD_MAX_CONCURRENCY | Cap on concurrent upstream requests — politeness against a community-funded API. | 2 |
GNOMAD_MAX_VARIANT_BATCH | Maximum variant IDs accepted per gnomad_get_variant call. | 25 |
CLINVAR_BASE_URL | NCBI E-utilities base URL for gnomad_search_clinvar. | https://eutils.ncbi.nlm.nih.gov/entrez/eutils |
NCBI_API_KEY | Optional NCBI key. Raises the E-utilities rate limit from 3 to 10 req/s. | — |
CANVAS_PROVIDER_TYPE | Set to duckdb to enable the spill/SQL path behind the list tools. When none, they return a capped inline preview. | none |
GNOMAD_DATAFRAME_DROP_ENABLED | Gate for the opt-in gnomad_dataframe_drop tool. Off by default. | false |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for the HTTP server. | 3010 |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
See .env.example for the full list of optional overrides.
Build and run:
Run checks and tests:
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/gnomad-genetics-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools/resources/prompts and inits services. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts) and shared input schemas. |
src/mcp-server/resources | Resource definitions (*.resource.ts). |
src/mcp-server/prompts | Prompt definitions (*.prompt.ts). |
src/services/gnomad | gnomAD GraphQL client, query documents, and domain types. |
src/services/clinvar | NCBI E-utilities client for the optional ClinVar tool. |
src/services/canvas-accessor.ts | Module-level accessor for the framework's optional DataCanvas. |
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagecreateApp() arrays in src/index.tsIssues and pull requests are welcome. Run checks and tests before submitting:
Apache-2.0 — see LICENSE for details.
gnomAD data is provided by the Genome Aggregation Database (Broad Institute). ClinVar data is provided by NCBI.