---
summary: "Opt-in local SQLite mirror for offline study search and count (CT_MIRROR_* env vars)"
breaking: false
security: false
agent-notes: |
  New mirror/ module under src/services/clinical-trials/. Disabled by default (CT_MIRROR_ENABLED=false). No schema changes; no changes to existing tool behavior when mirror is disabled.
---

# 2.6.2 — 2026-06-04

Adds an opt-in, self-refreshing SQLite+FTS5 local mirror of the ClinicalTrials.gov study corpus ([#56](https://github.com/cyanheads/clinicaltrialsgov-mcp-server/issues/56)). Disabled by default; requires explicit `CT_MIRROR_ENABLED=true` to activate.

## Added

- **`src/services/clinical-trials/mirror/`** — new `MirrorService` module: `index.ts` (init/accessor, `initMirror`/`getClinicalTrialsMirror`), `ingester.ts` (bulk bootstrap and incremental refresh), `types.ts` (`StudyMetaRow`, `MirrorStatus`). Backed by `@cyanheads/mcp-ts-core/mirror` (`MirrorService`, `Mirror`, `QueryFilter`).
- **`getMirrorConfig()`** in `src/config/server-config.ts` — lazy-parsed mirror config from four new env vars: `CT_MIRROR_ENABLED`, `CT_MIRROR_PATH`, `CT_MIRROR_REFRESH_CRON`, `CT_MIRROR_FALLBACK_LIVE`.
- **`ClinicalTrialsService.mirrorStatus()`** — returns current `MirrorStatus` (study count, last sync time, ready flag) or `undefined` when disabled.
- **Mirror routing** in `searchStudies` and `getStudiesBatch` — routes to mirror first when enabled and ready; falls back to live API transparently for geo filters, AREA[] expressions, pageToken continuations, and any query the mirror cannot answer.
- **Scheduler wiring** in `src/index.ts` — on HTTP transport, schedules an incremental mirror refresh job via `schedulerService` using `CT_MIRROR_REFRESH_CRON` (default `0 3 * * *`, 3 AM daily). No persistent scheduler on stdio transport.
- **`tests/services/clinical-trials/mirror/mirror.test.ts`** — unit tests for mirror init, status, routing, and fallback behavior.
- **`CT_MIRROR_ENABLED`**, **`CT_MIRROR_PATH`**, **`CT_MIRROR_REFRESH_CRON`**, **`CT_MIRROR_FALLBACK_LIVE`** documented in README, `.env.example`, `server.json`, `manifest.json`, `CLAUDE.md`, and `AGENTS.md`.
- **`@cloudflare/workers-types`** added to `devcheck.config.json` outdated-deps allowlist (daily-release package; version churn is expected and non-blocking).
