Skip to main content
Glama

gnomad-genetics-mcp-server

gnomad-genetics-mcp-server: get gene constraint

gnomad_get_gene_constraint
Read-onlyIdempotent

Fetch gnomAD loss-of-function constraint for a gene — pLI (probability of LoF intolerance; >0.9 intolerant), LOEUF (oe_lof_upper, the headline metric) plus its lower bound and gnomAD’s LOEUF percentile, observed/expected ratios for LoF, missense, and synonymous variation with 90% intervals for missense and synonymous, 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). constraint_release names the release the metrics come from: gnomAD v4.1.2 for gnomad_r4, gnomad_r3, and their subsets (gnomAD publishes no v3 constraint), gnomAD v2.1.1 for gnomad_r2_1 and its subsets, and ExAC r0.3 for exac. gnomAD publishes no subset constraint, so a subset dataset reads its parent release’s table and echoes the subset as dataset. gnomAD recommends LOEUF < 0.45 to call a gene LoF-intolerant on v4.1.2 and LOEUF < 0.35 on v2.1.1; only v4.1.2 publishes the LOEUF percentile. ExAC r0.3 publishes only pLI, the Z-scores, and observed/expected counts, so on exac the ratios, their intervals, LOEUF, and the LOEUF percentile are null, constraint_flags is empty, and pLI is the intolerance measure. A mitochondrial gene (MT-CO1, MT-TL1) has no nuclear constraint: gnomAD’s mitochondrial constraint comes back in mitochondrial_constraint instead — kind protein or rna, the same table on every dataset, exac included — and is null for every nuclear gene; the nuclear LOEUF thresholds do not apply to it. Many genes have null constraint (sparse upstream) — null fields are reported as such, never fabricated. Echoes the effective dataset and reference build. Data source: gnomAD (Broad Institute) — https://gnomad.broadinstitute.org/

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "gene": "<gene>"
    },
    "name": "gnomad_get_gene_constraint"
  }
}

Input Schema

NameRequiredDescriptionDefault
geneYesGene — HGNC symbol (e.g. PCSK9) or Ensembl gene ID (e.g. ENSG00000169174). Obtain a stable ID from ensembl_lookup_gene.
datasetNognomAD dataset, default gnomad_r4: gnomad_r4 and its subset gnomad_r4_non_ukb (GRCh38); gnomad_r3 and its subsets gnomad_r3_controls_and_biobanks, gnomad_r3_non_cancer, gnomad_r3_non_neuro, gnomad_r3_non_topmed, gnomad_r3_non_v2 (GRCh38); gnomad_r2_1 and its subsets gnomad_r2_1_controls, gnomad_r2_1_non_cancer, gnomad_r2_1_non_neuro, gnomad_r2_1_non_topmed (GRCh37); exac (GRCh37). A subset keeps only part of its parent release's samples (non_cancer leaves out cancer-study samples, non_ukb UK Biobank's) and can leave a callset unchanged: gnomad_r4_non_ukb genome counts equal gnomad_r4's, and gnomad_r2_1_non_cancer genome counts equal gnomad_r2_1's. No subset publishes joint data, and gnomAD publishes no subset coverage or constraint, so those come from the parent. Echoed in output.
reference_genomeNoReference build. Derived from dataset when omitted: GRCh38 for gnomad_r4, gnomad_r3, and their subsets; GRCh37 for gnomad_r2_1, its subsets, and exac. If supplied it must match the dataset, or the call is rejected. Keep aligned with ensembl coordinates.

Output Schema

NameRequiredDescriptionDefault
pliNopLI — probability of LoF intolerance; >0.9 intolerant. Null when unavailable.
errorNoPresent when the call failed. Absent on success.
lof_zNoLoF constraint Z-score. Null when unavailable.
mis_zNoMissense constraint Z-score. Null when unavailable.
syn_zNoSynonymous constraint Z-score. Null when unavailable.
oe_lofNoNon-negative observed/expected LoF ratio. Null when unavailable.
oe_misNoObserved/expected missense ratio. Null when unavailable.
oe_synNoObserved/expected synonymous ratio. Null when unavailable.
symbolNoHGNC gene symbol.
datasetNoEffective gnomAD dataset.
exp_lofNoNon-negative expected LoF variant count. Null when unavailable.
exp_misNoNon-negative expected missense count. Null when unavailable.
exp_synNoNon-negative expected synonymous count. Null when unavailable.
gene_idNoEnsembl gene ID resolved for the gene.
obs_lofNoNon-negative observed LoF variant count. Null when unavailable.
obs_misNoNon-negative observed missense count. Null when unavailable.
obs_synNoNon-negative observed synonymous count. Null when unavailable.
oe_lof_lowerNoLOEUF confidence-interval lower bound. Null when unavailable.
oe_lof_upperNoLOEUF (oe_lof_upper) — the headline intolerance metric; gnomAD recommends < 0.45 on v4.1.2 and < 0.35 on v2.1.1 to call a gene LoF-intolerant. Null when unavailable, and always null on exac.
oe_mis_lowerNoLower bound of the 90% confidence interval around oe_mis. Null when unavailable, and always null on exac.
oe_mis_upperNoUpper bound of the 90% confidence interval around oe_mis. Null when unavailable, and always null on exac.
oe_syn_lowerNoLower bound of the 90% confidence interval around oe_syn. Null when unavailable, and always null on exac.
oe_syn_upperNoUpper bound of the 90% confidence interval around oe_syn. Null when unavailable, and always null on exac.
constraint_flagsNoCaveat flags gnomAD attaches to the gene’s constraint (e.g. no_exp_lof, mis_too_many, syn_outlier); empty when none, and always empty on exac, where ExAC publishes no flags.
reference_genomeNoEffective reference build.
oe_lof_percentileNognomAD’s LOEUF percentile — the percentile bin the gene’s LOEUF falls in among gnomAD v4.1.2’s MANE Select transcripts, an integer from 0 to 100; lower is more constrained (KMT2A is 0, FLG is 98). Only gnomAD v4.1.2 publishes it, so it is null on gnomad_r2_1, its subsets, and exac, and wherever LOEUF is null.
constraint_releaseNoConstraint release the metrics come from: gnomAD v4.1.2 for gnomad_r4, gnomad_r3, and their subsets (gnomAD publishes no v3 constraint, so gnomad_r3 serves the GRCh38 table), gnomAD v2.1.1 for gnomad_r2_1 and its subsets, ExAC r0.3 for exac. A subset reads its parent release’s table, since gnomAD publishes no subset constraint. It labels the nuclear tables only, never mitochondrial_constraint.
mitochondrial_constraintNognomAD’s mitochondrial gene constraint, computed from 56,434 gnomAD v4.1 genomes: present for every mitochondrial gene and null for a nuclear gene, whose nuclear fields carry its constraint instead. kind "protein" carries observed, expected, observed/expected, and its 90% interval for stop-gain (lof; splice variants do not apply in mtDNA), missense (mis), and synonymous (syn) SNVs; kind "rna" (a tRNA or rRNA gene) carries one set over all SNVs. Observed and expected are sums of maximum heteroplasmy over every possible SNV, not variant counts, and the intervals come from a beta distribution, so the nuclear LOEUF thresholds do not apply; gnomAD reads the upper bound (OEUF) as the conservative measure, lower meaning stronger selection. The same table on every dataset, exac included; constraint_release does not label it.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedInput schema / properties / dataset / description
      Previous value: -"gnomAD dataset: gnomad_r4 (GRCh38, default), gnomad_r3 (GRCh38), gnomad_r2_1 (GRCh37), exac (GRCh37). Echoed in output."New value: +"gnomAD dataset, default gnomad_r4: gnomad_r4 and its subset gnomad_r4_non_ukb (GRCh38); gnomad_r3 and its subsets gnomad_r3_controls_and_biobanks, gnomad_r3_non_cancer, gnomad_r3_non_neuro, gnomad_r3_non_topmed, gnomad_r3_non_v2 (GRCh38); gnomad_r2_1 and its subsets gnomad_r2_1_controls, gnomad_r2_1_non_cancer, gnomad_r2_1_non_neuro, gnomad_r2_1_non_topmed (GRCh37); exac (GRCh37). A subset keeps only part of its parent release's samples (non_cancer leaves out cancer-study samples, non_ukb UK Biobank's) and can leave a callset unchanged: gnomad_r4_non_ukb genome counts equal gnomad_r4's, and gnomad_r2_1_non_cancer genome counts equal gnomad_r2_1's. No subset publishes joint data, and gnomAD publishes no subset coverage or constraint, so those come from the parent. Echoed in output."
    • changedInput schema / properties / dataset / enum
      Previous value: -[
      -  "gnomad_r4",
      -  "gnomad_r3",
      -  "gnomad_r2_1",
      -  "exac"
      -]New value: +[
      +  "gnomad_r4",
      +  "gnomad_r4_non_ukb",
      +  "gnomad_r3",
      +  "gnomad_r3_controls_and_biobanks",
      +  "gnomad_r3_non_cancer",
      +  "gnomad_r3_non_neuro",
      +  "gnomad_r3_non_topmed",
      +  "gnomad_r3_non_v2",
      +  "gnomad_r2_1",
      +  "gnomad_r2_1_controls",
      +  "gnomad_r2_1_non_neuro",
      +  "gnomad_r2_1_non_cancer",
      +  "gnomad_r2_1_non_topmed",
      +  "exac"
      +]
    • changedInput schema / properties / reference_genome / description
      Previous value: -"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."New value: +"Reference build. Derived from dataset when omitted: GRCh38 for gnomad_r4, gnomad_r3, and their subsets; GRCh37 for gnomad_r2_1, its subsets, and exac. If supplied it must match the dataset, or the call is rejected. Keep aligned with ensembl coordinates."
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "gene_id",
      -      "symbol",
      -      "dataset",
      -      "reference_genome",
      -      "constraint_release",
      -      "pli",
      -      "oe_lof",
      -      "oe_lof_lower",
      -      "oe_lof_upper",
      -      "oe_mis",
      -      "oe_syn",
      -      "lof_z",
      -      "mis_z",
      -      "syn_z",
      -      "obs_lof",
      -      "exp_lof",
      -      "obs_mis",
      -      "exp_mis",
      -      "obs_syn",
      -      "exp_syn",
      -      "constraint_flags"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "gene_id",
      +      "symbol",
      +      "dataset",
      +      "reference_genome",
      +      "constraint_release",
      +      "pli",
      +      "oe_lof",
      +      "oe_lof_lower",
      +      "oe_lof_upper",
      +      "oe_lof_percentile",
      +      "oe_mis",
      +      "oe_mis_lower",
      +      "oe_mis_upper",
      +      "oe_syn",
      +      "oe_syn_lower",
      +      "oe_syn_upper",
      +      "lof_z",
      +      "mis_z",
      +      "syn_z",
      +      "obs_lof",
      +      "exp_lof",
      +      "obs_mis",
      +      "exp_mis",
      +      "obs_syn",
      +      "exp_syn",
      +      "constraint_flags",
      +      "mitochondrial_constraint"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / constraint_release / description
      Previous value: -"Constraint release the metrics come from: gnomAD v4.1.2 for gnomad_r4 and gnomad_r3 (gnomAD publishes no v3 constraint, so gnomad_r3 serves the GRCh38 table), gnomAD v2.1.1 for gnomad_r2_1, ExAC r0.3 for exac."New value: +"Constraint release the metrics come from: gnomAD v4.1.2 for gnomad_r4, gnomad_r3, and their subsets (gnomAD publishes no v3 constraint, so gnomad_r3 serves the GRCh38 table), gnomAD v2.1.1 for gnomad_r2_1 and its subsets, ExAC r0.3 for exac. A subset reads its parent release’s table, since gnomAD publishes no subset constraint. It labels the nuclear tables only, never mitochondrial_constraint."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `gene_not_found`: No gene matched the symbol or Ensembl ID in this build. `incoherent_build`: reference_genome was supplied but does not match the dataset. `invalid_constraint_data`: gnomAD returned constraint metrics outside their valid ranges, such as a pLI above 1. `graphql_error`: gnomAD rejected the constraint query with a GraphQL error. `upstream_unavailable`: gnomAD stayed unavailable or throttled through every retry. `upstream_timeout`: gnomAD attempts timed out or the shared 45 s call budget expired. `upstream_access`: gnomAD refused the request (access denied). `invalid_upstream_response`: gnomAD kept answering with a response that failed validation. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `gene_not_found`: No gene matched the symbol or Ensembl ID in this build. `incoherent_build`: reference_genome was supplied but does not match the dataset. `invalid_constraint_data`: gnomAD returned constraint metrics outside their valid ranges, such as a pLI above 1, or a mitochondrial constraint of a shape gnomAD’s schema does not define. `graphql_error`: gnomAD rejected the constraint query with a GraphQL error. `upstream_unavailable`: gnomAD stayed unavailable or throttled through every retry. `upstream_timeout`: gnomAD attempts timed out or the shared 45 s call budget expired. `upstream_access`: gnomAD refused the request (access denied). `invalid_upstream_response`: gnomAD kept answering with a response that failed validation. Other values are possible when a failure originates below the handler."
    • addedOutput schema / properties / mitochondrial_constraint
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "description": "Constraint for a protein-coding mitochondrial gene.",
      +      "properties": {
      +        "exp_lof": {
      +          "description": "Expected sum of maximum heteroplasmy over stop-gain SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "exp_mis": {
      +          "description": "Expected sum of maximum heteroplasmy over missense SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "exp_syn": {
      +          "description": "Expected sum of maximum heteroplasmy over synonymous SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "kind": {
      +          "const": "protein",
      +          "description": "A protein-coding mitochondrial gene: stop-gain (lof), missense, and synonymous sets.",
      +          "type": "string"
      +        },
      +        "obs_lof": {
      +          "description": "Observed sum of maximum heteroplasmy over stop-gain SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "obs_mis": {
      +          "description": "Observed sum of maximum heteroplasmy over missense SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "obs_syn": {
      +          "description": "Observed sum of maximum heteroplasmy over synonymous SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_lof": {
      +          "description": "Observed/expected ratio for stop-gain SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_lof_lower": {
      +          "description": "Lower bound of the 90% interval around oe_lof.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_lof_upper": {
      +          "description": "Upper bound of the 90% interval around oe_lof (OEUF); lower is more constrained.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_mis": {
      +          "description": "Observed/expected ratio for missense SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_mis_lower": {
      +          "description": "Lower bound of the 90% interval around oe_mis.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_mis_upper": {
      +          "description": "Upper bound of the 90% interval around oe_mis (OEUF); lower is more constrained.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_syn": {
      +          "description": "Observed/expected ratio for synonymous SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_syn_lower": {
      +          "description": "Lower bound of the 90% interval around oe_syn.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_syn_upper": {
      +          "description": "Upper bound of the 90% interval around oe_syn.",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "obs_lof",
      +        "exp_lof",
      +        "oe_lof",
      +        "oe_lof_lower",
      +        "oe_lof_upper",
      +        "obs_mis",
      +        "exp_mis",
      +        "oe_mis",
      +        "oe_mis_lower",
      +        "oe_mis_upper",
      +        "obs_syn",
      +        "exp_syn",
      +        "oe_syn",
      +        "oe_syn_lower",
      +        "oe_syn_upper"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "description": "Constraint for a tRNA or rRNA mitochondrial gene.",
      +      "properties": {
      +        "expected": {
      +          "description": "Expected sum of maximum heteroplasmy over all SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "kind": {
      +          "const": "rna",
      +          "description": "A tRNA or rRNA mitochondrial gene: one set over all SNVs.",
      +          "type": "string"
      +        },
      +        "observed": {
      +          "description": "Observed sum of maximum heteroplasmy over all SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe": {
      +          "description": "Observed/expected ratio over all SNVs.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_lower": {
      +          "description": "Lower bound of the 90% interval around oe.",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "oe_upper": {
      +          "description": "Upper bound of the 90% interval around oe (OEUF); lower is more constrained.",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "observed",
      +        "expected",
      +        "oe",
      +        "oe_lower",
      +        "oe_upper"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "description": "No mitochondrial constraint: the gene is nuclear.",
      +      "type": "null"
      +    }
      +  ],
      +  "description": "gnomAD’s mitochondrial gene constraint, computed from 56,434 gnomAD v4.1 genomes: present for every mitochondrial gene and null for a nuclear gene, whose nuclear fields carry its constraint instead. kind \"protein\" carries observed, expected, observed/expected, and its 90% interval for stop-gain (lof; splice variants do not apply in mtDNA), missense (mis), and synonymous (syn) SNVs; kind \"rna\" (a tRNA or rRNA gene) carries one set over all SNVs. Observed and expected are sums of maximum heteroplasmy over every possible SNV, not variant counts, and the intervals come from a beta distribution, so the nuclear LOEUF thresholds do not apply; gnomAD reads the upper bound (OEUF) as the conservative measure, lower meaning stronger selection. The same table on every dataset, exac included; constraint_release does not label it."
      +}
    • addedOutput schema / properties / oe_lof_percentile
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "gnomAD’s LOEUF percentile — the percentile bin the gene’s LOEUF falls in among gnomAD v4.1.2’s MANE Select transcripts, an integer from 0 to 100; lower is more constrained (KMT2A is 0, FLG is 98). Only gnomAD v4.1.2 publishes it, so it is null on gnomad_r2_1, its subsets, and exac, and wherever LOEUF is null."
      +}
    • addedOutput schema / properties / oe_mis_lower
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Lower bound of the 90% confidence interval around oe_mis. Null when unavailable, and always null on exac."
      +}
    • addedOutput schema / properties / oe_mis_upper
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Upper bound of the 90% confidence interval around oe_mis. Null when unavailable, and always null on exac."
      +}
    • addedOutput schema / properties / oe_syn_lower
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Lower bound of the 90% confidence interval around oe_syn. Null when unavailable, and always null on exac."
      +}
    • addedOutput schema / properties / oe_syn_upper
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Upper bound of the 90% confidence interval around oe_syn. Null when unavailable, and always null on exac."
      +}
  2. Changed1 schema field changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `gene_not_found`: No gene matched the symbol or Ensembl ID in this build. `incoherent_build`: reference_genome was supplied but does not match the dataset. `invalid_constraint_data`: gnomAD returned constraint metrics outside their valid ranges, such as a pLI above 1. `graphql_error`: gnomAD rejected the constraint query with a GraphQL error. `upstream_unavailable`: gnomAD stayed unavailable or throttled through every retry. `upstream_timeout`: Every attempt to reach gnomAD timed out. `upstream_access`: gnomAD refused the request (access denied). `invalid_upstream_response`: gnomAD kept answering with a response that failed validation. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `gene_not_found`: No gene matched the symbol or Ensembl ID in this build. `incoherent_build`: reference_genome was supplied but does not match the dataset. `invalid_constraint_data`: gnomAD returned constraint metrics outside their valid ranges, such as a pLI above 1. `graphql_error`: gnomAD rejected the constraint query with a GraphQL error. `upstream_unavailable`: gnomAD stayed unavailable or throttled through every retry. `upstream_timeout`: gnomAD attempts timed out or the shared 45 s call budget expired. `upstream_access`: gnomAD refused the request (access denied). `invalid_upstream_response`: gnomAD kept answering with a response that failed validation. Other values are possible when a failure originates below the handler."
  3. Changed6 schema fields changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "gene_id",
      -      "symbol",
      -      "dataset",
      -      "reference_genome",
      -      "pli",
      -      "oe_lof",
      -      "oe_lof_lower",
      -      "oe_lof_upper",
      -      "oe_mis",
      -      "oe_syn",
      -      "lof_z",
      -      "mis_z",
      -      "syn_z",
      -      "obs_lof",
      -      "exp_lof",
      -      "obs_mis",
      -      "exp_mis",
      -      "obs_syn",
      -      "exp_syn",
      -      "constraint_flags"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "gene_id",
      +      "symbol",
      +      "dataset",
      +      "reference_genome",
      +      "constraint_release",
      +      "pli",
      +      "oe_lof",
      +      "oe_lof_lower",
      +      "oe_lof_upper",
      +      "oe_mis",
      +      "oe_syn",
      +      "lof_z",
      +      "mis_z",
      +      "syn_z",
      +      "obs_lof",
      +      "exp_lof",
      +      "obs_mis",
      +      "exp_mis",
      +      "obs_syn",
      +      "exp_syn",
      +      "constraint_flags"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / constraint_flags / description
      Previous value: -"Constraint caveat flags (e.g. beta/experimental notes for v4)."New value: +"Caveat flags gnomAD attaches to the gene’s constraint (e.g. no_exp_lof, mis_too_many, syn_outlier); empty when none, and always empty on exac, where ExAC publishes no flags."
    • addedOutput schema / properties / constraint_release
      Added value: +{
      +  "description": "Constraint release the metrics come from: gnomAD v4.1.2 for gnomad_r4 and gnomad_r3 (gnomAD publishes no v3 constraint, so gnomad_r3 serves the GRCh38 table), gnomAD v2.1.1 for gnomad_r2_1, ExAC r0.3 for exac.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `gene_not_found`: No gene matched the symbol or Ensembl ID in this build. `incoherent_build`: reference_genome was supplied but does not match the dataset. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `gene_not_found`: No gene matched the symbol or Ensembl ID in this build. `incoherent_build`: reference_genome was supplied but does not match the dataset. `invalid_constraint_data`: gnomAD returned constraint metrics outside their valid ranges, such as a pLI above 1. `graphql_error`: gnomAD rejected the constraint query with a GraphQL error. `upstream_unavailable`: gnomAD stayed unavailable or throttled through every retry. `upstream_timeout`: Every attempt to reach gnomAD timed out. `upstream_access`: gnomAD refused the request (access denied). `invalid_upstream_response`: gnomAD kept answering with a response that failed validation. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "gene_not_found",
      -  "incoherent_build"
      -]New value: +[
      +  "gene_not_found",
      +  "incoherent_build",
      +  "invalid_constraint_data",
      +  "graphql_error",
      +  "upstream_unavailable",
      +  "upstream_timeout",
      +  "upstream_access",
      +  "invalid_upstream_response"
      +]
    • changedOutput schema / properties / oe_lof_upper / description
      Previous value: -"LOEUF (oe_lof_upper) — the headline intolerance metric. Null when unavailable."New value: +"LOEUF (oe_lof_upper) — the headline intolerance metric; gnomAD recommends < 0.45 on v4.1.2 and < 0.35 on v2.1.1 to call a gene LoF-intolerant. Null when unavailable, and always null on exac."
  4. Changed6 schema fields changed
    • removedOutput schema / properties / lof_z / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / lof_z / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / mis_z / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / mis_z / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / syn_z / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / syn_z / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  5. Changed19 schema fields changed
    • changedOutput schema / properties / exp_lof / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / exp_lof / description
      Previous value: -"Expected LoF variant count. Null when unavailable."New value: +"Non-negative expected LoF variant count. Null when unavailable."
    • changedOutput schema / properties / exp_mis / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / exp_mis / description
      Previous value: -"Expected missense count. Null when unavailable."New value: +"Non-negative expected missense count. Null when unavailable."
    • changedOutput schema / properties / exp_syn / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / exp_syn / description
      Previous value: -"Expected synonymous count. Null when unavailable."New value: +"Non-negative expected synonymous count. Null when unavailable."
    • changedOutput schema / properties / obs_lof / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / obs_lof / description
      Previous value: -"Observed LoF variant count. Null when unavailable."New value: +"Non-negative observed LoF variant count. Null when unavailable."
    • changedOutput schema / properties / obs_mis / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / obs_mis / description
      Previous value: -"Observed missense count. Null when unavailable."New value: +"Non-negative observed missense count. Null when unavailable."
    • changedOutput schema / properties / obs_syn / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / obs_syn / description
      Previous value: -"Observed synonymous count. Null when unavailable."New value: +"Non-negative observed synonymous count. Null when unavailable."
    • changedOutput schema / properties / oe_lof / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / oe_lof / description
      Previous value: -"Observed/expected LoF ratio. Null when unavailable."New value: +"Non-negative observed/expected LoF ratio. Null when unavailable."
    • changedOutput schema / properties / oe_lof_lower / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / oe_lof_upper / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / oe_mis / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / oe_syn / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / pli / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 1,
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  6. First observed

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover read-only/idempotent/open-world, yet the description discloses genuinely non-obvious behavior: null fields are reported as null and never fabricated, ExAC returns null for ratios/LOEUF/flags, subset datasets read the parent release's constraint table and echo the subset, and mitochondrial genes return data under mitochondrial_constraint instead. These are exactly the surprises that would otherwise cause misinterpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause before any caveats, which is the right structure. The prose is a dense, semicolon-heavy block and longer than most agents will read in full, but each chunk (ExAC, mitochondrial, subsets, nulls) carries distinct information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description needn't explain return shape, and it instead spends its budget on the edge cases that schema cannot express — release provenance, subset inheritance, ExAC and mitochondrial exceptions, null handling. For a read-only 3-parameter tool this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: the exact dataset-to-release mapping ('gnomAD v4.1.2 for gnomad_r4... ExAC r0.3 for exac') and the fact that gnomAD publishes no subset constraint. The gene-identifier and reference_genome constraints are largely restated from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ("Fetch gnomAD loss-of-function constraint for a gene") and enumerates exactly what comes back: pLI, LOEUF, O/E ratios, intervals, Z-scores. It frames the tool's role relative to variant frequency ('the orthogonal axis to allele frequency'), which helps an agent place it, but it never names a sibling tool, so differentiation from gnomad_get_variant or gnomad_list_gene_variants is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives real decision context: use this when interpreting whether a LoF variant is consequential, and it supplies per-release LOEUF cutoffs (<0.45 on v4.1.2, <0.35 on v2.1.1) so an agent can judge results. It also covers dataset-choice guidance indirectly through constraint_release semantics. It stops short of explicit when-not-to-use or naming an alternative sibling, so it is not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.