Skip to main content
Glama

Server Details

Search ClinicalTrials.gov: find studies, retrieve results, match patients to candidate trials.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 81 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/clinicaltrialsgov-mcp-server
GitHub Stars
100
Server Listing
clinicaltrialsgov-mcp-server
ChatGPT
–
Claude
–

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation4/5

Each tool has a fairly distinct role, and the long descriptions actively clarify boundaries (e.g., find_eligible explicitly disclaims checking inclusion/exclusion criteria and points to get_study_record). The main residual overlaps are search_studies vs find_eligible (both return candidate study sets) and get_study_record vs get_study_results (same resource, different payloads), but these are well delineated in the text.

Naming Consistency5/5

All seven tools use a uniform clinicaltrials_ prefix followed by a verb_noun pattern (find_eligible, search_studies, get_study_record, get_study_results, get_study_count, get_field_definitions, get_field_values). No camelCase mixing or stylistic outliers.

Tool Count5/5

Seven tools is a tight, well-scoped surface for a read-only ClinicalTrials.gov API: one search, one count, one record fetch, one results fetch, one eligibility matcher, and two metadata helpers. No tool feels redundant or padded.

Completeness4/5

The lifecycle is well covered — discovery (search, field definitions/values), aggregation (count), retrieval (record, results), and a higher-level eligibility workflow. Minor gaps remain: no bulk record fetch by NCT ID list (results caps at 20 IDs) and no way to enumerate related studies or interventions, but agents can work around these via search.

Available Tools

7 tools
clinicaltrials_find_eligibleClinicaltrials Find EligibleA
Read-onlyIdempotent
Inspect

Find candidate clinical trials for a patient profile. Provide age, sex, conditions, and location to get studies with their demographic limits, contact information, and recruiting locations. Candidates are matched on age, sex, location, recruitment status, and ClinicalTrials.gov's fuzzy condition search only — inclusion/exclusion criteria are not checked, and a candidate can exclude the requested condition, so review each one's criteria with clinicaltrials_get_study_record before treating it as a match. Results are re-ranked so studies whose own condition matches a requested condition surface above tangential matches from ClinicalTrials.gov's fuzzy condition search. Each candidate returns only the sites matching the requested location (capped by locationLimit), not the study's full registered site list — a large trial can register hundreds of sites worldwide. When none of a candidate's matched sites is recruiting, one recruiting site is added so an enrollable site is never hidden behind a closer closed one: the one nearest the matched sites by their published coordinates, in the requested country whenever a site there recruits, carrying distanceMi, or the first in match order when coordinates are missing. Fetch a study's complete record with clinicaltrials_get_study_record.

NameRequiredDescriptionDefault
ageYesPatient age as a whole number in ageUnit (years unless ageUnit says otherwise).
sexYesPatient's biological sex. Use 'ALL' to include studies regardless of sex restrictions.
ageUnitNoUnit age is given in: years (default), months, weeks, or days; case and singular forms are accepted. Use a smaller unit for an infant or young child whose eligibility window is narrower than a year — age 7 with ageUnit "months" matches a study registered for 6 Months to 8 Months, which no whole number of years reaches. ClinicalTrials.gov compares ages across units, so the unit only sets how precisely age is stated.
locationYesPatient location as `{ country (required), state?, city? }`. Country is required; state/city narrow the match. Every part given must hold for the same study site: country and state are compared with the site's filed country and state, while city is matched against the site's whole location text, so a site filed under a borough or neighbouring town that names the city still counts. For radius-based geographic search, use clinicaltrials_search_studies with geoFilter.
conditionsYesMedical conditions or diagnoses, e.g. ["Type 2 Diabetes", "Hypertension"]. Each entry is matched as a condition: an entry containing whitespace is quoted and matches as a phrase, and any other entry is sent as written, punctuation included (double quotes are stripped from every entry); multiple entries are combined with OR, so studies for any listed condition qualify. Returned studies are re-ranked so those whose own condition list names a requested condition rank above tangential matches the upstream fuzzy search pulls in via the MeSH umbrella.
maxResultsNoMaximum candidates to return, 1–1000. Each call returns at most 50; a larger value returns 50, reported in truncated/shown/cap when more studies match, and the searchCriteria replay through clinicaltrials_search_studies pages the rest.
locationLimitNoCap on the sites returned per candidate. Each candidate keeps only the sites matching the requested location at the narrowest level that matched (city, else state, else country), capped at this many; the rest of the study's registered sites are omitted. The cap governs those matched sites — when none of them is recruiting, one recruiting site is added on top of it (the nearest to any matched site, measured before this cap, when coordinates allow — in the requested country whenever a site there recruits), so a candidate can carry one site more than this. Raise it to see more nearby sites — there is no upper bound, and a limit past the matched sites returns all of them — or fetch the complete site list with clinicaltrials_get_study_record. Each candidate reports totalLocations / matchedLocations / locationsTruncated / nearestRecruitingSiteAdded in locationSummary only when the bound actually dropped sites.
recruitingOnlyNoOnly include actively recruiting studies.
healthyVolunteerNoWhether the patient is a healthy volunteer. When true, only studies accepting healthy volunteers are queried.

Output Schema

NameRequiredDescription
capNoThe tool's per-call cap, served in place of the requested maxResults when truncated is true.
errorNoPresent when the call failed. Absent on success.
shownNoCandidates returned when truncated is true.
funnelNoMatch counts at each filter stage. Shows where the funnel collapsed — e.g., conditionMatched=298 but demographicsMatched=2 means age/sex/status are the constraint.
noticeNoWhen no studies matched, recovery guidance that identifies which filter stage collapsed and suggests how to broaden. When studies are returned, one caveat for the whole response: candidates were matched on demographics, location, recruitment status, and a fuzzy condition search, not on inclusion/exclusion criteria. When maxResults was above the tool's per-call cap and more studies match, a sentence follows stating the requested, served, and total counts and pointing at the searchCriteria replay.
studiesNoCandidate studies with their demographic limits (age, sex, healthy volunteers), contacts, and location fields — matched on age, sex, location, recruitment status, and the fuzzy condition search; inclusion/exclusion criteria are not checked and are not in these records, so review each candidate with clinicaltrials_get_study_record. Each candidate's protocolSection.contactsLocationsModule.locations is BOUNDED to the sites matching the requested location (capped at locationLimit) plus, when none of those is recruiting, one added recruiting site — not the study's full registered site list. The added site is the one nearest any matched site by published coordinates, taken from the requested country whenever a site there recruits, and carries distanceMi (miles to that nearest matched site); when the matched or recruiting sites publish no coordinates it is the first in match order and carries no distanceMi. A candidate whose sites were bounded also carries a top-level locationSummary object — { totalLocations, matchedLocations, locationsTruncated, nearestRecruitingSiteAdded?, retrieveFullStudyWith } — absent when nothing was dropped; nearestRecruitingSiteAdded is present only when that extra site was added (the key keeps its name in the match-order fallback). Fetch a study's complete record and site list with clinicaltrials_get_study_record.
truncatedNoTrue when maxResults was above the tool's per-call cap and more studies match than were returned. Absent otherwise.
totalCountNoTotal matching studies from the API.
searchCriteriaNoNormalized search criteria applied to this eligibility query, including the exact upstream query strings needed to reproduce the full match set via clinicaltrials_search_studies (replay with includeUnknownEnrollment=true, which find_eligible always sets).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnly/idempotent annotations already covering safety, the description adds substantial non-obvious behavior: fuzzy condition pulling via the MeSH umbrella, re-ranking to surface exact-condition matches, per-candidate site truncation rather than the full registry site list, and the rule that one recruiting site is injected on top of locationLimit when all matched sites are closed. These are things an agent could not infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and caveats are front-loaded, but the recruiting-site fallback heuristic is described at excessive depth (nearest by published coordinates, requested-country precedence, distanceMi, first-in-match-order fallback), which is largely restated in the locationLimit schema text. The final sentence pointing to clinicaltrials_get_study_record is a useful close, but the middle is denser than needed for selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter, nested-object, read-only search tool with an output schema, the description covers the essential risks: criteria are not evaluated, condition matching is fuzzy, and site lists are truncated. Return-value shape is correctly left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description adds cross-parameter semantics the schema states less prominently — that each candidate carries only location-matched sites capped by locationLimit, and that an extra recruiting site can make a result exceed the cap. It does not add much beyond the schema for age/sex/conditions, which are already richly documented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Find candidate clinical trials for a patient profile") and immediately delimits scope: it matches only on age, sex, location, recruitment status and fuzzy condition search, not eligibility criteria. This clearly separates it from clinicaltrials_search_studies (keyword/geo search) and clinicaltrials_get_study_record (full record).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it (patient profile with age/sex/conditions/location), what it does not do (inclusion/exclusion criteria unchecked), and routes the agent to clinicaltrials_get_study_record to review criteria before treating a result as a match. The schema also routes radius-based search to clinicaltrials_search_studies with geoFilter, so the alternative path is covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clinicaltrials_get_field_definitionsClinicaltrials Get Field DefinitionsA
Read-onlyIdempotent
Inspect

Resolve valid field names from the ClinicalTrials.gov data model — the canonical PascalCase identifiers (OverallStatus, EnrollmentCount, LeadSponsorName) accepted by the fields, advancedFilter, and sort parameters of other tools, and as input to clinicaltrials_get_field_values. Select a mode: "search" — keyword search returning ranked matches (pass query, e.g. "enrollment", "sponsor", "adverse events"); "drill" — drill into a specific section by dot-notation path (pass path, e.g. "protocolSection.designModule"); "overview" — top-level summary of all sections (no additional args).

NameRequiredDescriptionDefault
modeYesOperation mode. "search" — keyword search (requires `query`); "drill" — drill into a section by path (requires `path`); "overview" — list all top-level sections (no other args needed).
pathNodrill mode only. Dot-notation path to drill into — e.g., "protocolSection.designModule", "protocolSection.eligibilityModule", "resultsSection". Returns the section's individual fields.
limitNosearch mode only. Maximum results to return. Default: 20. A value at or past the match count returns every match.
queryNosearch mode only. Keyword to search field names by — e.g., "enrollment", "sponsor", "adverse events". Returns matching field names ranked by relevance with their full paths and data types.
includeIndexedOnlyNodrill mode only. Also list index-only pieces (search-index fields such as StudyFirstPostYear) alongside the record fields. Default: false.

Output Schema

NameRequiredDescription
capNoThe limit cap applied to this search (search mode only).
errorNoPresent when the call failed. Absent on success.
shownNoNumber of fields returned (search mode only).
fieldsNoField definitions, ordered by relevance when mode is "search".
noticeNoRecovery guidance when search mode returns no matches, or a truncation note when results are capped.
truncatedNoTrue when the field list was capped by the limit parameter (search mode only).
searchQueryNoEcho of the keyword used in search mode. Absent for drill and overview.
totalFieldsNoTotal fields returned.
resolvedPathNoResolved path when mode is "drill".
totalMatchesNoTotal fields matching the query before the limit cap was applied (search mode only). Compare against `shown` to size a follow-up limit, or to see that a capped result set is barely over the cap rather than hundreds deep.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and open-world behavior, so the description only needs to add mode-level behavior. It does so by stating that search returns ranked matches, drill returns section-level fields, and overview returns a top-level summary, without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and identifiers are front-loaded, and the mode list is easy to scan. The opening sentence is dense and slightly repetitive with the schema, but no sentence is truly wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema, 100% schema coverage, and clear annotations, the description supplies enough context for an agent to select the tool and choose a mode. It doesn't restate return-value details, which is appropriate, though a brief note on result shape or limits could help.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter including examples. The description reinforces mode-argument pairing and gives examples, but adds little semantic detail beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Resolve valid field names') and resource ('ClinicalTrials.gov data model'), and anchors it to the exact canonical identifiers and sibling tools that consume them. An agent can distinguish this from clinicaltrials_get_field_values and from search/record tools without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly maps each mode to its arguments and examples (search with query, drill with path, overview with none), and notes that resolved names feed into other tools' fields/advancedFilter/sort parameters and clinicaltrials_get_field_values. It stops short of naming conditions when another tool would be a better alternative, but the context is strong enough to route most calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clinicaltrials_get_field_valuesClinicaltrials Get Field ValuesA
Read-onlyIdempotent
Inspect

Discover valid values for ClinicalTrials.gov fields with study counts per value. Use to explore available filter options before building a search — e.g., valid OverallStatus, Phase, InterventionType, StudyType, or LeadSponsorClass values.

NameRequiredDescriptionDefault
fieldsYesPascalCase field name(s) to get value statistics for — an empty list is rejected, not treated as "every field". A comma- or pipe-joined string ("Phase,StudyType") is split into separate names. Examples: OverallStatus, Phase, StudyType, Sex, LeadSponsorClass. Use clinicaltrials_get_field_definitions with a query to find more field names.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPresent when a longest value was cut to a preview — names, for each such field, the clinicaltrials_search_studies arguments that return its full text.
fieldStatsNoOne entry per requested field: canonical path, PascalCase piece name, data type, and the statistics variant that type carries — top values with study counts plus unique/longest for ENUM/STRING, trueCount/falseCount for BOOLEAN, min/max/avg for INTEGER/NUMBER, min/max/formats for DATE.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds behavior beyond that by disclosing that each returned value is accompanied by a study count, which tells the agent the result is a frequency summary rather than a plain enum list. It says nothing about limits or error behavior (the empty-list rejection lives only in the schema), keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core capability, followed immediately by the when-to-use guidance and a compact illustrative field list. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the return shape need not be explained, and the single parameter is fully specified in the schema. The description covers purpose and workflow placement adequately for a one-parameter read tool; only the explicit relationship to sibling discovery/search tools is left to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents the anyOf string/array forms, the empty-list rejection, comma/pipe splitting, and example field names. The description's list of example fields largely duplicates that schema content, so it adds little meaning beyond the structured field — the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Discover valid values for ClinicalTrials.gov fields') and adds the output characteristic ('with study counts per value'). It gives concrete field examples (OverallStatus, Phase, StudyType), though it does not explicitly name the sibling tools it differs from — that differentiation only appears in the schema's reference to clinicaltrials_get_field_definitions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use to explore available filter options before building a search' clearly positions the tool in a workflow and signals it is a precursor to a search call. It lacks an explicit when-not clause or a direct pointer to clinicaltrials_search_studies, but the contextual usage is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clinicaltrials_get_study_countClinicaltrials Get Study CountA
Read-onlyIdempotent
Inspect

Get total clinical trial study count from ClinicalTrials.gov matching a query, without fetching study data. Fast and lightweight. Use for quick statistics or to build breakdowns by calling multiple times with different filters (e.g., count by phase, count by status, count recruiting vs completed for a condition).

NameRequiredDescriptionDefault
queryNoGeneral free-text search across all fields. Runs the 57-field relevance search ClinicalTrials.gov publishes for this parameter — NCTId, NCTIdAlias, OrgStudyId, SecondaryId, Acronym, BriefTitle, OfficialTitle, Condition, InterventionName, InterventionOtherName, Phase, StdAge, StudyType, BriefSummary, outcome measures and their descriptions, LeadSponsorName, CollaboratorName, the Location* fields, the Design* fields, and the ConditionAncestorTerm/InterventionAncestorTerm MeSH umbrellas — so a hit need not carry your term in the field you had in mind. Plain words plus AND, OR, NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression — those work here as well as in advancedFilter, so AREA[Phase]PHASE2 is accepted in this parameter; a stray bracket fails. `( )` group sub-expressions and work when matched; `,` acts as AND. The dedicated *Query parameters (conditionQuery, interventionQuery, etc.) scope a search to one field.
titleQueryNoSearch within study titles and acronyms only. Matches Acronym, BriefTitle, and OfficialTitle. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
phaseFilterNoFilter by trial phase. Omit to count all phases — an empty list is rejected, not treated as "no filter". Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA. Case and spacing variants ("Phase 3", "early phase 1", "Not Applicable") are accepted, and a list or a comma- or pipe-joined string matches any of the phases. Each entry must name a phase — put search expressions (OR, NOT, AREA[…]) in advancedFilter.
outcomeQueryNoSearch within outcome measure fields. Matches PrimaryOutcomeMeasure, SecondaryOutcomeMeasure, OtherOutcomeMeasure, and OutcomeMeasureTitle, plus their description counterparts PrimaryOutcomeDescription, SecondaryOutcomeDescription, OtherOutcomeDescription, OutcomeMeasureDescription, and OutcomeMeasurePopulationDescription — so a term appearing only in outcome prose still matches. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
sponsorQueryNoSponsor/collaborator name search. Matches LeadSponsorName, CollaboratorName, and OrgFullName. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
statusFilterNoFilter by study status. Omit to count all statuses — an empty list is rejected, not treated as "no filter". Values: RECRUITING, COMPLETED, ACTIVE_NOT_RECRUITING, NOT_YET_RECRUITING, ENROLLING_BY_INVITATION, SUSPENDED, TERMINATED, WITHDRAWN, UNKNOWN, WITHHELD, NO_LONGER_AVAILABLE, AVAILABLE, APPROVED_FOR_MARKETING, TEMPORARILY_NOT_AVAILABLE.
locationQueryNoLocation search — city, state, country, or facility name. Matches LocationCity, LocationState, LocationCountry, LocationFacility, and LocationZip; a study matches when any of its sites does. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
advancedFilterNoAdvanced filter using AREA[FieldName]value syntax. Examples: "AREA[StudyType]INTERVENTIONAL", "AREA[EnrollmentCount]RANGE[100, 1000]", "AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL", "(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL". AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names. A field name — a record field, an index-only piece such as NumLocations, or a search area such as ConditionSearch — that differs from the spelling AREA[] accepts only by case (AREA[overallstatus]) is corrected before the request, here and in the query parameters, and searchCriteria shows the expression as sent.
conditionQueryNoCondition/disease-specific search. E.g., "Type 2 Diabetes", "non-small cell lung cancer". Matches Condition, BriefTitle, OfficialTitle, ConditionMeshTerm, ConditionAncestorTerm, Keyword, and NCTId. ConditionAncestorTerm is the MeSH umbrella above the conditions a study itself lists, so results run broader than those lists — a study can match a parent term it never names. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
interventionQueryNoIntervention/treatment search. E.g., "pembrolizumab", "cognitive behavioral therapy". Matches InterventionName, InterventionType, ArmGroupType, InterventionOtherName, BriefTitle, OfficialTitle, ArmGroupLabel, InterventionMeshTerm, Keyword, InterventionAncestorTerm, InterventionDescription, and ArmGroupDescription. InterventionAncestorTerm is the MeSH umbrella above the interventions a study itself lists, so results run broader than those lists. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
includeUnknownEnrollmentNoInclude studies whose EnrollmentCount is the upstream "unknown" sentinel (99999999). Excluded by default — the sentinel pollutes RANGE[N, MAX] queries. Set true for data-quality audits.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery guidance when totalCount is 0 — suggests how to broaden the query or filters.
totalCountNoTotal studies matching the query/filters.
searchCriteriaNoEcho of active query/filter criteria applied to this count, including sentinelFilterActive when the default unknown-enrollment exclusion is in effect.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond that: no study records are returned, the call is cheap, and repeated calls with different filters are the intended pattern for aggregations. It omits any note on rate limits or how filters combine, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences that state the action, the cost profile, and the usage pattern in that order. 'Fast and lightweight' is the only near-redundant phrasing, but it is short enough not to hurt.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter count tool, the description supplies purpose, cost, and calling pattern, while the schema fully documents every parameter and an output schema exists to explain the return value. Nothing an agent needs in order to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter docs are unusually detailed (matching fields, AREA[] syntax, empty-list rejection), leaving almost nothing for the description to add. The description only gestures at filter usage via the phase/status/recruiting examples, with no explanation of how the 11 parameters compose (e.g. AND across parameters).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get total clinical trial study count from ClinicalTrials.gov') and adds the key scoping fact 'without fetching study data', which separates it from clinicaltrials_search_studies and clinicaltrials_get_study_record. It does not name a sibling tool explicitly, which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use guidance ('quick statistics', 'build breakdowns by calling multiple times with different filters') with worked examples (count by phase, by status, recruiting vs completed). It lacks an explicit when-not/use-alternative clause, e.g. 'when you need records, use clinicaltrials_search_studies instead'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clinicaltrials_get_study_recordClinicaltrials Get Study RecordA
Read-onlyIdempotent
Inspect

Fetch a single clinical trial study by NCT ID from ClinicalTrials.gov. Returns the full study record including protocol details, eligibility criteria, outcomes, arms, interventions, contacts, and locations. Optional locationLimit / outcomeLimit / referenceLimit / nearLocation parameters trim locations, outcomes, and references — original totals are preserved in filtersApplied only when a cap actually trims the set.

NameRequiredDescriptionDefault
nctIdYesNCT identifier — format `NCT` followed by 8 digits (e.g., `NCT03722472`).
nearLocationNoFilter returned locations to those within radius of (lat, lon) and sort by distance. Adds distanceMi to each location. Locations without published coordinates are dropped — most US sites carry them; international sites less reliably so. Distances reflect ClinicalTrials.gov geocoding granularity — typically city-centroid, not facility-level — so multiple sites in the same city resolve to near-identical distances. For broader geographic filtering across studies, use clinicaltrials_search_studies with geoFilter.
outcomeLimitNoOptional cap on the number of secondary and other outcomes returned. Omit for no cap (full upstream lists); a value at or past a list length also returns that whole list. Primary outcomes are never capped. Original totals preserved in filtersApplied.totalSecondaryOutcomes / totalOtherOutcomes only when the cap trims a list.
locationLimitNoOptional cap on the number of locations returned. Omit for no cap (full upstream list); a value at or past the list length also returns every location. Pairs naturally with nearLocation for narrowing a large multi-site trial. Original total preserved in filtersApplied.totalLocations only when the cap trims the list.
referenceLimitNoOptional cap on the number of references returned. Omit for no cap (full upstream list); a value at or past the list length also returns every reference. Original total preserved in filtersApplied.totalReferences only when the cap trims the list. seeAlsoLinks are never capped.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
studyNoFull study record with caller-requested filters already applied to locations and outcomes. Top-level keys: protocolSection (identification, status, sponsor, conditions, design, arms/interventions, outcomes, eligibility, contacts/locations), derivedSection (MeSH-normalized terms), hasResults, documentSection. The heavy resultsSection is omitted — see resultsSummary for counts and clinicaltrials_get_study_results for full results data. Use clinicaltrials_get_field_definitions to explore the schema.
filtersAppliedNoMetadata about the filtering applied to `study`.
resultsSummaryNoCompact counts of posted results, present when hasResults is true. The full resultsSection is intentionally omitted from this record-level tool — fetch it via clinicaltrials_get_study_results.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, openWorld), but the description adds real behavioral detail: caps trim lists, and original totals appear in filtersApplied only when a cap actually trims the set — a non-obvious conditional worth knowing before calling. It does not cover error behavior for a malformed or unknown NCT ID, which is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose and return scope before the trimming caveat; no filler. The final sentence largely duplicates what the schema already says about the limit parameters, so it is not maximally economical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not specify the return shape, and it correctly focuses on the trimming semantics that the schema does not summarize in one place. Complete enough for a read-only single-record fetch with one required parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter is documented at length in the schema, so the description can only restate rather than add. Its summary of the limit parameters (including the filtersApplied conditional) is accurate but mirrors the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with its resolving key: 'Fetch a single clinical trial study by NCT ID from ClinicalTrials.gov'. The 'single study by NCT ID' framing clearly separates it from the search siblings, and the second sentence enumerates what comes back.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Use is implied by 'by NCT ID' — an agent already holding an identifier knows this is the tool. There is no explicit statement of when to prefer clinicaltrials_search_studies instead; that routing hint appears only inside the nearLocation schema description, not in the tool description itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clinicaltrials_get_study_resultsClinicaltrials Get Study ResultsA
Read-onlyIdempotent
Inspect

Fetch clinical trial results data from ClinicalTrials.gov for completed studies — outcome measures with statistics, adverse events, participant flow, baseline characteristics, and results metadata (limitations & caveats, certain-agreement disclosure restrictions, results point of contact). Only available for studies where hasResults is true. Use clinicaltrials_search_studies first to find studies with results. Each call fetches up to 20 distinct NCT IDs and returns any further IDs in deferredNctIds for a follow-up call. A results-rich record can exceed 500KB per study in full mode — bound it with summary=true, narrower sections, or the outcomeLimit / adverseEventLimit caps; outcomeLimit / outcomeOffset also page summarized outcomes. A bounded list is resumable: outcomeOffset / seriousEventOffset / otherEventOffset start the next window, and each study's filtersApplied reports what was trimmed and the next offset for every list left short. A previous (alias) NCT ID resolves to its canonical study, named in canonicalNctId.

NameRequiredDescriptionDefault
nctIdsYesOne or more NCT IDs — an empty list is rejected, and a repeated ID collapses to one results entry in first-occurrence order. A call fetches the first 20 distinct IDs; any further distinct IDs come back unfetched in deferredNctIds, in first-occurrence order, for a follow-up call. A list over 500 entries, repeats included, is rejected. E.g., "NCT12345678" or ["NCT12345678", "NCT87654321"]. Use summary=true for large batches to avoid large payloads.
summaryNoReturn condensed summaries instead of full data. Full mode renders every row and field on both output channels, so a large results set can exceed 500KB per study; summary mode typically cuts that to a few KB, scaling with the measure count rather than to a fixed ceiling. An outcome summary keeps the title, type, timeframe, paramType, dispersionType, unit, group/class/analysis counts, per-group denominators, a top-line projection of a single class/category cell — labelled with the class and category titles it came from, that class’s own denominators, and a count of the siblings it omits — and the first statistical analysis with its group description and compared groups named by title. The measurements outside that cell and the remaining analyses are dropped; re-run with summary=false to reach them. outcomeLimit / outcomeOffset page the summarized outcome list as they page full mode; the adverse-event bounds do not apply here, since topEvents ranks the whole event list. For a middle ground, keep full mode and cap the two lists that carry the bulk with outcomeLimit / adverseEventLimit.
sectionsNoFilter which sections to return. Values: outcomes, adverseEvents, participantFlow, baseline, moreInfo. Omit for all sections — an empty list is rejected, not treated as omission.
outcomeLimitNoOptional cap on the number of outcome measures returned per study, taken in the order ClinicalTrials.gov publishes them. Omit for no cap (every measure); a limit at or past the list length returns the whole list. Applies in both modes: each surviving measure keeps its complete groups/classes/measurements/analyses tree in full mode, or its whole summary projection with summary: true. Upstream total preserved in filtersApplied.totalOutcomes only when the cap trims the list.
outcomeOffsetNoOptional index of the first outcome measure to return, in the order ClinicalTrials.gov publishes them. Omit or 0 to start at the first. Pair with outcomeLimit to page a long list: each response reports filtersApplied.nextOutcomeOffset for the study, and the list is exhausted when that field is absent. Applied to every study in the call. An offset at or past the end returns an empty list with filtersApplied.totalOutcomes stating the upstream length, not an error. Works in summary mode too, paging the summarized measures. Rejected when sections excludes outcomes.
otherEventOffsetNoOptional index of the first other (non-serious) adverse event to return, in upstream order. Omit or 0 to start at the first. Pages independently of seriousEventOffset and pairs with adverseEventLimit. Continue from filtersApplied.nextOtherEventOffset until that field is absent. Applied to every study in the call. Rejected with summary: true or when sections excludes adverseEvents.
adverseEventLimitNoOptional cap on the number of serious and other adverse events returned per study, applied to each list separately in upstream order. Omit for no cap (every event); a limit at or past a list’s length returns that whole list. Applies to full mode only — summary mode already ranks the top 20 by the most participants affected in any one event group. Event groups are never capped. Upstream totals preserved in filtersApplied.totalSeriousEvents / totalOtherEvents only when the cap trims a list.
seriousEventOffsetNoOptional index of the first serious adverse event to return, in upstream order. Omit or 0 to start at the first. Pages independently of otherEventOffset — the two lists have uncorrelated lengths — and pairs with adverseEventLimit, which bounds each list separately. Continue from filtersApplied.nextSeriousEventOffset until that field is absent. Applied to every study in the call. Rejected with summary: true or when sections excludes adverseEvents.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
resultsNoResults per study.
truncatedNoTrue when a bound — a cap or an offset — trimmed a list on at least one study; absent when nothing was trimmed, matching filtersApplied one level down. Which study, which list, and where to resume is named in that study’s filtersApplied.
fetchErrorsNoStudies that could not be fetched.
deferredNctIdsNoRequested NCT IDs past the per-call cap of 20 distinct IDs, normalized and deduplicated, in first-occurrence order. Not fetched — pass them as nctIds in a follow-up call. Absent when every requested ID was processed.
studiesWithoutResultsNoNCT IDs that do not have results data.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world, so the safety profile is covered. The description still adds substantial behavior beyond that: a 20-distinct-ID fetch cap with deferredNctIds, per-study payload sizes that can exceed 500KB in full mode, summary-vs-full tradeoffs, per-list offset resumption via filtersApplied, and alias-to-canonical NCT resolution. It does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and precondition are front-loaded, followed by batching, size control, paging, and alias resolution in a logical order. The summary=true sentence is dense and long, and some schema-level parameter detail is repeated, but overall the length is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return shapes, and it still covers the operational essentials: batch cap and deferral, payload size risk, summarization tradeoffs, pagination continuation fields, and alias resolution. An agent has everything needed to call this correctly and to bound responses.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter in detail; baseline would be 3. The description adds cross-parameter meaning not obvious from individual schema entries: how outcomeLimit/outcomeOffset page summarized outcomes, how seriousEventOffset and otherEventOffset page independently, and that the adverse-event bounds do not apply in summary mode. Those interactions are genuinely useful beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch clinical trial results data from ClinicalTrials.gov') and enumerates the returned sections (outcome measures, adverse events, participant flow, baseline, results metadata). It distinguishes itself from clinicaltrials_search_studies by naming it as the discovery step and from clinicaltrials_get_study_record by scoping to results-only studies (hasResults true).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use clinicaltrials_search_studies first to find studies with results, and sets the precondition that only studies with hasResults=true are eligible. It also gives concrete alternatives for large payloads (summary=true, narrower sections, outcomeLimit/adverseEventLimit), which is exactly the when-to-use-vs-alternative guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clinicaltrials_search_studiesClinicaltrials Search StudiesA
Read-onlyIdempotent
Inspect

Search for clinical trial studies from ClinicalTrials.gov. Supports full-text and field-specific queries, status/phase/geographic filters, pagination, sorting, and field selection. Returns a compact per-study index by default; pass the fields parameter to get specific leaves at full fidelity — full study records are ~70KB each.

NameRequiredDescriptionDefault
sortNoSort order. Format: FieldName:asc or FieldName:desc. E.g., "LastUpdatePostDate:desc", "EnrollmentCount:desc". Max 2 fields comma-separated. For "largest trials" queries, pair EnrollmentCount:desc with advancedFilter "AREA[StudyType]INTERVENTIONAL" — the top enrollment counts are observational registry/claims studies enrolling tens of millions. Enrollment counts are sponsor-reported and not validated upstream beyond the unknown-enrollment sentinel exclusion. Use clinicaltrials_get_field_definitions to find sortable field names.
queryNoGeneral free-text search across all fields. Runs the 57-field relevance search ClinicalTrials.gov publishes for this parameter — NCTId, NCTIdAlias, OrgStudyId, SecondaryId, Acronym, BriefTitle, OfficialTitle, Condition, InterventionName, InterventionOtherName, Phase, StdAge, StudyType, BriefSummary, outcome measures and their descriptions, LeadSponsorName, CollaboratorName, the Location* fields, the Design* fields, and the ConditionAncestorTerm/InterventionAncestorTerm MeSH umbrellas — so a hit need not carry your term in the field you had in mind. Plain words plus AND, OR, NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression — those work here as well as in advancedFilter, so AREA[Phase]PHASE2 is accepted in this parameter; a stray bracket fails. `( )` group sub-expressions and work when matched; `,` acts as AND. The dedicated *Query parameters (conditionQuery, interventionQuery, etc.) scope a search to one field.
fieldsNoPascalCase leaf names to return; strongly recommended since full records are ~70KB. Omit for the compact index projection — an empty list is rejected, not treated as omission. A comma- or pipe-joined entry ("NCTId,BriefTitle") is split into separate names. Common leaves: NCTId, BriefTitle, BriefSummary, OverallStatus, Phase, LeadSponsorName, Condition. Call clinicaltrials_get_field_definitions with a concept query (e.g., "adverse events", "eligibility") to find the exact leaf for any concept.
nctIdsNoFilter to specific NCT IDs for batch lookups. Omit to search every study — an empty list is rejected, not treated as "no filter". Repeated IDs collapse to one, first occurrence kept. One request carries as many leading IDs as fit ClinicalTrials.gov's URL length limit beside the other parameters — about 560 when nothing else is set, fewer beside long queries or field lists — and the rest come back unqueried in deferredNctIds, in order, for a follow-up call; every page of a walk queries the same IDs. A list over 1000 entries, repeats included, is rejected. Supplying this lifts the default unknown-enrollment exclusion, so an ID you name is never filtered out of its own lookup.
pageSizeNoResults per page, 1–1000. A value above this server's per-page cap (200 unless the operator changed it) returns a page at the cap, reported in truncated/shown/cap with nextPageToken to continue.
geoFilterNoGeographic proximity filter. Format: distance(lat,lon,radius), where radius carries a `mi` or `km` suffix — e.g. "distance(47.6062,-122.3321,50mi)" for studies within 50 miles of Seattle. The suffix is required: a radius with no unit is rejected, as are a non-positive radius, a latitude outside [-90, 90], and a longitude outside [-180, 180]. When set, each study's locations are re-sorted by proximity to the center so the nearest matched site leads, annotated with its distance in miles; the full location list is preserved.
pageTokenNoPagination cursor: a previous response's nextPageToken, passed back unchanged with the same criteria. Tokens expire when ClinicalTrials.gov refreshes its data.
countTotalNoInclude total study count in response. Only computed on the first page.
titleQueryNoSearch within study titles and acronyms only. Matches Acronym, BriefTitle, and OfficialTitle. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
phaseFilterNoFilter by trial phase. Omit to search all phases — an empty list is rejected, not treated as "no filter". Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA. Case and spacing variants ("Phase 3", "early phase 1", "Not Applicable") are accepted, and a list or a comma- or pipe-joined string matches any of the phases. Each entry must name a phase — put search expressions (OR, NOT, AREA[…]) in advancedFilter.
outcomeQueryNoSearch within outcome measure fields. Matches PrimaryOutcomeMeasure, SecondaryOutcomeMeasure, OtherOutcomeMeasure, and OutcomeMeasureTitle, plus their description counterparts PrimaryOutcomeDescription, SecondaryOutcomeDescription, OtherOutcomeDescription, OutcomeMeasureDescription, and OutcomeMeasurePopulationDescription — so a term appearing only in outcome prose still matches. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
sponsorQueryNoSponsor/collaborator name search. Matches LeadSponsorName, CollaboratorName, and OrgFullName. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
statusFilterNoFilter by study status. Omit to search all statuses — an empty list is rejected, not treated as "no filter". Values: RECRUITING, COMPLETED, ACTIVE_NOT_RECRUITING, NOT_YET_RECRUITING, ENROLLING_BY_INVITATION, SUSPENDED, TERMINATED, WITHDRAWN, UNKNOWN, WITHHELD, NO_LONGER_AVAILABLE, AVAILABLE, APPROVED_FOR_MARKETING, TEMPORARILY_NOT_AVAILABLE.
locationQueryNoLocation search — city, state, country, or facility name. Matches LocationCity, LocationState, LocationCountry, LocationFacility, and LocationZip; a study matches when any of its sites does. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
advancedFilterNoAdvanced filter using AREA[FieldName]value syntax. Examples: "AREA[StudyType]INTERVENTIONAL", "AREA[EnrollmentCount]RANGE[100, 1000]", "AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL", "(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL". "AREA[HasResults]true" restricts to studies with posted results. AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names. A field name — a record field, an index-only piece such as NumLocations, or a search area such as ConditionSearch — that differs from the spelling AREA[] accepts only by case (AREA[overallstatus]) is corrected before the request, here and in the query parameters, and searchCriteria shows the expression as sent.
conditionQueryNoCondition/disease-specific search. E.g., "Type 2 Diabetes", "non-small cell lung cancer". Matches Condition, BriefTitle, OfficialTitle, ConditionMeshTerm, ConditionAncestorTerm, Keyword, and NCTId. ConditionAncestorTerm is the MeSH umbrella above the conditions a study itself lists, so results run broader than those lists — a study can match a parent term it never names. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
interventionQueryNoIntervention/treatment search. E.g., "pembrolizumab", "cognitive behavioral therapy". Matches InterventionName, InterventionType, ArmGroupType, InterventionOtherName, BriefTitle, OfficialTitle, ArmGroupLabel, InterventionMeshTerm, Keyword, InterventionAncestorTerm, InterventionDescription, and ArmGroupDescription. InterventionAncestorTerm is the MeSH umbrella above the interventions a study itself lists, so results run broader than those lists. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND.
includeUnknownEnrollmentNoInclude studies whose EnrollmentCount is the upstream "unknown" sentinel (99999999). Excluded by default — the sentinel pollutes RANGE[N, MAX] queries and EnrollmentCount:desc sorts. Set true for data-quality audits or when targeting unknown-enrollment studies specifically.

Output Schema

NameRequiredDescription
capNoThe server's per-page cap, served in place of the requested pageSize when truncated is true.
errorNoPresent when the call failed. Absent on success.
shownNoStudies on this page when truncated is true.
noticeNoRecovery guidance when no studies matched — echoes the constraint and suggests how to broaden, and names nctIds as part of the unmatched criteria when an ID list was supplied. On a page cut to the server's per-page cap, states the requested and served page sizes and points at nextPageToken. Absent on other pages with results, and on an exhausted continuation page, where the cohort already matched and there is nothing to broaden.
studiesNoMatching studies. By default each entry is a COMPACT index projection — nctId, briefTitle, overallStatus, phases, enrollmentCount, leadSponsor, conditions, hasResults, startDate and primaryCompletionDate (YYYY-MM or YYYY-MM-DD, as registered), and a bounded locations summary ({ total, nearest: { facility, city, state, country, status, distanceMi } }). nearest is the site closest to the geoFilter center, carrying distanceMi, or the lead registered site when no geoFilter is set; its status is that one site's own recruitment status, which can differ from the study's overallStatus, and is absent when the site publishes none. Keys the study does not publish are omitted — mirroring the rendered result, NOT the full ~70KB record. Pass the fields parameter to receive exactly the requested leaves at full fidelity instead (e.g. all locations). Fetch a full single record with clinicaltrials_get_study_record.
truncatedNoTrue when pageSize was above the server's per-page cap and this page filled to the cap with a nextPageToken. Without a total to check against (countTotal: false, or a continuation page), that next page can be empty. Absent otherwise.
totalCountNoTotal matching studies (first page only when countTotal=true).
nextPageTokenNoToken for the next page. Absent when this response already carries every matching study; otherwise it mirrors the upstream cursor, which ClinicalTrials.gov emits whenever a page fills to pageSize — so on a continuation page a token can still lead to an empty page.
pageExhaustedNoTrue when this call supplied a pageToken and the continuation page came back empty — the walk is finished and no further pages exist. Absent on every other response, including an empty first page, which is an unmatched search rather than exhausted pagination.
deferredNctIdsNoIDs from nctIds that did not fit in one ClinicalTrials.gov request beside the other parameters, deduplicated, in first-occurrence order. Not queried — studies and totalCount cover only the IDs that went out; pass these as nctIds in a follow-up call with the same criteria. Every page of a walk defers the same IDs. Absent when every requested ID was queried.
searchCriteriaNoEcho of active query/filter criteria applied to this search, including sentinelFilterActive when the default unknown-enrollment exclusion is in effect. Present on every response.
requestedFieldsNoEcho of the explicit fields parameter, with comma- or pipe-joined entries split into separate names and repeated names listed once — present only when the caller passed fields. Signals that studies carry the requested leaves at full fidelity (not the default compact index) and that the rendered truncation cap is lifted so all of them appear.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds useful behavioral context beyond them: results default to a compact per-study index, and full study records are roughly 70KB each, so passing fields matters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded, and wastes no sentences. It moves from purpose to supported features to output behavior in a logical order.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 18-parameter search tool with rich schema descriptions, annotations, and an output schema, the description covers the essentials: search scope, filters, pagination, sorting, field selection, and default compact output. It is slightly incomplete on sibling routing, but otherwise sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 18 parameters in depth. The description mentions the fields parameter and full-record size, but those details are already present in the schema's fields description, so it adds little new parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Search for clinical trial studies from ClinicalTrials.gov." It also summarizes supported capabilities, but it does not explicitly distinguish this tool from siblings such as clinicaltrials_get_study_record, clinicaltrials_get_study_count, or clinicaltrials_find_eligible.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the search use case clear and mentions that the fields parameter controls fidelity, but it gives no explicit when-to-use versus when-to-use-an-alternative guidance. It does not route agents to clinicaltrials_get_study_record for single full records or clinicaltrials_get_study_count for counts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updates
    • Changedclinicaltrials_find_eligible2 fields changed
      • changedInput schema / properties / location / properties / country / description
        Previous value: -"Country name. E.g., \"United States\"."New value: +"Country name, e.g. \"United States\". Common synonyms rank sites as the registry spelling does: USA and US as United States, UK and England as United Kingdom, Czech Republic as Czechia, Republic of Korea as South Korea, and PR, GU, VI, AS, and MP as the US territories, which the registry files as countries."
      • changedInput schema / properties / location / properties / state / description
        Previous value: -"State or province, compared with the state the site files. With city also given, a site that files no state still matches; without city, only sites filing this state match."New value: +"State or province, compared with the state the site files. A US state or DC abbreviation (WA, DC) is compared as its full name when the country is the United States or a synonym for it. With city also given, a site that files no state still matches; without city, only sites filing this state match."
    • Changedclinicaltrials_get_study_count1 field changed
      • changedInput schema / properties / advancedFilter / description
        Previous value: -"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names. A record-field name that differs from the spelling AREA[] accepts only by case (AREA[overallstatus]) is corrected before the request, here and in the query parameters, and searchCriteria shows the expression as sent; index-only pieces and search areas are not case-corrected."New value: +"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names. A field name — a record field, an index-only piece such as NumLocations, or a search area such as ConditionSearch — that differs from the spelling AREA[] accepts only by case (AREA[overallstatus]) is corrected before the request, here and in the query parameters, and searchCriteria shows the expression as sent."
    • Changedclinicaltrials_get_study_results1 field changed
      • changedOutput schema / properties / results / items / properties / adverseEvents / description
        Previous value: -"Adverse events. Summary mode: timeFrame, groupCount, seriousEventCount, otherEventCount, eventGroups (id and title of each event group), plus topEvents — up to 20 events ranked by the most participants affected in any one event group, each with term, organSystem, kind, and byGroup (one { groupId, numAffected, numAtRisk } row per event group; resolve groupId against eventGroups). Counts are never pooled across groups: groups can overlap (a crossover or second-course group re-counts participants of its parent arm), so compare arms row by row. Full mode: eventGroups with descriptions and per-group totals, plus seriousEvents and otherEvents with per-event term and per-group affected/at-risk stats."New value: +"Adverse events. Summary mode: timeFrame, frequencyThreshold, groupCount, seriousEventCount, otherEventCount, eventGroups (id and title of each event group), plus topEvents — up to 20 events ranked by the most participants affected in any one event group, each with term, organSystem, kind, and byGroup (one { groupId, numAffected, numAtRisk } row per event group; resolve groupId against eventGroups). Counts are never pooled across groups: groups can overlap (a crossover or second-course group re-counts participants of its parent arm), so compare arms row by row. Full mode: frequencyThreshold, eventGroups with descriptions and per-group totals, plus seriousEvents and otherEvents with per-event term and per-group affected/at-risk stats. frequencyThreshold, in either mode, is the reporting threshold as upstream sends it: other (non-serious) events are listed only when their frequency reaches it, so an other event the study does not list may still have occurred below it. Usually a percentage (\"5\", \"0\"), occasionally text (\"any\"); absent when the study publishes none."
    • Changedclinicaltrials_search_studies2 fields changed
      • changedInput schema / properties / advancedFilter / description
        Previous value: -"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". \"AREA[HasResults]true\" restricts to studies with posted results. AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names. A record-field name that differs from the spelling AREA[] accepts only by case (AREA[overallstatus]) is corrected before the request, here and in the query parameters, and searchCriteria shows the expression as sent; index-only pieces and search areas are not case-corrected."New value: +"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". \"AREA[HasResults]true\" restricts to studies with posted results. AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names. A field name — a record field, an index-only piece such as NumLocations, or a search area such as ConditionSearch — that differs from the spelling AREA[] accepts only by case (AREA[overallstatus]) is corrected before the request, here and in the query parameters, and searchCriteria shows the expression as sent."
      • changedOutput schema / properties / studies / description
        Previous value: -"Matching studies. By default each entry is a COMPACT index projection — nctId, briefTitle, overallStatus, phases, enrollmentCount, leadSponsor, conditions, hasResults, startDate and primaryCompletionDate (YYYY-MM or YYYY-MM-DD, as registered), and a bounded locations summary ({ total, nearest }); keys the study does not publish are omitted — mirroring the rendered result, NOT the full ~70KB record. Pass the fields parameter to receive exactly the requested leaves at full fidelity instead (e.g. all locations). Fetch a full single record with clinicaltrials_get_study_record."New value: +"Matching studies. By default each entry is a COMPACT index projection — nctId, briefTitle, overallStatus, phases, enrollmentCount, leadSponsor, conditions, hasResults, startDate and primaryCompletionDate (YYYY-MM or YYYY-MM-DD, as registered), and a bounded locations summary ({ total, nearest: { facility, city, state, country, status, distanceMi } }). nearest is the site closest to the geoFilter center, carrying distanceMi, or the lead registered site when no geoFilter is set; its status is that one site's own recruitment status, which can differ from the study's overallStatus, and is absent when the site publishes none. Keys the study does not publish are omitted — mirroring the rendered result, NOT the full ~70KB record. Pass the fields parameter to receive exactly the requested leaves at full fidelity instead (e.g. all locations). Fetch a full single record with clinicaltrials_get_study_record."
  2. 6 tool updates
    • Changedclinicaltrials_find_eligible5 fields changed
      • changedInput schema / properties / location / description
        Previous value: -"Patient location as `{ country (required), state?, city? }`. Country is required; state/city narrow the match. For radius-based geographic search, use clinicaltrials_search_studies with geoFilter."New value: +"Patient location as `{ country (required), state?, city? }`. Country is required; state/city narrow the match. Every part given must hold for the same study site: country and state are compared with the site's filed country and state, while city is matched against the site's whole location text, so a site filed under a borough or neighbouring town that names the city still counts. For radius-based geographic search, use clinicaltrials_search_studies with geoFilter."
      • changedInput schema / properties / location / properties / state / description
        Previous value: -"State or province."New value: +"State or province, compared with the state the site files. With city also given, a site that files no state still matches; without city, only sites filing this state match."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A conditions entry or location.country was supplied blank — empty, whitespace-only, or made only of `\"` characters, invisible format characters such as zero-width spaces, and whitespace, since `\"` is stripped before the query is built — or conditions was an empty list. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A conditions entry or location.country was supplied blank — empty, whitespace-only, or made only of `\"` characters, invisible format characters such as zero-width spaces, and whitespace, since `\"` is stripped before the query is built — or conditions was an empty list. `field_invalid`: A conditions entry carries an AREA[] expression naming a field ClinicalTrials.gov does not recognize or cannot search by value. `query_parse_error`: A conditions entry uses syntax the upstream Essie parser rejects — typically an unmatched `(` or `)`, or a `[` or `]` outside an AREA[…] expression. `request_too_long`: The conditions list or location makes the request URL longer than ClinicalTrials.gov accepts — several hundred conditions in one call. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "blank_value",
        -  "rate_limited"
        -]New value: +[
        +  "blank_value",
        +  "field_invalid",
        +  "query_parse_error",
        +  "request_too_long",
        +  "rate_limited"
        +]
      • changedOutput schema / properties / searchCriteria / properties / location / description
        Previous value: -"The exact queryLocn string sent upstream: city/state/country AND-joined inside SEARCH[Location](…) so every part must match the same site, each part quoted unless it is a single run of letters and digits (Toronto stays bare; \"United States\", \"Winston-Salem\", and \"L'Aquila\" are quoted), with any embedded double quote stripped and any backslash in a quoted part doubled. Pass as locationQuery to clinicaltrials_search_studies to reproduce the location filter beyond the maxResults cap."New value: +"The exact queryLocn string sent upstream: the parts AND-joined inside SEARCH[Location](…) so every part must match the same site. The city is a search term, quoted unless it is a single run of letters and digits (Toronto stays bare; \"Winston-Salem\" and \"L'Aquila\" are quoted); the state is AREA[LocationState]\"…\", ORed with AREA[LocationState]MISSING when a city is given; the country is AREA[LocationCountry]\"…\", ORed with the same spelling without diacritics when it carries any (México also tries Mexico). Any embedded double quote is stripped and any backslash in a quoted value doubled. Pass as locationQuery to clinicaltrials_search_studies to reproduce the location filter beyond the maxResults cap."
    • Changedclinicaltrials_get_field_definitions1 field changed
      • changedInput schema / properties / includeIndexedOnly / description
        Previous value: -"drill mode only. Only return indexed (searchable) fields. Default: false."New value: +"drill mode only. Also list index-only pieces (search-index fields such as StudyFirstPostYear) alongside the record fields. Default: false."
    • Changedclinicaltrials_get_field_values2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `field_invalid`: A requested field name is not a valid PascalCase piece name. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `field_invalid`: A requested field name is not a valid PascalCase piece name. `request_too_long`: The fields list makes the request URL longer than ClinicalTrials.gov accepts — a few hundred piece names in one call. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "blank_value",
        -  "field_invalid",
        -  "rate_limited"
        -]New value: +[
        +  "blank_value",
        +  "field_invalid",
        +  "request_too_long",
        +  "rate_limited"
        +]
    • Changedclinicaltrials_get_study_count3 fields changed
      • changedInput schema / properties / advancedFilter / description
        Previous value: -"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names."New value: +"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names. A record-field name that differs from the spelling AREA[] accepts only by case (AREA[overallstatus]) is corrected before the request, here and in the query parameters, and searchCriteria shows the expression as sent; index-only pieces and search areas are not case-corrected."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. A phaseFilter entry of only quotes or invisible format characters (zero-width space) is blank. `field_invalid`: A field name in the advanced filter or AREA[] expression is invalid (often a module name instead of a piece name). `enum_invalid`: A phaseFilter entry resolves to none of the six phase values, or statusFilter or an AREA[] expression carries a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. A phaseFilter entry of only quotes or invisible format characters (zero-width space) is blank. `field_invalid`: An AREA[] expression in advancedFilter or a query parameter names a field ClinicalTrials.gov does not recognize or cannot search by value — often a module or group such as LeadSponsor instead of a leaf piece such as LeadSponsorName. `enum_invalid`: A phaseFilter entry resolves to none of the six phase values, or statusFilter or an AREA[] expression carries a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `request_too_long`: The request URL runs past the length ClinicalTrials.gov accepts — typically a very long free-text query or advancedFilter expression. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "blank_value",
        -  "field_invalid",
        -  "enum_invalid",
        -  "query_parse_error",
        -  "rate_limited"
        -]New value: +[
        +  "blank_value",
        +  "field_invalid",
        +  "enum_invalid",
        +  "query_parse_error",
        +  "request_too_long",
        +  "rate_limited"
        +]
    • Changedclinicaltrials_get_study_record1 field changed
      • changedOutput schema / properties / resultsSummary / description
        Previous value: -"Compact counts of posted results, present when hasResults is true. The full resultsSection is intentionally omitted from this record-level tool — fetch it via clinicaltrials_get_study_results or the clinicaltrials://{nctId} resource."New value: +"Compact counts of posted results, present when hasResults is true. The full resultsSection is intentionally omitted from this record-level tool — fetch it via clinicaltrials_get_study_results."
    • Changedclinicaltrials_search_studies6 fields changed
      • changedInput schema / properties / advancedFilter / description
        Previous value: -"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". \"AREA[HasResults]true\" restricts to studies with posted results. AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names."New value: +"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". \"AREA[HasResults]true\" restricts to studies with posted results. AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names. A record-field name that differs from the spelling AREA[] accepts only by case (AREA[overallstatus]) is corrected before the request, here and in the query parameters, and searchCriteria shows the expression as sent; index-only pieces and search areas are not case-corrected."
      • changedInput schema / properties / nctIds / anyOf
        Previous value: -[
        -  {
        -    "description": "A single NCT ID.",
        -    "pattern": "^NCT\\d{8}$",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple NCT IDs (OR).",
        -    "items": {
        -      "pattern": "^NCT\\d{8}$",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single NCT ID.",
        +    "pattern": "^NCT\\d{8}$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple NCT IDs (OR), at most 1000 entries counting repeats.",
        +    "items": {
        +      "pattern": "^NCT\\d{8}$",
        +      "type": "string"
        +    },
        +    "maxItems": 1000,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / nctIds / description
        Previous value: -"Filter to specific NCT IDs for batch lookups. Omit to search every study — an empty list is rejected, not treated as \"no filter\". Supplying this lifts the default unknown-enrollment exclusion, so an ID you name is never filtered out of its own lookup."New value: +"Filter to specific NCT IDs for batch lookups. Omit to search every study — an empty list is rejected, not treated as \"no filter\". Repeated IDs collapse to one, first occurrence kept. One request carries as many leading IDs as fit ClinicalTrials.gov's URL length limit beside the other parameters — about 560 when nothing else is set, fewer beside long queries or field lists — and the rest come back unqueried in deferredNctIds, in order, for a follow-up call; every page of a walk queries the same IDs. A list over 1000 entries, repeats included, is rejected. Supplying this lifts the default unknown-enrollment exclusion, so an ID you name is never filtered out of its own lookup."
      • addedOutput schema / properties / deferredNctIds
        Added value: +{
        +  "description": "IDs from nctIds that did not fit in one ClinicalTrials.gov request beside the other parameters, deduplicated, in first-occurrence order. Not queried — studies and totalCount cover only the IDs that went out; pass these as nctIds in a follow-up call with the same criteria. Every page of a walk defers the same IDs. Absent when every requested ID was queried.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. A fields or phaseFilter entry of only invisible format characters (zero-width space) is blank, and so is a phaseFilter entry of only quotes. `ids_not_found`: One or more NCT IDs in the nctIds filter are not present at ClinicalTrials.gov. `field_invalid`: A field name in the fields parameter or AREA[] expression is invalid (often a module name instead of a piece name). `enum_invalid`: A phaseFilter entry resolves to none of the six phase values, or statusFilter or an AREA[] expression carries a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `geo_invalid`: geoFilter is not a well-formed distance(lat,lon,radius) expression. `sort_invalid`: sort is not FieldName:asc / FieldName:desc, or names more than 2 fields. `page_token_invalid`: ClinicalTrials.gov rejected pageToken as malformed (not a token it issued), or as unresumable (issued before a data refresh, or altered after issue). `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. A fields or phaseFilter entry of only invisible format characters (zero-width space) is blank, and so is a phaseFilter entry of only quotes. `ids_not_found`: One or more NCT IDs in the nctIds filter are not present at ClinicalTrials.gov. `field_invalid`: A name in the fields parameter is not a field, or an AREA[] expression names a field ClinicalTrials.gov does not recognize or cannot search by value — often a module or group such as LeadSponsor instead of a leaf piece such as LeadSponsorName. `enum_invalid`: A phaseFilter entry resolves to none of the six phase values, or statusFilter or an AREA[] expression carries a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `geo_invalid`: geoFilter is not a well-formed distance(lat,lon,radius) expression. `sort_invalid`: sort is not FieldName:asc / FieldName:desc, or names more than 2 fields. `page_token_invalid`: ClinicalTrials.gov rejected pageToken as malformed (not a token it issued), or as unresumable (issued before a data refresh, or altered after issue). `request_too_long`: The request URL runs past the length ClinicalTrials.gov accepts — long free-text queries, advancedFilter, or fields — or the other parameters leave no room for even one nctIds entry. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "blank_value",
        -  "ids_not_found",
        -  "field_invalid",
        -  "enum_invalid",
        -  "query_parse_error",
        -  "geo_invalid",
        -  "sort_invalid",
        -  "page_token_invalid",
        -  "rate_limited"
        -]New value: +[
        +  "blank_value",
        +  "ids_not_found",
        +  "field_invalid",
        +  "enum_invalid",
        +  "query_parse_error",
        +  "geo_invalid",
        +  "sort_invalid",
        +  "page_token_invalid",
        +  "request_too_long",
        +  "rate_limited"
        +]
  3. 6 tool updates
    • Changedclinicaltrials_find_eligible14 fields changed
      • changedInput schema / properties / age / description
        Previous value: -"Patient age in years."New value: +"Patient age as a whole number in ageUnit (years unless ageUnit says otherwise)."
      • addedInput schema / properties / ageUnit
        Added value: +{
        +  "description": "Unit age is given in: years (default), months, weeks, or days; case and singular forms are accepted. Use a smaller unit for an infant or young child whose eligibility window is narrower than a year — age 7 with ageUnit \"months\" matches a study registered for 6 Months to 8 Months, which no whole number of years reaches. ClinicalTrials.gov compares ages across units, so the unit only sets how precisely age is stated.",
        +  "enum": [
        +    "years",
        +    "months",
        +    "weeks",
        +    "days"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / conditions / description
        Previous value: -"Medical conditions or diagnoses, e.g. [\"Type 2 Diabetes\", \"Hypertension\"]. Each entry is matched as a condition (multi-word entries match as a phrase); multiple entries are combined with OR, so studies for any listed condition qualify. Returned studies are re-ranked so those whose own condition list names a requested condition rank above tangential matches the upstream fuzzy search pulls in via the MeSH umbrella."New value: +"Medical conditions or diagnoses, e.g. [\"Type 2 Diabetes\", \"Hypertension\"]. Each entry is matched as a condition: an entry containing whitespace is quoted and matches as a phrase, and any other entry is sent as written, punctuation included (double quotes are stripped from every entry); multiple entries are combined with OR, so studies for any listed condition qualify. Returned studies are re-ranked so those whose own condition list names a requested condition rank above tangential matches the upstream fuzzy search pulls in via the MeSH umbrella."
      • changedInput schema / properties / locationLimit / description
        Previous value: -"Cap on the sites returned per candidate. Each candidate keeps only the sites matching the requested location at the narrowest level that matched (city, else state, else country), capped at this many; the rest of the study's registered sites are omitted. The cap governs those matched sites — when none of them is recruiting, one recruiting site is added on top of it (the nearest to any matched site, measured before this cap, when coordinates allow — in the requested country whenever a site there recruits), so a candidate can carry one site more than this. Raise it to see more nearby sites, or fetch the complete site list with clinicaltrials_get_study_record. Each candidate reports totalLocations / matchedLocations / locationsTruncated / nearestRecruitingSiteAdded in locationSummary only when the bound actually dropped sites."New value: +"Cap on the sites returned per candidate. Each candidate keeps only the sites matching the requested location at the narrowest level that matched (city, else state, else country), capped at this many; the rest of the study's registered sites are omitted. The cap governs those matched sites — when none of them is recruiting, one recruiting site is added on top of it (the nearest to any matched site, measured before this cap, when coordinates allow — in the requested country whenever a site there recruits), so a candidate can carry one site more than this. Raise it to see more nearby sites — there is no upper bound, and a limit past the matched sites returns all of them — or fetch the complete site list with clinicaltrials_get_study_record. Each candidate reports totalLocations / matchedLocations / locationsTruncated / nearestRecruitingSiteAdded in locationSummary only when the bound actually dropped sites."
      • changedInput schema / properties / locationLimit / maximum
        Previous value: -500New value: +9007199254740991
      • changedInput schema / properties / maxResults / description
        Previous value: -"Maximum results to return."New value: +"Maximum candidates to return, 1–1000. Each call returns at most 50; a larger value returns 50, reported in truncated/shown/cap when more studies match, and the searchCriteria replay through clinicaltrials_search_studies pages the rest."
      • changedInput schema / properties / maxResults / maximum
        Previous value: -50New value: +1000
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The tool's per-call cap, served in place of the requested maxResults when truncated is true.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"When no studies matched, recovery guidance that identifies which filter stage collapsed and suggests how to broaden. When studies are returned, one caveat for the whole response: candidates were matched on demographics, location, recruitment status, and a fuzzy condition search, not on inclusion/exclusion criteria."New value: +"When no studies matched, recovery guidance that identifies which filter stage collapsed and suggests how to broaden. When studies are returned, one caveat for the whole response: candidates were matched on demographics, location, recruitment status, and a fuzzy condition search, not on inclusion/exclusion criteria. When maxResults was above the tool's per-call cap and more studies match, a sentence follows stating the requested, served, and total counts and pointing at the searchCriteria replay."
      • changedOutput schema / properties / searchCriteria / properties / age / description
        Previous value: -"Patient age."New value: +"Patient age, in ageUnit when present, else in years."
      • addedOutput schema / properties / searchCriteria / properties / ageUnit
        Added value: +{
        +  "description": "The unit age was given in. Present only for months, weeks, or days; absent means years.",
        +  "enum": [
        +    "years",
        +    "months",
        +    "weeks",
        +    "days"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / searchCriteria / properties / location / description
        Previous value: -"The exact queryLocn string sent upstream (city/state/country, multi-word components quoted, AND-joined). Pass as locationQuery to clinicaltrials_search_studies to reproduce the location filter beyond the maxResults cap."New value: +"The exact queryLocn string sent upstream: city/state/country AND-joined inside SEARCH[Location](…) so every part must match the same site, each part quoted unless it is a single run of letters and digits (Toronto stays bare; \"United States\", \"Winston-Salem\", and \"L'Aquila\" are quoted), with any embedded double quote stripped and any backslash in a quoted part doubled. Pass as locationQuery to clinicaltrials_search_studies to reproduce the location filter beyond the maxResults cap."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Candidates returned when truncated is true.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when maxResults was above the tool's per-call cap and more studies match than were returned. Absent otherwise.",
        +  "type": "boolean"
        +}
    • Changedclinicaltrials_get_field_definitions2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"search mode only. Maximum results to return. Default: 20."New value: +"search mode only. Maximum results to return. Default: 20. A value at or past the match count returns every match."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +9007199254740991
    • Changedclinicaltrials_get_field_values6 fields changed
      • changedOutput schema / properties / fieldStats / items / properties / longest / properties / length / description
        Previous value: -"Its length in characters."New value: +"Full length of the recorded value in characters, even when truncated."
      • addedOutput schema / properties / fieldStats / items / properties / longest / properties / truncated
        Added value: +{
        +  "const": true,
        +  "description": "True when value is a preview of at most 2,000 characters; absent when value is whole. The notice names the clinicaltrials_search_studies call that returns the full text.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / fieldStats / items / properties / longest / properties / value / description
        Previous value: -"The longest recorded value."New value: +"The longest recorded value — when truncated is true, only a prefix of at most 2,000 characters (1,999 when the cut would split a surrogate pair)."
      • changedOutput schema / properties / fieldStats / items / properties / uniqueValuesCount / description
        Previous value: -"Number of distinct values."New value: +"Number of distinct values, as ClinicalTrials.gov reports it. Free-text STRING fields it does not count (DetailedDescription, EligibilityCriteria) report 0 here alongside uniqueValuesCounted: false — that 0 is not a count. A 0 without the flag means no recorded values."
      • addedOutput schema / properties / fieldStats / items / properties / uniqueValuesCounted
        Added value: +{
        +  "const": false,
        +  "description": "False when ClinicalTrials.gov did not count distinct values for this field, so the uniqueValuesCount of 0 is not a real count — the field has recorded values (see longest) but no topValues. Absent otherwise.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when a longest value was cut to a preview — names, for each such field, the clinicaltrials_search_studies arguments that return its full text.",
        +  "type": "string"
        +}
    • Changedclinicaltrials_get_study_record8 fields changed
      • changedInput schema / properties / locationLimit / description
        Previous value: -"Optional cap on the number of locations returned. Omit for no cap (full upstream list). Pairs naturally with nearLocation for narrowing a large multi-site trial. Original total preserved in filtersApplied.totalLocations only when the cap trims the list."New value: +"Optional cap on the number of locations returned. Omit for no cap (full upstream list); a value at or past the list length also returns every location. Pairs naturally with nearLocation for narrowing a large multi-site trial. Original total preserved in filtersApplied.totalLocations only when the cap trims the list."
      • changedInput schema / properties / locationLimit / maximum
        Previous value: -500New value: +9007199254740991
      • changedInput schema / properties / nearLocation / properties / radiusMi / description
        Previous value: -"Radius in miles. Default 50."New value: +"Radius in miles, at least 1. Default 50. A radius past the farthest site keeps every site with published coordinates."
      • removedInput schema / properties / nearLocation / properties / radiusMi / maximum
        Removed value: -500
      • changedInput schema / properties / outcomeLimit / description
        Previous value: -"Optional cap on the number of secondary and other outcomes returned. Omit for no cap (full upstream lists). Primary outcomes are never capped. Original totals preserved in filtersApplied.totalSecondaryOutcomes / totalOtherOutcomes only when the cap trims a list."New value: +"Optional cap on the number of secondary and other outcomes returned. Omit for no cap (full upstream lists); a value at or past a list length also returns that whole list. Primary outcomes are never capped. Original totals preserved in filtersApplied.totalSecondaryOutcomes / totalOtherOutcomes only when the cap trims a list."
      • changedInput schema / properties / outcomeLimit / maximum
        Previous value: -100New value: +9007199254740991
      • changedInput schema / properties / referenceLimit / description
        Previous value: -"Optional cap on the number of references returned. Omit for no cap (full upstream list). Original total preserved in filtersApplied.totalReferences only when the cap trims the list. seeAlsoLinks are never capped."New value: +"Optional cap on the number of references returned. Omit for no cap (full upstream list); a value at or past the list length also returns every reference. Original total preserved in filtersApplied.totalReferences only when the cap trims the list. seeAlsoLinks are never capped."
      • changedInput schema / properties / referenceLimit / maximum
        Previous value: -100New value: +9007199254740991
    • Changedclinicaltrials_get_study_results7 fields changed
      • changedInput schema / properties / adverseEventLimit / description
        Previous value: -"Optional cap on the number of serious and other adverse events returned per study, applied to each list separately in upstream order. Omit for no cap (every event). Applies to full mode only — summary mode already ranks the top 20 by the most participants affected in any one event group. Event groups are never capped. Upstream totals preserved in filtersApplied.totalSeriousEvents / totalOtherEvents only when the cap trims a list."New value: +"Optional cap on the number of serious and other adverse events returned per study, applied to each list separately in upstream order. Omit for no cap (every event); a limit at or past a list’s length returns that whole list. Applies to full mode only — summary mode already ranks the top 20 by the most participants affected in any one event group. Event groups are never capped. Upstream totals preserved in filtersApplied.totalSeriousEvents / totalOtherEvents only when the cap trims a list."
      • changedInput schema / properties / adverseEventLimit / maximum
        Previous value: -500New value: +9007199254740991
      • changedInput schema / properties / nctIds / anyOf
        Previous value: -[
        -  {
        -    "description": "A single NCT ID.",
        -    "pattern": "^NCT\\d{8}$",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple NCT IDs (max 20).",
        -    "items": {
        -      "pattern": "^NCT\\d{8}$",
        -      "type": "string"
        -    },
        -    "maxItems": 20,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single NCT ID.",
        +    "pattern": "^NCT\\d{8}$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple NCT IDs, at most 500 entries counting repeats.",
        +    "items": {
        +      "pattern": "^NCT\\d{8}$",
        +      "type": "string"
        +    },
        +    "maxItems": 500,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / nctIds / description
        Previous value: -"One or more NCT IDs (max 20) — an empty list is rejected, and a repeated ID collapses to one results entry in first-occurrence order. E.g., \"NCT12345678\" or [\"NCT12345678\", \"NCT87654321\"]. Use summary=true for large batches to avoid large payloads."New value: +"One or more NCT IDs — an empty list is rejected, and a repeated ID collapses to one results entry in first-occurrence order. A call fetches the first 20 distinct IDs; any further distinct IDs come back unfetched in deferredNctIds, in first-occurrence order, for a follow-up call. A list over 500 entries, repeats included, is rejected. E.g., \"NCT12345678\" or [\"NCT12345678\", \"NCT87654321\"]. Use summary=true for large batches to avoid large payloads."
      • changedInput schema / properties / outcomeLimit / description
        Previous value: -"Optional cap on the number of outcome measures returned per study, taken in the order ClinicalTrials.gov publishes them. Omit for no cap (every measure). Applies in both modes: each surviving measure keeps its complete groups/classes/measurements/analyses tree in full mode, or its whole summary projection with summary: true. Upstream total preserved in filtersApplied.totalOutcomes only when the cap trims the list."New value: +"Optional cap on the number of outcome measures returned per study, taken in the order ClinicalTrials.gov publishes them. Omit for no cap (every measure); a limit at or past the list length returns the whole list. Applies in both modes: each surviving measure keeps its complete groups/classes/measurements/analyses tree in full mode, or its whole summary projection with summary: true. Upstream total preserved in filtersApplied.totalOutcomes only when the cap trims the list."
      • changedInput schema / properties / outcomeLimit / maximum
        Previous value: -100New value: +9007199254740991
      • addedOutput schema / properties / deferredNctIds
        Added value: +{
        +  "description": "Requested NCT IDs past the per-call cap of 20 distinct IDs, normalized and deduplicated, in first-occurrence order. Not fetched — pass them as nctIds in a follow-up call. Absent when every requested ID was processed.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedclinicaltrials_search_studies6 fields changed
      • changedInput schema / properties / pageSize / description
        Previous value: -"Results per page, 1–200."New value: +"Results per page, 1–1000. A value above this server's per-page cap (200 unless the operator changed it) returns a page at the cap, reported in truncated/shown/cap with nextPageToken to continue."
      • changedInput schema / properties / pageSize / maximum
        Previous value: -200New value: +1000
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The server's per-page cap, served in place of the requested pageSize when truncated is true.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when no studies matched — echoes the constraint and suggests how to broaden, and names nctIds as part of the unmatched criteria when an ID list was supplied. Absent on pages with results, and on an exhausted continuation page, where the cohort already matched and there is nothing to broaden."New value: +"Recovery guidance when no studies matched — echoes the constraint and suggests how to broaden, and names nctIds as part of the unmatched criteria when an ID list was supplied. On a page cut to the server's per-page cap, states the requested and served page sizes and points at nextPageToken. Absent on other pages with results, and on an exhausted continuation page, where the cohort already matched and there is nothing to broaden."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Studies on this page when truncated is true.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when pageSize was above the server's per-page cap and this page filled to the cap with a nextPageToken. Without a total to check against (countTotal: false, or a continuation page), that next page can be empty. Absent otherwise.",
        +  "type": "boolean"
        +}
  4. 5 tool updates
    • Changedclinicaltrials_find_eligible3 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A conditions entry or location.country was supplied blank — empty, whitespace-only, or made only of `\"` characters, invisible format characters such as zero-width spaces, and whitespace, since `\"` is stripped before the query is built — or conditions was an empty list. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when no studies matched — identifies which filter stage collapsed and suggests how to broaden. Absent when results are returned."New value: +"When no studies matched, recovery guidance that identifies which filter stage collapsed and suggests how to broaden. When studies are returned, one caveat for the whole response: candidates were matched on demographics, location, recruitment status, and a fuzzy condition search, not on inclusion/exclusion criteria."
      • changedOutput schema / properties / studies / description
        Previous value: -"Matching studies with eligibility and location fields. Each candidate's protocolSection.contactsLocationsModule.locations is BOUNDED to the sites matching the requested location (capped at locationLimit) plus, when none of those is recruiting, one added recruiting site — not the study's full registered site list. The added site is the one nearest any matched site by published coordinates, taken from the requested country whenever a site there recruits, and carries distanceMi (miles to that nearest matched site); when the matched or recruiting sites publish no coordinates it is the first in match order and carries no distanceMi. A candidate whose sites were bounded also carries a top-level locationSummary object — { totalLocations, matchedLocations, locationsTruncated, nearestRecruitingSiteAdded?, retrieveFullStudyWith } — absent when nothing was dropped; nearestRecruitingSiteAdded is present only when that extra site was added (the key keeps its name in the match-order fallback). Fetch a study's complete record and site list with clinicaltrials_get_study_record."New value: +"Candidate studies with their demographic limits (age, sex, healthy volunteers), contacts, and location fields — matched on age, sex, location, recruitment status, and the fuzzy condition search; inclusion/exclusion criteria are not checked and are not in these records, so review each candidate with clinicaltrials_get_study_record. Each candidate's protocolSection.contactsLocationsModule.locations is BOUNDED to the sites matching the requested location (capped at locationLimit) plus, when none of those is recruiting, one added recruiting site — not the study's full registered site list. The added site is the one nearest any matched site by published coordinates, taken from the requested country whenever a site there recruits, and carries distanceMi (miles to that nearest matched site); when the matched or recruiting sites publish no coordinates it is the first in match order and carries no distanceMi. A candidate whose sites were bounded also carries a top-level locationSummary object — { totalLocations, matchedLocations, locationsTruncated, nearestRecruitingSiteAdded?, retrieveFullStudyWith } — absent when nothing was dropped; nearestRecruitingSiteAdded is present only when that extra site was added (the key keeps its name in the match-order fallback). Fetch a study's complete record and site list with clinicaltrials_get_study_record."
    • Changedclinicaltrials_get_field_values1 field changed
      • changedInput schema / properties / fields / description
        Previous value: -"PascalCase field name(s) to get value statistics for — an empty list is rejected, not treated as \"every field\". Examples: OverallStatus, Phase, StudyType, Sex, LeadSponsorClass. Use clinicaltrials_get_field_definitions with a query to find more field names."New value: +"PascalCase field name(s) to get value statistics for — an empty list is rejected, not treated as \"every field\". A comma- or pipe-joined string (\"Phase,StudyType\") is split into separate names. Examples: OverallStatus, Phase, StudyType, Sex, LeadSponsorClass. Use clinicaltrials_get_field_definitions with a query to find more field names."
    • Changedclinicaltrials_get_study_count2 fields changed
      • changedInput schema / properties / phaseFilter / description
        Previous value: -"Filter by trial phase. Omit to count all phases — an empty list is rejected, not treated as \"no filter\". Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA."New value: +"Filter by trial phase. Omit to count all phases — an empty list is rejected, not treated as \"no filter\". Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA. Case and spacing variants (\"Phase 3\", \"early phase 1\", \"Not Applicable\") are accepted, and a list or a comma- or pipe-joined string matches any of the phases. Each entry must name a phase — put search expressions (OR, NOT, AREA[…]) in advancedFilter."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `field_invalid`: A field name in the advanced filter or AREA[] expression is invalid (often a module name instead of a piece name). `enum_invalid`: statusFilter or phaseFilter contains a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. A phaseFilter entry of only quotes or invisible format characters (zero-width space) is blank. `field_invalid`: A field name in the advanced filter or AREA[] expression is invalid (often a module name instead of a piece name). `enum_invalid`: A phaseFilter entry resolves to none of the six phase values, or statusFilter or an AREA[] expression carries a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
    • Changedclinicaltrials_get_study_results7 fields changed
      • changedInput schema / properties / outcomeLimit / description
        Previous value: -"Optional cap on the number of outcome measures returned per study, taken in the order ClinicalTrials.gov publishes them. Omit for no cap (every measure). Applies to full mode only — summary mode is already condensed. Each surviving measure keeps its complete groups/classes/measurements/analyses tree. Upstream total preserved in filtersApplied.totalOutcomes only when the cap trims the list."New value: +"Optional cap on the number of outcome measures returned per study, taken in the order ClinicalTrials.gov publishes them. Omit for no cap (every measure). Applies in both modes: each surviving measure keeps its complete groups/classes/measurements/analyses tree in full mode, or its whole summary projection with summary: true. Upstream total preserved in filtersApplied.totalOutcomes only when the cap trims the list."
      • changedInput schema / properties / outcomeOffset / description
        Previous value: -"Optional index of the first outcome measure to return, in the order ClinicalTrials.gov publishes them. Omit or 0 to start at the first. Pair with outcomeLimit to page a long list: each response reports filtersApplied.nextOutcomeOffset for the study, and the list is exhausted when that field is absent. Applied to every study in the call. An offset at or past the end returns an empty list with filtersApplied.totalOutcomes stating the upstream length, not an error. Rejected with summary: true or when sections excludes outcomes."New value: +"Optional index of the first outcome measure to return, in the order ClinicalTrials.gov publishes them. Omit or 0 to start at the first. Pair with outcomeLimit to page a long list: each response reports filtersApplied.nextOutcomeOffset for the study, and the list is exhausted when that field is absent. Applied to every study in the call. An offset at or past the end returns an empty list with filtersApplied.totalOutcomes stating the upstream length, not an error. Works in summary mode too, paging the summarized measures. Rejected when sections excludes outcomes."
      • changedInput schema / properties / summary / description
        Previous value: -"Return condensed summaries instead of full data. Full mode renders every row and field on both output channels, so a large results set can exceed 500KB per study; summary mode typically cuts that to a few KB, scaling with the measure count rather than to a fixed ceiling. An outcome summary keeps the title, type, timeframe, paramType, dispersionType, unit, group/class counts, per-group denominators, one statistical analysis, and a top-line projection of a single class/category cell — labelled with the class and category titles it came from and a count of the siblings it omits. The measurements outside that cell and the remaining analyses are dropped; re-run with summary=false to reach them. For a middle ground, keep full mode and cap the two lists that carry the bulk with outcomeLimit / adverseEventLimit."New value: +"Return condensed summaries instead of full data. Full mode renders every row and field on both output channels, so a large results set can exceed 500KB per study; summary mode typically cuts that to a few KB, scaling with the measure count rather than to a fixed ceiling. An outcome summary keeps the title, type, timeframe, paramType, dispersionType, unit, group/class/analysis counts, per-group denominators, a top-line projection of a single class/category cell — labelled with the class and category titles it came from, that class’s own denominators, and a count of the siblings it omits — and the first statistical analysis with its group description and compared groups named by title. The measurements outside that cell and the remaining analyses are dropped; re-run with summary=false to reach them. outcomeLimit / outcomeOffset page the summarized outcome list as they page full mode; the adverse-event bounds do not apply here, since topEvents ranks the whole event list. For a middle ground, keep full mode and cap the two lists that carry the bulk with outcomeLimit / adverseEventLimit."
      • addedInput schema / required
        Added value: +[
        +  "nctIds"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `offset_not_applicable`: An offset was supplied for a list this call does not return — summary mode returns a condensed projection rather than a bounded window, or the sections filter excludes the offset’s own section. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `offset_not_applicable`: An offset was supplied for a list this call does not return as a window — an adverse-event offset in summary mode, which ranks the whole event list into topEvents, or any offset whose own section the sections filter excludes. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / results / items / properties / filtersApplied / description
        Previous value: -"What the outcomeLimit / adverseEventLimit caps and the outcomeOffset / seriousEventOffset / otherEventOffset offsets trimmed on this study, plus the next offset for each list left short. Present only when a bound actually reduced a list — a window that started at zero and reached the end trimmed nothing. Absent means the payload is the complete upstream set for the requested sections. Offsets apply uniformly to every study in the call, so continuation is reported per study: each exhausts its lists at a different index."New value: +"What the outcomeLimit / adverseEventLimit caps and the outcomeOffset / seriousEventOffset / otherEventOffset offsets trimmed on this study, plus the next offset for each list left short. In summary mode only the outcome bounds apply. Present only when a bound actually reduced a list — a window that started at zero and reached the end trimmed nothing. Absent means the payload is the complete upstream set for the requested sections. Offsets apply uniformly to every study in the call, so continuation is reported per study: each exhausts its lists at a different index."
      • changedOutput schema / properties / results / items / properties / outcomes / description
        Previous value: -"Outcome measures with per-group statistics. Summary mode (compact): type, title, timeFrame, paramType, dispersionType, unitOfMeasure, group/class counts, denoms (per-group denominators keyed by group title), topStats (the per-group cells of one class/category — each carrying the upstream value verbatim, including an NA/NR sentinel, plus spread, lowerLimit/upperLimit, and the record’s own comment when present), topStatsFrom (classTitle / categoryTitle naming where that cell came from, with omittedClasses / omittedCategories counts and a note pointing at summary=false when siblings were dropped), and topAnalysis (statisticalMethod, pValue, paramType/Value, ciPctValue/Lower/Upper, nonInferiorityType, groupIds — lifted from analyses[0]) when present. Full mode (default): adds raw groups, classes, categories, measurements, and analyses arrays."New value: +"Outcome measures with per-group statistics. Summary mode (compact): type, title, timeFrame, paramType, dispersionType, unitOfMeasure, groupCount / classCount, analysisCount (how many analyses the measure carries, when it has any), denoms (the whole measure’s per-group denominators keyed by group title), topStats (the per-group cells of one class/category — each carrying the upstream value verbatim, including an NA/NR sentinel, plus spread, lowerLimit/upperLimit, and the record’s own comment when present), topStatsFrom (classTitle / categoryTitle naming where that cell came from, classDenoms — that class’s own denominators, shaped like denoms, when upstream publishes them — omittedClasses / omittedCategories counts, and a note pointing at summary=false when siblings were dropped), and topAnalysis (statisticalMethod, pValue, paramType/Value, ciPctValue/Lower/Upper, nonInferiorityType, groupDescription naming the subgroup or comparison, groupIds, and groups — the compared groups’ titles in groupIds order — lifted from analyses[0]) when present. Every summary field is resolved per measure. Full mode (default): adds raw groups, classes, categories, measurements, and analyses arrays."
    • Changedclinicaltrials_search_studies6 fields changed
      • changedInput schema / properties / fields / description
        Previous value: -"PascalCase leaf names to return; strongly recommended since full records are ~70KB. Omit for the compact index projection — an empty list is rejected, not treated as omission. Common leaves: NCTId, BriefTitle, BriefSummary, OverallStatus, Phase, LeadSponsorName, Condition. Call clinicaltrials_get_field_definitions with a concept query (e.g., \"adverse events\", \"eligibility\") to find the exact leaf for any concept."New value: +"PascalCase leaf names to return; strongly recommended since full records are ~70KB. Omit for the compact index projection — an empty list is rejected, not treated as omission. A comma- or pipe-joined entry (\"NCTId,BriefTitle\") is split into separate names. Common leaves: NCTId, BriefTitle, BriefSummary, OverallStatus, Phase, LeadSponsorName, Condition. Call clinicaltrials_get_field_definitions with a concept query (e.g., \"adverse events\", \"eligibility\") to find the exact leaf for any concept."
      • changedInput schema / properties / pageToken / description
        Previous value: -"Pagination cursor from a previous response."New value: +"Pagination cursor: a previous response's nextPageToken, passed back unchanged with the same criteria. Tokens expire when ClinicalTrials.gov refreshes its data."
      • changedInput schema / properties / phaseFilter / description
        Previous value: -"Filter by trial phase. Omit to search all phases — an empty list is rejected, not treated as \"no filter\". Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA."New value: +"Filter by trial phase. Omit to search all phases — an empty list is rejected, not treated as \"no filter\". Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA. Case and spacing variants (\"Phase 3\", \"early phase 1\", \"Not Applicable\") are accepted, and a list or a comma- or pipe-joined string matches any of the phases. Each entry must name a phase — put search expressions (OR, NOT, AREA[…]) in advancedFilter."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `ids_not_found`: One or more NCT IDs in the nctIds filter are not present at ClinicalTrials.gov. `field_invalid`: A field name in the fields parameter or AREA[] expression is invalid (often a module name instead of a piece name). `enum_invalid`: statusFilter or phaseFilter contains a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `geo_invalid`: geoFilter is not a well-formed distance(lat,lon,radius) expression. `sort_invalid`: sort is not FieldName:asc / FieldName:desc, or names more than 2 fields. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. A fields or phaseFilter entry of only invisible format characters (zero-width space) is blank, and so is a phaseFilter entry of only quotes. `ids_not_found`: One or more NCT IDs in the nctIds filter are not present at ClinicalTrials.gov. `field_invalid`: A field name in the fields parameter or AREA[] expression is invalid (often a module name instead of a piece name). `enum_invalid`: A phaseFilter entry resolves to none of the six phase values, or statusFilter or an AREA[] expression carries a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `geo_invalid`: geoFilter is not a well-formed distance(lat,lon,radius) expression. `sort_invalid`: sort is not FieldName:asc / FieldName:desc, or names more than 2 fields. `page_token_invalid`: ClinicalTrials.gov rejected pageToken as malformed (not a token it issued), or as unresumable (issued before a data refresh, or altered after issue). `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "blank_value",
        -  "ids_not_found",
        -  "field_invalid",
        -  "enum_invalid",
        -  "query_parse_error",
        -  "geo_invalid",
        -  "sort_invalid",
        -  "rate_limited"
        -]New value: +[
        +  "blank_value",
        +  "ids_not_found",
        +  "field_invalid",
        +  "enum_invalid",
        +  "query_parse_error",
        +  "geo_invalid",
        +  "sort_invalid",
        +  "page_token_invalid",
        +  "rate_limited"
        +]
      • changedOutput schema / properties / requestedFields / description
        Previous value: -"Echo of the explicit fields parameter — present only when the caller passed fields. Signals that studies carry the requested leaves at full fidelity (not the default compact index) and that the rendered truncation cap is lifted so all of them appear."New value: +"Echo of the explicit fields parameter, with comma- or pipe-joined entries split into separate names and repeated names listed once — present only when the caller passed fields. Signals that studies carry the requested leaves at full fidelity (not the default compact index) and that the rendered truncation cap is lifted so all of them appear."
  5. 2 tool updates
    • Changedclinicaltrials_find_eligible2 fields changed
      • changedInput schema / properties / locationLimit / description
        Previous value: -"Cap on the sites returned per candidate. Each candidate keeps only the sites matching the requested location at the narrowest level that matched (city, else state, else country), capped at this many; the rest of the study's registered sites are omitted. The cap governs those matched sites — when none of them is recruiting, the candidate's nearest recruiting site is added on top of it, so a candidate can carry one site more than this. Raise it to see more nearby sites, or fetch the complete site list with clinicaltrials_get_study_record. Each candidate reports totalLocations / matchedLocations / locationsTruncated / nearestRecruitingSiteAdded in locationSummary only when the bound actually dropped sites."New value: +"Cap on the sites returned per candidate. Each candidate keeps only the sites matching the requested location at the narrowest level that matched (city, else state, else country), capped at this many; the rest of the study's registered sites are omitted. The cap governs those matched sites — when none of them is recruiting, one recruiting site is added on top of it (the nearest to any matched site, measured before this cap, when coordinates allow — in the requested country whenever a site there recruits), so a candidate can carry one site more than this. Raise it to see more nearby sites, or fetch the complete site list with clinicaltrials_get_study_record. Each candidate reports totalLocations / matchedLocations / locationsTruncated / nearestRecruitingSiteAdded in locationSummary only when the bound actually dropped sites."
      • changedOutput schema / properties / studies / description
        Previous value: -"Matching studies with eligibility and location fields. Each candidate's protocolSection.contactsLocationsModule.locations is BOUNDED to the sites matching the requested location (capped at locationLimit) plus, when none of those is recruiting, the candidate's nearest recruiting site — not the study's full registered site list. A candidate whose sites were bounded also carries a top-level locationSummary object — { totalLocations, matchedLocations, locationsTruncated, nearestRecruitingSiteAdded?, retrieveFullStudyWith } — absent when nothing was dropped; nearestRecruitingSiteAdded is present only when that extra site was added. Fetch a study's complete record and site list with clinicaltrials_get_study_record."New value: +"Matching studies with eligibility and location fields. Each candidate's protocolSection.contactsLocationsModule.locations is BOUNDED to the sites matching the requested location (capped at locationLimit) plus, when none of those is recruiting, one added recruiting site — not the study's full registered site list. The added site is the one nearest any matched site by published coordinates, taken from the requested country whenever a site there recruits, and carries distanceMi (miles to that nearest matched site); when the matched or recruiting sites publish no coordinates it is the first in match order and carries no distanceMi. A candidate whose sites were bounded also carries a top-level locationSummary object — { totalLocations, matchedLocations, locationsTruncated, nearestRecruitingSiteAdded?, retrieveFullStudyWith } — absent when nothing was dropped; nearestRecruitingSiteAdded is present only when that extra site was added (the key keeps its name in the match-order fallback). Fetch a study's complete record and site list with clinicaltrials_get_study_record."
    • Changedclinicaltrials_get_study_results2 fields changed
      • changedInput schema / properties / adverseEventLimit / description
        Previous value: -"Optional cap on the number of serious and other adverse events returned per study, applied to each list separately in upstream order. Omit for no cap (every event). Applies to full mode only — summary mode already ranks the top 20 by participants affected. Event groups are never capped. Upstream totals preserved in filtersApplied.totalSeriousEvents / totalOtherEvents only when the cap trims a list."New value: +"Optional cap on the number of serious and other adverse events returned per study, applied to each list separately in upstream order. Omit for no cap (every event). Applies to full mode only — summary mode already ranks the top 20 by the most participants affected in any one event group. Event groups are never capped. Upstream totals preserved in filtersApplied.totalSeriousEvents / totalOtherEvents only when the cap trims a list."
      • changedOutput schema / properties / results / items / properties / adverseEvents / description
        Previous value: -"Adverse events. Summary mode: timeFrame, groupCount, seriousEventCount, otherEventCount, plus topEvents — the most frequent events ranked by participants affected, aggregated across arms (term, organSystem, kind, numAffected, numAtRisk). Full mode: adds eventGroups, seriousEvents, otherEvents with per-event term and per-group affected/at-risk stats."New value: +"Adverse events. Summary mode: timeFrame, groupCount, seriousEventCount, otherEventCount, eventGroups (id and title of each event group), plus topEvents — up to 20 events ranked by the most participants affected in any one event group, each with term, organSystem, kind, and byGroup (one { groupId, numAffected, numAtRisk } row per event group; resolve groupId against eventGroups). Counts are never pooled across groups: groups can overlap (a crossover or second-course group re-counts participants of its parent arm), so compare arms row by row. Full mode: eventGroups with descriptions and per-group totals, plus seriousEvents and otherEvents with per-event term and per-group affected/at-risk stats."
  6. 2 tool updates
    • Changedclinicaltrials_get_study_results2 fields changed
      • removedInput schema / required
        Removed value: -[
        -  "nctIds"
        -]
      • changedOutput schema / properties / results / items / properties / nctId / description
        Previous value: -"The NCT identifier as requested, echoed verbatim. When it is a previous (alias) ID, ClinicalTrials.gov answers with the canonical record and canonicalNctId names it."New value: +"The NCT identifier as requested, trimmed and uppercased. When it is a previous (alias) ID, ClinicalTrials.gov answers with the canonical record and canonicalNctId names it."
    • Changedclinicaltrials_search_studies2 fields changed
      • changedInput schema / properties / advancedFilter / description
        Previous value: -"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names."New value: +"Advanced filter using AREA[FieldName]value syntax. Examples: \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\", \"AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL\", \"(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL\". \"AREA[HasResults]true\" restricts to studies with posted results. AND/OR/NOT join complete AREA[FieldName]value expressions; parentheses group them. Call clinicaltrials_get_field_definitions to find AREA[]-compatible field names."
      • changedOutput schema / properties / studies / description
        Previous value: -"Matching studies. By default each entry is a COMPACT index projection — nctId, briefTitle, overallStatus, phases, enrollmentCount, leadSponsor, conditions, and a bounded locations summary ({ total, nearest }) — mirroring the rendered result, NOT the full ~70KB record. Pass the fields parameter to receive exactly the requested leaves at full fidelity instead (e.g. all locations). Fetch a full single record with clinicaltrials_get_study_record."New value: +"Matching studies. By default each entry is a COMPACT index projection — nctId, briefTitle, overallStatus, phases, enrollmentCount, leadSponsor, conditions, hasResults, startDate and primaryCompletionDate (YYYY-MM or YYYY-MM-DD, as registered), and a bounded locations summary ({ total, nearest }); keys the study does not publish are omitted — mirroring the rendered result, NOT the full ~70KB record. Pass the fields parameter to receive exactly the requested leaves at full fidelity instead (e.g. all locations). Fetch a full single record with clinicaltrials_get_study_record."
  7. 3 tool updates
    • Changedclinicaltrials_get_field_definitions2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `path_not_found`: The dot-notation path does not match any node in the field tree. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: The selected mode's required argument was supplied with a whitespace-only value. `mode_mismatch`: An argument belonging to a different mode was supplied alongside the selected mode. `mode_requires`: The selected mode's required argument was omitted. `path_not_found`: The dot-notation path does not match any node in the field tree. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "path_not_found",
        -  "rate_limited"
        -]New value: +[
        +  "blank_value",
        +  "mode_mismatch",
        +  "mode_requires",
        +  "path_not_found",
        +  "rate_limited"
        +]
    • Changedclinicaltrials_get_field_values7 fields changed
      • changedOutput schema / properties / fieldStats / description
        Previous value: -"One entry per requested field: canonical path, PascalCase piece name, data type, missing/unique counts, and top values with study counts (or trueCount/falseCount for BOOLEAN fields)."New value: +"One entry per requested field: canonical path, PascalCase piece name, data type, and the statistics variant that type carries — top values with study counts plus unique/longest for ENUM/STRING, trueCount/falseCount for BOOLEAN, min/max/avg for INTEGER/NUMBER, min/max/formats for DATE."
      • addedOutput schema / properties / fieldStats / items / properties / avg
        Added value: +{
        +  "description": "Mean of the recorded values. Present for INTEGER/NUMBER fields.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / fieldStats / items / properties / formats
        Added value: +{
        +  "description": "Date patterns this field is recorded in. Present for DATE fields; more than one means the field mixes precisions across studies.",
        +  "items": {
        +    "description": "A date pattern, e.g. \"yyyy-MM-dd\".",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / fieldStats / items / properties / longest
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Longest recorded value with its length and a study carrying it. Present for STRING fields only.",
        +  "properties": {
        +    "length": {
        +      "description": "Its length in characters.",
        +      "type": "number"
        +    },
        +    "nctId": {
        +      "description": "NCT ID of a study carrying it.",
        +      "type": "string"
        +    },
        +    "value": {
        +      "description": "The longest recorded value.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "value",
        +    "length",
        +    "nctId"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / fieldStats / items / properties / max
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "Largest value of an INTEGER/NUMBER field.",
        +      "type": "number"
        +    },
        +    {
        +      "description": "Latest value of a DATE field, at the precision recorded.",
        +      "type": "string"
        +    }
        +  ],
        +  "description": "Largest recorded value — a number for INTEGER/NUMBER, a date string for DATE."
        +}
      • addedOutput schema / properties / fieldStats / items / properties / min
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "Smallest value of an INTEGER/NUMBER field.",
        +      "type": "number"
        +    },
        +    {
        +      "description": "Earliest value of a DATE field, at the precision recorded — a partial date such as \"1900-01\" stays partial.",
        +      "type": "string"
        +    }
        +  ],
        +  "description": "Smallest recorded value — a number for INTEGER/NUMBER, a date string for DATE."
        +}
      • changedOutput schema / properties / fieldStats / items / properties / multiValued / description
        Previous value: -"True when the field is array-typed (a study can carry several values, e.g. Phase, Condition), so the per-value studiesCount buckets sum above the study total. Use to avoid computing a percentage against the corpus."New value: +"True when the field is repeated — array-typed itself (Phase, Condition) or nested under a repeated object (LocationCountry, one per site) — so a study can carry several values and the per-value studiesCount buckets sum above the study total. Use to avoid computing a percentage against the corpus."
    • Changedclinicaltrials_search_studies1 field changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when no studies matched — echoes the constraint and suggests how to broaden. Absent on pages with results, and on an exhausted continuation page, where the cohort already matched and there is nothing to broaden."New value: +"Recovery guidance when no studies matched — echoes the constraint and suggests how to broaden, and names nctIds as part of the unmatched criteria when an ID list was supplied. Absent on pages with results, and on an exhausted continuation page, where the cohort already matched and there is nothing to broaden."
  8. 2 tool updates
    • Changedclinicaltrials_find_eligible1 field changed
      • changedOutput schema / properties / searchCriteria / properties / location / description
        Previous value: -"The exact queryLocn string sent upstream (city/state/country joined). Pass as locationQuery to clinicaltrials_search_studies to reproduce the location filter beyond the maxResults cap."New value: +"The exact queryLocn string sent upstream (city/state/country, multi-word components quoted, AND-joined). Pass as locationQuery to clinicaltrials_search_studies to reproduce the location filter beyond the maxResults cap."
    • Changedclinicaltrials_search_studies3 fields changed
      • changedInput schema / properties / geoFilter / description
        Previous value: -"Geographic proximity filter. Format: distance(lat,lon,radius), where radius carries a `mi` or `km` suffix — e.g. \"distance(47.6062,-122.3321,50mi)\" for studies within 50 miles of Seattle. Always include the suffix: a bare radius is accepted upstream but interpreted as meters, which silently matches almost nothing. When set, each study's locations are re-sorted by proximity to the center so the nearest matched site leads, annotated with its distance in miles; the full location list is preserved."New value: +"Geographic proximity filter. Format: distance(lat,lon,radius), where radius carries a `mi` or `km` suffix — e.g. \"distance(47.6062,-122.3321,50mi)\" for studies within 50 miles of Seattle. The suffix is required: a radius with no unit is rejected, as are a non-positive radius, a latitude outside [-90, 90], and a longitude outside [-180, 180]. When set, each study's locations are re-sorted by proximity to the center so the nearest matched site leads, annotated with its distance in miles; the full location list is preserved."
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when no studies matched — echoes the constraint and suggests how to broaden. Absent on pages with results."New value: +"Recovery guidance when no studies matched — echoes the constraint and suggests how to broaden. Absent on pages with results, and on an exhausted continuation page, where the cohort already matched and there is nothing to broaden."
      • addedOutput schema / properties / pageExhausted
        Added value: +{
        +  "description": "True when this call supplied a pageToken and the continuation page came back empty — the walk is finished and no further pages exist. Absent on every other response, including an empty first page, which is an unmatched search rather than exhausted pagination.",
        +  "type": "boolean"
        +}
  9. 1 tool update
    • Changedclinicaltrials_get_study_results23 fields changed
      • changedInput schema / properties / nctIds / description
        Previous value: -"One or more NCT IDs (max 20) — an empty list is rejected. E.g., \"NCT12345678\" or [\"NCT12345678\", \"NCT87654321\"]. Use summary=true for large batches to avoid large payloads."New value: +"One or more NCT IDs (max 20) — an empty list is rejected, and a repeated ID collapses to one results entry in first-occurrence order. E.g., \"NCT12345678\" or [\"NCT12345678\", \"NCT87654321\"]. Use summary=true for large batches to avoid large payloads."
      • addedInput schema / properties / otherEventOffset
        Added value: +{
        +  "description": "Optional index of the first other (non-serious) adverse event to return, in upstream order. Omit or 0 to start at the first. Pages independently of seriousEventOffset and pairs with adverseEventLimit. Continue from filtersApplied.nextOtherEventOffset until that field is absent. Applied to every study in the call. Rejected with summary: true or when sections excludes adverseEvents.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / outcomeOffset
        Added value: +{
        +  "description": "Optional index of the first outcome measure to return, in the order ClinicalTrials.gov publishes them. Omit or 0 to start at the first. Pair with outcomeLimit to page a long list: each response reports filtersApplied.nextOutcomeOffset for the study, and the list is exhausted when that field is absent. Applied to every study in the call. An offset at or past the end returns an empty list with filtersApplied.totalOutcomes stating the upstream length, not an error. Rejected with summary: true or when sections excludes outcomes.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / seriousEventOffset
        Added value: +{
        +  "description": "Optional index of the first serious adverse event to return, in upstream order. Omit or 0 to start at the first. Pages independently of otherEventOffset — the two lists have uncorrelated lengths — and pairs with adverseEventLimit, which bounds each list separately. Continue from filtersApplied.nextSeriousEventOffset until that field is absent. Applied to every study in the call. Rejected with summary: true or when sections excludes adverseEvents.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / summary / description
        Previous value: -"Return condensed summaries instead of full data. Full mode renders every row and field on both output channels, so a large results set can exceed 500KB per study; summary mode reduces that to ~5KB. Summaries include outcome titles, types, timeframes, group counts, and top-level stats — omitting individual measurements, analyses, and per-group data. For a middle ground, keep full mode and cap the two lists that carry the bulk with outcomeLimit / adverseEventLimit."New value: +"Return condensed summaries instead of full data. Full mode renders every row and field on both output channels, so a large results set can exceed 500KB per study; summary mode typically cuts that to a few KB, scaling with the measure count rather than to a fixed ceiling. An outcome summary keeps the title, type, timeframe, paramType, dispersionType, unit, group/class counts, per-group denominators, one statistical analysis, and a top-line projection of a single class/category cell — labelled with the class and category titles it came from and a count of the siblings it omits. The measurements outside that cell and the remaining analyses are dropped; re-run with summary=false to reach them. For a middle ground, keep full mode and cap the two lists that carry the bulk with outcomeLimit / adverseEventLimit."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `offset_not_applicable`: An offset was supplied for a list this call does not return — summary mode returns a condensed projection rather than a bounded window, or the sections filter excludes the offset’s own section. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "blank_value",
        -  "rate_limited"
        -]New value: +[
        +  "blank_value",
        +  "offset_not_applicable",
        +  "rate_limited"
        +]
      • addedOutput schema / properties / results / items / properties / canonicalNctId
        Added value: +{
        +  "description": "The canonical NCT identifier of the study that answered — present only when the requested nctId is a previous (alias) ID pointing at a different record. Absent means nctId is already canonical. Requesting an alias and its own canonical ID together returns one entry per requested ID, both carrying the same study.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / properties / filtersApplied / description
        Previous value: -"What a cap trimmed on this study — present only when a cap actually reduced a list. Absent means the payload is the complete upstream set for the requested sections."New value: +"What the outcomeLimit / adverseEventLimit caps and the outcomeOffset / seriousEventOffset / otherEventOffset offsets trimmed on this study, plus the next offset for each list left short. Present only when a bound actually reduced a list — a window that started at zero and reached the end trimmed nothing. Absent means the payload is the complete upstream set for the requested sections. Offsets apply uniformly to every study in the call, so continuation is reported per study: each exhausts its lists at a different index."
      • changedOutput schema / properties / results / items / properties / filtersApplied / properties / adverseEventLimit / description
        Previous value: -"Echo of the adverseEventLimit input — present only when the cap trimmed a list."New value: +"Echo of the adverseEventLimit input — present only when the cap cut events off the end of a window. Which list it cut is named by that list’s own next offset."
      • addedOutput schema / properties / results / items / properties / filtersApplied / properties / nextOtherEventOffset
        Added value: +{
        +  "description": "The otherEventOffset to request next for this study — present only when other events remain past the window. Absent means this study’s other event list is exhausted.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results / items / properties / filtersApplied / properties / nextOutcomeOffset
        Added value: +{
        +  "description": "The outcomeOffset to request next for this study — present only when measures remain past the window. Absent means this study’s outcome list is exhausted.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results / items / properties / filtersApplied / properties / nextSeriousEventOffset
        Added value: +{
        +  "description": "The seriousEventOffset to request next for this study — present only when serious events remain past the window. Absent means this study’s serious event list is exhausted.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results / items / properties / filtersApplied / properties / otherEventOffset
        Added value: +{
        +  "description": "Echo of the otherEventOffset input — present only when it skipped events before the window.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / results / items / properties / filtersApplied / properties / outcomeLimit / description
        Previous value: -"Echo of the outcomeLimit input — present only when the cap trimmed the list."New value: +"Echo of the outcomeLimit input — present only when the cap cut measures off the end of the window."
      • addedOutput schema / properties / results / items / properties / filtersApplied / properties / outcomeOffset
        Added value: +{
        +  "description": "Echo of the outcomeOffset input — present only when it skipped measures before the window.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results / items / properties / filtersApplied / properties / seriousEventOffset
        Added value: +{
        +  "description": "Echo of the seriousEventOffset input — present only when it skipped events before the window.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / results / items / properties / filtersApplied / properties / totalOtherEvents / description
        Previous value: -"Upstream other adverse event count before adverseEventLimit trimmed the list."New value: +"Upstream other adverse event count, before the bounds trimmed the list."
      • changedOutput schema / properties / results / items / properties / filtersApplied / properties / totalOutcomes / description
        Previous value: -"Upstream outcome measure count before outcomeLimit trimmed the list."New value: +"Upstream outcome measure count, before the bounds trimmed the list."
      • changedOutput schema / properties / results / items / properties / filtersApplied / properties / totalSeriousEvents / description
        Previous value: -"Upstream serious adverse event count before adverseEventLimit trimmed the list."New value: +"Upstream serious adverse event count, before the bounds trimmed the list."
      • changedOutput schema / properties / results / items / properties / nctId / description
        Previous value: -"NCT identifier."New value: +"The NCT identifier as requested, echoed verbatim. When it is a previous (alias) ID, ClinicalTrials.gov answers with the canonical record and canonicalNctId names it."
      • changedOutput schema / properties / results / items / properties / outcomes / description
        Previous value: -"Outcome measures with per-group statistics. Summary mode (compact): type, title, timeFrame, paramType, unitOfMeasure, group/class counts, plus topStats (per-group measurements) and topAnalysis (statisticalMethod, pValue, paramType/Value, ciPctValue/Lower/Upper, nonInferiorityType, groupIds — lifted from analyses[0]) when present. Full mode (default): adds raw groups, classes, categories, measurements, and analyses arrays."New value: +"Outcome measures with per-group statistics. Summary mode (compact): type, title, timeFrame, paramType, dispersionType, unitOfMeasure, group/class counts, denoms (per-group denominators keyed by group title), topStats (the per-group cells of one class/category — each carrying the upstream value verbatim, including an NA/NR sentinel, plus spread, lowerLimit/upperLimit, and the record’s own comment when present), topStatsFrom (classTitle / categoryTitle naming where that cell came from, with omittedClasses / omittedCategories counts and a note pointing at summary=false when siblings were dropped), and topAnalysis (statisticalMethod, pValue, paramType/Value, ciPctValue/Lower/Upper, nonInferiorityType, groupIds — lifted from analyses[0]) when present. Full mode (default): adds raw groups, classes, categories, measurements, and analyses arrays."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when a cap trimmed a list on at least one study; absent when nothing was trimmed, matching filtersApplied one level down. Which study and which list is named in that study’s filtersApplied."New value: +"True when a bound — a cap or an offset — trimmed a list on at least one study; absent when nothing was trimmed, matching filtersApplied one level down. Which study, which list, and where to resume is named in that study’s filtersApplied."
  10. 7 tool updates
    • Changedclinicaltrials_find_eligible7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / location / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "studies",
        +      "searchCriteria",
        +      "funnel"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "blank_value",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "studies",
        -  "searchCriteria",
        -  "funnel"
        -]
    • Changedclinicaltrials_get_field_definitions6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "fields",
        +      "totalFields"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `path_not_found`: The dot-notation path does not match any node in the field tree. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "path_not_found",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "fields",
        -  "totalFields"
        -]
    • Changedclinicaltrials_get_field_values6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "fieldStats"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `field_invalid`: A requested field name is not a valid PascalCase piece name. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "blank_value",
        +            "field_invalid",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "fieldStats"
        -]
    • Changedclinicaltrials_get_study_count6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `field_invalid`: A field name in the advanced filter or AREA[] expression is invalid (often a module name instead of a piece name). `enum_invalid`: statusFilter or phaseFilter contains a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "blank_value",
        +            "field_invalid",
        +            "enum_invalid",
        +            "query_parse_error",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "totalCount"
        -]
    • Changedclinicaltrials_get_study_record7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / nearLocation / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "study",
        +      "filtersApplied"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `study_not_found`: The provided NCT ID does not match any study at ClinicalTrials.gov. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "study_not_found",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "study",
        -  "filtersApplied"
        -]
    • Changedclinicaltrials_get_study_results6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "blank_value",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results"
        -]
    • Changedclinicaltrials_search_studies6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "studies"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `blank_value`: A parameter was supplied with a blank, whitespace-only, or empty-list value. `ids_not_found`: One or more NCT IDs in the nctIds filter are not present at ClinicalTrials.gov. `field_invalid`: A field name in the fields parameter or AREA[] expression is invalid (often a module name instead of a piece name). `enum_invalid`: statusFilter or phaseFilter contains a value ClinicalTrials.gov does not accept. `query_parse_error`: A free-text query or advancedFilter expression uses syntax the upstream Essie parser rejects — typically a `[` or `]` outside an AREA[…] / RANGE[…] expression, an unmatched `(` / `)`, or an unterminated quote in a query/conditionQuery/etc. value. `geo_invalid`: geoFilter is not a well-formed distance(lat,lon,radius) expression. `sort_invalid`: sort is not FieldName:asc / FieldName:desc, or names more than 2 fields. `rate_limited`: ClinicalTrials.gov returned 429 after retry budget exhausted. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "blank_value",
        +            "ids_not_found",
        +            "field_invalid",
        +            "enum_invalid",
        +            "query_parse_error",
        +            "geo_invalid",
        +            "sort_invalid",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "studies"
        -]
  11. 2 tool updates
    • Changedclinicaltrials_find_eligible2 fields changed
      • addedInput schema / properties / locationLimit
        Added value: +{
        +  "default": 10,
        +  "description": "Cap on the sites returned per candidate. Each candidate keeps only the sites matching the requested location at the narrowest level that matched (city, else state, else country), capped at this many; the rest of the study's registered sites are omitted. The cap governs those matched sites — when none of them is recruiting, the candidate's nearest recruiting site is added on top of it, so a candidate can carry one site more than this. Raise it to see more nearby sites, or fetch the complete site list with clinicaltrials_get_study_record. Each candidate reports totalLocations / matchedLocations / locationsTruncated / nearestRecruitingSiteAdded in locationSummary only when the bound actually dropped sites.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / studies / description
        Previous value: -"Matching studies with eligibility and location fields."New value: +"Matching studies with eligibility and location fields. Each candidate's protocolSection.contactsLocationsModule.locations is BOUNDED to the sites matching the requested location (capped at locationLimit) plus, when none of those is recruiting, the candidate's nearest recruiting site — not the study's full registered site list. A candidate whose sites were bounded also carries a top-level locationSummary object — { totalLocations, matchedLocations, locationsTruncated, nearestRecruitingSiteAdded?, retrieveFullStudyWith } — absent when nothing was dropped; nearestRecruitingSiteAdded is present only when that extra site was added. Fetch a study's complete record and site list with clinicaltrials_get_study_record."
    • Changedclinicaltrials_get_study_results5 fields changed
      • addedInput schema / properties / adverseEventLimit
        Added value: +{
        +  "description": "Optional cap on the number of serious and other adverse events returned per study, applied to each list separately in upstream order. Omit for no cap (every event). Applies to full mode only — summary mode already ranks the top 20 by participants affected. Event groups are never capped. Upstream totals preserved in filtersApplied.totalSeriousEvents / totalOtherEvents only when the cap trims a list.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / outcomeLimit
        Added value: +{
        +  "description": "Optional cap on the number of outcome measures returned per study, taken in the order ClinicalTrials.gov publishes them. Omit for no cap (every measure). Applies to full mode only — summary mode is already condensed. Each surviving measure keeps its complete groups/classes/measurements/analyses tree. Upstream total preserved in filtersApplied.totalOutcomes only when the cap trims the list.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / summary / description
        Previous value: -"Return condensed summaries instead of full data. Full mode renders every row and field on both output channels, so a large results set can exceed 500KB per study; summary mode reduces that to ~5KB. Summaries include outcome titles, types, timeframes, group counts, and top-level stats — omitting individual measurements, analyses, and per-group data."New value: +"Return condensed summaries instead of full data. Full mode renders every row and field on both output channels, so a large results set can exceed 500KB per study; summary mode reduces that to ~5KB. Summaries include outcome titles, types, timeframes, group counts, and top-level stats — omitting individual measurements, analyses, and per-group data. For a middle ground, keep full mode and cap the two lists that carry the bulk with outcomeLimit / adverseEventLimit."
      • addedOutput schema / properties / results / items / properties / filtersApplied
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "What a cap trimmed on this study — present only when a cap actually reduced a list. Absent means the payload is the complete upstream set for the requested sections.",
        +  "properties": {
        +    "adverseEventLimit": {
        +      "description": "Echo of the adverseEventLimit input — present only when the cap trimmed a list.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "outcomeLimit": {
        +      "description": "Echo of the outcomeLimit input — present only when the cap trimmed the list.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "totalOtherEvents": {
        +      "description": "Upstream other adverse event count before adverseEventLimit trimmed the list.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "totalOutcomes": {
        +      "description": "Upstream outcome measure count before outcomeLimit trimmed the list.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "totalSeriousEvents": {
        +      "description": "Upstream serious adverse event count before adverseEventLimit trimmed the list.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when a cap trimmed a list on at least one study; absent when nothing was trimmed, matching filtersApplied one level down. Which study and which list is named in that study’s filtersApplied.",
        +  "type": "boolean"
        +}
  12. 5 tool updates
    • Changedclinicaltrials_find_eligible1 field changed
      • removedInput schema / properties / conditions / minItems
        Removed value: -1
    • Changedclinicaltrials_get_field_values2 fields changed
      • changedInput schema / properties / fields / anyOf
        Previous value: -[
        -  {
        -    "description": "A single PascalCase field name.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple PascalCase field names (at least one required).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single PascalCase field name.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple PascalCase field names (at least one required).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / fields / description
        Previous value: -"PascalCase field name(s) to get value statistics for. Examples: OverallStatus, Phase, StudyType, Sex, LeadSponsorClass. Use clinicaltrials_get_field_definitions with a query to find more field names."New value: +"PascalCase field name(s) to get value statistics for — an empty list is rejected, not treated as \"every field\". Examples: OverallStatus, Phase, StudyType, Sex, LeadSponsorClass. Use clinicaltrials_get_field_definitions with a query to find more field names."
    • Changedclinicaltrials_get_study_count9 fields changed
      • changedInput schema / properties / conditionQuery / description
        Previous value: -"Condition/disease-specific search. E.g., \"Type 2 Diabetes\", \"non-small cell lung cancer\". Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Condition/disease-specific search. E.g., \"Type 2 Diabetes\", \"non-small cell lung cancer\". Matches Condition, BriefTitle, OfficialTitle, ConditionMeshTerm, ConditionAncestorTerm, Keyword, and NCTId. ConditionAncestorTerm is the MeSH umbrella above the conditions a study itself lists, so results run broader than those lists — a study can match a parent term it never names. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / interventionQuery / description
        Previous value: -"Intervention/treatment search. E.g., \"pembrolizumab\", \"cognitive behavioral therapy\". Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Intervention/treatment search. E.g., \"pembrolizumab\", \"cognitive behavioral therapy\". Matches InterventionName, InterventionType, ArmGroupType, InterventionOtherName, BriefTitle, OfficialTitle, ArmGroupLabel, InterventionMeshTerm, Keyword, InterventionAncestorTerm, InterventionDescription, and ArmGroupDescription. InterventionAncestorTerm is the MeSH umbrella above the interventions a study itself lists, so results run broader than those lists. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / locationQuery / description
        Previous value: -"Location search — city, state, country, or facility name. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Location search — city, state, country, or facility name. Matches LocationCity, LocationState, LocationCountry, LocationFacility, and LocationZip; a study matches when any of its sites does. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / outcomeQuery / description
        Previous value: -"Search within outcome measure fields. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Search within outcome measure fields. Matches PrimaryOutcomeMeasure, SecondaryOutcomeMeasure, OtherOutcomeMeasure, and OutcomeMeasureTitle, plus their description counterparts PrimaryOutcomeDescription, SecondaryOutcomeDescription, OtherOutcomeDescription, OutcomeMeasureDescription, and OutcomeMeasurePopulationDescription — so a term appearing only in outcome prose still matches. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / phaseFilter / anyOf
        Previous value: -[
        -  {
        -    "description": "A single phase value.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple phase values (OR).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single phase value.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple phase values (OR).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / query / description
        Previous value: -"General free-text search across all fields. Plain words plus AND, OR, NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression — those work here as well as in advancedFilter, so AREA[Phase]PHASE2 is accepted in this parameter; a stray bracket fails. `( )` group sub-expressions and work when matched; `,` acts as AND. The dedicated *Query parameters (conditionQuery, interventionQuery, etc.) scope a search to one field."New value: +"General free-text search across all fields. Runs the 57-field relevance search ClinicalTrials.gov publishes for this parameter — NCTId, NCTIdAlias, OrgStudyId, SecondaryId, Acronym, BriefTitle, OfficialTitle, Condition, InterventionName, InterventionOtherName, Phase, StdAge, StudyType, BriefSummary, outcome measures and their descriptions, LeadSponsorName, CollaboratorName, the Location* fields, the Design* fields, and the ConditionAncestorTerm/InterventionAncestorTerm MeSH umbrellas — so a hit need not carry your term in the field you had in mind. Plain words plus AND, OR, NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression — those work here as well as in advancedFilter, so AREA[Phase]PHASE2 is accepted in this parameter; a stray bracket fails. `( )` group sub-expressions and work when matched; `,` acts as AND. The dedicated *Query parameters (conditionQuery, interventionQuery, etc.) scope a search to one field."
      • changedInput schema / properties / sponsorQuery / description
        Previous value: -"Sponsor/collaborator name search. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Sponsor/collaborator name search. Matches LeadSponsorName, CollaboratorName, and OrgFullName. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / statusFilter / anyOf
        Previous value: -[
        -  {
        -    "description": "A single status value.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple status values (OR).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single status value.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple status values (OR).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / titleQuery / description
        Previous value: -"Search within study titles and acronyms only. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Search within study titles and acronyms only. Matches Acronym, BriefTitle, and OfficialTitle. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
    • Changedclinicaltrials_get_study_results3 fields changed
      • changedInput schema / properties / nctIds / anyOf
        Previous value: -[
        -  {
        -    "description": "A single NCT ID.",
        -    "pattern": "^NCT\\d{8}$",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple NCT IDs (max 20).",
        -    "items": {
        -      "pattern": "^NCT\\d{8}$",
        -      "type": "string"
        -    },
        -    "maxItems": 20,
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single NCT ID.",
        +    "pattern": "^NCT\\d{8}$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple NCT IDs (max 20).",
        +    "items": {
        +      "pattern": "^NCT\\d{8}$",
        +      "type": "string"
        +    },
        +    "maxItems": 20,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / nctIds / description
        Previous value: -"One or more NCT IDs (max 20). E.g., \"NCT12345678\" or [\"NCT12345678\", \"NCT87654321\"]. Use summary=true for large batches to avoid large payloads."New value: +"One or more NCT IDs (max 20) — an empty list is rejected. E.g., \"NCT12345678\" or [\"NCT12345678\", \"NCT87654321\"]. Use summary=true for large batches to avoid large payloads."
      • changedInput schema / properties / sections / anyOf
        Previous value: -[
        -  {
        -    "description": "A single section name.",
        -    "enum": [
        -      "outcomes",
        -      "adverseEvents",
        -      "participantFlow",
        -      "baseline",
        -      "moreInfo"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple section names.",
        -    "items": {
        -      "enum": [
        -        "outcomes",
        -        "adverseEvents",
        -        "participantFlow",
        -        "baseline",
        -        "moreInfo"
        -      ],
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single section name.",
        +    "enum": [
        +      "outcomes",
        +      "adverseEvents",
        +      "participantFlow",
        +      "baseline",
        +      "moreInfo"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple section names.",
        +    "items": {
        +      "enum": [
        +        "outcomes",
        +        "adverseEvents",
        +        "participantFlow",
        +        "baseline",
        +        "moreInfo"
        +      ],
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
    • Changedclinicaltrials_search_studies11 fields changed
      • changedInput schema / properties / conditionQuery / description
        Previous value: -"Condition/disease-specific search. E.g., \"Type 2 Diabetes\", \"non-small cell lung cancer\". Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Condition/disease-specific search. E.g., \"Type 2 Diabetes\", \"non-small cell lung cancer\". Matches Condition, BriefTitle, OfficialTitle, ConditionMeshTerm, ConditionAncestorTerm, Keyword, and NCTId. ConditionAncestorTerm is the MeSH umbrella above the conditions a study itself lists, so results run broader than those lists — a study can match a parent term it never names. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • removedInput schema / properties / fields / minItems
        Removed value: -1
      • changedInput schema / properties / interventionQuery / description
        Previous value: -"Intervention/treatment search. E.g., \"pembrolizumab\", \"cognitive behavioral therapy\". Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Intervention/treatment search. E.g., \"pembrolizumab\", \"cognitive behavioral therapy\". Matches InterventionName, InterventionType, ArmGroupType, InterventionOtherName, BriefTitle, OfficialTitle, ArmGroupLabel, InterventionMeshTerm, Keyword, InterventionAncestorTerm, InterventionDescription, and ArmGroupDescription. InterventionAncestorTerm is the MeSH umbrella above the interventions a study itself lists, so results run broader than those lists. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / locationQuery / description
        Previous value: -"Location search — city, state, country, or facility name. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Location search — city, state, country, or facility name. Matches LocationCity, LocationState, LocationCountry, LocationFacility, and LocationZip; a study matches when any of its sites does. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / nctIds / description
        Previous value: -"Filter to specific NCT IDs for batch lookups."New value: +"Filter to specific NCT IDs for batch lookups. Omit to search every study — an empty list is rejected, not treated as \"no filter\". Supplying this lifts the default unknown-enrollment exclusion, so an ID you name is never filtered out of its own lookup."
      • changedInput schema / properties / outcomeQuery / description
        Previous value: -"Search within outcome measure fields. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Search within outcome measure fields. Matches PrimaryOutcomeMeasure, SecondaryOutcomeMeasure, OtherOutcomeMeasure, and OutcomeMeasureTitle, plus their description counterparts PrimaryOutcomeDescription, SecondaryOutcomeDescription, OtherOutcomeDescription, OutcomeMeasureDescription, and OutcomeMeasurePopulationDescription — so a term appearing only in outcome prose still matches. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / phaseFilter / anyOf
        Previous value: -[
        -  {
        -    "description": "A single phase value.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple phase values (OR).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single phase value.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple phase values (OR).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / query / description
        Previous value: -"General free-text search across all fields. Plain words plus AND, OR, NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression — those work here as well as in advancedFilter, so AREA[Phase]PHASE2 is accepted in this parameter; a stray bracket fails. `( )` group sub-expressions and work when matched; `,` acts as AND. The dedicated *Query parameters (conditionQuery, interventionQuery, etc.) scope a search to one field."New value: +"General free-text search across all fields. Runs the 57-field relevance search ClinicalTrials.gov publishes for this parameter — NCTId, NCTIdAlias, OrgStudyId, SecondaryId, Acronym, BriefTitle, OfficialTitle, Condition, InterventionName, InterventionOtherName, Phase, StdAge, StudyType, BriefSummary, outcome measures and their descriptions, LeadSponsorName, CollaboratorName, the Location* fields, the Design* fields, and the ConditionAncestorTerm/InterventionAncestorTerm MeSH umbrellas — so a hit need not carry your term in the field you had in mind. Plain words plus AND, OR, NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression — those work here as well as in advancedFilter, so AREA[Phase]PHASE2 is accepted in this parameter; a stray bracket fails. `( )` group sub-expressions and work when matched; `,` acts as AND. The dedicated *Query parameters (conditionQuery, interventionQuery, etc.) scope a search to one field."
      • changedInput schema / properties / sponsorQuery / description
        Previous value: -"Sponsor/collaborator name search. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Sponsor/collaborator name search. Matches LeadSponsorName, CollaboratorName, and OrgFullName. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
      • changedInput schema / properties / statusFilter / anyOf
        Previous value: -[
        -  {
        -    "description": "A single status value.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple status values (OR).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single status value.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple status values (OR).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / titleQuery / description
        Previous value: -"Search within study titles and acronyms only. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."New value: +"Search within study titles and acronyms only. Matches Acronym, BriefTitle, and OfficialTitle. Plain words plus AND/OR/NOT. `[ ]` are valid only inside an AREA[FieldName]value or RANGE[min, max] expression, which this parameter accepts; a stray bracket fails. `( )` group sub-expressions when matched; `,` acts as AND."
  13. 3 tool updates
    • Changedclinicaltrials_get_study_count4 fields changed
      • changedInput schema / properties / phaseFilter / anyOf
        Previous value: -[
        -  {
        -    "description": "A single phase value.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple phase values (OR).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single phase value.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple phase values (OR).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / phaseFilter / description
        Previous value: -"Filter by trial phase. Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA."New value: +"Filter by trial phase. Omit to count all phases — an empty list is rejected, not treated as \"no filter\". Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA."
      • changedInput schema / properties / statusFilter / anyOf
        Previous value: -[
        -  {
        -    "description": "A single status value.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple status values (OR).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single status value.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple status values (OR).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / statusFilter / description
        Previous value: -"Filter by study status. Values: RECRUITING, COMPLETED, ACTIVE_NOT_RECRUITING, NOT_YET_RECRUITING, ENROLLING_BY_INVITATION, SUSPENDED, TERMINATED, WITHDRAWN, UNKNOWN, WITHHELD, NO_LONGER_AVAILABLE, AVAILABLE, APPROVED_FOR_MARKETING, TEMPORARILY_NOT_AVAILABLE."New value: +"Filter by study status. Omit to count all statuses — an empty list is rejected, not treated as \"no filter\". Values: RECRUITING, COMPLETED, ACTIVE_NOT_RECRUITING, NOT_YET_RECRUITING, ENROLLING_BY_INVITATION, SUSPENDED, TERMINATED, WITHDRAWN, UNKNOWN, WITHHELD, NO_LONGER_AVAILABLE, AVAILABLE, APPROVED_FOR_MARKETING, TEMPORARILY_NOT_AVAILABLE."
    • Changedclinicaltrials_get_study_results2 fields changed
      • changedInput schema / properties / sections / anyOf
        Previous value: -[
        -  {
        -    "description": "A single section name.",
        -    "enum": [
        -      "outcomes",
        -      "adverseEvents",
        -      "participantFlow",
        -      "baseline",
        -      "moreInfo"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple section names.",
        -    "items": {
        -      "enum": [
        -        "outcomes",
        -        "adverseEvents",
        -        "participantFlow",
        -        "baseline",
        -        "moreInfo"
        -      ],
        -      "type": "string"
        -    },
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single section name.",
        +    "enum": [
        +      "outcomes",
        +      "adverseEvents",
        +      "participantFlow",
        +      "baseline",
        +      "moreInfo"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple section names.",
        +    "items": {
        +      "enum": [
        +        "outcomes",
        +        "adverseEvents",
        +        "participantFlow",
        +        "baseline",
        +        "moreInfo"
        +      ],
        +      "type": "string"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / sections / description
        Previous value: -"Filter which sections to return. Values: outcomes, adverseEvents, participantFlow, baseline, moreInfo. Omit for all sections."New value: +"Filter which sections to return. Values: outcomes, adverseEvents, participantFlow, baseline, moreInfo. Omit for all sections — an empty list is rejected, not treated as omission."
    • Changedclinicaltrials_search_studies7 fields changed
      • changedInput schema / properties / fields / description
        Previous value: -"PascalCase leaf names to return; strongly recommended since full records are ~70KB. Common leaves: NCTId, BriefTitle, BriefSummary, OverallStatus, Phase, LeadSponsorName, Condition. Call clinicaltrials_get_field_definitions with a concept query (e.g., \"adverse events\", \"eligibility\") to find the exact leaf for any concept."New value: +"PascalCase leaf names to return; strongly recommended since full records are ~70KB. Omit for the compact index projection — an empty list is rejected, not treated as omission. Common leaves: NCTId, BriefTitle, BriefSummary, OverallStatus, Phase, LeadSponsorName, Condition. Call clinicaltrials_get_field_definitions with a concept query (e.g., \"adverse events\", \"eligibility\") to find the exact leaf for any concept."
      • addedInput schema / properties / fields / minItems
        Added value: +1
      • changedInput schema / properties / phaseFilter / anyOf
        Previous value: -[
        -  {
        -    "description": "A single phase value.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple phase values (OR).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single phase value.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple phase values (OR).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / phaseFilter / description
        Previous value: -"Filter by trial phase. Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA."New value: +"Filter by trial phase. Omit to search all phases — an empty list is rejected, not treated as \"no filter\". Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA."
      • changedInput schema / properties / statusFilter / anyOf
        Previous value: -[
        -  {
        -    "description": "A single status value.",
        -    "type": "string"
        -  },
        -  {
        -    "description": "Multiple status values (OR).",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single status value.",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Multiple status values (OR).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / statusFilter / description
        Previous value: -"Filter by study status. Values: RECRUITING, COMPLETED, ACTIVE_NOT_RECRUITING, NOT_YET_RECRUITING, ENROLLING_BY_INVITATION, SUSPENDED, TERMINATED, WITHDRAWN, UNKNOWN, WITHHELD, NO_LONGER_AVAILABLE, AVAILABLE, APPROVED_FOR_MARKETING, TEMPORARILY_NOT_AVAILABLE."New value: +"Filter by study status. Omit to search all statuses — an empty list is rejected, not treated as \"no filter\". Values: RECRUITING, COMPLETED, ACTIVE_NOT_RECRUITING, NOT_YET_RECRUITING, ENROLLING_BY_INVITATION, SUSPENDED, TERMINATED, WITHDRAWN, UNKNOWN, WITHHELD, NO_LONGER_AVAILABLE, AVAILABLE, APPROVED_FOR_MARKETING, TEMPORARILY_NOT_AVAILABLE."
      • changedOutput schema / properties / nextPageToken / description
        Previous value: -"Token for the next page. Absent on last page."New value: +"Token for the next page. Absent when this response already carries every matching study; otherwise it mirrors the upstream cursor, which ClinicalTrials.gov emits whenever a page fills to pageSize — so on a continuation page a token can still lead to an empty page."
  14. 1 tool update
    • Changedclinicaltrials_get_study_results1 field changed
      • changedInput schema / properties / summary / description
        Previous value: -"Return condensed summaries instead of full data. Reduces payload from ~200KB to ~5KB per study. Summaries include outcome titles, types, timeframes, group counts, and top-level stats — omitting individual measurements, analyses, and per-group data."New value: +"Return condensed summaries instead of full data. Full mode renders every row and field on both output channels, so a large results set can exceed 500KB per study; summary mode reduces that to ~5KB. Summaries include outcome titles, types, timeframes, group counts, and top-level stats — omitting individual measurements, analyses, and per-group data."

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables searching ClinicalTrials.gov's 600K+ registered studies with full-text and field-specific queries, status/phase/geographic filters, and field discovery. Also retrieves full study records and posted results, and matches patient demographics and conditions to candidate recruiting trials.
    1,625 npm
    Apache 2.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables searching clinical trials, retrieving trial details, matching patient profiles to recruiting trials, and extracting eligibility criteria from ClinicalTrials.gov.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables searching 600K+ ClinicalTrials.gov studies with field-specific, geographic, and advanced filters; fetching full protocol records, posted results, and field definitions. It also matches patient demographics and conditions to candidate recruiting trials via STDIO or Streamable HTTP.
    1,625 npm
    Apache 2.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.