gnomad-genetics-mcp-server CLAUDE.md

A project-specific instruction file for an AI coding assistant working on a genetics data server. It defines the server’s coding rules, configuration conventions, and request-handling patterns.

In plain words
What is it for?
Use it when developing or maintaining the gnomAD genetics MCP server, especially its TypeScript handlers, configuration, request flow, and GitHub issue work.
Why use it?
It gives the assistant the project context needed to make changes that fit the existing server. It also clarifies how to handle errors, logs, stored data, secrets, and missing user input.

Instructions file

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add instructions/cyanheads/gnomad-genetics-mcp-server/claude-md
Clone the repo
git clone --depth 1 https://github.com/cyanheads/gnomad-genetics-mcp-server
Per session 6,274 This file is loaded in full into every session.
When invoked 6,274 The same file — it is already loaded in full.
Security scan A 0 findings. Scan, not verified.
Origin 78% copy Near-identical to another mod in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.06274 $0.06274
Opus 5 $0.03137 $0.03137
Sonnet 5 $0.01255 $0.01255
Haiku 4.5 $0.00627 $0.00627

Measured yesterday against content hash 5deda681a275, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

gnomad-genetics-mcp-server CLAUDE.md scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

Origin

This is a copy

78% identical to obsidian-mcp-server AGENTS.md — 352 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.

CLAUDE.md · 421 lines

How it starts

The opening of the file, as written. The whole thing — 421 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Developer Protocol

Server: gnomad-genetics-mcp-server Version: 0.2.0 Framework: @cyanheads/mcp-ts-core ^0.12.3 Engines: Bun ≥1.3.0, Node ≥24.0.0 MCP SDK: @modelcontextprotocol/server ^2.0.0 Zod: ^4.4.3

Read the framework docs first: node_modules/@cyanheads/mcp-ts-core/CLAUDE.md contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.


Core Rules

  • Logic throws, framework catches. Tool/resource handlers are pure — throw on failure, no try/catch. Plain Error is fine; the framework catches, classifies, and formats. Use error factories (notFound(), validationError(), etc.) when the error code matters.
  • Use ctx.log for request-scoped logging. No console calls.
  • Use ctx.state for tenant-scoped storage. Never access persistence directly.
  • Need input the caller didn't supply? return ctx.requestInput(...) and read ctx.inputs when the handler is re-entered. Never await for user input mid-handler.
  • Secrets in env vars only — never hardcoded.
  • Close the loop on issues. When implementing work tracked by a GitHub issue, comment on the issue with what landed and close it. Do both — a comment without a close leaves stale issues open; a close without a comment leaves no record of what shipped. The comment is for future readers — state the concrete changes, not the conversation that produced them.

Patterns

Real definitions from this server, condensed. The full versions live under src/mcp-server/.

Tool (src/mcp-server/tools/definitions/gnomad-get-gene-constraint.tool.ts)

import { tool, z } from '@cyanheads/mcp-ts-core';
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
import { getGnomadService } from '@/services/gnomad/gnomad-service.js';
import { datasetField, geneField, referenceGenomeField } from '../shared-schemas.js';

export const gnomadGetGeneConstraint = tool('gnomad_get_gene_constraint', {
  title: 'gnomad-genetics-mcp-server: get gene constraint',
  description: 'Fetch gnomAD loss-of-function constraint for a gene — pLI, LOEUF, …',
  annotations: { readOnlyHint: true, openWorldHint: true, idempotentHint: true },
  input: z.object({ gene: geneField, dataset: datasetField, reference_genome: referenceGenomeField }),
  output: z.object({
    gene_id: z.string().describe('Ensembl gene ID resolved for the gene.'),
    symbol: z.string().describe('HGNC gene symbol.'),
    pli: z.number().nullable().describe('pLI — probability of LoF intolerance; >0.9 intolerant.'),
    // … remaining flat constraint fields, all nullable
    constraint_flags: z.array(z.string()).describe('Constraint caveat flags (e.g. v4 beta notes).'),
  }),
  // Typed error contract — ctx.fail('gene_not_found', …) is type-checked against this union.
  errors: [
    { reason: 'gene_not_found', code: JsonRpcErrorCode.NotFound,
      when: 'No gene matched the symbol or Ensembl ID in this build.',
      recovery: 'Check the symbol spelling or resolve a stable Ensembl gene ID via ensembl_lookup_gene.' },
  ],

  async handler(input, ctx) {
    const svc = getGnomadService();
    const dsCtx = svc.resolveDatasetContext(input.dataset, input.reference_genome);
    const constraint = await svc.getGeneConstraint(input.gene, dsCtx, ctx);
    if (!constraint) throw ctx.fail('gene_not_found', `Gene "${input.gene}" not found.`);
    return constraint;
  },

  // format() populates content[] — the markdown twin of structuredContent.
  // Different clients read different surfaces (Claude Code → structuredContent,
  // Claude Desktop → content[]); both must carry the same data.
  // Enforced at lint time: every field in `output` must appear in the rendered text.
  format: (result) => [{ type: 'text', text: `## ${result.symbol} (${result.gene_id})` }],
});

Read the full file on GitHub · 421 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. yesterday First seen · 421 lines · 6,274 tokens per session scan A 5deda681a275

Subscribe to this mod's changes

gnomad-genetics-mcp-server CLAUDE.md is an instructions file published in the GitHub repository cyanheads/gnomad-genetics-mcp-server (1 stars, last pushed yesterday), licensed Apache-2.0. It adds 6,274 tokens to every session, about $0.0314 per session on Opus 5. A static security scan graded it A with 0 findings. It is 78% identical to obsidian-mcp-server AGENTS.md, differing in 352 lines, and is treated as a copy.

Related

Other instructions, from other repositories