Skip to main content
Glama
pubmed-mcp-server

pubmed-mcp-server

by cyanheads

Pubmed Search Articles

pubmed_search_articles
Read-only

Search PubMed articles with full query syntax and filters for author, journal, MeSH terms, date range, language, species, and free full text; returns PMIDs plus brief summaries with offset pagination.

Instructions

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.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "pubmed_search_articles"
  }
}

Input Schema

NameRequiredDescriptionDefault
sortNoSort order: relevance (default), pub_date (publication date, newest first), author (first author A–Z), or journal (journal name A–Z)relevance
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: its NLM title abbreviation (e.g. "N Engl J Med") or ISSN; a full title matches only as NLM records it. 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: its English name or three-letter NLM code (e.g. "english" or "eng"); a two-letter code such as "en" matches nothing. 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 headings, each searched as `"term"[MeSH Terms]`. Multiple terms are AND'd — all must match. A supplementary concept, as many drugs are, is not a heading and matches nothing here: search it in `query` as the `searchTerm` pubmed_lookup_mesh returns, such as `"dapagliflozin"[nm]`. 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 (with advice by the clause's field), a dateRange dropped for having one bound, no matches at all, paging past the end, a page that ends at PubMed's 9,999-record window with matches past it that no `offset` reaches, 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. Changed14 schema fields changedv2.12.1
    • changedInput schema / properties / journal / description
      Previous 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."New value: +"Filter by journal: its NLM title abbreviation (e.g. \"N Engl J Med\") or ISSN; a full title matches only as NLM records it. 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\"). An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."New value: +"Filter by language: its English name or three-letter NLM code (e.g. \"english\" or \"eng\"); a two-letter code such as \"en\" matches nothing. 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. Empty strings are skipped; an element of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."New value: +"Filter by MeSH headings, each searched as `\"term\"[MeSH Terms]`. Multiple terms are AND'd — all must match. A supplementary concept, as many drugs are, is not a heading and matches nothing here: search it in `query` as the `searchTerm` pubmed_lookup_mesh returns, such as `\"dapagliflozin\"[nm]`. Empty strings are skipped; an element of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."
    • changedInput schema / properties / sort / description
      Previous value: -"Sort order: relevance (default), pub_date (newest first), author, or journal"New value: +"Sort order: relevance (default), pub_date (publication date, newest first), author (first author A–Z), or journal (journal name A–Z)"
    • 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]`. 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."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, the next backoff would overrun the total deadline, or the call made one attempt without retrying because the previous call to the same E-utility had failed on every attempt. `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 / 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, paging past the end, or a `maxResults` or `summaryCount` past its per-call cap, served at the cap. 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 (with advice by the clause's field), a dateRange dropped for having one bound, no matches at all, paging past the end, a page that ends at PubMed's 9,999-record window with matches past it that no `offset` reaches, or a `maxResults` or `summaryCount` past its per-call cap, served at the cap. Absent when nothing applies."
    • changedOutput schema / properties / summaries / items / properties / authors / description
      Previous 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`."New value: +"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 in `editors`."
    • changedOutput schema / properties / summaries / items / properties / doi / description
      Previous 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."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. Absent when the record has none."
    • addedOutput schema / properties / summaries / items / properties / epubDate
      Added value: +{
      +  "description": "Electronic publication date — when the article went online, often ahead of the issue `pubDate` names — in ISO 8601 at the precision PubMed states, normally `YYYY-MM-DD`. Absent when PubMed records none.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / summaries / items / properties / pmcId / description
      Previous value: -"PMC ID"New value: +"PubMed Central ID (`PMC` prefix) of the record's PMC copy. Absent when the record has none."
    • changedOutput schema / properties / summaries / items / properties / pmcUrl / description
      Previous value: -"PMC URL"New value: +"Link to the record's PMC copy; present exactly when `pmcId` is."
    • changedOutput schema / properties / summaries / items / properties / pubDate / description
      Previous 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."New value: +"Publication date as PubMed states it, in ISO 8601 at that precision: `2026`, `2026-12`, or `2026-09-30`. A stated range is an interval `start/end` — `2026-09/2026-10` for a bimonthly issue, `1994/1995`, `2006-12-12/2007-01-01` — and a season reads as its year; every form opens with the four-digit 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. Absent when PubMed states no date with a year."
    • changedOutput schema / properties / summaries / items / properties / pubmedUrl / description
      Previous value: -"PubMed URL"New value: +"Link to the record's PubMed page; present on every row."
    • changedOutput schema / properties / summaries / items / required
      Previous value: -[
      -  "pmid"
      -]New value: +[
      +  "pmid",
      +  "pubmedUrl"
      +]
  2. Changed12 schema fields changedv2.12.0
    • 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"
  3. Changed5 schema fields changedv2.11.1
    • 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."
  4. Changed5 schema fields changedv2.10.20
    • 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."
  5. Changed11 schema fields changedv2.10.19
    • 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"
      +]
  6. Changed3 schema fields changedv2.10.18
    • 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`: 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 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."
  7. Changed9 schema fields changedv2.10.12
    • 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"
      +]
    • 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. Changed6 schema fields changedv2.10.4
    • 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"
      -]
  9. Changed5 schema fields changedv2.10.2
    • 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."
  10. Changed3 schema fields changedv2.9.4
    • 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"
      +]
  11. Changed1 schema field changedv2.7.8
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "effectiveQuery",
      -  "appliedFilters",
      -  "totalFound",
      -  "offset",
      -  "pmids",
      -  "summaries",
      -  "searchUrl"
      -]New value: +[
      +  "query",
      +  "offset",
      +  "pmids",
      +  "summaries",
      +  "searchUrl",
      +  "effectiveQuery",
      +  "totalFound",
      +  "appliedFilters"
      +]
  12. Addedv2.7.6
  13. Removedv2.7.4
  14. Changed30 schema fields changedv2.3.2
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / author
      Added value: +{
      +  "description": "Filter by author name (e.g. \"Smith J\")",
      +  "type": "string"
      +}
    • removedInput schema / properties / dateRange / additionalProperties
      Removed value: -false
    • changedInput schema / properties / dateRange / description
      Previous value: -"Defines an optional date range for the search."New value: +"Filter by date range"
    • changedInput schema / properties / dateRange / properties / dateType / description
      Previous value: -"The type of date to filter by: 'pdat' (Publication Date), 'mdat' (Modification Date), 'edat' (Entrez Date). Default is 'pdat'."New value: +"Date type: pdat (publication), mdat (modification), edat (entrez)"
    • changedInput schema / properties / dateRange / properties / maxDate / description
      Previous value: -"The end date for the search range (YYYY, YYYY/MM, or YYYY/MM/DD)."New value: +"End date (YYYY/MM/DD, YYYY/MM, or YYYY)"
    • removedInput schema / properties / dateRange / properties / maxDate / pattern
      Removed value: -"^\\d{4}(\\/\\d{2}(\\/\\d{2})?)?$"
    • changedInput schema / properties / dateRange / properties / minDate / description
      Previous value: -"The start date for the search range (YYYY, YYYY/MM, or YYYY/MM/DD)."New value: +"Start date (YYYY/MM/DD, YYYY/MM, or YYYY)"
    • removedInput schema / properties / dateRange / properties / minDate / pattern
      Removed value: -"^\\d{4}(\\/\\d{2}(\\/\\d{2})?)?$"
    • addedInput schema / properties / dateRange / required
      Added value: +[
      +  "minDate",
      +  "maxDate"
      +]
    • removedInput schema / properties / fetchBriefSummaries
      Removed value: -{
      -  "default": 0,
      -  "description": "Number of top PMIDs for which to fetch brief summaries using ESummary. Set to 0 to disable. Max 50. Default 0.",
      -  "maximum": 50,
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • removedInput schema / properties / filterByPublicationTypes
      Removed value: -{
      -  "description": "An array of publication types to filter by (e.g., [\"Review\", \"Clinical Trial\"]).",
      -  "items": {
      -    "type": "string"
      -  },
      -  "type": "array"
      -}
    • addedInput schema / properties / freeFullText
      Added value: +{
      +  "description": "Only include free full text articles",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / hasAbstract
      Added value: +{
      +  "description": "Only include articles with abstracts",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / journal
      Added value: +{
      +  "description": "Filter by journal name",
      +  "type": "string"
      +}
    • addedInput schema / properties / language
      Added value: +{
      +  "description": "Filter by language (e.g. \"english\")",
      +  "type": "string"
      +}
    • changedInput schema / properties / maxResults / description
      Previous value: -"Maximum number of articles to retrieve. Corresponds to ESearch's 'retmax' parameter. Default is 20, max is 1000."New value: +"Maximum results to return"
    • removedInput schema / properties / maxResults / exclusiveMinimum
      Removed value: -0
    • addedInput schema / properties / maxResults / minimum
      Added value: +1
    • addedInput schema / properties / meshTerms
      Added value: +{
      +  "description": "Filter by MeSH terms",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / offset
      Added value: +{
      +  "default": 0,
      +  "description": "Result offset for pagination (0-based)",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / publicationTypes
      Added value: +{
      +  "description": "Filter by publication type (e.g. \"Review\", \"Clinical Trial\", \"Meta-Analysis\")",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / query
      Added value: +{
      +  "description": "PubMed search query (supports full NCBI syntax)",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • removedInput schema / properties / queryTerm
      Removed value: -{
      -  "description": "The primary keyword or phrase to search for in PubMed. Must be at least 3 characters long.",
      -  "minLength": 3,
      -  "type": "string"
      -}
    • addedInput schema / properties / sort
      Added value: +{
      +  "default": "relevance",
      +  "description": "Sort order: relevance (default), pub_date (newest first), author, or journal",
      +  "enum": [
      +    "relevance",
      +    "pub_date",
      +    "author",
      +    "journal"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / sortBy
      Removed value: -{
      -  "default": "relevance",
      -  "description": "Sorting criteria for results. Options: 'relevance' (default), 'pub_date', 'author', 'journal_name'.",
      -  "enum": [
      -    "relevance",
      -    "pub_date",
      -    "author",
      -    "journal_name"
      -  ],
      -  "type": "string"
      -}
    • addedInput schema / properties / species
      Added value: +{
      +  "description": "Filter by species",
      +  "enum": [
      +    "humans",
      +    "animals"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / summaryCount
      Added value: +{
      +  "default": 0,
      +  "description": "Fetch brief summaries for top N results (0 = PMIDs only)",
      +  "maximum": 50,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "queryTerm"
      -]New value: +[
      +  "query"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "offset": {
      +      "description": "Result offset used",
      +      "type": "number"
      +    },
      +    "pmids": {
      +      "description": "PubMed IDs",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "query": {
      +      "description": "Original query",
      +      "type": "string"
      +    },
      +    "searchUrl": {
      +      "description": "PubMed search URL",
      +      "type": "string"
      +    },
      +    "summaries": {
      +      "description": "Brief summaries (empty array when summaryCount is 0)",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "authors": {
      +            "description": "Formatted author string",
      +            "type": "string"
      +          },
      +          "doi": {
      +            "description": "DOI",
      +            "type": "string"
      +          },
      +          "pmcId": {
      +            "description": "PMC ID",
      +            "type": "string"
      +          },
      +          "pmcUrl": {
      +            "description": "PMC URL",
      +            "type": "string"
      +          },
      +          "pmid": {
      +            "description": "PubMed ID",
      +            "type": "string"
      +          },
      +          "pubDate": {
      +            "description": "Publication date",
      +            "type": "string"
      +          },
      +          "pubmedUrl": {
      +            "description": "PubMed URL",
      +            "type": "string"
      +          },
      +          "source": {
      +            "description": "Journal source",
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "Article title",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "pmid"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "totalFound": {
      +      "description": "Total matching articles",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "query",
      +    "totalFound",
      +    "offset",
      +    "pmids",
      +    "summaries",
      +    "searchUrl"
      +  ],
      +  "type": "object"
      +}
  15. First observedv1.0.0

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 the safety profile is covered. The description adds that results include PMIDs and optional summaries and that offset supports deep paging, but it omits the notable behavioral limits that live in the schema (the 9999-record PubMed ceiling, the 1000-result and 50-summary caps) rather than surfacing them where an agent skimming the description would see them.

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

Conciseness4/5

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

Three sentences, front-loaded with purpose and return shape, then capabilities. No filler. It could be marginally tighter by folding the pagination clause into the filter sentence, but nothing is wasted.

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

Completeness4/5

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

For a 14-parameter tool with nested objects, enums, and an output schema, the description covers the main capability axes and leaves detail to the schema and output schema, which is the right division of labor. The main residual gap is sibling disambiguation, since Europe PMC and fetch/related tools overlap on intent and nothing in the description distinguishes them.

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?

With 100% schema description coverage the schema already carries the semantics, so the baseline is 3. The description does add a useful conceptual grouping (field-specific filters versus common filters) and flags that summaries are optional, but it supplies no syntax, format, or edge-case detail beyond what the schema states.

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 concrete verb and resource ("Search PubMed") and states what comes back (PMIDs and optional brief summaries). It enumerates the filter families it covers. It stops short of naming or contrasting any sibling such as pubmed_europepmc_search, so an agent must infer that this is the native PubMed index rather than the Europe PMC path.

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: it says it supports date ranges, filters, and offset paging, which signals "use me for filtered literature retrieval," but it gives no explicit when-to-use versus when-not, and no routing to pubmed_europepmc_search or pubmed_fetch_articles. The one operational hint, paging via offset, is generic rather than a selection rule.

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