Connects Claude to the Ensembl REST API for genomic lookup and analysis. You get seven tools covering gene resolution by symbol or stable ID, sequence retrieval in multiple formats (genomic, cDNA, CDS, protein), variant consequence prediction via VEP, homology searches across species, and cross-database reference lookups to HGNC, UniProt, and OMIM. Also includes region queries for finding overlapping features and a species catalog tool since Ensembl expects names like homo_sapiens. Supports both stdio and streamable HTTP, with a public hosted instance at ensembl.caseyjhand.com. Reach for this when you need to translate gene symbols into stable IDs, pull sequences with flanking regions, predict variant effects in HGVS notation, or chain into pathway and protein databases via xrefs.
ENSEMBL_BASE_URLdefault: https://rest.ensembl.orgEnsembl REST API base URL. Override to use GRCh37 endpoint or a local mirror.
MCP_LOG_LEVELdefault: infoSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_HTTP_HOSTdefault: 127.0.0.1The hostname for the HTTP server.
MCP_HTTP_PORTdefault: 3010The port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHdefault: /mcpThe endpoint path for the MCP server.
MCP_AUTH_MODEdefault: noneAuthentication mode to use: 'none', 'jwt', or 'oauth'.
Look up genes, fetch sequences, predict variant consequences, find orthologs and cross-database xrefs via Ensembl REST via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://ensembl.caseyjhand.com/mcp
Seven tools covering the core Ensembl REST API surface — species discovery, gene/transcript lookup, sequence retrieval, genomic region overlap, variant consequence prediction, cross-species homology, and external database cross-references:
| Tool | Description |
|---|---|
ensembl_list_species | List species supported by Ensembl with display name, common name, assembly, taxon ID, and division |
ensembl_lookup_gene | Resolve a gene by symbol + species or by stable ID to its Ensembl ID, genomic location, biotype, and transcript list |
ensembl_get_sequence | Fetch the DNA, cDNA, CDS, or protein sequence for a gene, transcript, protein, or genomic region |
ensembl_query_region | Find genomic features (genes, transcripts, variants, regulatory elements, exons) overlapping a chromosomal region |
ensembl_predict_variant | Predict functional consequences of a sequence variant using the Ensembl Variant Effect Predictor (VEP) |
ensembl_get_homology | Find orthologs and/or paralogs of a gene across species with percent identity and taxonomy level |
ensembl_get_xrefs | Retrieve cross-database references for a gene — HGNC, UniProt, EntrezGene, OMIM, RefSeq, Reactome, and others |
ensembl_list_speciesDiscovery tool for the Ensembl species catalog.
nameContains) for local substring matchinghomo_sapiens are opaque to non-biologists and are the input format every other tool expectsensembl_lookup_geneSingle entry point for resolving gene identity.
BRCA2 + homo_sapiens) or direct stable ID lookup (ENSG00000139618)not_found (symbol or ID not in Ensembl), invalid_species (call ensembl_list_species to discover valid names)ensembl_get_sequenceFetch any sequence type for any Ensembl feature.
genomic (default, includes introns), cdna (spliced), cds (coding only), proteinspecies:chr:start-end region format for genomic region modeexpand_5prime, expand_3prime) in base pairsensembl_query_regionFind all genomic features overlapping a chromosomal window.
chr:start-end (e.g. 13:32315086-32400268) — no chr prefix for vertebratesgene (default), transcript, variation, regulatory, exonensembl_predict_variantPredict variant consequences via the Ensembl VEP.
ENST00000380152.8:c.2T>A) or genomic region+allele format (13:32316462:32316462:1/A)invalid_notation (check format), not_found (location outside any known transcript)ensembl_get_homologyCross-species homolog lookup.
target_species filter to narrow to specific organismsperc_id, perc_pos, and taxonomy levelensembl_get_xrefsFull cross-database reference set for any Ensembl feature.
dbname filter (e.g. HGNC, Uniprot_gn, EntrezGene, MIM_GENE) to narrow outputxrefs/id endpoint (not xrefs/symbol) — returns the full cross-reference set| Type | Name | Description |
|---|---|---|
| Resource | ensembl://gene/{id} | Gene record by stable ID (ENSG…) — location, biotype, description, and transcript list |
| Resource | ensembl://transcript/{id} | Transcript record by stable ID (ENST…) — parent gene, location, biotype, canonical flag, and length |
| Resource | ensembl://species | Full list of supported Ensembl species with name, display name, assembly, taxon ID, and division |
| Prompt | ensembl_gene_dossier | Structured workflow for assembling a complete gene profile: symbol → ID + location → sequence → variants → orthologs → xrefs |
All resource data is also reachable via tools. The ensembl://species resource provides the full species catalog with cursor pagination; ensembl_list_species is the tool equivalent with filtering support.
Built on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1Ensembl-specific:
x-ratelimit-remaining, retries 429 with Retry-After, and retries transient 5xxPOST /lookup/id (up to 50 IDs) and POST /lookup/symbol/{species} reduce N+1 round trips in multi-gene workflowsENSEMBL_BASE_URL — point the entire server at https://grch37.rest.ensembl.org for clinical workflows on the older assemblyAgent-friendly output:
ensembl_get_sequence response so callers can budget context before consuming large genomic sequencesensembl_list_species is explicitly the discovery step — tool descriptions call out the opaque internal-name format and direct agents to it before using species-dependent toolsensembl_get_xrefs are described as inputs for protein and literature servers; the ensembl_gene_dossier prompt sequences the full 7-tool research workflowA public instance is available at https://ensembl.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"ensembl-mcp-server": {
"type": "streamable-http",
"url": "https://ensembl.caseyjhand.com/mcp"
}
}
}
Add the following to your MCP client configuration file.
{
"mcpServers": {
"ensembl-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/ensembl-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"ensembl-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/ensembl-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"ensembl-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/ensembl-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
git clone https://github.com/cyanheads/ensembl-mcp-server.git
cd ensembl-mcp-server
bun install
cp .env.example .env
# edit .env if you need to override ENSEMBL_BASE_URL (e.g. for GRCh37)
All configuration is validated at startup via Zod schemas in src/config/server-config.ts.
| Variable | Description | Default |
|---|---|---|
ENSEMBL_BASE_URL | Ensembl REST API base URL. Override for GRCh37 (https://grch37.rest.ensembl.org) or a local mirror. | https://rest.ensembl.org |
MCP_TRANSPORT_TYPE | Transport: stdio or http | stdio |
MCP_HTTP_PORT | HTTP server port | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path | /mcp |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.) | info |
LOGS_DIR | Directory for log files (Node.js only) | <project-root>/logs |
OTEL_ENABLED | Enable OpenTelemetry | false |
See .env.example for the full list of optional overrides.
Build and run:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against spec
docker build -t ensembl-mcp-server .
docker run --rm -p 3010:3010 ensembl-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/ensembl-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) — 7 tools |
src/mcp-server/resources | Resource definitions (*.resource.ts) — gene, transcript, species |
src/mcp-server/prompts | Prompt definitions (*.prompt.ts) — gene dossier workflow |
src/services/ensembl | Ensembl REST API client — HTTP, rate-limit handling, retry, error normalization |
tests/ | Unit and integration tests mirroring src/ |
See CLAUDE.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:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
com.mcparmory/google-search
marcopesani/mcp-server-serper
brave/brave-search-mcp-server
com.mcparmory/google-search-console
acamolese/google-search-console-mcp
io.github.sarahpark/google-search-console