| 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. |
Adds an opt-in, self-refreshing SQLite+FTS5 local mirror of the ClinicalTrials.gov study corpus (#56). Disabled by default; requires explicit CT_MIRROR_ENABLED=true to activate.
src/services/clinical-trials/mirror/— newMirrorServicemodule: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()insrc/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 currentMirrorStatus(study count, last sync time, ready flag) orundefinedwhen disabled.- Mirror routing in
searchStudiesandgetStudiesBatch— 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 viaschedulerServiceusingCT_MIRROR_REFRESH_CRON(default0 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_LIVEdocumented in README,.env.example,server.json,manifest.json,CLAUDE.md, andAGENTS.md.@cloudflare/workers-typesadded todevcheck.config.jsonoutdated-deps allowlist (daily-release package; version churn is expected and non-blocking).