| summary | 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 |
|---|---|
| breaking | true |
| security | false |
enum_invaliderror contract declared onsearch_studiesandget_study_count(#57). The service already carrieddata.reason: 'enum_invalid'on the wire whenstatusFilter/phaseFilterreceived an invalid value; the contract declaration surfaces this to callers and enables TypeScript-level conformance.find_eligibleis intentionally excluded — it hardcodes its status filter and exposes no status/phase param, so the path is unreachable from tool input.sentinelFilterActivefield insearch_studiessearchCriteriaenrichment — set totruewhenincludeUnknownEnrollment=false(the default) is in effect, so callers can tell why large-enrollment studies may be missing (#58).locationQuery,titleQuery,outcomeQueryadded toget_study_countinput schema, matching thesearch_studiesquery surface (#59). No service change —buildSearchQueryalready handled these params; they were only absent from the count tool definition.topEventsinget_study_resultssummary mode (#61). The most frequent adverse events ranked bynumAffected, aggregated across arms, capped at 20. Each row:term,organSystem,kind(serious|other),numAffected,numAtRisk. Answers "which AEs and how common" in ~5KB instead of the full ~450KB structure.
search_studiessearchCriterianow echoes on every response, not only when results are empty (#58). Previously the enrichment was conditional onresult.studies.length === 0; it is now unconditional.get_study_resultsfull mode — row caps removed fromformat()(#63). The previousevents.slice(0, 20)andmeasures.slice(0, 15)truncations inrenderEvents/formatBaselineare gone;format()now renders all rows handed to it, matchingstructuredContent. Usesummary=trueto reduce payload size.
- Channel parity for
get_study_resultsandget_study_record(#63).content[]andstructuredContentnow carry the same data.get_study_results:format()no longer truncates adverse-event or baseline rows (see Changed above).get_study_record:structuredContentno longer embeds the fullresultsSection— it was absent fromcontent[], making the two channels diverge. A compactresultsSummary(outcome / adverse-event / baseline / participant-flow counts) replaces it; fetch full results viaclinicaltrials_get_study_resultsor theclinicaltrials://{nctId}resource.
get_study_recordstructuredContentno longer includesstudy.resultsSection. Callers that readstructuredContent.study.resultsSectiondirectly must switch toclinicaltrials_get_study_resultsorclinicaltrials://{nctId}. AresultsSummarycounts object is available in the record for quick triage without fetching full results.