The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Biolab MCP Server listing page.
"AI agents querying biological databases leave no audit trail. Six months later, nobody can answer: what exact query returned this result, when, and was that paper peer-reviewed at the time? Biolab solves that."
A dual-implementation (Python + Go) MCP server that sits between AI agents and biological/scientific databases (PubMed, Europe PMC, ClinicalTrials.gov, bioRxiv/medRxiv). Every query is intercepted, logged with full retrieval context, and returns a retrieval_id that calling systems store alongside their reasoning traces — creating an end-to-end auditable chain from conclusion back to raw source.
New to MCP? It's a small, open standard (built by Anthropic) that lets an AI assistant — Claude, ChatGPT, Cursor, etc. — call out to external tools during a conversation. Add Biolab as an MCP server and any of those assistants gains four new abilities: searching PubMed, Europe PMC, ClinicalTrials.gov, and bioRxiv/medRxiv, with every single result permanently logged so it can be checked later.
A hosted instance is running at https://srikarjy025-biolab-mcp.hf.space/mcp. Point your client at it and you're done — nothing to install, nothing to run locally, nothing to sign up for.
Claude Code:
Claude Desktop / Cursor — add this to your MCP config file:
(Add "headers": {"Authorization": "Bearer <your key>"} alongside "url" once you have a key — see the rate-limit note below.)
That's it — search_pubmed, search_europepmc, search_clinicaltrials, search_biorxiv, and get_retrieval are now available as tools your assistant can call. Every retrieval is written to a hash-chained audit trail you can inspect later (see Audit Trail Schema below).
Also listed on the official MCP Registry and Smithery if you'd rather discover/install it from there.
A note on rate limits. The hosted server is shared and stays open — no signup required for casual use — but callers with no API key share one small, low-throughput budget (1 req/s to PubMed) so no single anonymous user can starve everyone else. If you're doing more than a handful of queries, ask for a key (below) and you get your own isolated, higher budget instead.
Getting a key:
Add that header in your client's MCP config (Claude Code: claude mcp add --transport http biolab <url> --header "Authorization: Bearer <key>"). Keys are issued with biolab keys create <label> — see Managing API Keys below if you're running your own instance; otherwise ask the maintainer for one.
Want to run your own copy instead (local dev, your own storage, self-hosting)? Keep reading.
A drug discovery team uses an AI agent to research gene targets. The agent queries PubMed 200 times over three days and surfaces a paper claiming gene X is upregulated in pancreatic cancer. A scientist makes a decision based on that. Six months later, during FDA submission:
Without Biolab, nobody can answer any of those questions. The retrieval is invisible.
Biolab is an interception and logging layer, not a retrieval layer. It doesn't interpret evidence, rank it, or summarize it — it records what happened, verbatim, so an agent's claim can always be traced back to an unforgeable original.
The agent gets the paper it asked for. Biolab gets a permanent, queryable, tamper-evident record of exactly what happened.
| Source | MCP Tool | CLI Command | Notes |
|---|---|---|---|
| PubMed | search_pubmed | biolab search | E-utilities, full XML stored |
| Europe PMC | search_europepmc | biolab search-europepmc | Free, indexes bioRxiv/medRxiv |
| ClinicalTrials.gov | search_clinicaltrials | biolab search-clinicaltrials | API v2, condition-based search |
| bioRxiv/medRxiv | search_biorxiv | biolab search-biorxiv | Date-range pagination (API limit) |
All sources share a single audit database (SQLite locally, or Turso — a hosted, SQLite-compatible database — in production) with one source-agnostic schema.
You don't need to know Python or Go to get this running locally — just follow these steps in order. All commands are run in a terminal.
python3 --version. Get it from python.org if you don't have it.git --version.That's genuinely it for the Python path — no database server to install, no API keys required (PubMed works anonymously, just at a lower rate limit).
This searches PubMed for real, stores every result in a local biolab.db file (created automatically, no setup needed), and prints back the retrieval_id for each paper — the same ID an AI agent would get back over MCP.
Most tests hit the real PubMed/Europe PMC/ClinicalTrials.gov APIs on purpose (no mocking) — that's a deliberate project rule, not a bug, so a slow test run is normal.
This starts an HTTP server on http://localhost:8000/mcp — point Claude Desktop, Claude Code, or Cursor at that URL exactly like in Use It Now, just with localhost:8000 instead of the hosted URL.
If you'd rather not install Python locally at all:
(Storage defaults to an ephemeral file inside the container unless you set TURSO_DATABASE_URL/TURSO_AUTH_TOKEN — see Environment Variables below.)
The server stays open to unauthenticated callers by design — but they all share one small, low-throughput rate-limit budget (see Use It Now). Issuing someone a key gives them their own isolated, higher budget instead. This doesn't gate access — it's purely a fairness mechanism so one caller can't starve everyone else's share of PubMed's real rate limit.
The caller sends the key back as Authorization: Bearer <key>. A missing header still works (anonymous tier); a header with an invalid or revoked key is rejected with 401, not silently downgraded — a typo'd key should fail loudly, not quietly run at a lower tier.
All optional — the server runs with sensible defaults if you set none of these.
| Variable | Purpose | Default |
|---|---|---|
BIOLAB_DB_PATH | Local SQLite file path (ignored if TURSO_DATABASE_URL is set) | biolab.db |
TURSO_DATABASE_URL | Remote Turso database URL — use this for real persistence in production | unset (uses local file) |
TURSO_AUTH_TOKEN | Auth token for the Turso database above | unset |
BIOLAB_HOST | Host the MCP server binds to | 0.0.0.0 |
BIOLAB_PORT | Port the MCP server listens on | 8000 |
NCBI_API_KEY | Raises the PubMed rate limit from 3 req/s to 10 req/s | unset (works fine without one) |
Key properties:
retrieval_log.verify_chain(conn) to check the whole log; it returns exactly which row broke, if any.Design principles:
retrieval_id is worse than error| Target | Method |
|---|---|
| Hosted (no install) | https://srikarjy025-biolab-mcp.hf.space/mcp — Hugging Face Space, Docker SDK, backed by Turso |
| Local | pipx install biolab-mcp or download binary |
| CI/CD | GitHub Actions → PyPI (Trusted Publishing/OIDC) + GHCR + GitHub Releases |
| Containers | docker pull ghcr.io/srikarjy/biolab-mcp:latest, or build space/Dockerfile yourself |
| Linux packages | .deb, .rpm, .apk via goreleaser |
| Discovery | MCP Registry · Smithery |
Running cost: $0/month. The Space runs on Hugging Face's free cpu-basic tier (this workload waits on network calls, not compute, so it never needed more). Turso's free tier is currently at 0% of its storage/read/write quotas, and has overages disabled — if usage ever did hit a limit, requests get rejected, not silently billed. There's no realistic query volume (short of literally millions/month) that would introduce a cost.
MIT — see LICENSE
Srikar Jy — srikarjy025@gmail.com