Skip to main content
Glama
clinicaltrialsgov-mcp-server

clinicaltrialsgov-mcp-server

by cyanheads

Clinicaltrials Search Studies

clinicaltrials_search_studies
Read-onlyIdempotent

Search ClinicalTrials.gov studies by condition, intervention, sponsor, status, phase, or location, then filter, sort, and paginate results while selecting only the fields you need.

Instructions

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.

Input Schema

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 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.
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

NameRequiredDescriptionDefault
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 }); 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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changedv2.11.0
    • 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"
      +]
  2. Changed6 schema fields changedv2.10.1
    • 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"
      +}
  3. Changed6 schema fields changedv2.10.0
    • 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."
  4. Changed2 schema fields changedv2.9.10
    • 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."
  5. Changed3 schema fields changedv2.9.6
    • 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, 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."
    • 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"
      +}
  6. Changed6 schema fields changedv2.9.2
    • 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"
      -]
  7. Changed13 schema fields changedv2.9.1
    • 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 reserved; `( )` 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 / 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."
    • changedInput schema / properties / geoFilter / description
      Previous value: -"Geographic proximity filter. Format: distance(lat,lon,radius). E.g., \"distance(47.6062,-122.3321,50mi)\" for studies within 50 miles of Seattle. 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. 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."
    • changedInput schema / properties / interventionQuery / description
      Previous value: -"Intervention/treatment search. E.g., \"pembrolizumab\", \"cognitive behavioral therapy\". Plain words plus AND/OR/NOT. `[ ]` are reserved; `( )` 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 reserved; `( )` 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 reserved; `( )` 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 / 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 / query / description
      Previous value: -"General free-text search across all fields. Plain words plus AND, OR, NOT. `[ ]` are reserved (advancedFilter AREA[] only); `( )` group sub-expressions and work when matched; `,` acts as AND. For field-scoped searches, use the dedicated *Query parameters (conditionQuery, interventionQuery, etc.) or advancedFilter with AREA[FieldName]value."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 reserved; `( )` 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 / 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."
    • changedInput schema / properties / titleQuery / description
      Previous value: -"Search within study titles and acronyms only. Plain words plus AND/OR/NOT. `[ ]` are reserved; `( )` 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."
    • 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."
  8. Changed2 schema fields changedv2.8.0
    • changedOutput schema / properties / requestedFields / description
      Previous value: -"Echo of the explicit fields parameter — present only when the caller passed fields. Lifts the default truncation cap so all requested leaves render in full."New 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."
    • changedOutput schema / properties / studies / description
      Previous value: -"Matching studies. Each entry is a nested ClinicalTrials.gov study record — top-level keys: protocolSection, derivedSection, hasResults, resultsSection, documentSection. Use clinicaltrials_get_field_definitions to explore the schema."New 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."
  9. Changed1 schema field changedv2.7.1
    • changedInput schema / properties / geoFilter / description
      Previous value: -"Geographic proximity filter. Format: distance(lat,lon,radius). E.g., \"distance(47.6062,-122.3321,50mi)\" for studies within 50 miles of Seattle."New value: +"Geographic proximity filter. Format: distance(lat,lon,radius). E.g., \"distance(47.6062,-122.3321,50mi)\" for studies within 50 miles of Seattle. 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."
  10. Changed1 schema field changedv2.7.0
    • changedInput schema / properties / sort / description
      Previous value: -"Sort order. Format: FieldName:asc or FieldName:desc. E.g., \"LastUpdatePostDate:desc\", \"EnrollmentCount:desc\". Max 2 fields comma-separated. Use clinicaltrials_get_field_definitions to find sortable field names."New value: +"Sort 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."
  11. Changed7 schema fields changedv2.6.5
    • 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 only — reserved chars: [ ] ( ) ,"New value: +"Condition/disease-specific search. E.g., \"Type 2 Diabetes\", \"non-small cell lung cancer\". Plain words plus AND/OR/NOT. `[ ]` are reserved; `( )` 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 only — reserved chars: [ ] ( ) ,"New value: +"Intervention/treatment search. E.g., \"pembrolizumab\", \"cognitive behavioral therapy\". Plain words plus AND/OR/NOT. `[ ]` are reserved; `( )` 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 only — reserved chars: [ ] ( ) ,"New value: +"Location search — city, state, country, or facility name. Plain words plus AND/OR/NOT. `[ ]` are reserved; `( )` 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 only — reserved chars: [ ] ( ) ,"New value: +"Search within outcome measure fields. Plain words plus AND/OR/NOT. `[ ]` are reserved; `( )` group sub-expressions when matched; `,` acts as AND."
    • changedInput schema / properties / query / description
      Previous value: -"General free-text search across all fields. Plain words plus AND, OR, NOT only — reserved chars `[ ] ( ) ,` will fail. For field-scoped searches, use the dedicated *Query parameters (conditionQuery, interventionQuery, etc.) or advancedFilter with AREA[FieldName]value."New value: +"General free-text search across all fields. Plain words plus AND, OR, NOT. `[ ]` are reserved (advancedFilter AREA[] only); `( )` group sub-expressions and work when matched; `,` acts as AND. For field-scoped searches, use the dedicated *Query parameters (conditionQuery, interventionQuery, etc.) or advancedFilter with AREA[FieldName]value."
    • changedInput schema / properties / sponsorQuery / description
      Previous value: -"Sponsor/collaborator name search. Plain words plus AND/OR/NOT only — reserved chars: [ ] ( ) ,"New value: +"Sponsor/collaborator name search. Plain words plus AND/OR/NOT. `[ ]` are reserved; `( )` group sub-expressions when matched; `,` acts as AND."
    • changedInput schema / properties / titleQuery / description
      Previous value: -"Search within study titles and acronyms only. Plain words plus AND/OR/NOT only — reserved chars: [ ] ( ) ,"New value: +"Search within study titles and acronyms only. Plain words plus AND/OR/NOT. `[ ]` are reserved; `( )` group sub-expressions when matched; `,` acts as AND."
  12. Changed1 schema field changedv2.6.1
    • changedOutput schema / properties / searchCriteria / description
      Previous value: -"Echo of active query/filter criteria. Present when results are empty."New value: +"Echo of active query/filter criteria applied to this search, including sentinelFilterActive when the default unknown-enrollment exclusion is in effect. Present on every response."
  13. Changed3 schema fields changedv2.5.4
    • removedOutput schema / properties / noMatchHints
      Removed value: -{
      -  "description": "Suggestions for broadening the search when no results are found.",
      -  "items": {
      -    "type": "string"
      -  },
      -  "type": "array"
      -}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Recovery guidance when no studies matched — echoes the constraint and suggests how to broaden. Absent on pages with results.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / searchCriteria / description
      Previous value: -"Echo of query/filter criteria used. Present when results are empty."New value: +"Echo of active query/filter criteria. Present when results are empty."
  14. Addedv2.5.1
  15. Removedv2.4.12
  16. Changed32 schema fields changedv2.0.6
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / advancedFilter
      Added value: +{
      +  "description": "Advanced filter using AREA[] Essie syntax. E.g., \"AREA[StudyType]INTERVENTIONAL\", \"AREA[EnrollmentCount]RANGE[100, 1000]\". Combine with AND/OR/NOT and parentheses.",
      +  "type": "string"
      +}
    • addedInput schema / properties / conditionQuery
      Added value: +{
      +  "description": "Condition/disease-specific search. E.g., \"Type 2 Diabetes\", \"non-small cell lung cancer\".",
      +  "type": "string"
      +}
    • addedInput schema / properties / countTotal
      Added value: +{
      +  "default": true,
      +  "description": "Include total study count in response. Only computed on the first page.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / fields / description
      Previous value: -"A list of specific top-level fields to include in the response."New value: +"Fields to return (PascalCase piece names). Strongly recommended to reduce payload. Common: NCTId, BriefTitle, OverallStatus, Phase, LeadSponsorName, Condition, InterventionName, BriefSummary, EnrollmentCount, StartDate."
    • removedInput schema / properties / filter
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "A set of filters that narrow the search results without affecting ranking.",
      -  "properties": {
      -    "advanced": {
      -      "description": "Apply an advanced filter using Essie expression syntax.",
      -      "type": "string"
      -    },
      -    "geo": {
      -      "additionalProperties": false,
      -      "description": "Filter results to a geographic area by providing a point and radius.",
      -      "properties": {
      -        "latitude": {
      -          "maximum": 90,
      -          "minimum": -90,
      -          "type": "number"
      -        },
      -        "longitude": {
      -          "maximum": 180,
      -          "minimum": -180,
      -          "type": "number"
      -        },
      -        "radius": {
      -          "exclusiveMinimum": 0,
      -          "type": "number"
      -        },
      -        "unit": {
      -          "default": "km",
      -          "enum": [
      -            "km",
      -            "mi"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "latitude",
      -        "longitude",
      -        "radius"
      -      ],
      -      "type": "object"
      -    },
      -    "ids": {
      -      "description": "Return only studies with the specified NCT IDs.",
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    },
      -    "overallStatus": {
      -      "description": "Filter results by one or more study statuses.",
      -      "items": {
      -        "enum": [
      -          "ACTIVE_NOT_RECRUITING",
      -          "COMPLETED",
      -          "ENROLLING_BY_INVITATION",
      -          "NOT_YET_RECRUITING",
      -          "RECRUITING",
      -          "SUSPENDED",
      -          "TERMINATED",
      -          "WITHDRAWN",
      -          "UNKNOWN"
      -        ],
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  },
      -  "type": "object"
      -}
    • addedInput schema / properties / geoFilter
      Added value: +{
      +  "description": "Geographic proximity filter. Format: distance(lat,lon,radius). E.g., \"distance(47.6062,-122.3321,50mi)\" for studies within 50 miles of Seattle.",
      +  "type": "string"
      +}
    • addedInput schema / properties / interventionQuery
      Added value: +{
      +  "description": "Intervention/treatment search. E.g., \"pembrolizumab\", \"cognitive behavioral therapy\".",
      +  "type": "string"
      +}
    • addedInput schema / properties / locationQuery
      Added value: +{
      +  "description": "Location search — city, state, country, or facility name.",
      +  "type": "string"
      +}
    • addedInput schema / properties / nctIds
      Added value: +{
      +  "anyOf": [
      +    {
      +      "pattern": "^NCT\\d{8}$",
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "pattern": "^NCT\\d{8}$",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Filter to specific NCT IDs for batch lookups."
      +}
    • addedInput schema / properties / outcomeQuery
      Added value: +{
      +  "description": "Search within outcome measure fields.",
      +  "type": "string"
      +}
    • changedInput schema / properties / pageSize / description
      Previous value: -"The number of studies to return per page (1-200). Defaults to 10."New value: +"Results per page, 1–200."
    • changedInput schema / properties / pageToken / description
      Previous value: -"A token used to retrieve the next page of results."New value: +"Pagination cursor from a previous response."
    • addedInput schema / properties / phaseFilter
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  ],
      +  "description": "Filter by trial phase. Values: EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA."
      +}
    • removedInput schema / properties / query / additionalProperties
      Removed value: -false
    • changedInput schema / properties / query / description
      Previous value: -"A set of search terms that influence result ranking."New value: +"General full-text search across all fields."
    • removedInput schema / properties / query / properties
      Removed value: -{
      -  "cond": {
      -    "description": "Search for conditions or diseases.",
      -    "type": "string"
      -  },
      -  "id": {
      -    "description": "Search for study identifiers (e.g., NCT ID).",
      -    "type": "string"
      -  },
      -  "intr": {
      -    "description": "Search for specific interventions or treatments.",
      -    "type": "string"
      -  },
      -  "locn": {
      -    "description": "Search for study locations.",
      -    "type": "string"
      -  },
      -  "outc": {
      -    "description": "Search for specific outcome measures.",
      -    "type": "string"
      -  },
      -  "spons": {
      -    "description": "Search for sponsors or collaborators.",
      -    "type": "string"
      -  },
      -  "term": {
      -    "description": "Search for other terms like interventions, outcomes, or sponsors.",
      -    "type": "string"
      -  },
      -  "titles": {
      -    "description": "Search within study titles or acronyms.",
      -    "type": "string"
      -  }
      -}
    • changedInput schema / properties / query / type
      Previous value: -"object"New value: +"string"
    • changedInput schema / properties / sort / description
      Previous value: -"Specify the sort order for the results."New value: +"Sort order. Format: FieldName:asc or FieldName:desc. E.g., \"LastUpdatePostDate:desc\", \"EnrollmentCount:desc\". Max 2 fields comma-separated."
    • removedInput schema / properties / sort / items
      Removed value: -{
      -  "type": "string"
      -}
    • changedInput schema / properties / sort / type
      Previous value: -"array"New value: +"string"
    • addedInput schema / properties / sponsorQuery
      Added value: +{
      +  "description": "Sponsor/collaborator name search.",
      +  "type": "string"
      +}
    • addedInput schema / properties / statusFilter
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  ],
      +  "description": "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."
      +}
    • addedInput schema / properties / titleQuery
      Added value: +{
      +  "description": "Search within study titles and acronyms only.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / nextPageToken / description
      Added value: +"Token for the next page. Absent on last page."
    • addedOutput schema / properties / noMatchHints
      Added value: +{
      +  "description": "Suggestions for broadening the search when no results are found.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / searchCriteria
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Echo of query/filter criteria used. Present when results are empty.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / studies / description
      Added value: +"Matching studies."
    • changedOutput schema / properties / studies / items / additionalProperties
      Previous value: -trueNew value: +{}
    • removedOutput schema / properties / studies / items / properties
      Removed value: -{
      -  "derivedSection": {
      -    "additionalProperties": true,
      -    "properties": {
      -      "conditionBrowseModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "ancestors": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "id": {
      -                  "type": "string"
      -                },
      -                "term": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "browseBranches": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "abbrev": {
      -                  "type": "string"
      -                },
      -                "name": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "browseLeaves": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "asFound": {
      -                  "type": "string"
      -                },
      -                "id": {
      -                  "type": "string"
      -                },
      -                "name": {
      -                  "type": "string"
      -                },
      -                "relevance": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "meshes": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "id": {
      -                  "type": "string"
      -                },
      -                "term": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "interventionBrowseModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "ancestors": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "id": {
      -                  "type": "string"
      -                },
      -                "term": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "browseBranches": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "abbrev": {
      -                  "type": "string"
      -                },
      -                "name": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "browseLeaves": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "id": {
      -                  "type": "string"
      -                },
      -                "name": {
      -                  "type": "string"
      -                },
      -                "relevance": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "meshes": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "id": {
      -                  "type": "string"
      -                },
      -                "term": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "miscInfoModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "versionHolder": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  "hasResults": {
      -    "type": "boolean"
      -  },
      -  "protocolSection": {
      -    "additionalProperties": true,
      -    "properties": {
      -      "armsInterventionsModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "arms": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "description": {
      -                  "type": "string"
      -                },
      -                "name": {
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "interventions": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "armNames": {
      -                  "items": {
      -                    "type": "string"
      -                  },
      -                  "type": "array"
      -                },
      -                "description": {
      -                  "type": "string"
      -                },
      -                "name": {
      -                  "type": "string"
      -                },
      -                "type": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "conditionsModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "conditions": {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          },
      -          "keywords": {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "contactsLocationsModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "locations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "city": {
      -                  "type": "string"
      -                },
      -                "country": {
      -                  "type": "string"
      -                },
      -                "state": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "descriptionModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "briefSummary": {
      -            "type": "string"
      -          },
      -          "detailedDescription": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "designModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "designInfo": {
      -            "additionalProperties": true,
      -            "properties": {
      -              "allocation": {
      -                "type": "string"
      -              },
      -              "interventionModel": {
      -                "type": "string"
      -              },
      -              "maskingInfo": {
      -                "additionalProperties": true,
      -                "properties": {
      -                  "masking": {
      -                    "type": "string"
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              "primaryPurpose": {
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "phases": {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          },
      -          "studyType": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "eligibilityModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "eligibilityCriteria": {
      -            "type": "string"
      -          },
      -          "healthyVolunteers": {
      -            "type": "boolean"
      -          },
      -          "minimumAge": {
      -            "type": "string"
      -          },
      -          "sex": {
      -            "type": "string"
      -          },
      -          "stdAges": {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "identificationModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "acronym": {
      -            "type": "string"
      -          },
      -          "briefTitle": {
      -            "type": "string"
      -          },
      -          "nctId": {
      -            "type": "string"
      -          },
      -          "officialTitle": {
      -            "type": "string"
      -          },
      -          "orgStudyIdInfo": {
      -            "additionalProperties": true,
      -            "properties": {
      -              "id": {
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "organization": {
      -            "additionalProperties": true,
      -            "properties": {
      -              "class": {
      -                "type": "string"
      -              },
      -              "fullName": {
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "nctId"
      -        ],
      -        "type": "object"
      -      },
      -      "sponsorCollaboratorsModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "collaborators": {
      -            "items": {
      -              "additionalProperties": true,
      -              "properties": {
      -                "class": {
      -                  "type": "string"
      -                },
      -                "name": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "leadSponsor": {
      -            "additionalProperties": true,
      -            "properties": {
      -              "class": {
      -                "type": "string"
      -              },
      -              "name": {
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "responsibleParty": {
      -            "additionalProperties": true,
      -            "properties": {
      -              "type": {
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "statusModule": {
      -        "additionalProperties": true,
      -        "properties": {
      -          "completionDateStruct": {
      -            "additionalProperties": true,
      -            "properties": {
      -              "date": {
      -                "type": "string"
      -              },
      -              "type": {
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "lastKnownStatus": {
      -            "type": "string"
      -          },
      -          "overallStatus": {
      -            "type": "string"
      -          },
      -          "primaryCompletionDateStruct": {
      -            "additionalProperties": true,
      -            "properties": {
      -              "date": {
      -                "type": "string"
      -              },
      -              "type": {
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "startDateStruct": {
      -            "additionalProperties": true,
      -            "properties": {
      -              "date": {
      -                "type": "string"
      -              },
      -              "type": {
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "type": "object"
      -  }
      -}
    • addedOutput schema / properties / studies / items / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / totalCount / description
      Added value: +"Total matching studies (first page only when countTotal=true)."
  17. First observedv1.0.0

TDQS

A3.8/5.0
Behavior4/5

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

The annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds useful behavioral context beyond the annotations: results default to a compact per-study index, and full records are roughly 70KB each, explaining why field selection 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 with the core action, and then adds the most important output-size caveat. Every sentence carries useful information without repetition or filler.

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 tool's complexity, annotations, detailed schema, and output schema, the description provides enough high-level context to understand the tool's scope and default return shape. It does not mention every advanced behavior, such as nctIds batching or unknown-enrollment exclusion, but those are fully documented in 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%, so the input schema already carries detailed semantics for all 18 parameters. The description reinforces the importance of the fields parameter and the size of full records, but it does not add substantial parameter-level meaning beyond the schema.

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 provides a clear verb and resource: search clinical trial studies from ClinicalTrials.gov. It differentiates search from record retrieval implicitly by describing queries, filters, pagination, and field selection, but it does not explicitly contrast itself with siblings such as clinicaltrials_get_study_record or clinicaltrials_get_study_count.

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?

It gives implied usage context by saying it supports full-text and field-specific queries, filters, pagination, sorting, and field selection. However, it does not explicitly state when to use this tool versus clinicaltrials_get_study_record, clinicaltrials_get_study_count, clinicaltrials_find_eligible, or the field-definition tools.

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