@cyanheads/pubmed-mcp-server 2.10.12 → 2.10.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/AGENTS.md +39 -20
  2. package/CLAUDE.md +39 -20
  3. package/README.md +89 -121
  4. package/changelog/2.0.x/2.0.0.md +32 -0
  5. package/changelog/2.0.x/2.0.1.md +32 -0
  6. package/changelog/2.1.x/2.1.0.md +17 -0
  7. package/changelog/2.1.x/2.1.1.md +29 -0
  8. package/changelog/2.1.x/2.1.2.md +18 -0
  9. package/changelog/2.1.x/2.1.3.md +10 -0
  10. package/changelog/2.1.x/2.1.4.md +12 -0
  11. package/changelog/2.1.x/2.1.5.md +18 -0
  12. package/changelog/2.1.x/2.1.6.md +15 -0
  13. package/changelog/2.10.x/2.10.0.md +17 -0
  14. package/changelog/2.10.x/2.10.1.md +14 -0
  15. package/changelog/2.10.x/2.10.10.md +22 -0
  16. package/changelog/2.10.x/2.10.11.md +21 -0
  17. package/changelog/2.10.x/2.10.12.md +14 -0
  18. package/changelog/2.10.x/2.10.13.md +28 -0
  19. package/changelog/2.10.x/2.10.14.md +28 -0
  20. package/changelog/2.10.x/2.10.2.md +13 -0
  21. package/changelog/2.10.x/2.10.3.md +26 -0
  22. package/changelog/2.10.x/2.10.4.md +11 -0
  23. package/changelog/2.10.x/2.10.5.md +31 -0
  24. package/changelog/2.10.x/2.10.6.md +30 -0
  25. package/changelog/2.10.x/2.10.7.md +17 -0
  26. package/changelog/2.10.x/2.10.8.md +22 -0
  27. package/changelog/2.10.x/2.10.9.md +15 -0
  28. package/changelog/2.2.x/2.2.0.md +67 -0
  29. package/changelog/2.2.x/2.2.1.md +10 -0
  30. package/changelog/2.2.x/2.2.2.md +20 -0
  31. package/changelog/2.2.x/2.2.3.md +17 -0
  32. package/changelog/2.2.x/2.2.4.md +34 -0
  33. package/changelog/2.2.x/2.2.5.md +10 -0
  34. package/changelog/2.2.x/2.2.6.md +17 -0
  35. package/changelog/2.3.x/2.3.0.md +27 -0
  36. package/changelog/2.3.x/2.3.1.md +15 -0
  37. package/changelog/2.3.x/2.3.10.md +20 -0
  38. package/changelog/2.3.x/2.3.11.md +21 -0
  39. package/changelog/2.3.x/2.3.2.md +27 -0
  40. package/changelog/2.3.x/2.3.3.md +38 -0
  41. package/changelog/2.3.x/2.3.4.md +21 -0
  42. package/changelog/2.3.x/2.3.5.md +24 -0
  43. package/changelog/2.3.x/2.3.6.md +26 -0
  44. package/changelog/2.3.x/2.3.7.md +31 -0
  45. package/changelog/2.3.x/2.3.8.md +19 -0
  46. package/changelog/2.3.x/2.3.9.md +22 -0
  47. package/changelog/2.4.x/2.4.0.md +34 -0
  48. package/changelog/2.4.x/2.4.1.md +32 -0
  49. package/changelog/2.5.x/2.5.0.md +35 -0
  50. package/changelog/2.5.x/2.5.1.md +32 -0
  51. package/changelog/2.5.x/2.5.2.md +23 -0
  52. package/changelog/2.5.x/2.5.3.md +22 -0
  53. package/changelog/2.5.x/2.5.5.md +52 -0
  54. package/changelog/2.5.x/2.5.6.md +33 -0
  55. package/changelog/2.6.x/2.6.0.md +32 -0
  56. package/changelog/2.6.x/2.6.1.md +26 -0
  57. package/changelog/2.6.x/2.6.10.md +16 -0
  58. package/changelog/2.6.x/2.6.11.md +24 -0
  59. package/changelog/2.6.x/2.6.12.md +29 -0
  60. package/changelog/2.6.x/2.6.2.md +23 -0
  61. package/changelog/2.6.x/2.6.3.md +17 -0
  62. package/changelog/2.6.x/2.6.4.md +21 -0
  63. package/changelog/2.6.x/2.6.5.md +30 -0
  64. package/changelog/2.6.x/2.6.6.md +25 -0
  65. package/changelog/2.6.x/2.6.7.md +37 -0
  66. package/changelog/2.6.x/2.6.8.md +15 -0
  67. package/changelog/2.6.x/2.6.9.md +36 -0
  68. package/changelog/2.7.x/2.7.0.md +41 -0
  69. package/changelog/2.7.x/2.7.1.md +21 -0
  70. package/changelog/2.7.x/2.7.10.md +13 -0
  71. package/changelog/2.7.x/2.7.11.md +15 -0
  72. package/changelog/2.7.x/2.7.2.md +22 -0
  73. package/changelog/2.7.x/2.7.3.md +18 -0
  74. package/changelog/2.7.x/2.7.4.md +15 -0
  75. package/changelog/2.7.x/2.7.5.md +34 -0
  76. package/changelog/2.7.x/2.7.6.md +14 -0
  77. package/changelog/2.7.x/2.7.7.md +14 -0
  78. package/changelog/2.7.x/2.7.8.md +18 -0
  79. package/changelog/2.7.x/2.7.9.md +16 -0
  80. package/changelog/2.8.x/2.8.0.md +23 -0
  81. package/changelog/2.9.x/2.9.0.md +21 -0
  82. package/changelog/2.9.x/2.9.1.md +12 -0
  83. package/changelog/2.9.x/2.9.10.md +15 -0
  84. package/changelog/2.9.x/2.9.2.md +21 -0
  85. package/changelog/2.9.x/2.9.3.md +11 -0
  86. package/changelog/2.9.x/2.9.4.md +24 -0
  87. package/changelog/2.9.x/2.9.5.md +20 -0
  88. package/changelog/2.9.x/2.9.6.md +22 -0
  89. package/changelog/2.9.x/2.9.7.md +26 -0
  90. package/changelog/2.9.x/2.9.8.md +15 -0
  91. package/changelog/2.9.x/2.9.9.md +35 -0
  92. package/changelog/template.md +151 -0
  93. package/dist/config/server-config.d.ts +4 -4
  94. package/dist/config/server-config.d.ts.map +1 -1
  95. package/dist/config/server-config.js +9 -24
  96. package/dist/config/server-config.js.map +1 -1
  97. package/dist/index.js +1 -0
  98. package/dist/index.js.map +1 -1
  99. package/dist/services/europe-pmc/europe-pmc-service.d.ts.map +1 -1
  100. package/dist/services/europe-pmc/europe-pmc-service.js +3 -10
  101. package/dist/services/europe-pmc/europe-pmc-service.js.map +1 -1
  102. package/dist/services/ncbi/ncbi-service.d.ts +0 -2
  103. package/dist/services/ncbi/ncbi-service.d.ts.map +1 -1
  104. package/dist/services/ncbi/ncbi-service.js +9 -13
  105. package/dist/services/ncbi/ncbi-service.js.map +1 -1
  106. package/dist/services/ncbi/response-handler.d.ts +9 -0
  107. package/dist/services/ncbi/response-handler.d.ts.map +1 -1
  108. package/dist/services/ncbi/response-handler.js +33 -1
  109. package/dist/services/ncbi/response-handler.js.map +1 -1
  110. package/dist/services/openalex/openalex-service.d.ts.map +1 -1
  111. package/dist/services/openalex/openalex-service.js +3 -10
  112. package/dist/services/openalex/openalex-service.js.map +1 -1
  113. package/package.json +23 -12
  114. package/server.json +3 -3
  115. package/dist/services/retry-policy.d.ts +0 -18
  116. package/dist/services/retry-policy.d.ts.map +0 -1
  117. package/dist/services/retry-policy.js +0 -21
  118. package/dist/services/retry-policy.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ ---
2
+ summary: "find_related: offset pagination, multi-source provider fallback (NCBI → EuropePMC → OpenAlex); europepmc_search: date-sort advisory for PPR-only results"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.0 — 2026-06-09
8
+
9
+ ## Added
10
+
11
+ - **`pubmed_find_related`**: `offset` input parameter (0-based, default 0) enables paging past the first result window — mirrors `pubmed_search_articles` semantics ([#36](https://github.com/cyanheads/pubmed-mcp-server/issues/36)).
12
+ - **`pubmed_find_related`**: `format()` header now emits `**Returned:** N | **Offset:** Z` alongside the existing `**Relationship:**` line, matching `search_articles` header parity ([#36](https://github.com/cyanheads/pubmed-mcp-server/issues/36)).
13
+ - **`pubmed_find_related`**: multi-source provider fallback — NCBI eLink (primary) → Europe PMC → OpenAlex; first success wins, no merging ([#63](https://github.com/cyanheads/pubmed-mcp-server/issues/63)).
14
+ - `similar`: NCBI `pubmed_pubmed` → OpenAlex `related_works`.
15
+ - `cited_by`: NCBI `citedin` → Europe PMC `/MED/{pmid}/citations` → OpenAlex `cites:`.
16
+ - `references`: NCBI `refs` (PMC-indexed only) → Europe PMC `/MED/{pmid}/references` → OpenAlex `referenced_works`. Supersedes the notice-only mitigation for non-PMC sources — actual coverage now served by EPMC/OpenAlex when NCBI has no PMC-indexed reference list.
17
+ - Provenance surfaced in `enrichment.source` (`"ncbi"` | `"europepmc"` | `"openalex"`); a notice is appended to `enrichment` only when a non-primary provider answered.
18
+ - Records without a PMID are dropped, never minted.
19
+ - **`src/services/openalex/`**: new OpenAlex API client — PMID→OA ID resolve, `related_works`/`referenced_works` batch PMID round-trip, `cites:` filter for `cited_by` ([#63](https://github.com/cyanheads/pubmed-mcp-server/issues/63)).
20
+ - **`src/services/europe-pmc/`**: `citations(pmid, options)` and `references(pmid, options)` methods added to the existing Europe PMC integration ([#63](https://github.com/cyanheads/pubmed-mcp-server/issues/63)).
21
+ - **`pubmed_europepmc_search`**: advisory notice via `ctx.enrich.notice()` when `sort` targets a date field (e.g. `P_PDATE_D`) and the effective sources are preprint-only (`PPR`) — EPMC accepts but silently ignores date sort on PPR records; notice names `firstPublicationDate` as the populated field available for page-local client-side sorting ([#67](https://github.com/cyanheads/pubmed-mcp-server/issues/67)).
@@ -0,0 +1,12 @@
1
+ ---
2
+ summary: "fix(fetch_fulltext): element-citation references now delimited; PMC page/bibliographic tokens preserved verbatim"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.1 — 2026-06-09
8
+
9
+ ## Fixed
10
+
11
+ - **`pubmed_fetch_fulltext`** (`includeReferences: true`): structured `<element-citation>` references now render field-by-field with separators — author names joined with `, `, typed `<pub-id>` nodes labeled (`PMID`, `DOI`, `PMCID`), fields separated by spaces. `<mixed-citation>` rendering is unchanged. ([#69](https://github.com/cyanheads/pubmed-mcp-server/issues/69))
12
+ - **`pubmed_fetch_fulltext`**: PMC JATS ordered parser (`orderedXmlParser`) now runs with `parseTagValue: false` — page tokens like `4002.e26` are preserved verbatim instead of being coerced to `4.002e+29`; zero-padded values retain their leading zeros. The regular parser (esearch/esummary numeric counts) is untouched. ([#69](https://github.com/cyanheads/pubmed-mcp-server/issues/69))
@@ -0,0 +1,15 @@
1
+ ---
2
+ summary: "pubmed_fetch_fulltext: EPMC/PMCID query builders fixed, front-matter-only records fall through the retrieval chain instead of being dropped, pmcids input reaches Unpaywall via a resolved DOI, and Unpaywall articles carry a pmcId backlink. Dead 404-handling branches removed from the Europe PMC and OpenAlex clients."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.10 — 2026-07-26
8
+
9
+ ## Fixed
10
+
11
+ - **`pubmed_europepmc_search` / `pubmed_fetch_fulltext` EPMC query builders** — `EXT_ID:"<pmid>" AND SRC:MED` and `PMCID:"PMC<digits>" AND SRC:PMC` matched zero records: Europe PMC requires identifier tokens combined with `AND SRC:` to be unquoted, and the canonical record for a PMCID lookup has `source: MED`, so `SRC:PMC` excluded the very record being sought. Query builders now emit `EXT_ID:<pmid> AND SRC:MED` and `PMCID:<PMC<digits>>` (the `SRC:PMC` filter dropped); `pubmed_europepmc_search`'s `query` `.describe()` updated to match. ([#85](https://github.com/cyanheads/pubmed-mcp-server/issues/85))
12
+ - **`pubmed_fetch_fulltext` front-matter-only PMC/EPMC records** — a PMC article with front matter and abstract but no `<body>` (publishers that block full-text XML download still return a populated `<front>`) was previously demoted like any other retrieved article. It's now detected pre-filter and routed through the fallback chain like a miss, so a later tier can still recover it. New `no-body` member on the `UnavailableReasonSchema` and `TierOutcomeSchema` output enums, plus an `enrichment.notice` naming the affected id(s) when no tier recovers a copy. ([#86](https://github.com/cyanheads/pubmed-mcp-server/issues/86))
13
+ - **`pubmed_fetch_fulltext` `pmcids` input skipped Unpaywall entirely** — PMC/EPMC misses on `pmcids` input never reached the Unpaywall fallback tier because the DOI needed to query it was never resolved. Now threads the DOI from the Europe PMC hit (when present) or the NCBI ID Converter through to Unpaywall. ([#88](https://github.com/cyanheads/pubmed-mcp-server/issues/88))
14
+ - **Unpaywall articles from `pmcids` input lacked a PMCID backlink** — `UnpaywallArticleSchema` gains an optional `pmcId` field so a batch's `articles[]` and `unavailable[]` key on the same identifier for `pmcids` input; `format()`'s heading and metadata block now surface the PMCID when present. ([#92](https://github.com/cyanheads/pubmed-mcp-server/issues/92))
15
+ - **Europe PMC / OpenAlex 404 handling** — `fetchWithTimeout` throws a status-mapped `McpError` for any non-2xx response rather than returning the failing `Response`, so the `response.status === 404` / `!response.ok` branches in `src/services/europe-pmc/api-client.ts` and `src/services/openalex/api-client.ts` (plus four sibling methods) were unreachable; a genuine 404 was rethrown as a generic error and surfaced as `service-error` instead of the documented `no-fulltext`/`null` outcome. Converted to catch-block classification on `error.code`, and corrected the test mocks that had resolved with a non-2xx `Response`. ([#90](https://github.com/cyanheads/pubmed-mcp-server/issues/90))
@@ -0,0 +1,21 @@
1
+ ---
2
+ summary: "mcp-ts-core ^0.10.5: ctx.enrich.total(), z.stringbool(), server identity fields; totalCount enrichment rename; .mcpbignore anchored"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.2 — 2026-06-11
8
+
9
+ ## Changed
10
+
11
+ - **`totalFound` enrichment key renamed to `totalCount`** across `pubmed_search_articles`, `pubmed_find_related`, `pubmed_lookup_mesh`, and `pubmed_europepmc_search`. Pagination overshoot notices updated to reference `totalCount`. This key appears in `structuredContent` enrichment blocks and is consumed by agents reading result-set metadata.
12
+ - **`PUBMED_EUROPEPMC_ENABLED` now uses `z.stringbool()` semantics.** Accepts `true/false/1/0/yes/no/on/off` (case-insensitive); `yes` and `on` now parse truthy. Unrecognized values fail at startup instead of silently coercing to `false`. Previously only `true`/`1` were truthy.
13
+ - **Server identity fields added to `createApp()`**: `name`, `title`, `websiteUrl`, and `description` are now set, surfaced in the `initialize` response and `/.well-known/mcp.json`.
14
+ - **`.mcpbignore` dev-dir patterns anchored to root**: `/.claude/`, `/.agents/`, `/skills/` now use leading `/` so they cannot strip nested `node_modules` runtime paths.
15
+ - **`ctx.enrich.total()` migration**: enrichment total counts are now set via the framework's `ctx.enrich.total()` helper rather than as inline `totalFound` fields in the `ctx.enrich()` call.
16
+
17
+ ## Dependencies
18
+
19
+ - `@cyanheads/mcp-ts-core` ^0.9.21 → ^0.10.5
20
+ - `sanitize-html` ^2.17.4 → ^2.17.5
21
+ - `@types/node` ^25.9.2 → ^25.9.3
@@ -0,0 +1,11 @@
1
+ ---
2
+ summary: "serverInfo title corrected to machine name pubmed-mcp-server"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.3 — 2026-06-11
8
+
9
+ ## Fixed
10
+
11
+ - **`createApp()` `title`** corrected to `pubmed-mcp-server` (was the Title Case display string `'PubMed MCP Server'` introduced in 2.9.2). MCP clients display `serverInfo.title` in their UI — this aligns the displayed name with the machine name convention.
@@ -0,0 +1,24 @@
1
+ ---
2
+ summary: "mcp-ts-core ^0.10.6: post-pack bundle cleaner, packaging identity checks; lint-packaging checks 8–9 synced; orchestrations skill v1.3"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.4 — 2026-06-11
8
+
9
+ ## Changed
10
+
11
+ - **`src/index.ts`** — removed `websiteUrl` and `description` from `createApp()` options; canonical source is `package.json` (framework derives description from it); identity pair `name`/`title` both set to `'pubmed-mcp-server'`.
12
+ - **`scripts/lint-packaging.ts`** — synced from mcp-ts-core 0.10.6 template: adds check 8 (post-bundle content guard: flags `node_modules/**` agent-doc entries in built `.mcpb`) and check 9 (entrypoint identity: `name`/`title` in `createApp()` / `createWorkerHandler()` and `manifest.json` `display_name` must equal the unscoped package name). `checkBundleContent` refactored to accept raw content string; `KNOWN_DEV_DIRS` / `CRITICAL_RUNTIME_PATHS` / `AGENT_DOC_ENTRY` exported for unit testing.
13
+ - **`package.json` `bundle` script** — appended `&& bun run scripts/clean-mcpb.ts dist/pubmed-mcp-server.mcpb` after `mcpb pack`; strips dependency-shipped agent docs from the bundle.
14
+ - **`skills/orchestrations` v1.3** — Phase 4 close-loop wording: one what-landed comment per shipped issue, then a bare close; bare "Fixed in v\<version\>" trailer replaced.
15
+ - **`skills/polish-docs-meta` v2.7** — adds `name`/`title` identity requirement and updated `bundle` description.
16
+ - **`CLAUDE.md` / `AGENTS.md`** — framework version `^0.10.5 → ^0.10.6`; identity example corrected; `bundle` description updated.
17
+
18
+ ## Added
19
+
20
+ - **`scripts/clean-mcpb.ts`** — post-pack bundle cleaner: runs `mcpb clean`, then strips `node_modules/**` agent-doc entries (`skills/`, `.claude/`, `.agents/` trees and `SKILL.md` files) that root-anchored `.mcpbignore` patterns cannot reach. Wired into the `bundle` script. (mcp-ts-core [#230](https://github.com/cyanheads/mcp-ts-core/issues/230))
21
+
22
+ ## Dependencies
23
+
24
+ - `@cyanheads/mcp-ts-core` ^0.10.5 → ^0.10.6
@@ -0,0 +1,20 @@
1
+ ---
2
+ summary: "Fixes: transient NCBI eutils 500s now reclassify to ServiceUnavailable and retry; pubmed_lookup_mesh returns the canonical MeSH DescriptorUI with a new entrezUid field"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.5 — 2026-06-13
8
+
9
+ ## Fixed
10
+
11
+ - **`NcbiApiClient` eutils 500 retry** — `getRequest`/`postRequest` now issue plain `fetch` (via a shared `buildTimeoutSignal` helper) instead of `fetchWithTimeout`, which threw on any non-2xx before the status could be read. The `if (!response.ok)` reclassification in `makeRequest` is now reachable, so NCBI's transient HTTP 500s map to `ServiceUnavailable` and are retried by `NcbiService.withRetry`; HTTP 501 stays `InternalError` (not transient). ([#70](https://github.com/cyanheads/pubmed-mcp-server/issues/70))
12
+ - **`pubmed_lookup_mesh` `meshId`** — now returns the canonical MeSH DescriptorUI (e.g. `D003924`) instead of NCBI's Entrez UID. `decodeMeshDescriptorUi` maps the 8-digit UID's two-digit prefix to its letter (`67→C`, `68→D`, `81→Q`); non-decodable UIDs (e.g. 7-digit supplementary-concept IDs) fall back to the raw value. ([#71](https://github.com/cyanheads/pubmed-mcp-server/issues/71))
13
+
14
+ ## Added
15
+
16
+ - **`pubmed_lookup_mesh` `entrezUid`** — new output field carrying the raw NCBI Entrez UID, the join key for E-utilities (`eSummary`/`eFetch` `db=mesh`); rendered in `format()` as **Entrez UID**. ([#71](https://github.com/cyanheads/pubmed-mcp-server/issues/71))
17
+
18
+ ## Dependencies
19
+
20
+ - `@biomejs/biome` ^2.4.16 → ^2.5.0
@@ -0,0 +1,22 @@
1
+ ---
2
+ summary: "Output cleanups: convert_ids accepts mixed PMC/bare-digit batches; europepmc_search and fetch_articles strip leaked markup and decode entities; europepmc_search splits its silent-rejection diagnosis from its recovery hint; lookup_mesh drops non-navigable SCR tree pointers"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.6 — 2026-06-18
8
+
9
+ ## Fixed
10
+
11
+ - **`pubmed_convert_ids` mixed PMCID batches** — `NcbiService.idConvert` now canonicalizes bare-digit PMCIDs to `PMC`+digits before the PMC ID Converter call, so a batch mixing `PMC3531190` and `3531190` resolves like a homogeneous one instead of being rejected wholesale (HTTP 400). The `pmcid` format hint (both `ID_CONVERT_FORMAT_HINTS` and the tool's `ids` `.describe()`) now states bare digits are accepted. ([#73](https://github.com/cyanheads/pubmed-mcp-server/issues/73))
12
+ - **`pubmed_europepmc_search` `abstractSnippet`** — normalized to display-ready plain text via a new `toDisplayText` helper: strips structural JATS/HTML tags, decodes HTML entities, and removes soft hyphens (U+00AD) before truncation, so the snippet budget holds text rather than markup and stray soft hyphens don't corrupt token matching. ([#74](https://github.com/cyanheads/pubmed-mcp-server/issues/74))
13
+ - **`pubmed_fetch_articles` `grantList`** — `extractGrants` now decodes the residual `&amp;` that NCBI's double-encoding leaves after the XML parser's single decode pass, so `grantId`/`acronym`/`agency`/`country` surface as `CSR&D` rather than `CSR&amp;D`. ([#74](https://github.com/cyanheads/pubmed-mcp-server/issues/74))
14
+ - **`pubmed_europepmc_search` silent-rejection error** — the version-only-envelope throw now passes a distinct diagnosis as the message and an actionable next step as `recovery.hint`, instead of the same string for both. Previously the framework rendered byte-identical `Error:`/`Recovery:` blocks. ([#75](https://github.com/cyanheads/pubmed-mcp-server/issues/75))
15
+ - **`pubmed_lookup_mesh` `treeNumbers`** — `extractTreeNumbers` now drops `@`-prefixed values, which supplementary concept records (SCRs) surface in the `TreeNum` field as non-navigable mapped-heading pointers (e.g. `@218176`). `treeNumbers` now holds only real tree numbers and is omitted for SCRs; its `.describe()` documents this. ([#76](https://github.com/cyanheads/pubmed-mcp-server/issues/76))
16
+
17
+ ## Dependencies
18
+
19
+ - `defuddle` ^0.18.1 → ^0.19.0
20
+ - `fast-xml-parser` ^5.8.0 → ^5.9.2
21
+ - `vitest` ^4.1.8 → ^4.1.9
22
+ - `@vitest/coverage-istanbul` ^4.1.8 → ^4.1.9
@@ -0,0 +1,26 @@
1
+ ---
2
+ summary: "Adopt mcp-ts-core 0.10.9: devcheck gains a Dependency Specifiers guard (floating latest/*/dist-tags) and plugin-manifest checks in lint:packaging; fresh-scaffold git guards; 14 skills re-synced; dependency refresh"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.7 — 2026-06-20
8
+
9
+ ## Added
10
+
11
+ - **`Dependency Specifiers` devcheck step** — new `scripts/check-dependency-specifiers.ts` (flag `--no-dep-specifiers`) hard-fails on floating specifiers (`latest`, `*`, `next`/`beta`/`canary`/`rc`) in `package.json`'s dependency sections and `bun.lock`'s `workspaces` map, catching the case where `bun update --latest` writes a literal `latest` dist-tag into the lock and lets the next `bun install` re-resolve past the manifest range. Static and local — runs in the default and `--fast` passes. ([mcp-ts-core#246](https://github.com/cyanheads/mcp-ts-core/issues/246))
12
+ - **Plugin marketplace manifest checks in `lint:packaging`** — `scripts/lint-packaging.ts` check 10 validates `.claude-plugin/plugin.json`, `.codex-plugin/plugin.json`, and `.codex-plugin/mcp.json`: non-empty descriptions, display fields carrying the unscoped machine name, and the `npx -y` install arg carrying the full scoped package name. Gated by the new `devcheck.config.json` `packaging.pluginManifests` flag (default on; set here). ([mcp-ts-core#240](https://github.com/cyanheads/mcp-ts-core/issues/240))
13
+
14
+ ## Changed
15
+
16
+ - **14 `skills/<name>/SKILL.md` re-synced** from mcp-ts-core 0.10.7–0.10.9 — `metadata.version` bumps and body drift: `add-tool` 2.14→2.15, `api-auth` 1.1→1.2, `api-canvas` 1.6→1.7, `api-config` 1.7→1.8, `api-context` 1.8→1.9, `api-errors` 1.6→1.7, `api-services` 1.3→1.4, `api-telemetry` 1.0→1.2, `field-test` 2.5→2.6, `git-wrapup` 1.2→1.4, `orchestrations` 1.3→1.4, `polish-docs-meta` 2.7→2.9, `report-issue-local` 1.5→1.6, `tool-defs-analysis` 1.2→1.3.
17
+
18
+ ## Fixed
19
+
20
+ - **Fresh-scaffold devcheck guards** — `devcheck.ts` (TODOs/FIXMEs, Tracked Secrets, Framework Antipatterns), `check-framework-antipatterns.ts`, and `build-changelog.ts --check` now skip cleanly when `.git` is absent, and `check-skill-versions.ts` skips a `SKILL.md` deleted from the worktree, instead of exiting 128 / crashing with ENOENT. ([mcp-ts-core#242](https://github.com/cyanheads/mcp-ts-core/issues/242), [#243](https://github.com/cyanheads/mcp-ts-core/issues/243), [#237](https://github.com/cyanheads/mcp-ts-core/issues/237))
21
+
22
+ ## Dependencies
23
+
24
+ - `@cyanheads/mcp-ts-core` ^0.10.6 → ^0.10.9
25
+ - `fast-xml-parser` ^5.9.2 → ^5.9.3
26
+ - `@types/node` ^25.9.3 → ^26.0.0
@@ -0,0 +1,15 @@
1
+ ---
2
+ summary: "pubmed_fetch_fulltext surfaces a recovery notice when a sections filter removes every body section from an article that had one — naming the requested terms and affected article ids, still returning the article; detected on both the PMC and Europe PMC paths. Adopts mcp-ts-core 0.10.10."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.8 — 2026-06-30
8
+
9
+ ## Added
10
+
11
+ - **`pubmed_fetch_fulltext` section-filter-miss notice** — when a `sections` filter removes every body section from an article that had sections upstream, the tool surfaces a recovery notice via a new `enrichment.notice` block (emitted through `ctx.enrich.notice`) instead of silently returning an empty body. The notice names the requested section terms and the affected article id(s), distinguishes a filtered-empty body from one absent upstream, and suggests retrying without `sections` or filtering on broader headings (Introduction, Methods, Results, Discussion). The article is still returned with its empty body — not an error — and the miss is detected on both the PMC EFetch and Europe PMC paths. ([#80](https://github.com/cyanheads/pubmed-mcp-server/issues/80))
12
+
13
+ ## Dependencies
14
+
15
+ - `@cyanheads/mcp-ts-core` ^0.10.9 → ^0.10.10 (framework js-yaml v4→v5 migration and biome 2.5.1; no consumer change — this server installs no js-yaml directly)
@@ -0,0 +1,35 @@
1
+ ---
2
+ summary: "pubmed_lookup_mesh gets true upstream totalCount plus offset/nextOffset pagination; pubmed_lookup_citation stops false-flagging authors ranked 4th or later; pubmed_spell_check threads ctx.signal into ESpell. Adopts mcp-ts-core 0.11.0."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 2.9.9 — 2026-07-26
8
+
9
+ ## Added
10
+
11
+ - **`pubmed_lookup_mesh` offset pagination** — new `offset` input (default `0`) and `nextOffset` output let callers page past the `maxResults` cap; `nextOffset` is omitted on the last page as the end-of-results signal. ([#84](https://github.com/cyanheads/pubmed-mcp-server/issues/84))
12
+
13
+ ## Changed
14
+
15
+ - **`pubmed_lookup_mesh` `totalCount`** now reports the true upstream match count from `eSearch`'s `count` field instead of the number of records returned on the page. ([#82](https://github.com/cyanheads/pubmed-mcp-server/issues/82))
16
+
17
+ ## Fixed
18
+
19
+ - **`pubmed_lookup_mesh` pinned exact-match double-serve** — the exact-descriptor match is now held back on every page it ranks into, not just the first; a page consisting solely of the already-served pinned match returns an explanatory `enrichment.notice` instead of an empty or duplicated result. ([#91](https://github.com/cyanheads/pubmed-mcp-server/issues/91))
20
+ - **`pubmed_lookup_citation` false `author_mismatch` warning** — the mismatch check now verifies the queried author against the full author roster (`authorNames`) instead of the `authors` display string, which truncates to three names plus "et al." and was flagging genuine fourth-or-later authors as mismatches. `ESummaryDocumentSummary` parsing and `ParsedBriefSummary` gain an `authorNames: string[]` field alongside the existing `authors` display string. ([#87](https://github.com/cyanheads/pubmed-mcp-server/issues/87))
21
+ - **`pubmed_spell_check` dropped `ctx.signal`** — the handler now passes `{ signal: ctx.signal }` into `eSpell`, so request cancellation reaches the NCBI ESpell call. Also fixes a stale `pubmed_spell` log message to `pubmed_spell_check`. ([#89](https://github.com/cyanheads/pubmed-mcp-server/issues/89))
22
+ - **`pubmed_format_citations` description** — replaced "styles"/"style" with "formats"/"format" for accuracy.
23
+ - **Noisy error-path telemetry on expected 404s** — `expectedStatuses` added to the `fetchWithTimeout` call sites in `src/services/europe-pmc/api-client.ts` (404), `src/services/openalex/api-client.ts` (404), and `src/services/unpaywall/unpaywall-service.ts` (404, 422), so upstream responses these services already treat as expected "not found" outcomes no longer classify as errors.
24
+
25
+ ## Dependencies
26
+
27
+ - `@cyanheads/mcp-ts-core` ^0.10.10 → ^0.11.0
28
+ - `typescript` ^6.0.3 → ^7.0.2
29
+ - `bun` (packageManager) 1.3.2 → 1.3.14; `engines.bun` floor relaxed `>=1.3.2` → `>=1.3.0`
30
+ - `@biomejs/biome` ^2.5.0 → ^2.5.5, `@types/node` ^26.0.0 → ^26.1.1, `@vitest/coverage-istanbul`/`vitest` ^4.1.9 → ^4.1.10, `fast-check` ^4.8.0 → ^4.9.0, `ignore` ^7.0.5 → ^7.0.6, `tsc-alias` ^1.8.17 → ^1.9.1
31
+ - `defuddle` ^0.19.0 → ^0.19.2, `fast-xml-parser` ^5.9.3 → ^5.10.1, `linkedom` ^0.18.12 → ^0.18.13, `sanitize-html` ^2.17.5 → ^2.17.6
32
+ - Added `@socketsecurity/bun-security-scanner` ^1.1.2 as a dev dependency, wired as the `bunfig.toml` `[install.security]` scanner and a `devcheck.config.json` known-dep entry
33
+ - New `package.json` `overrides` block pins nested transitive copies: `@hono/node-server` ^2.0.11, `brace-expansion` ^2.1.2, `fast-uri` ^3.1.4, `postcss` ^8.5.22
34
+ - `Dockerfile` — `oven/bun:1.3` → `oven/bun:1.3.14` (build and production stages), `bun install` steps gain `--ignore-scripts` and a BuildKit cache mount on `/root/.bun/install/cache`
35
+ - `bunfig.toml` — `install.minimumReleaseAge` set to 259200s (3 days), excluding `@cyanheads/mcp-ts-core`
@@ -0,0 +1,151 @@
1
+ ---
2
+ # FORMAT REFERENCE — do not edit. Copy this file to
3
+ # `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.8.x/0.8.6.md`)
4
+ # to author a new release. Set that file's H1 to `# <version> — YYYY-MM-DD`
5
+ # with a concrete date.
6
+
7
+ # Required. One-line GitHub Release-style headline. 350 character cap — a
8
+ # ceiling, not a target. Default short and scannable. Don't pad, don't stitch
9
+ # unrelated changes with commas/semicolons into an inventory — pick the one
10
+ # headline the release is about. Quotes required: unquoted YAML treats
11
+ # `: ` inside the value as a key separator and fails GitHub's strict parser.
12
+ summary: ""
13
+
14
+ # Set `true` when consumers must change code to upgrade: API removals,
15
+ # signature changes, config renames, behavior changes that break existing
16
+ # usage. Flagged as `Breaking` in the rollup.
17
+ breaking: false
18
+
19
+ # Set `true` ONLY for a security fix in THIS project's own source code — a
20
+ # vulnerability or hardening in code you ship. A dependency or transitive CVE
21
+ # bump is routine maintenance, NOT a security release: record it under
22
+ # `## Dependencies` (with the advisory ID) and leave this `false`. When true,
23
+ # pairs with the `## Security` section below and flags `Security` in the rollup.
24
+ security: false
25
+
26
+ # Optional free-form notes for maintenance agents processing this release.
27
+ # Not rendered in CHANGELOG — consumed by agents running `maintenance` on
28
+ # downstream servers. ADOPTION STEPS ONLY — new files to create, fields to
29
+ # populate, one-time migration steps. Never a second rendering of the body:
30
+ # if a body bullet already says it, name the bullet's symbol instead of
31
+ # re-explaining. Omit the field entirely when there's nothing to say.
32
+ # agent-notes: |
33
+ # <instructions for downstream maintenance agents>
34
+ ---
35
+
36
+ # <version> — YYYY-MM-DD
37
+
38
+ <!--
39
+ AUTHORING GUIDE — applies to the new per-version file you create from this
40
+ template.
41
+
42
+ Audience: someone scanning release notes to decide what affects them. Lead
43
+ each bullet with the symbol or concept name in **bold** so they can skip
44
+ what's irrelevant and zoom in on what's not.
45
+
46
+ Tone: terse, fact-dense, not verbose. Bullet shape: **symbol** + what
47
+ changed + at most one consumer-facing caveat. One sentence by default, two
48
+ when the second carries weight — a bullet past ~40 words or three sentences
49
+ is wrong. The depth lives one hop away: the linked issue carries the why,
50
+ the commit diff carries the how. The changelog names what changed and what
51
+ a consumer does about it; a reader who wants mechanism opens the link.
52
+
53
+ Model length on THIS guide, never on the previous entry — entries modeled
54
+ on entries compound.
55
+
56
+ Cut (each has shipped as a wall of text; these are the cruft):
57
+ - History/justification narration — how the bug worked, why the old
58
+ behavior was wrong. One short clause at most; the issue carries the story.
59
+ - Design-rationale defense — "chosen over Y because…", "guarding the
60
+ getter is not enough…". That is the author arguing with a reviewer;
61
+ reviewers read the PR, not the changelog.
62
+ - Defensive unchanged-clauses — "X is unchanged", "byte-identical to
63
+ <prev>". Keep one only where its absence would cause a real misread,
64
+ as a short parenthetical.
65
+ - Edge-case inventories — marker lists, not-flagged lists, escape tables.
66
+ Tests and the issue carry those.
67
+ - Mechanism walkthroughs (JSDoc, CLAUDE.md/AGENTS.md, or the relevant
68
+ skill own those), ceremonial framings ("This release introduces…"),
69
+ backwards-compat paragraphs, file-by-file test enumerations. Prefer
70
+ code/symbol names over English re-explanations.
71
+
72
+ Verified ≠ included: the every-claim-verified-from-the-diff rule bounds
73
+ the TRUTH of what you write, never the AMOUNT.
74
+
75
+ Example — same fact, right size:
76
+
77
+ TOO LONG: **`fetchWithTimeout`'s `timeoutMs` bounds the whole exchange**
78
+ (#341). `fetch` resolves once headers arrive and the deadline was
79
+ cleared as the helper returned, so a peer that answered promptly and
80
+ then stalled the stream held the request open indefinitely. A 2xx
81
+ carrying a body now comes back as a passthrough wrapper that disarms
82
+ the deadline when the body closes, errors, or is cancelled; …
83
+ [+90 more words of mechanism and edge cases]
84
+
85
+ RIGHT: **`fetchWithTimeout`'s `timeoutMs` now bounds the whole
86
+ exchange, not just the headers** (#341). A stalled body aborts with
87
+ the same `Timeout` error; the returned `Response` is a wrapper, so
88
+ identity assertions (`toBe(response)`) no longer hold.
89
+
90
+ Narrative intro: skip by default. Add one short sentence only when the
91
+ release theme genuinely needs framing the bullets can't carry. When many
92
+ bullets share one upgrade consequence, state it ONCE — intro line or
93
+ agent-notes — never per bullet.
94
+
95
+ Sections: Keep a Changelog order — Added, Changed, Deprecated, Removed,
96
+ Fixed, Security. Include only sections with entries; delete the rest
97
+ (including the commented-out scaffolding below). Don't ship empty headers.
98
+
99
+ Include: every distinct fact a reader needs to adopt or audit the release —
100
+ new exports, signatures, lint rule IDs, env vars, breaking changes, version
101
+ bumps on shipped skills. Nothing more.
102
+
103
+ Links: link issues, PRs, docs, or skills where they help a reader jump to
104
+ context. Once per item per entry — don't re-link the same issue in summary,
105
+ narrative, and bullet. Skip links for inline symbol names; code spans speak
106
+ for themselves.
107
+
108
+ Issue/PR URLs: use full URLs. GitHub's bare `#NN` auto-link only resolves
109
+ inside its own UI, not in npm reads or local editors.
110
+
111
+ [#38](https://github.com/cyanheads/mcp-ts-core/issues/38) ← issue
112
+ [#42](https://github.com/cyanheads/mcp-ts-core/pull/42) ← PR
113
+
114
+ Verify numbers exist before linking (`gh issue view NN`, `gh pr view NN`).
115
+ Never speculate on a future number — `#42` for an upcoming PR silently
116
+ resolves to whatever real item already owns 42, and timeline previews pull
117
+ in that unrelated item's metadata.
118
+
119
+ TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
120
+ via `gh release create --notes-from-tag`. It is a condensed digest of this
121
+ entry, never a copy, and its format is owned by the `release-and-publish`
122
+ skill (step 4, "Create the annotated tag"): a short subject line without the
123
+ version, flat headline bullets — no Keep-a-Changelog section headers, no
124
+ gates line — at most one deps line, issue backlinks, and the changelog link
125
+ last. In release-PR mode the `git-wrapup` skill authors those bullets as the
126
+ PR body's `## Changes` and the tag copies them.
127
+ -->
128
+
129
+ ## Added
130
+
131
+ -
132
+
133
+ ## Changed
134
+
135
+ -
136
+
137
+ <!-- ## Deprecated
138
+
139
+ - -->
140
+
141
+ <!-- ## Removed
142
+
143
+ - -->
144
+
145
+ ## Fixed
146
+
147
+ -
148
+
149
+ <!-- ## Security
150
+
151
+ - -->
@@ -6,18 +6,18 @@
6
6
  */
7
7
  import { z } from '@cyanheads/mcp-ts-core';
8
8
  declare const ServerConfigSchema: z.ZodObject<{
9
- apiKey: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
9
+ apiKey: z.ZodOptional<z.ZodString>;
10
10
  toolIdentifier: z.ZodDefault<z.ZodString>;
11
- adminEmail: z.ZodPreprocess<z.ZodOptional<z.ZodEmail>, unknown>;
11
+ adminEmail: z.ZodOptional<z.ZodEmail>;
12
12
  requestDelayMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
13
13
  maxConcurrent: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
14
14
  maxRetries: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
15
15
  timeoutMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
16
16
  totalDeadlineMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
17
- unpaywallEmail: z.ZodPreprocess<z.ZodOptional<z.ZodEmail>, unknown>;
17
+ unpaywallEmail: z.ZodOptional<z.ZodEmail>;
18
18
  unpaywallTimeoutMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
19
19
  europepmcEnabled: z.ZodDefault<z.ZodCodec<z.ZodString, z.ZodBoolean>>;
20
- europepmcEmail: z.ZodPreprocess<z.ZodOptional<z.ZodEmail>, unknown>;
20
+ europepmcEmail: z.ZodOptional<z.ZodEmail>;
21
21
  europepmcRequestDelayMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
22
22
  europepmcMaxRetries: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
23
23
  europepmcTimeoutMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAoB3C,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBA4DtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,wBAAgB,eAAe,IAAI,YAAY,CA8B9C"}
1
+ {"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAG3C,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBA8DtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,wBAAgB,eAAe,IAAI,YAAY,CA+B9C"}
@@ -6,28 +6,10 @@
6
6
  */
7
7
  import { z } from '@cyanheads/mcp-ts-core';
8
8
  import { parseEnvConfig } from '@cyanheads/mcp-ts-core/config';
9
- /**
10
- * Treats an unset env var (`undefined`), a set-but-empty env var (`""`), and
11
- * an unsubstituted MCPB placeholder (`${user_config.X}`) identically. Without
12
- * this, `NCBI_ADMIN_EMAIL=` would fail `z.email()` validation instead of being
13
- * interpreted as "no admin email configured". The placeholder case occurs when
14
- * a Claude Desktop / MCPB host installs the bundle and the user leaves an
15
- * optional `user_config` field blank — the literal `${user_config.X}` string
16
- * is passed through to the process instead of being substituted, which would
17
- * otherwise crash `z.email()` on the next config load.
18
- */
19
- const PLACEHOLDER_PATTERN = /^\$\{[^}]+\}$/;
20
- const emptyAsUndefined = (v) => {
21
- if (v === '')
22
- return;
23
- if (typeof v === 'string' && PLACEHOLDER_PATTERN.test(v))
24
- return;
25
- return v;
26
- };
27
9
  const ServerConfigSchema = z.object({
28
- apiKey: z.preprocess(emptyAsUndefined, z.string().optional()).describe('NCBI API key'),
10
+ apiKey: z.string().optional().describe('NCBI API key'),
29
11
  toolIdentifier: z.string().default('pubmed-mcp-server').describe('NCBI tool identifier'),
30
- adminEmail: z.preprocess(emptyAsUndefined, z.email().optional()).describe('Admin contact email'),
12
+ adminEmail: z.email().optional().describe('Admin contact email'),
31
13
  requestDelayMs: z.coerce.number().min(50).max(5000).default(334).describe('Request delay in ms'),
32
14
  maxConcurrent: z.coerce
33
15
  .number()
@@ -49,7 +31,8 @@ const ServerConfigSchema = z.object({
49
31
  .default(60000)
50
32
  .describe('Total deadline across all retry attempts for one NCBI call, in ms'),
51
33
  unpaywallEmail: z
52
- .preprocess(emptyAsUndefined, z.email().optional())
34
+ .email()
35
+ .optional()
53
36
  .describe('Email for Unpaywall API (enables non-PMC full-text fallback when set)'),
54
37
  unpaywallTimeoutMs: z.coerce
55
38
  .number()
@@ -62,7 +45,8 @@ const ServerConfigSchema = z.object({
62
45
  .default(true)
63
46
  .describe('Enable Europe PMC search tool and `pubmed_fetch_fulltext` JATS fallback chain. Set false to fully disable EPMC calls.'),
64
47
  europepmcEmail: z
65
- .preprocess(emptyAsUndefined, z.email().optional())
48
+ .email()
49
+ .optional()
66
50
  .describe('Optional contact email sent with Europe PMC requests'),
67
51
  europepmcRequestDelayMs: z.coerce
68
52
  .number()
@@ -106,10 +90,11 @@ export function getServerConfig() {
106
90
  /**
107
91
  * An API key raises NCBI's rate ceiling from ~3 req/s to ~10 req/s. If the
108
92
  * operator hasn't explicitly overridden the delay, tighten from the 334ms
109
- * safe default to 100ms when a key is present.
93
+ * safe default to 100ms when a key is present. A set-but-blank delay counts
94
+ * as not overridden, matching how `parseEnvConfig` reads it.
110
95
  */
111
96
  _config =
112
- parsed.apiKey && process.env.NCBI_REQUEST_DELAY_MS === undefined
97
+ parsed.apiKey && !process.env.NCBI_REQUEST_DELAY_MS?.trim()
113
98
  ? { ...parsed, requestDelayMs: 100 }
114
99
  : parsed;
115
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -38,6 +38,7 @@ const tools = [
38
38
  await createApp({
39
39
  name: 'pubmed-mcp-server',
40
40
  title: 'pubmed-mcp-server',
41
+ sessionMode: 'stateless',
41
42
  tools,
42
43
  resources: [databaseInfoResource],
43
44
  prompts: [researchPlanPrompt],
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,8DAA8D,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+DAA+D,CAAC;AACzG,OAAO,EAAE,yBAAyB,EAAE,MAAM,gEAAgE,CAAC;AAC3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;AACjC,MAAM,KAAK,GAAG;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,cAAc;IACd,cAAc;IACd,kBAAkB;IAClB,cAAc;IACd,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;CAC1F,CAAC;AAEF,MAAM,SAAS,CAAC;IACd,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,mBAAmB;IAC1B,KAAK;IACL,SAAS,EAAE,CAAC,oBAAoB,CAAC;IACjC,OAAO,EAAE,CAAC,kBAAkB,CAAC;IAC7B,YAAY,EACV,2vBAA2vB;IAC7vB,OAAO,EAAE;QACP,WAAW,EAAE,KAAK;QAClB,OAAO,EACL,uGAAuG;QACzG,QAAQ,EAAE,gDAAgD;QAC1D,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC7E;gBACE,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,8CAA8C;gBACpD,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,KAAK,EAAE,qBAAqB;gBAC5B,IAAI,EAAE,gDAAgD;gBACtD,QAAQ,EAAE,IAAI;aACf;YACD,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,4BAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC9E;QACD,UAAU,EAAE;YACV,YAAY,EAAE,mBAAmB;YACjC,gBAAgB,EAAE,iBAAiB;YACnC,eAAe,EAAE,iBAAiB;SACnC;KACF;IACD,KAAK;QACH,eAAe,EAAE,CAAC;QAClB,oBAAoB,EAAE,CAAC;QACvB,oBAAoB,EAAE,CAAC;QACvB,mBAAmB,EAAE,CAAC;IACxB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,8DAA8D,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+DAA+D,CAAC;AACzG,OAAO,EAAE,yBAAyB,EAAE,MAAM,gEAAgE,CAAC;AAC3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;AACjC,MAAM,KAAK,GAAG;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,cAAc;IACd,cAAc;IACd,kBAAkB;IAClB,cAAc;IACd,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;CAC1F,CAAC;AAEF,MAAM,SAAS,CAAC;IACd,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,WAAW;IACxB,KAAK;IACL,SAAS,EAAE,CAAC,oBAAoB,CAAC;IACjC,OAAO,EAAE,CAAC,kBAAkB,CAAC;IAC7B,YAAY,EACV,2vBAA2vB;IAC7vB,OAAO,EAAE;QACP,WAAW,EAAE,KAAK;QAClB,OAAO,EACL,uGAAuG;QACzG,QAAQ,EAAE,gDAAgD;QAC1D,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC7E;gBACE,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,8CAA8C;gBACpD,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,KAAK,EAAE,qBAAqB;gBAC5B,IAAI,EAAE,gDAAgD;gBACtD,QAAQ,EAAE,IAAI;aACf;YACD,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,4BAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC9E;QACD,UAAU,EAAE;YACV,YAAY,EAAE,mBAAmB;YACjC,gBAAgB,EAAE,iBAAiB;YACnC,eAAe,EAAE,iBAAiB;SACnC;KACF;IACD,KAAK;QACH,eAAe,EAAE,CAAC;QAClB,oBAAoB,EAAE,CAAC;QACvB,oBAAoB,EAAE,CAAC;QACvB,mBAAmB,EAAE,CAAC;IACxB,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"europe-pmc-service.d.ts","sourceRoot":"","sources":["../../../src/services/europe-pmc/europe-pmc-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,4CAA4C,CAAC;AAGzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EACV,uBAAuB,EAEvB,kBAAkB,EAElB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EAErB,qBAAqB,EACrB,eAAe,EAChB,MAAM,YAAY,CAAC;AAkDpB;;;;;;;;;GASG;AACH,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAY;IAE7C,YACmB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,qBAAqB,EAC5B,UAAU,EAAE,MAAM,EAQpC;IAED;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6F1E;IAED;;;;;;;;;;OAUG;IACG,YAAY,CAChB,IAAI,EAAE,SAAS,kBAAkB,EAAE,EACnC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAQ/B;IAED;;;;;;;OAOG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,uBAAuB,CAAC,CAgBlC;IAED;;;;;;;;;;OAUG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAQjC;IAED;;;;;;;;;;OAUG;IACH,UAAU,CACR,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAQjC;IAED;;;;;OAKG;YACW,iBAAiB;IAsE/B;;;;;;;;OAQG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA8BlD;IAED;;;;OAIG;YACW,SAAS;CAoDxB;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAyB3C;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAElE"}
1
+ {"version":3,"file":"europe-pmc-service.d.ts","sourceRoot":"","sources":["../../../src/services/europe-pmc/europe-pmc-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,4CAA4C,CAAC;AAEzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EACV,uBAAuB,EAEvB,kBAAkB,EAElB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EAErB,qBAAqB,EACrB,eAAe,EAChB,MAAM,YAAY,CAAC;AA2CpB;;;;;;;;;GASG;AACH,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAY;IAE7C,YACmB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,qBAAqB,EAC5B,UAAU,EAAE,MAAM,EAQpC;IAED;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6F1E;IAED;;;;;;;;;;OAUG;IACG,YAAY,CAChB,IAAI,EAAE,SAAS,kBAAkB,EAAE,EACnC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAQ/B;IAED;;;;;;;OAOG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,uBAAuB,CAAC,CAgBlC;IAED;;;;;;;;;;OAUG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAQjC;IAED;;;;;;;;;;OAUG;IACH,UAAU,CACR,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAQjC;IAED;;;;;OAKG;YACW,iBAAiB;IAsE/B;;;;;;;;OAQG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA8BlD;IAED;;;;OAIG;YACW,SAAS;CAoDxB;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAyB3C;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAElE"}
@@ -13,23 +13,16 @@
13
13
  *
14
14
  * @module src/services/europe-pmc/europe-pmc-service
15
15
  */
16
- import { internalError, JsonRpcErrorCode, McpError, serializationError, validationError, } from '@cyanheads/mcp-ts-core/errors';
17
- import { logger, requestContextService } from '@cyanheads/mcp-ts-core/utils';
16
+ import { internalError, McpError, serializationError, validationError, } from '@cyanheads/mcp-ts-core/errors';
17
+ import { defaultIsTransient, logger, requestContextService } from '@cyanheads/mcp-ts-core/utils';
18
18
  // biome-ignore lint/suspicious/noDeprecatedImports: staying on in-tree XMLValidator — see ncbi/response-handler.ts
19
19
  import { XMLParser, XMLValidator } from 'fast-xml-parser';
20
20
  import { getServerConfig } from '../../config/server-config.js';
21
21
  import { recoveryFor } from '../error-contracts.js';
22
22
  import { ORDERED_XML_PARSER_OPTIONS } from '../ncbi/parsing/ordered-xml-parser-options.js';
23
23
  import { ensureArray } from '../ncbi/parsing/xml-helpers.js';
24
- import { isTransient } from '../retry-policy.js';
25
24
  import { EuropePmcApiClient } from './api-client.js';
26
25
  import { EuropePmcRequestQueue } from './request-queue.js';
27
- /** Retryable transient codes — same set NCBI uses. */
28
- const RETRYABLE_CODES = new Set([
29
- JsonRpcErrorCode.ServiceUnavailable,
30
- JsonRpcErrorCode.Timeout,
31
- JsonRpcErrorCode.RateLimited,
32
- ]);
33
26
  const MAX_BACKOFF_MS = 30_000;
34
27
  function abortableSleep(ms, signal) {
35
28
  if (!signal)
@@ -352,7 +345,7 @@ export class EuropePmcService {
352
345
  throw signal.reason;
353
346
  if (!(error instanceof McpError))
354
347
  throw error;
355
- if (!isTransient(error, RETRYABLE_CODES))
348
+ if (!defaultIsTransient(error))
356
349
  throw error;
357
350
  if (attempt < this.maxRetries) {
358
351
  const baseDelay = Math.min(1000 * 2 ** attempt, MAX_BACKOFF_MS);