cyanheads/clinicaltrialsgov-mcp-server
Search ClinicalTrials.gov trials, retrieve study details and results, and match patients to candidate trials via MCP. STDIO or Streamable HTTP.
Changelog
All notable changes to this project. Each entry links to its full per-version file in changelog/.
2.10.2 — 2026-10-25
mcp-ts-core 0.13.18: error text in content[] is Markdown-escaped so it renders as written, an out-of-range framework config value fails startup naming the variable, and the .mcpb bundle leaves out source, tests, docs, and the framework's build-only files. Adds the Agent Plugins root plugin.json and mcp.json.
2.10.1 — 2026-10-23
Workload-cap parameters serve what fits instead of rejecting: search_studies pageSize up to 1000, find_eligible maxResults up to 1000, get_study_results nctIds up to 500. find_eligible matches a location's parts at one site and accepts subyear ages; counts fetch one ID instead of ten studies.
2.10.0 — 2026-10-14 · ⚠️ Breaking
Input normalization for phaseFilter and fields, typed page_token_invalid errors, find_eligible results framed as candidates, and get_study_results summaries that keep subgroup denominators, analysis identity, and outcome paging. Breaking: some phaseFilter and conditions inputs 2.9.11 accepted are now rejected.
2.9.11 — 2026-10-05
Moves to mcp-ts-core 0.13.12: tool error results name their request ID, client-facing error data no longer carries stack traces or request context, and the Docker image installs dependencies on the build platform with musl bindings pruned.
2.9.10 — 2026-09-22
get_study_results' adverse-event summary reports each event group separately instead of pooling them, and find_eligible admits its fallback recruiting site by distance instead of upstream list order.
2.9.9 — 2026-09-22
search_studies' default index gains hasResults and key dates, and statusFilter/NCT ID inputs now accept case and spacing variants instead of being rejected.
2.9.8 — 2026-09-18
HTTP declares stateless session mode by default (createApp option from mcp-ts-core 0.13.1) — source, bunx, and npm start now match the Docker image and issue no Mcp-Session-Id unless MCP_SESSION_MODE overrides it.
2.9.7 — 2026-09-13
manifest.json's MCPB user_config options now reach the server, and a blank or unsubstituted ${...} config value falls back to its default (mcp-ts-core 0.13.0); development skills move from skills/ to framework-skills/ so installing the plugin no longer loads them.
2.9.6 — 2026-09-12
Fixes numeric/date/string field-value stats, get_field_definitions argument validation, and ID-aware search notices; adds document download URLs on get_study_record.
2.9.5 — 2026-09-12
clinicaltrials_search_studies validates geoFilter before querying, distinguishes exhausted pagination from no matches, and fixes phase-filter grouping and field-parity gaps; find_eligible's location query is AND-joined with quoting instead of comma-joined.
2.9.4 — 2026-09-12
clinicaltrials_get_study_results stops mislabeling missing values, keeps summary stats attributable to their class/category, disambiguates arms after group-title truncation, resolves alias NCT IDs, and gains offset-based pagination for capped lists
2.9.3 — 2026-09-02 · 🛡️ Security
A cancelled caller surfaces RequestCancelled instead of being retried or walked one ID at a time; mcp-ts-core ^0.12.5 classifies upstream 500/501 as ServiceUnavailable and closes an SSRF DNS-guard bypass
2.9.2 — 2026-08-21
mcp-ts-core ^0.12.3 (MCP SDK v2 migration); find_eligible/get_study_record nested option bags reject undeclared keys; toolchain refresh clears the last bun audit advisories
2.9.1 — 2026-08-18
nearestPieces field/sort suggestions require a similarity floor instead of always returning three; the blank_value recovery hint leads with the fix that works on required parameters; dead Cloudflare Worker scripts and devDependency removed
2.9.0 — 2026-08-18 · ⚠️ Breaking
clinicaltrials://{nctId} now returns a bounded wrapper instead of the raw study (breaking); get_study_results and find_eligible gain new caps; find_eligible no longer hides an enrollable site behind a closed one; remaining-field labels disambiguate on collision
2.8.7 — 2026-08-18
find_eligible age bounds and the enrollment sentinel filter no longer exclude studies with a missing field; sort rejections reclassified and normalized; query.* parameter descriptions completed; empty-list rejection extended to nctIds and get_field_values
2.8.6 — 2026-08-18
search_studies and get_study_results fixes: array cross-contamination, stale pagination tokens, rate-limit retry storm, and an unreachable error contract; blank-value rejection added across five tools and the analyze_trial_landscape prompt; mcp-ts-core 0.11.5 maintenance
2.8.5 — 2026-07-26
get_study_record and get_study_results format() render leaves structuredContent already carried but text output silently dropped, including the full classes/categories/measurements results tree
2.8.4 — 2026-07-26
get_study_record renders the Locations header and reason on a nearLocation match of zero; find_eligible carries each site's LocationStatus into content[]; get_field_definitions surfaces the pre-cap totalMatches in search mode
2.8.3 — 2026-07-26
throttle() serializes concurrent requests instead of firing them together; search_studies classifies malformed geoFilter/sort by reading the offending parameter from the upstream body; Essie query-parse errors name the actual offending token and correct the bracket-reservation rule; mcp-ts-core ^0.11.0 maintenance
2.8.2 — 2026-07-09
clinicaltrials_get_field_definitions path_not_found recovery hint now names the current mode-based call shape instead of the removed no-args overview; docs/design.md synced to mode/query/path/limit/includeIndexedOnly
2.8.1 — 2026-07-09
search_studies, get_field_values, and find_eligible content-output renders no longer clip long values or cap lists below what structuredContent already carries; find_eligible echoes reproducible upstream query strings; mcp-ts-core ^0.10.14 + Socket/minimumReleaseAge supply-chain guard maintenance
2.8.0 — 2026-06-30 · ⚠️ Breaking · 🛡️ Security
search_studies bounds structuredContent to a compact per-study index by default (breaking) — pass fields or use get_study_record for full leaves; find_eligible re-rank drops shared-word false friends; @cyanheads/mcp-ts-core ^0.10.10 clears a transitive js-yaml DoS advisory
2.7.4 — 2026-06-21
geoFilter searches lead with the matched site (distanceMi), get_field_values flags multi-valued fields, and query parse errors drop the raw Essie grammar dump
2.7.3 — 2026-06-20
mcp-ts-core 0.10.9 maintenance — floating-specifier and plugin-manifest devcheck guards, 14 skill syncs, dependency refresh
2.7.2 — 2026-06-14
Outcome rendering and filter-disclosure correctness — not-reached arms retained in summaries, truncation/cap flags gated on real overflow, empty field lists rejected
2.7.1 — 2026-06-14
toArray tolerates JSON-stringified array arguments from LLM callers — get_field_values fields no longer silently wraps a stringified array into one bogus element
2.7.0 — 2026-06-11
find_eligible condition re-rank; get_study_record referenceLimit; search_studies EnrollmentCount:desc guidance
2.6.6 — 2026-06-11
mcp-ts-core 0.9.21 → 0.10.6: createApp identity pair, bundle clean step, .mcpbignore re-anchoring, truncation enrichment on field-definitions, skills sync
2.6.5 — 2026-06-08
Fix phaseFilter/sort error messages and correct reserved-char docs for free-text query params
2.6.4 — 2026-06-05
Remove local SQLite study mirror (CT_MIRROR_*); fix find_eligible recruitingOnly to exclude NOT_YET_RECRUITING
2.6.3 — 2026-06-04
node-cron declared as direct dep; CT_MIRROR_ENABLED and CT_MIRROR_FALLBACK_LIVE now parse z.stringbool() so "false" disables correctly
2.6.2 — 2026-06-04
Opt-in local SQLite mirror for offline study search and count (CT_MIRROR_* env vars)
2.6.1 — 2026-06-02
get_study_results gains moreInfo section — limitations & caveats, certain-agreement restrictions, results point of contact
2.6.0 — 2026-06-02 · ⚠️ Breaking
typed enum_invalid contract on search/count tools, always-on searchCriteria echo, get_study_count query parity, topEvents in summary mode, channel parity for results and record
2.5.5 — 2026-06-02
adopt @cyanheads/mcp-ts-core 0.9.21: per-request log context fix, fetchWithTimeout secret scrubbing, withRetry fail-fast on non-retryable errors
2.5.4 — 2026-05-30
get-study-results: drop unreachable ids_not_found contract; get-field-values: auto-correct RecruitmentStatus/RecruitingStatus to OverallStatus, ranking favors fields matched tokens cover more fully
2.5.3 — 2026-05-30
Enrichment adoption: search/field/eligibility tools now surface query echoes, result totals, and empty-result guidance in a typed enrichment block reaching both structuredContent and content[] trailer
2.5.2 — 2026-05-28
mcp-ts-core ^0.9.9 → ^0.9.13: 413 body cap, HTTP session-init gate, quieter 401/403/400/404 logging, GET /mcp surfaces keywords; landing.requireAuth explicit; plugin metadata scaffolded
2.5.1 — 2026-05-25
mcp-ts-core ^0.9.6 → ^0.9.9 (git-wrapup skill, release artifact verification, tag annotation format)
2.5.0 — 2026-05-25
get_field_definitions mode discriminator, enum error translation, funnel-aware no-match hints, transport framing removed from get_study_record description
2.4.12 — 2026-05-23
mcp-ts-core ^0.9.1 → ^0.9.6, zod added as direct dep, manifest.json + .mcpbignore scaffolded for MCPB bundle support, install badges added to README.
2.4.11 — 2026-05-21
Description hardening — advancedFilter anchors AREA[FieldName]value with composition examples (#47); path_not_found hint on clinicaltrials_get_field_definitions promotes query mode (#48).
2.4.10 — 2026-05-20
Fix clinicaltrials_get_study_record surface divergence (#46) — locationLimit / outcomeLimit / nearLocation now trim both surfaces identically, defaults flip to no cap, upstream totals surface in filtersApplied.
2.4.9 — 2026-05-20
Auto-normalize case/whitespace field-name mistakes (#44), surface Essie query parse errors with recovery hints (#34, #39), add locationLimit/outcomeLimit/nearLocation render controls on get_study_record (#40), and lift topAnalysis (p-value, CI, method) into get_study_results summary mode (#42).
2.4.8 — 2026-05-16
Framework 0.8.20 → 0.9.1: adopt server-level instructions on createApp (spec orientation text broadcast on initialize), summary cap 250 → 350 chars, bun outdated parser fix for markdown-style rows, skill resyncs including the new portability lint family in api-linter.
2.4.7 — 2026-05-10
Framework 0.8.14 → 0.8.20, engines bumped to Bun ≥1.3 / Node ≥24, search/count format() renders array criteria as [a, b], fuzz coverage for 3 tools, new api-telemetry skill, template-fork dep cleanup.
2.4.6 — 2026-05-04
search_studies fields description hardened against Sponsor/*List hallucinations; three tool descriptions anchor on "clinical trial"; framework bumped to 0.8.14 with skill sync.
2.4.5 — 2026-05-03
find_eligible adds match-prioritized location sort + 3-stage funnel diagnostics; search/count default-filter the EnrollmentCount=99999999 sentinel; search format() lifts truncation cap when fields is explicit.
2.4.4 — 2026-05-03
Polish LLM-facing definition language — flatten clinicaltrials_get_field_definitions description, enrich opaque output schemas in search/get-study/get-study-results, expand landscape prompt to all relevant tools.
2.4.3 — 2026-05-03
Field-name validation cache + did-you-mean suggestions (fixes #35); new query mode in clinicaltrials_get_field_definitions; typed error contracts on every tool/resource; framework 0.7.6 → 0.8.13
2.4.2 — 2026-04-27
Bump @cyanheads/mcp-ts-core 0.7.0 → 0.7.6, resync 7 skills and 1 script (+ 1 new), adopt 0.7.4 form-client safety guidance in CLAUDE.md/AGENTS.md checklist
2.4.1 — 2026-04-24
Bump @cyanheads/mcp-ts-core 0.6.17 → 0.7.0, resync 5 skills and 2 framework scripts, adopt expanded CLAUDE.md/AGENTS.md checklist and Changelog/Agent-skill-dir callouts
2.4.0 — 2026-04-24 · ⚠️ Breaking
Uppercase find_eligible.sex enum (breaking); specific offending-field error on field-values 404; directory-based changelog; new security-pass skill; framework 0.6.17
2.3.5 — 2026-04-23
Adopt rateLimited() error factory; document MCP_PUBLIC_URL; refresh bundled skills from mcp-ts-core 0.6
2.3.4 — 2026-04-21
Fix format()/structuredContent parity across 6 tools via new format-parity linter; sync scripts and skills from mcp-ts-core 0.5.3
2.3.3 — 2026-04-21
Fix format() drop-offs across 4 tools; fall back to per-ID calls when batch rejects on a single bad NCT
2.3.2 — 2026-04-21
Surface nextPageToken in search_studies format() so content[]-only agents can paginate
2.3.1 — 2026-04-21
Stop slicing conditions in format() for search_studies and find_eligible; narrow test-side types under strict tsconfig
2.3.0 — 2026-04-20
Rewrite get_study_record format() for full coverage; harden retry/backoff; consolidate duplicated NCT ID regex
2.2.0 — 2026-04-20
Catch invalid-field-name errors in search_studies with a piece-vs-module hint and pointer to get_field_definitions
2.1.1 — 2026-04-13
Add add-app-tool skill; broad skill refresh (13 updated); tool description rewrites across 4 tools
2.1.0 — 2026-04-04
Shared format-helpers utility (formatRemainingStudyFields); expanded test coverage; mirrored test directory layout
2.0.6 — 2026-03-30
Skill refresh for add-tool/add-resource/design-mcp-server; dependency bumps
2.0.5 — 2026-03-28
Bump @cyanheads/mcp-ts-core 0.2.3 → 0.2.8
2.0.4 — 2026-03-28
Refactor get_study_results format() into dedicated helpers; richer rendering for outcomes, adverse events, flow, and baseline
2.0.3 — 2026-03-28
Add BOOLEAN field support to get_field_values; validate NCT ID format and cap batch at 20 for get_study_results
2.0.2 — 2026-03-28
Batch get_study_results via /studies?filter.ids (single request); lift 5-NCT-ID cap; fix field name references
2.0.1 — 2026-03-28
Rewrite format() for 4 tools to produce full structured markdown reports; expand RawStudyShape
2.0.0 — 2026-03-27 · ⚠️ Breaking
Ground-up rewrite on @cyanheads/mcp-ts-core; 7 redesigned tools, new resource, new prompt, and full test suite