Back to Discover

genefoundry-router

connector

berntpopp

MCP gateway federating 21 biomedical MCP servers behind one endpoint: gnomAD, ClinVar, HPO, VEP.

View on GitHub
0 starsSynced Aug 7, 2026

Install to Claude Code

/plugin marketplace add berntpopp/genefoundry-router

README

genefoundry-router

Python 3.12+ CI Security License: MIT

A thin FastMCP 3.x aggregator that federates the GeneFoundry *-link MCP fleet behind a single Streamable-HTTP endpoint. A host adds one server — genefoundry — and gets every biomedical backend with collision-free <namespace>_<tool> naming and search-based discovery.

[!IMPORTANT] Research use only. Not clinical decision support. Do not use for diagnosis, treatment, triage, or patient management.

Why

An MCP host that mounted all 21 backends directly would face a wall of several hundred tools — more than a model can reason over, and a guarantee of name collisions. The router collapses that into one endpoint and replaces the flat catalog with a search surface, so a model finds the right tool by intent instead of by scrolling.

It is a client to each backend and a server to hosts: it namespaces and shapes the surface, but never rewrites a backend's data. The caller's token is never forwarded upstream.

Quick start

The fleet is hosted — no install required:

claude mcp add --transport http genefoundry https://genefoundry.org/mcp

Health check: genefoundry.org/health.

To run your own against the live fleet (Python 3.12+, uv):

uv sync --group dev
cp .env.example .env                    # set GF_*_URL backend URLs and GF_AUTH_MODE
uv run genefoundry-router run --host 127.0.0.1 --port 8000
curl -s localhost:8000/health | python -m json.tool

An offline fake fleet (make dev-fleet + make run-dev, or one-shot make test-e2e) runs the real router against impersonated backends over real Streamable-HTTP — no Docker, no network.

Tools

The router does not surface the federated catalog flat. A model sees three things:

ToolPurpose
search_toolsRelevance search over the entire federated catalog
call_toolInvoke a hit by its <namespace>_<tool> name
pinned entry pointsEach backend's front-door tool, always visible — declared per-backend as entrypoints: in servers.yaml
search_tools(query="splicing prediction")   # → spliceai_predict_splicing (+ schema)
call_tool(name="spliceai_predict_splicing", arguments={...})

Pinning makes each domain's canonical tool reachable deterministically rather than by relevance luck. See How discovery works — including the two traps that bite MCP clients.

Federated backends

21 backends, 272 tools, each surfaced namespaced — e.g. gnomad_search_genes.

NamespaceDomainData sourceToolsRepo
pubtatorLiterature & entity annotationPubTator335pubtator-link
gnomadVariant / gene / population frequencygnomAD22gnomad-link
orphanetRare disease ontology & associationsOrphadata19orphanet-link
clingenGene–disease curationClinGen17clingen-link
hpoPhenotype ontology & associationsHuman Phenotype Ontology17hpo-link
mavedbVariant-effect assay scoresMaveDB15mavedb-link
uniprotProtein functionUniProt15uniprot-link
genereviewsGene–disease literatureGeneReviews13genereviews-link
mgiMouse phenotype & modelsMGI13mgi-link
mondoDisease ontology / cross-referencesMondo13mondo-link
genccGene–disease curationGenCC12gencc-link
metadomeProtein tolerance landscapesMetaDome11metadome-link
stringdbProtein–protein interaction networksSTRING10stringdb-link
gtexTissue expressionGTEx Portal9gtex-link
hgncGene nomenclatureHGNC9hgnc-link
panelappDiagnostic gene panels & curationPanelApp9panelapp-link
autopvs1Variant ACMG PVS1AutoPVS17autopvs1-link
spliceaiSplicing predictionSpliceAI Lookup7spliceailookup-link
vepVariant annotation / consequenceEnsembl VEP7vep-link
clinvarVariant clinical significanceClinVar6clinvar-link
litvarVariant literatureLitVar26litvar-link

Data & provenance

The router serves no data of its own; each backend owns its sources, licences and citation guidance, and the router mirrors their disclaimers.

What it does own is integrity of the tool surface. A backend can serve a clean tool at review time and later change its definition — the channel for a rug pull. The router fingerprints every normalized tool definition and diffs the live fleet against a reviewed, packaged baseline (genefoundry_router/data/fleet-baseline.json), enforced at startup and on a schedule. See Deployment → drift detection.

Documentation

Contributing

See AGENTS.md for engineering conventions. make ci-local is the definition-of-done gate: format, lint, line budget, README standard, mypy, and tests.

License

MIT © Bernt Popp. Each federated backend carries the licence and citation terms of its upstream data source; see that backend's repository.

Rendered live from berntpopp/genefoundry-router's GitHub README — not stored, always reflects the source repo.

1 Install Method

NameDescriptionCategorySource
streamable-http remoteHosted streamable-http endpointmcp-serverhttps://genefoundry.org/mcp

0 Comments

Login required
Log in to post a comment or update on this repo.

No comments yet — be the first to share an update.