Skip to main content
Glama

Pubmed Search Articles

pubmed_search_articles
Read-only

Search PubMed with full query syntax, filters, and date ranges. Returns PMIDs and optional brief summaries. Supports field-specific filters (author, journal, MeSH terms), common filters (language, species, free full text), and pagination via offset for paging through large result sets.

Input Schema

NameRequiredDescriptionDefault
sortNoSort order: relevance (default), pub_date (newest first), author, or journalrelevance
queryNoPubMed search query (supports full NCBI syntax), sent as written apart from inline formatting tags such as `<i>`, which are removed. Omit it or pass an empty string to search on the filters alone, which needs `author`, `journal`, `meshTerms`, or `publicationTypes`; `all[sb]` selects the whole database for a slice by the other filters. A query given must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), parentheses, and invisible characters such as a zero-width space are disregarded is rejected rather than sent to PubMed.
authorNoFilter by author name (e.g. "Smith J"). An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.
offsetNoResult offset for pagination (0-based). PubMed serves at most the first 9999 records of a result set, so this caps at 9998; narrow the query or add filters to reach anything beyond it.
journalNoFilter by journal name. An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.
speciesNoFilter by species: `humans` adds `humans[MeSH Terms]`, `animals` adds `"animals"[mh:noexp]` (animals other than humans; a record indexed for both stays in). Both match only records with MEDLINE species indexing, which preprints and ahead-of-print citations lack.
languageNoFilter by language (e.g. "english"). An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.
dateRangeNoFilter by date range. The filter is applied only when both `minDate` and `maxDate` are non-empty; either one empty disables the entire date range. A partial date covers its whole year or month, and a range whose `minDate` falls after its `maxDate` is rejected: `2024/06` to `2024` is valid, `2024/07` to `2024/06/30` is not.
meshTermsNoFilter by MeSH terms. Multiple terms are AND'd — all must match. Empty strings are skipped; an element of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.
maxResultsNoMaximum results to return, up to 1000 per call; a larger value returns 1000 with a notice naming the next `offset`. 0 returns only `totalCount`.
hasAbstractNoOnly include articles with abstracts
freeFullTextNoOnly include free full text articles
summaryCountNoFetch brief summaries for the top N results (0 = PMIDs only), up to 50 per call; a larger value fetches 50 with a notice. Pass the PMIDs past the cap to pubmed_fetch_articles.
publicationTypesNoFilter by publication type (e.g. "Review", "Clinical Trial", "Meta-Analysis"). Multiple values are OR'd — any match qualifies. Empty strings are skipped; an element of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.

Output Schema

NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
pmidsNoPubMed IDs
queryNoOriginal query; empty when the search ran on the filters alone
noticeNoOptional guidance when the result set does not reflect what was asked for — a field tag PubMed ignored, a phrase it matched nothing for, a dateRange dropped for having one bound, no matches at all, paging past the end, or a `maxResults` or `summaryCount` past its per-call cap, served at the cap. Absent when nothing applies.
offsetNoResult offset used
searchUrlNoPubMed search URL
summariesNoBrief summaries (empty array when summaryCount is 0)
totalCountNoTotal matching articles
appliedFiltersNoFilter values applied to the PubMed query, as sent: each text value as written, formatting tags removed, and dates in YYYY/MM/DD form
effectiveQueryNoThe term sent to PubMed: the query as written, with a clause appended for each active filter, or the filter clauses alone, joined by AND, when no query was given. Only inline formatting tags with no attributes (`<i>`, `<b>`, `<em>`, `<strong>`, `<u>` and their closers) are removed; `&`, `<`, and `>` are sent as written.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedInput schema / properties / maxResults / description
      Previous value: -"Maximum results to return. 0 returns only `totalCount`."New value: +"Maximum results to return, up to 1000 per call; a larger value returns 1000 with a notice naming the next `offset`. 0 returns only `totalCount`."
    • changedInput schema / properties / maxResults / maximum
      Previous value: -1000New value: +10000
    • changedInput schema / properties / query / description
      Previous value: -"PubMed search query (supports full NCBI syntax), sent as written apart from inline formatting tags such as `<i>`, which are removed. Must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), parentheses, and invisible characters such as a zero-width space are disregarded is rejected rather than sent to PubMed."New value: +"PubMed search query (supports full NCBI syntax), sent as written apart from inline formatting tags such as `<i>`, which are removed. Omit it or pass an empty string to search on the filters alone, which needs `author`, `journal`, `meshTerms`, or `publicationTypes`; `all[sb]` selects the whole database for a slice by the other filters. A query given must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), parentheses, and invisible characters such as a zero-width space are disregarded is rejected rather than sent to PubMed."
    • removedInput schema / properties / query / minLength
      Removed value: -1
    • changedInput schema / properties / summaryCount / description
      Previous value: -"Fetch brief summaries for top N results (0 = PMIDs only). Above the 50 cap, pass the remaining PMIDs to pubmed_fetch_articles."New value: +"Fetch brief summaries for the top N results (0 = PMIDs only), up to 50 per call; a larger value fetches 50 with a notice. Pass the PMIDs past the cap to pubmed_fetch_articles."
    • changedInput schema / properties / summaryCount / maximum
      Previous value: -50New value: +500
    • removedInput schema / required
      Removed value: -[
      -  "query"
      -]
    • changedOutput schema / properties / effectiveQuery / description
      Previous value: -"The term sent to PubMed: the query as written, with a clause appended for each active filter. Only inline formatting tags with no attributes (`<i>`, `<b>`, `<em>`, `<strong>`, `<u>` and their closers) are removed; `&`, `<`, and `>` are sent as written."New value: +"The term sent to PubMed: the query as written, with a clause appended for each active filter, or the filter clauses alone, joined by AND, when no query was given. Only inline formatting tags with no attributes (`<i>`, `<b>`, `<em>`, `<strong>`, `<u>` and their closers) are removed; `&`, `<`, and `>` are sent as written."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call — the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed — retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it — retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully — mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query contains no search term: nothing is left once whitespace and invisible characters such as a zero-width space are disregarded. pubmed_search_articles and pubmed_europepmc_search first decode HTML entities and also disregard markup and parentheses, so `()`, `<b></b>`, and `&nbsp;` hold no term there; pubmed_search_articles also disregards bracketed field tags such as `[pdat]`. `invalid_date_range`: A `dateRange` bound is not a real calendar date — a month outside 01–12, day 00, or a day past the end of its month such as `2023/02/29` — or `minDate` falls after `maxDate` once PubMed expands each partial date: `minDate` from the start of its year or month, `maxDate` to the end. `blank_filter`: An `author`, `journal`, or `language` value, or a `publicationTypes` or `meshTerms` element, holds no term once markup is removed and HTML entities are decoded — only whitespace, invisible characters such as a zero-width space, parentheses, brackets, or double quotes are left, as in `()` or `\"\"` — so its field clause would carry no term. An exactly-empty string is not blank here; it sets no filter. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call — the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed — retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it — retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully — mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query contains no search term: nothing is left once whitespace and invisible characters such as a zero-width space are disregarded. pubmed_search_articles and pubmed_europepmc_search first decode HTML entities and also disregard markup and parentheses, so `()`, `<b></b>`, and `&nbsp;` hold no term there; pubmed_search_articles also disregards bracketed field tags such as `[pdat]`. On pubmed_search_articles an exactly-empty `query` is not blank: it means no query, and the search runs on its filters. `invalid_date_range`: A `dateRange` bound is not a real calendar date — a month outside 01–12, day 00, or a day past the end of its month such as `2023/02/29` — or `minDate` falls after `maxDate` once PubMed expands each partial date: `minDate` from the start of its year or month, `maxDate` to the end. `blank_filter`: An `author`, `journal`, or `language` value, or a `publicationTypes` or `meshTerms` element, holds no term once markup is removed and HTML entities are decoded — only whitespace, invisible characters such as a zero-width space, parentheses, brackets, or double quotes are left, as in `()` or `\"\"` — so its field clause would carry no term. An exactly-empty string is not blank here; it sets no filter. `no_search_term`: No `query` is given — it is omitted or an empty string — and no subject filter (`author`, `journal`, `meshTerms`, or `publicationTypes`) carries a term. `dateRange`, `language`, `species`, `hasAbstract`, and `freeFullText` narrow a search without saying what it is for, so they cannot run one alone. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "queue_full",
      -  "ncbi_unreachable",
      -  "ncbi_rate_limited",
      -  "ncbi_deadline_exceeded",
      -  "ncbi_invalid_response",
      -  "ncbi_resource_not_found",
      -  "blank_query",
      -  "invalid_date_range",
      -  "blank_filter"
      -]New value: +[
      +  "queue_full",
      +  "ncbi_unreachable",
      +  "ncbi_rate_limited",
      +  "ncbi_deadline_exceeded",
      +  "ncbi_invalid_response",
      +  "ncbi_resource_not_found",
      +  "blank_query",
      +  "invalid_date_range",
      +  "blank_filter",
      +  "no_search_term"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Optional guidance when the result set does not reflect what was asked for — a field tag PubMed ignored, a phrase it matched nothing for, a dateRange dropped for having one bound, no matches at all, or paging past the end. Absent when nothing applies."New value: +"Optional guidance when the result set does not reflect what was asked for — a field tag PubMed ignored, a phrase it matched nothing for, a dateRange dropped for having one bound, no matches at all, paging past the end, or a `maxResults` or `summaryCount` past its per-call cap, served at the cap. Absent when nothing applies."
    • changedOutput schema / properties / query / description
      Previous value: -"Original query"New value: +"Original query; empty when the search ran on the filters alone"
  2. Changed5 schema fields changed
    • changedInput schema / properties / query / description
      Previous value: -"PubMed search query (supports full NCBI syntax). Must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), parentheses, and invisible characters such as a zero-width space are disregarded is rejected rather than sent to PubMed."New value: +"PubMed search query (supports full NCBI syntax), sent as written apart from inline formatting tags such as `<i>`, which are removed. Must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), parentheses, and invisible characters such as a zero-width space are disregarded is rejected rather than sent to PubMed."
    • changedInput schema / properties / species / description
      Previous value: -"Filter by species"New value: +"Filter by species: `humans` adds `humans[MeSH Terms]`, `animals` adds `\"animals\"[mh:noexp]` (animals other than humans; a record indexed for both stays in). Both match only records with MEDLINE species indexing, which preprints and ahead-of-print citations lack."
    • changedOutput schema / properties / appliedFilters / description
      Previous value: -"Normalized filter values that were applied to the PubMed query"New value: +"Filter values applied to the PubMed query, as sent: each text value as written, formatting tags removed, and dates in YYYY/MM/DD form"
    • changedOutput schema / properties / appliedFilters / properties / species / description
      Previous value: -"Species filter applied to the search"New value: +"Species filter applied to the search: `humans` as `humans[MeSH Terms]`, `animals` as `\"animals\"[mh:noexp]`"
    • changedOutput schema / properties / effectiveQuery / description
      Previous value: -"Sanitized query sent to PubMed after applying all active filters"New value: +"The term sent to PubMed: the query as written, with a clause appended for each active filter. Only inline formatting tags with no attributes (`<i>`, `<b>`, `<em>`, `<strong>`, `<u>` and their closers) are removed; `&`, `<`, and `>` are sent as written."
  3. Changed5 schema fields changed
    • changedInput schema / properties / dateRange / properties / maxDate / description
      Previous value: -"End date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound. Must be a real calendar date — `2023/02/29` is rejected."New value: +"End date (YYYY/MM/DD, YYYY/MM, or YYYY). Must be a real calendar date — `2023/02/29` is rejected. Leaving it empty drops the whole date range, not just this bound; for no upper bound pass a wide sentinel such as `3000`."
    • changedInput schema / properties / dateRange / properties / minDate / description
      Previous value: -"Start date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound. Must be a real calendar date — `2023/02/29` is rejected."New value: +"Start date (YYYY/MM/DD, YYYY/MM, or YYYY). Must be a real calendar date — `2023/02/29` is rejected. Leaving it empty drops the whole date range, not just this bound; for no lower bound pass a wide sentinel such as `1000`."
    • changedInput schema / properties / maxResults / description
      Previous value: -"Maximum results to return"New value: +"Maximum results to return. 0 returns only `totalCount`."
    • changedInput schema / properties / maxResults / minimum
      Previous value: -1New value: +0
    • changedOutput schema / properties / summaries / items / properties / pubDate / description
      Previous value: -"Publication date"New value: +"Publication date as YYYY-MM-DD; a month- or year-only date reads as the first day of that month or year. On an NCBI Bookshelf chapter (`docType` \"chapter\") it is the chapter's own date — its last revision, otherwise its contribution — not the year its book began."
  4. Changed11 schema fields changed
    • changedInput schema / properties / author / description
      Previous value: -"Filter by author name (e.g. \"Smith J\")"New value: +"Filter by author name (e.g. \"Smith J\"). An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."
    • changedInput schema / properties / dateRange / description
      Previous value: -"Filter by date range. The filter is applied only when both `minDate` and `maxDate` are non-empty; either one empty disables the entire date range."New value: +"Filter by date range. The filter is applied only when both `minDate` and `maxDate` are non-empty; either one empty disables the entire date range. A partial date covers its whole year or month, and a range whose `minDate` falls after its `maxDate` is rejected: `2024/06` to `2024` is valid, `2024/07` to `2024/06/30` is not."
    • changedInput schema / properties / dateRange / properties / maxDate / description
      Previous value: -"End date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound"New value: +"End date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound. Must be a real calendar date — `2023/02/29` is rejected."
    • changedInput schema / properties / dateRange / properties / minDate / description
      Previous value: -"Start date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound"New value: +"Start date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound. Must be a real calendar date — `2023/02/29` is rejected."
    • changedInput schema / properties / journal / description
      Previous value: -"Filter by journal name"New value: +"Filter by journal name. An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."
    • changedInput schema / properties / language / description
      Previous value: -"Filter by language (e.g. \"english\")"New value: +"Filter by language (e.g. \"english\"). An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."
    • changedInput schema / properties / meshTerms / description
      Previous value: -"Filter by MeSH terms. Multiple terms are AND'd — all must match."New value: +"Filter by MeSH terms. Multiple terms are AND'd — all must match. Empty strings are skipped; an element of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."
    • changedInput schema / properties / publicationTypes / description
      Previous value: -"Filter by publication type (e.g. \"Review\", \"Clinical Trial\", \"Meta-Analysis\"). Multiple values are OR'd — any match qualifies."New value: +"Filter by publication type (e.g. \"Review\", \"Clinical Trial\", \"Meta-Analysis\"). Multiple values are OR'd — any match qualifies. Empty strings are skipped; an element of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."
    • changedInput schema / properties / query / description
      Previous value: -"PubMed search query (supports full NCBI syntax). Must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), and parentheses are removed is rejected rather than sent to PubMed as an empty term."New value: +"PubMed search query (supports full NCBI syntax). Must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), parentheses, and invisible characters such as a zero-width space are disregarded is rejected rather than sent to PubMed."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call — the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities is unreachable after all retry attempts. `ncbi_deadline_exceeded`: Total request deadline expired before NCBI returned a response. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query holds no search term once whitespace, and anything the tool strips before searching, are removed — so NCBI would receive a blank term. pubmed_search_articles strips markup, bracketed field tags, and parentheses, so a bare field tag such as `[pdat]` or empty parentheses `()` count as blank there. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call — the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed — retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it — retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully — mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query contains no search term: nothing is left once whitespace and invisible characters such as a zero-width space are disregarded. pubmed_search_articles and pubmed_europepmc_search first decode HTML entities and also disregard markup and parentheses, so `()`, `<b></b>`, and `&nbsp;` hold no term there; pubmed_search_articles also disregards bracketed field tags such as `[pdat]`. `invalid_date_range`: A `dateRange` bound is not a real calendar date — a month outside 01–12, day 00, or a day past the end of its month such as `2023/02/29` — or `minDate` falls after `maxDate` once PubMed expands each partial date: `minDate` from the start of its year or month, `maxDate` to the end. `blank_filter`: An `author`, `journal`, or `language` value, or a `publicationTypes` or `meshTerms` element, holds no term once markup is removed and HTML entities are decoded — only whitespace, invisible characters such as a zero-width space, parentheses, brackets, or double quotes are left, as in `()` or `\"\"` — so its field clause would carry no term. An exactly-empty string is not blank here; it sets no filter. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "queue_full",
      -  "ncbi_unreachable",
      -  "ncbi_deadline_exceeded",
      -  "ncbi_invalid_response",
      -  "ncbi_resource_not_found",
      -  "blank_query"
      -]New value: +[
      +  "queue_full",
      +  "ncbi_unreachable",
      +  "ncbi_rate_limited",
      +  "ncbi_deadline_exceeded",
      +  "ncbi_invalid_response",
      +  "ncbi_resource_not_found",
      +  "blank_query",
      +  "invalid_date_range",
      +  "blank_filter"
      +]
  5. Changed3 schema fields changed
    • changedInput schema / properties / query / description
      Previous value: -"PubMed search query (supports full NCBI syntax). Must carry a search term: a value that is blank once markup is stripped is rejected rather than sent to PubMed as an empty term."New value: +"PubMed search query (supports full NCBI syntax). Must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), and parentheses are removed is rejected rather than sent to PubMed as an empty term."
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "query",
      -      "offset",
      -      "pmids",
      -      "summaries",
      -      "searchUrl",
      -      "effectiveQuery",
      -      "totalCount",
      -      "appliedFilters"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "query",
      +      "offset",
      +      "pmids",
      +      "summaries",
      +      "searchUrl",
      +      "totalCount",
      +      "effectiveQuery",
      +      "appliedFilters"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call — the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities is unreachable after all retry attempts. `ncbi_deadline_exceeded`: Total request deadline expired before NCBI returned a response. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query holds no search term once whitespace, and any markup the tool strips first, are removed — so NCBI would receive a blank term. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call — the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities is unreachable after all retry attempts. `ncbi_deadline_exceeded`: Total request deadline expired before NCBI returned a response. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query holds no search term once whitespace, and anything the tool strips before searching, are removed — so NCBI would receive a blank term. pubmed_search_articles strips markup, bracketed field tags, and parentheses, so a bare field tag such as `[pdat]` or empty parentheses `()` count as blank there. Other values are possible when a failure originates below the handler."
  6. Changed1 schema field changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `queue_full`: Local NCBI request queue is at capacity. `ncbi_unreachable`: NCBI E-utilities is unreachable after all retry attempts. `ncbi_deadline_exceeded`: Total request deadline expired before NCBI returned a response. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query holds no search term once whitespace, and any markup the tool strips first, are removed — so NCBI would receive a blank term. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call — the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities is unreachable after all retry attempts. `ncbi_deadline_exceeded`: Total request deadline expired before NCBI returned a response. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query holds no search term once whitespace, and any markup the tool strips first, are removed — so NCBI would receive a blank term. Other values are possible when a failure originates below the handler."
  7. Changed6 schema fields changed
    • changedOutput schema / properties / summaries / items / properties / authors / description
      Previous value: -"Formatted author string"New value: +"Formatted author string — the first three of the record's own authors, then \"et al.\". On an NCBI Bookshelf chapter these are the chapter's authors; the book's editors are reported separately in `editors`."
    • addedOutput schema / properties / summaries / items / properties / bookTitle
      Added value: +{
      +  "description": "Title of the book an NCBI Bookshelf record belongs to, e.g. \"GeneReviews(®)\". Present instead of `source` on a book record; absent on a journal article.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / summaries / items / properties / docType
      Added value: +{
      +  "description": "What PubMed classifies this record as: \"chapter\" or \"book\" for an NCBI Bookshelf record, \"citation\" for an ordinary journal article. Absent when PubMed supplies none.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / summaries / items / properties / editors
      Added value: +{
      +  "description": "Editors of the containing book, kept out of `authors` so they cannot displace the record's own authors. Absent on a journal article and on a book that credits no editors.",
      +  "items": {
      +    "description": "One editor, \"Surname Initials\" as ESummary renders it",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / summaries / items / properties / publisherName
      Added value: +{
      +  "description": "Publisher of the book an NCBI Bookshelf record belongs to. Present only on a book record; absent on a journal article.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / summaries / items / properties / source / description
      Previous value: -"Journal source"New value: +"Journal the article appeared in. Absent on an NCBI Bookshelf record, which has no journal — its venue is in `bookTitle` and `publisherName` instead, and `docType` says which kind of record it is."
  8. Changed3 schema fields changed
    • changedInput schema / properties / query / description
      Previous value: -"PubMed search query (supports full NCBI syntax)"New value: +"PubMed search query (supports full NCBI syntax). Must carry a search term: a value that is blank once markup is stripped is rejected rather than sent to PubMed as an empty term."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `queue_full`: Local NCBI request queue is at capacity. `ncbi_unreachable`: NCBI E-utilities is unreachable after all retry attempts. `ncbi_deadline_exceeded`: Total request deadline expired before NCBI returned a response. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `queue_full`: Local NCBI request queue is at capacity. `ncbi_unreachable`: NCBI E-utilities is unreachable after all retry attempts. `ncbi_deadline_exceeded`: Total request deadline expired before NCBI returned a response. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). `blank_query`: The query holds no search term once whitespace, and any markup the tool strips first, are removed — so NCBI would receive a blank term. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "queue_full",
      -  "ncbi_unreachable",
      -  "ncbi_deadline_exceeded",
      -  "ncbi_invalid_response",
      -  "ncbi_resource_not_found"
      -]New value: +[
      +  "queue_full",
      +  "ncbi_unreachable",
      +  "ncbi_deadline_exceeded",
      +  "ncbi_invalid_response",
      +  "ncbi_resource_not_found",
      +  "blank_query"
      +]
  9. Changed6 schema 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": [
      +      "query",
      +      "offset",
      +      "pmids",
      +      "summaries",
      +      "searchUrl",
      +      "effectiveQuery",
      +      "totalCount",
      +      "appliedFilters"
      +    ]
      +  },
      +  {
      +    "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: `queue_full`: Local NCBI request queue is at capacity. `ncbi_unreachable`: NCBI E-utilities is unreachable after all retry attempts. `ncbi_deadline_exceeded`: Total request deadline expired before NCBI returned a response. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured \"not found\" error for the requested ID(s). Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "queue_full",
      +            "ncbi_unreachable",
      +            "ncbi_deadline_exceeded",
      +            "ncbi_invalid_response",
      +            "ncbi_resource_not_found"
      +          ],
      +          "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: -[
      -  "query",
      -  "offset",
      -  "pmids",
      -  "summaries",
      -  "searchUrl",
      -  "effectiveQuery",
      -  "totalCount",
      -  "appliedFilters"
      -]
  10. Changed5 schema fields changed
    • changedInput schema / properties / offset / description
      Previous value: -"Result offset for pagination (0-based)"New value: +"Result offset for pagination (0-based). PubMed serves at most the first 9999 records of a result set, so this caps at 9998; narrow the query or add filters to reach anything beyond it."
    • changedInput schema / properties / offset / maximum
      Previous value: -9007199254740991New value: +9998
    • changedInput schema / properties / summaryCount / description
      Previous value: -"Fetch brief summaries for top N results (0 = PMIDs only)"New value: +"Fetch brief summaries for top N results (0 = PMIDs only). Above the 50 cap, pass the remaining PMIDs to pubmed_fetch_articles."
    • changedOutput schema / properties / notice / description
      Previous value: -"Optional guidance when results are empty or paging overshot — e.g. how to broaden filters or reset offset. Absent on successful result pages."New value: +"Optional guidance when the result set does not reflect what was asked for — a field tag PubMed ignored, a phrase it matched nothing for, a dateRange dropped for having one bound, no matches at all, or paging past the end. Absent when nothing applies."
    • changedOutput schema / properties / summaries / items / properties / doi / description
      Previous value: -"DOI"New value: +"DOI, cased as NCBI reports it. DOIs are case-insensitive by spec and no case normalization is applied here, so casing can differ from a Europe PMC-sourced `doi` — compare the two case-insensitively."
  11. Changed3 schema fields changed
    • addedOutput schema / properties / totalCount
      Added value: +{
      +  "description": "Total matching articles",
      +  "type": "number"
      +}
    • removedOutput schema / properties / totalFound
      Removed value: -{
      -  "description": "Total matching articles",
      -  "type": "number"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "offset",
      -  "pmids",
      -  "summaries",
      -  "searchUrl",
      -  "effectiveQuery",
      -  "totalFound",
      -  "appliedFilters"
      -]New value: +[
      +  "query",
      +  "offset",
      +  "pmids",
      +  "summaries",
      +  "searchUrl",
      +  "effectiveQuery",
      +  "totalCount",
      +  "appliedFilters"
      +]
  12. Changed1 schema field changed
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "effectiveQuery",
      -  "appliedFilters",
      -  "totalFound",
      -  "offset",
      -  "pmids",
      -  "summaries",
      -  "searchUrl"
      -]New value: +[
      +  "query",
      +  "offset",
      +  "pmids",
      +  "summaries",
      +  "searchUrl",
      +  "effectiveQuery",
      +  "totalFound",
      +  "appliedFilters"
      +]
  13. Changed3 schema fields changed
    • changedInput schema / properties / dateRange / description
      Previous value: -"Filter by date range"New value: +"Filter by date range. The filter is applied only when both `minDate` and `maxDate` are non-empty; either one empty disables the entire date range."
    • changedInput schema / properties / dateRange / properties / maxDate / description
      Previous value: -"End date (YYYY/MM/DD, YYYY/MM, or YYYY)"New value: +"End date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound"
    • changedInput schema / properties / dateRange / properties / minDate / description
      Previous value: -"Start date (YYYY/MM/DD, YYYY/MM, or YYYY)"New value: +"Start date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound"
  14. Changed1 schema field changed
    • addedOutput schema / properties / summaries / items / description
      Added value: +"Brief article summary"
  15. Changed5 schema fields changed
    • addedInput schema / properties / dateRange / properties / maxDate / pattern
      Added value: +"^$|^\\d{4}([/\\-.]\\d{1,2}([/\\-.]\\d{1,2})?)?$"
    • addedInput schema / properties / dateRange / properties / minDate / pattern
      Added value: +"^$|^\\d{4}([/\\-.]\\d{1,2}([/\\-.]\\d{1,2})?)?$"
    • changedInput schema / properties / meshTerms / description
      Previous value: -"Filter by MeSH terms"New value: +"Filter by MeSH terms. Multiple terms are AND'd — all must match."
    • changedInput schema / properties / publicationTypes / description
      Previous value: -"Filter by publication type (e.g. \"Review\", \"Clinical Trial\", \"Meta-Analysis\")"New value: +"Filter by publication type (e.g. \"Review\", \"Clinical Trial\", \"Meta-Analysis\"). Multiple values are OR'd — any match qualifies."
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Optional guidance when results are empty or paging overshot — e.g. how to broaden filters or reset offset. Absent on successful result pages.",
      +  "type": "string"
      +}
  16. Changed3 schema fields changed
    • addedOutput schema / properties / appliedFilters
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Normalized filter values that were applied to the PubMed query",
      +  "properties": {
      +    "author": {
      +      "description": "Author filter applied to the search",
      +      "type": "string"
      +    },
      +    "dateRange": {
      +      "additionalProperties": false,
      +      "description": "Date range filter applied to the search",
      +      "properties": {
      +        "dateType": {
      +          "description": "Applied date field used for the range filter",
      +          "enum": [
      +            "pdat",
      +            "mdat",
      +            "edat"
      +          ],
      +          "type": "string"
      +        },
      +        "maxDate": {
      +          "description": "Applied maximum date",
      +          "type": "string"
      +        },
      +        "minDate": {
      +          "description": "Applied minimum date",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "minDate",
      +        "maxDate",
      +        "dateType"
      +      ],
      +      "type": "object"
      +    },
      +    "freeFullText": {
      +      "description": "Whether results were restricted to free full-text articles",
      +      "type": "boolean"
      +    },
      +    "hasAbstract": {
      +      "description": "Whether results were restricted to articles with abstracts",
      +      "type": "boolean"
      +    },
      +    "journal": {
      +      "description": "Journal filter applied to the search",
      +      "type": "string"
      +    },
      +    "language": {
      +      "description": "Language filter applied to the search",
      +      "type": "string"
      +    },
      +    "meshTerms": {
      +      "description": "MeSH term filters applied to the search",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "publicationTypes": {
      +      "description": "Publication type filters applied to the search",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "species": {
      +      "description": "Species filter applied to the search",
      +      "enum": [
      +        "humans",
      +        "animals"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / effectiveQuery
      Added value: +{
      +  "description": "Sanitized query sent to PubMed after applying all active filters",
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "totalFound",
      -  "offset",
      -  "pmids",
      -  "summaries",
      -  "searchUrl"
      -]New value: +[
      +  "query",
      +  "effectiveQuery",
      +  "appliedFilters",
      +  "totalFound",
      +  "offset",
      +  "pmids",
      +  "summaries",
      +  "searchUrl"
      +]
  17. Changed2 schema fields changed
    • changedInput schema / properties / dateRange / properties / maxDate / description
      Previous value: -"End date (YYYY-MM-DD)"New value: +"End date (YYYY/MM/DD, YYYY/MM, or YYYY)"
    • changedInput schema / properties / dateRange / properties / minDate / description
      Previous value: -"Start date (YYYY-MM-DD)"New value: +"Start date (YYYY/MM/DD, YYYY/MM, or YYYY)"
  18. First observed

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-dependency profile are covered. The description adds that results are PMIDs with optional brief summaries and that offset enables paging, but it omits the per-call caps (1000 results, 50 summaries) that materially affect how an agent pages, and those caps appear only in the schema.

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 what the tool does and what it returns, then the filter and paging capabilities. There is no filler, though the final sentence is a dense capability inventory that an agent must parse rather than a prioritized routing statement.

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 14 parameters, a nested dateRange object, and an output schema already present, the description need not restate return fields or per-parameter rules, and it correctly stays high-level. It is nearly complete, with the main shortfall being routing information against the many sibling tools and omission of the hard result caps.

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 explains every one of the 14 parameters, including the empty-string disable semantics and the date-range requirements. The description only restates the categories of filters that exist (author, journal, MeSH, language, species, free full text) without adding syntax or precedence meaning beyond the schema, so 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 opens with a specific verb+resource ("Search PubMed with full query syntax, filters, and date ranges") and states the return shape (PMIDs plus optional brief summaries). It is clear what the tool does, but it never names or contrasts itself with the sibling search tool (pubmed_europepmc_search) or with pubmed_find_related, so sibling differentiation is left to the agent.

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?

Usage is only implied: the mention of filters, date ranges, and "pagination via offset for paging through large result sets" suggests when to reach for it, but there is no explicit when-to-use/when-not-to-use guidance and no pointer to alternatives for other search backends. The 1000-result cap and the pointer to paging past it are left to the schema rather than the description.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.