@djmima/pubmed-mcp 0.0.0-stage → 1.0.0

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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +793 -3
  3. package/dist/auth.d.ts +39 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +97 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/cli/commands.d.ts +42 -0
  8. package/dist/cli/commands.d.ts.map +1 -0
  9. package/dist/cli/commands.js +508 -0
  10. package/dist/cli/commands.js.map +1 -0
  11. package/dist/cli/run.d.ts +21 -0
  12. package/dist/cli/run.d.ts.map +1 -0
  13. package/dist/cli/run.js +154 -0
  14. package/dist/cli/run.js.map +1 -0
  15. package/dist/cli.d.ts +16 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +52 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/index.d.ts +32 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +126 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/pubmed/client.d.ts +150 -0
  24. package/dist/pubmed/client.d.ts.map +1 -0
  25. package/dist/pubmed/client.js +315 -0
  26. package/dist/pubmed/client.js.map +1 -0
  27. package/dist/pubmed/types.d.ts +159 -0
  28. package/dist/pubmed/types.d.ts.map +1 -0
  29. package/dist/pubmed/types.js +11 -0
  30. package/dist/pubmed/types.js.map +1 -0
  31. package/dist/server.d.ts +18 -0
  32. package/dist/server.d.ts.map +1 -0
  33. package/dist/server.js +157 -0
  34. package/dist/server.js.map +1 -0
  35. package/dist/tools/convertArticleIds.d.ts +25 -0
  36. package/dist/tools/convertArticleIds.d.ts.map +1 -0
  37. package/dist/tools/convertArticleIds.js +39 -0
  38. package/dist/tools/convertArticleIds.js.map +1 -0
  39. package/dist/tools/findRelatedArticles.d.ts +30 -0
  40. package/dist/tools/findRelatedArticles.d.ts.map +1 -0
  41. package/dist/tools/findRelatedArticles.js +77 -0
  42. package/dist/tools/findRelatedArticles.js.map +1 -0
  43. package/dist/tools/getArticleMetadata.d.ts +31 -0
  44. package/dist/tools/getArticleMetadata.d.ts.map +1 -0
  45. package/dist/tools/getArticleMetadata.js +72 -0
  46. package/dist/tools/getArticleMetadata.js.map +1 -0
  47. package/dist/tools/getCopyrightStatus.d.ts +25 -0
  48. package/dist/tools/getCopyrightStatus.d.ts.map +1 -0
  49. package/dist/tools/getCopyrightStatus.js +84 -0
  50. package/dist/tools/getCopyrightStatus.js.map +1 -0
  51. package/dist/tools/getFullTextArticle.d.ts +21 -0
  52. package/dist/tools/getFullTextArticle.d.ts.map +1 -0
  53. package/dist/tools/getFullTextArticle.js +89 -0
  54. package/dist/tools/getFullTextArticle.js.map +1 -0
  55. package/dist/tools/lookupArticleByCitation.d.ts +33 -0
  56. package/dist/tools/lookupArticleByCitation.d.ts.map +1 -0
  57. package/dist/tools/lookupArticleByCitation.js +96 -0
  58. package/dist/tools/lookupArticleByCitation.js.map +1 -0
  59. package/dist/tools/searchArticles.d.ts +49 -0
  60. package/dist/tools/searchArticles.d.ts.map +1 -0
  61. package/dist/tools/searchArticles.js +121 -0
  62. package/dist/tools/searchArticles.js.map +1 -0
  63. package/dist/utils/xml.d.ts +37 -0
  64. package/dist/utils/xml.d.ts.map +1 -0
  65. package/dist/utils/xml.js +515 -0
  66. package/dist/utils/xml.js.map +1 -0
  67. package/package.json +72 -4
  68. package/skills/pubmed-cli/SKILL.md +79 -0
@@ -0,0 +1,515 @@
1
+ /**
2
+ * XML parsing utilities for NCBI E-utilities responses.
3
+ *
4
+ * PubMed returns XML by default from efetch.fcgi.
5
+ * PMC full-text articles use the JATS XML format.
6
+ */
7
+ import { XMLParser } from 'fast-xml-parser';
8
+ // Tags that should always be parsed as arrays even when only one element exists
9
+ const ALWAYS_ARRAY_PUBMED = new Set([
10
+ 'PubmedArticle',
11
+ 'PubmedBookArticle',
12
+ 'Author',
13
+ 'ArticleId',
14
+ 'MeshHeading',
15
+ 'Keyword',
16
+ 'PublicationType',
17
+ 'AbstractText',
18
+ 'AffiliationInfo',
19
+ 'OtherAbstract',
20
+ 'ELocationID',
21
+ 'Grant',
22
+ ]);
23
+ const ALWAYS_ARRAY_PMC = new Set([
24
+ 'article',
25
+ 'article-id',
26
+ 'sec',
27
+ 'p',
28
+ 'ref',
29
+ 'fig',
30
+ 'table-wrap',
31
+ 'contrib',
32
+ 'aff',
33
+ 'kwd',
34
+ 'abstract',
35
+ 'list-item',
36
+ ]);
37
+ // PubMed titles and abstracts use mixed-content formatting tags. Unwrapping
38
+ // only these presentation elements preserves their text in sentence order.
39
+ const PUBMED_INLINE_TAGS_TO_UNWRAP = ['b', 'i', 'sup', 'sub', 'u'];
40
+ const PMC_INLINE_TAGS_TO_UNWRAP = [
41
+ 'bold',
42
+ 'italic',
43
+ 'monospace',
44
+ 'overline',
45
+ 'roman',
46
+ 'sans-serif',
47
+ 'sc',
48
+ 'strike',
49
+ 'styled-content',
50
+ 'sub',
51
+ 'sup',
52
+ 'underline',
53
+ 'xref',
54
+ 'ext-link',
55
+ 'uri',
56
+ 'email',
57
+ 'named-content',
58
+ ];
59
+ // EFetch XML can carry characters as numeric character references (≥,
60
+ // é); db=pubmed writes every non-ASCII character that way. They are decoded
61
+ // before parsing rather than through fast-xml-parser's htmlEntities option,
62
+ // which uses String.fromCharCode (garbling code points above U+FFFF) and decodes
63
+ // & before &, turning "&" into "&" instead of "&". CDATA
64
+ // sections and comments are matched only so they can be skipped: references
65
+ // inside them are literal text.
66
+ const CHARACTER_REFERENCE_PATTERN = /<!\[CDATA\[[\s\S]*?\]\]>|<!--[\s\S]*?-->|&#x([0-9a-fA-F]+);|&#([0-9]+);/g;
67
+ // Decoded characters that must stay escaped for the XML to remain well-formed.
68
+ const XML_SPECIAL_CHARACTER_ENTITIES = new Map([
69
+ ['&', '&amp;'],
70
+ ['<', '&lt;'],
71
+ ['>', '&gt;'],
72
+ ['"', '&quot;'],
73
+ ["'", '&apos;'],
74
+ ]);
75
+ // Unicode space separators other than U+0020, such as NBSP (U+00A0), thin space
76
+ // (U+2009) and narrow NBSP (U+202F). trimValues and extractText already treat
77
+ // them as whitespace; as plain spaces they are also collapsed by cleanPmcText.
78
+ const UNICODE_SPACE_PATTERN = /[\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000]/g;
79
+ // ─── PubMed efetch XML parser ─────────────────────────────────────────────────
80
+ const pubmedParser = new XMLParser({
81
+ ignoreAttributes: false,
82
+ attributeNamePrefix: '_',
83
+ textNodeName: '#text',
84
+ parseAttributeValue: false,
85
+ parseTagValue: true,
86
+ trimValues: true,
87
+ isArray: (name) => ALWAYS_ARRAY_PUBMED.has(name),
88
+ });
89
+ // ─── PMC JATS XML parser ──────────────────────────────────────────────────────
90
+ const pmcParser = new XMLParser({
91
+ ignoreAttributes: false,
92
+ attributeNamePrefix: '_',
93
+ textNodeName: '#text',
94
+ parseAttributeValue: false,
95
+ parseTagValue: true,
96
+ trimValues: true,
97
+ isArray: (name) => ALWAYS_ARRAY_PMC.has(name),
98
+ });
99
+ // ─── PubMed XML → ArticleMetadata ─────────────────────────────────────────────
100
+ /**
101
+ * Parse the XML returned by efetch.fcgi (db=pubmed) into ArticleMetadata objects.
102
+ */
103
+ export function parsePubmedEfetchXml(xml) {
104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
105
+ const doc = pubmedParser.parse(normalizePubmedXml(xml));
106
+ const articleSet = doc?.PubmedArticleSet ?? doc;
107
+ const articles = asArray(articleSet?.PubmedArticle);
108
+ return articles.map((articleWrapper) => parsePubmedArticle(articleWrapper));
109
+ }
110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
+ function parsePubmedArticle(wrapper) {
112
+ const citation = wrapper?.MedlineCitation ?? {};
113
+ const article = citation?.Article ?? {};
114
+ const journal = article?.Journal ?? {};
115
+ const journalIssue = journal?.JournalIssue ?? {};
116
+ const pubDate = journalIssue?.PubDate ?? {};
117
+ const pagination = article?.Pagination ?? {};
118
+ const pubmedData = wrapper?.PubmedData ?? {};
119
+ const articleIdList = asArray(pubmedData?.ArticleIdList?.ArticleId);
120
+ // Identifiers
121
+ const identifiers = {
122
+ pmid: String(citation?.PMID?.['#text'] ?? citation?.PMID ?? ''),
123
+ };
124
+ for (const idNode of articleIdList) {
125
+ const idObj = idNode;
126
+ const idType = String(idObj['_IdType'] ?? '');
127
+ const idValue = String(idObj['#text'] ?? idNode ?? '');
128
+ if (idType === 'doi')
129
+ identifiers.doi = idValue;
130
+ else if (idType === 'pii')
131
+ identifiers.pii = idValue;
132
+ else if (idType === 'pmc')
133
+ identifiers.pmcid = idValue;
134
+ }
135
+ // Title
136
+ const title = extractText(article?.ArticleTitle);
137
+ // Abstract
138
+ const abstractNode = article?.Abstract;
139
+ const abstract = parseAbstract(abstractNode);
140
+ // Journal
141
+ const journalInfo = {
142
+ title: extractText(journal?.Title),
143
+ iso_abbreviation: extractText(journal?.ISOAbbreviation),
144
+ };
145
+ // Authors
146
+ const authorList = asArray(article?.AuthorList?.Author);
147
+ const authors = authorList.map(
148
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
149
+ (a) => {
150
+ const affiliations = asArray(a?.AffiliationInfo)
151
+ .map((ai) => extractText(ai?.Affiliation))
152
+ .filter(Boolean);
153
+ const collectiveName = extractText(a?.CollectiveName);
154
+ return {
155
+ last_name: extractText(a?.LastName),
156
+ fore_name: extractText(a?.ForeName),
157
+ initials: extractText(a?.Initials),
158
+ ...(collectiveName ? { collective_name: collectiveName } : {}),
159
+ ...(affiliations.length > 0 ? { affiliations } : {}),
160
+ };
161
+ });
162
+ // Publication date
163
+ const pubDateParsed = {
164
+ year: extractText(pubDate?.Year) || extractText(pubDate?.MedlineDate)?.slice(0, 4) || '',
165
+ };
166
+ const month = extractText(pubDate?.Month);
167
+ const day = extractText(pubDate?.Day);
168
+ if (month)
169
+ pubDateParsed.month = month;
170
+ if (day)
171
+ pubDateParsed.day = day;
172
+ // Keywords
173
+ const keywordList = asArray(citation?.KeywordList?.Keyword);
174
+ const keywords = keywordList.map((k) => extractText(k)).filter(Boolean);
175
+ // MeSH terms
176
+ const meshList = asArray(citation?.MeshHeadingList?.MeshHeading);
177
+ const mesh_terms = meshList
178
+ .map((m) => extractText(m?.DescriptorName))
179
+ .filter(Boolean);
180
+ // Article types
181
+ const pubTypeList = asArray(article?.PublicationTypeList?.PublicationType);
182
+ const article_types = pubTypeList
183
+ .map((pt) => extractText(pt))
184
+ .filter(Boolean);
185
+ // Language
186
+ const language = extractText(article?.Language) || 'eng';
187
+ // Citation
188
+ const citationInfo = {};
189
+ const volume = extractText(journalIssue?.Volume);
190
+ const issue = extractText(journalIssue?.Issue);
191
+ const pages = extractText(pagination?.MedlinePgn);
192
+ if (volume)
193
+ citationInfo.volume = volume;
194
+ if (issue)
195
+ citationInfo.issue = issue;
196
+ if (pages)
197
+ citationInfo.pages = pages;
198
+ return {
199
+ identifiers,
200
+ title,
201
+ abstract,
202
+ ...(identifiers.doi ? { doi: identifiers.doi } : {}),
203
+ journal: journalInfo,
204
+ authors,
205
+ author_count: authors.length,
206
+ publication_date: pubDateParsed,
207
+ keywords,
208
+ mesh_terms,
209
+ article_types,
210
+ language,
211
+ citation: citationInfo,
212
+ };
213
+ }
214
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
215
+ function parseAbstract(abstractNode) {
216
+ if (!abstractNode)
217
+ return '';
218
+ // Structured abstract: multiple AbstractText elements with Label attribute
219
+ const texts = asArray(abstractNode?.AbstractText);
220
+ if (texts.length === 0)
221
+ return '';
222
+ return texts
223
+ .map((t) => {
224
+ const label = t?._Label ??
225
+ t?._NlmCategory;
226
+ const text = extractText(t);
227
+ if (label && label !== 'UNLABELED') {
228
+ return `${label}: ${text}`;
229
+ }
230
+ return text;
231
+ })
232
+ .filter(Boolean)
233
+ .join('\n');
234
+ }
235
+ // ─── PMC JATS XML → FullTextArticle ─────────────────────────────────────────
236
+ /**
237
+ * Parse the XML returned by efetch.fcgi (db=pmc) into FullTextArticle objects.
238
+ */
239
+ export function parsePmcEfetchXml(xml) {
240
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
241
+ const doc = pmcParser.parse(normalizePmcXml(xml));
242
+ const articleSet = doc?.['pmc-articleset'] ?? doc;
243
+ const articles = asArray(articleSet?.article);
244
+ return articles.map((a) => parsePmcArticle(a));
245
+ }
246
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
247
+ function parsePmcArticle(article) {
248
+ const front = article?.front ?? {};
249
+ const articleMeta = front?.['article-meta'] ?? {};
250
+ const body = article?.body;
251
+ const back = article?.back;
252
+ // Identifiers
253
+ const articleIds = asArray(articleMeta?.['article-id']);
254
+ const identifiers = { pmcid: '' };
255
+ let doi;
256
+ for (const idNode of articleIds) {
257
+ const idObj = idNode;
258
+ const idType = String(idObj['_pub-id-type'] ?? '');
259
+ const idValue = extractText(idNode);
260
+ if (idType === 'pmc' || idType === 'pmcid') {
261
+ identifiers.pmcid = idValue.startsWith('PMC') ? idValue : `PMC${idValue}`;
262
+ }
263
+ else if (idType === 'pmid') {
264
+ identifiers.pmid = idValue;
265
+ }
266
+ else if (idType === 'doi') {
267
+ identifiers.doi = idValue;
268
+ doi = idValue;
269
+ }
270
+ }
271
+ // Title
272
+ const title = cleanPmcText(extractText(articleMeta?.['title-group']?.['article-title']));
273
+ // Abstract
274
+ const abstractNodes = asArray(articleMeta?.abstract);
275
+ const abstract = cleanPmcText(abstractNodes
276
+ .map((a) => extractPmcAbstract(a))
277
+ .join('\n'));
278
+ // Full text from body + back
279
+ const bodyText = body ? extractPmcSectionText(body) : '';
280
+ const backText = back ? extractPmcBackText(back) : '';
281
+ const full_text = cleanPmcText([bodyText, backText].filter(Boolean).join('\n\n'));
282
+ return {
283
+ identifiers,
284
+ title,
285
+ abstract,
286
+ ...(doi ? { doi } : {}),
287
+ full_text,
288
+ };
289
+ }
290
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
291
+ function extractPmcAbstract(abstractNode) {
292
+ if (!abstractNode)
293
+ return '';
294
+ // Structured abstract with sections
295
+ const secs = asArray(abstractNode?.sec);
296
+ if (secs.length > 0) {
297
+ return secs
298
+ .map((sec) => {
299
+ const s = sec;
300
+ const title = extractText(s?.title);
301
+ const paras = asArray(s?.p)
302
+ .map((p) => extractText(p))
303
+ .join(' ');
304
+ return title ? `${title}: ${paras}` : paras;
305
+ })
306
+ .join('\n');
307
+ }
308
+ // Simple abstract
309
+ return asArray(abstractNode?.p)
310
+ .map((p) => extractText(p))
311
+ .join('\n');
312
+ }
313
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
314
+ function extractPmcSectionText(node, depth = 0) {
315
+ if (!node || typeof node !== 'object')
316
+ return '';
317
+ const parts = [];
318
+ // Sections
319
+ const secs = asArray(node.sec);
320
+ for (const sec of secs) {
321
+ const secText = extractPmcSectionText(sec, depth + 1);
322
+ if (secText)
323
+ parts.push(secText);
324
+ }
325
+ // Title (after processing sub-sections so the title comes first)
326
+ if (node.title) {
327
+ const titleText = extractText(node.title);
328
+ if (titleText)
329
+ parts.unshift(titleText);
330
+ }
331
+ // Paragraphs
332
+ const paras = asArray(node.p);
333
+ for (const p of paras) {
334
+ const pText = extractText(p);
335
+ if (pText)
336
+ parts.push(pText);
337
+ }
338
+ // Figures
339
+ const figs = asArray(node.fig);
340
+ for (const fig of figs) {
341
+ const label = extractText(fig?.label);
342
+ const caption = extractText(fig?.caption);
343
+ if (label || caption)
344
+ parts.push([label, caption].filter(Boolean).join(': '));
345
+ }
346
+ // Tables
347
+ const tables = asArray(node['table-wrap']);
348
+ for (const table of tables) {
349
+ const label = extractText(table?.label);
350
+ const caption = extractText(table?.caption);
351
+ if (label || caption)
352
+ parts.push([label, caption].filter(Boolean).join(': '));
353
+ }
354
+ return parts.join('\n');
355
+ }
356
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
357
+ function extractPmcBackText(back) {
358
+ if (!back)
359
+ return '';
360
+ const parts = [];
361
+ const refLists = findNodesByKey(back, 'ref-list');
362
+ for (const refList of refLists) {
363
+ const title = extractText(refList?.title);
364
+ if (title)
365
+ parts.push(title);
366
+ const refs = asArray(refList?.ref);
367
+ for (const ref of refs) {
368
+ const r = ref;
369
+ const label = extractText(r?.label);
370
+ const citation = r?.['element-citation'] ??
371
+ r?.['mixed-citation'] ??
372
+ r?.['nlm-citation'] ??
373
+ r?.citation;
374
+ const citText = extractText(citation);
375
+ parts.push([label, citText].filter(Boolean).join(' '));
376
+ }
377
+ }
378
+ return parts.join('\n');
379
+ }
380
+ /**
381
+ * Read access and license status from efetch.fcgi (db=pmc) XML.
382
+ * Replaces the PMC OA Web Service (oa.fcgi), which NCBI retired on 2026-08-25.
383
+ */
384
+ export function parsePmcAccessXml(xml) {
385
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
386
+ const doc = pmcParser.parse(normalizePmcXml(xml));
387
+ const articleSet = doc?.['pmc-articleset'] ?? doc;
388
+ const articles = asArray(articleSet?.article);
389
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
390
+ return articles.map((article) => {
391
+ const articleMeta = article?.front?.['article-meta'] ?? {};
392
+ const meta = new Map();
393
+ for (const group of asArray(articleMeta?.['custom-meta-group'])) {
394
+ for (const entry of asArray(group?.['custom-meta'])) {
395
+ const e = entry;
396
+ meta.set(extractText(e?.['meta-name']), extractText(e?.['meta-value']));
397
+ }
398
+ }
399
+ const { identifiers, full_text } = parsePmcArticle(article);
400
+ const license = meta.get('pmc-license-ref');
401
+ const copyrightStatement = cleanPmcText(extractText(articleMeta?.permissions?.['copyright-statement']));
402
+ return {
403
+ pmcid: identifiers.pmcid,
404
+ isOpenAccess: meta.get('pmc-prop-open-access') === 'yes',
405
+ hasFullText: full_text.trim() !== '',
406
+ ...(license ? { license } : {}),
407
+ ...(copyrightStatement ? { copyrightStatement } : {}),
408
+ };
409
+ });
410
+ }
411
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
412
+ /** Ensure a value is an array (wrap singletons; filter null/undefined). */
413
+ function asArray(val) {
414
+ if (val === null || val === undefined)
415
+ return [];
416
+ if (Array.isArray(val))
417
+ return val;
418
+ return [val];
419
+ }
420
+ /**
421
+ * Recursively extract all plain text from a parsed XML node.
422
+ * Inline elements (italic, bold, sup, sub, etc.) are flattened to text.
423
+ */
424
+ export function extractText(node) {
425
+ if (node === null || node === undefined)
426
+ return '';
427
+ if (typeof node === 'string')
428
+ return node;
429
+ if (typeof node === 'number' || typeof node === 'boolean')
430
+ return String(node);
431
+ if (Array.isArray(node)) {
432
+ return node.map(extractText).join(' ');
433
+ }
434
+ if (typeof node === 'object') {
435
+ const obj = node;
436
+ // If there's a text node key, return it directly
437
+ if ('#text' in obj) {
438
+ const text = String(obj['#text']);
439
+ // Also gather inline element text and interleave
440
+ const inlineText = Object.entries(obj)
441
+ .filter(([k]) => k !== '#text' && !k.startsWith('_'))
442
+ .map(([, v]) => extractText(v))
443
+ .join(' ');
444
+ return inlineText ? `${text} ${inlineText}`.trim() : text;
445
+ }
446
+ // Otherwise concatenate all non-attribute children
447
+ return Object.entries(obj)
448
+ .filter(([k]) => !k.startsWith('_'))
449
+ .map(([, v]) => extractText(v))
450
+ .join(' ')
451
+ .replace(/\s+/g, ' ')
452
+ .trim();
453
+ }
454
+ return '';
455
+ }
456
+ function normalizePubmedXml(xml) {
457
+ return normalizeCharacters(unwrapInlineTags(xml, PUBMED_INLINE_TAGS_TO_UNWRAP));
458
+ }
459
+ function normalizePmcXml(xml) {
460
+ return normalizeCharacters(unwrapInlineTags(xml, PMC_INLINE_TAGS_TO_UNWRAP));
461
+ }
462
+ /**
463
+ * Decode numeric character references with String.fromCodePoint and replace
464
+ * Unicode spaces with ASCII spaces. References to XML special characters become
465
+ * the named entities that fast-xml-parser decodes, so nothing is decoded twice.
466
+ */
467
+ function normalizeCharacters(xml) {
468
+ return xml
469
+ .replace(CHARACTER_REFERENCE_PATTERN, (match, hex, dec) => {
470
+ const digits = hex ?? dec;
471
+ if (digits === undefined)
472
+ return match; // CDATA section or comment
473
+ const codePoint = Number.parseInt(digits, hex === undefined ? 10 : 16);
474
+ if (codePoint > 0x10ffff)
475
+ return match; // not a Unicode code point
476
+ const char = String.fromCodePoint(codePoint);
477
+ return XML_SPECIAL_CHARACTER_ENTITIES.get(char) ?? char;
478
+ })
479
+ .replace(UNICODE_SPACE_PATTERN, ' ');
480
+ }
481
+ function unwrapInlineTags(xml, tags) {
482
+ let normalized = xml;
483
+ for (const tag of tags) {
484
+ const tagPattern = new RegExp(`<${tag}\\b(?![^>]*\\/\\s*>)[^>]*>([\\s\\S]*?)<\\/${tag}>`, 'gi');
485
+ let previous;
486
+ do {
487
+ previous = normalized;
488
+ normalized = normalized.replace(tagPattern, '$1');
489
+ } while (normalized !== previous);
490
+ }
491
+ return normalized;
492
+ }
493
+ export function cleanPmcText(text) {
494
+ return text
495
+ .replace(/(^|[\s([{:;,.])\+(?:\s+\+)+(?=$|[\s)\]}:;,.])/g, '$1')
496
+ .replace(/[ \t]+\n/g, '\n')
497
+ .replace(/\n[ \t]+/g, '\n')
498
+ .replace(/[ \t]{2,}/g, ' ')
499
+ .replace(/\n{3,}/g, '\n\n')
500
+ .trim();
501
+ }
502
+ function findNodesByKey(node, key) {
503
+ if (!node || typeof node !== 'object')
504
+ return [];
505
+ if (Array.isArray(node)) {
506
+ return node.flatMap((item) => findNodesByKey(item, key));
507
+ }
508
+ const obj = node;
509
+ const matches = asArray(obj[key]);
510
+ const nested = Object.entries(obj)
511
+ .filter(([childKey]) => !childKey.startsWith('_') && childKey !== key)
512
+ .flatMap(([, value]) => findNodesByKey(value, key));
513
+ return [...matches, ...nested];
514
+ }
515
+ //# sourceMappingURL=xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/utils/xml.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,74 @@
1
1
  {
2
2
  "name": "@djmima/pubmed-mcp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "MCP server providing access to PubMed biomedical literature and citations",
5
+ "license": "MIT",
6
+ "author": "DJ MIMA",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/DJMIMA/PubMed_MCP.git"
10
+ },
11
+ "homepage": "https://github.com/DJMIMA/PubMed_MCP#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/DJMIMA/PubMed_MCP/issues"
14
+ },
15
+ "keywords": [
16
+ "mcp",
17
+ "model-context-protocol",
18
+ "pubmed",
19
+ "pmc",
20
+ "ncbi",
21
+ "e-utilities",
22
+ "literature-search",
23
+ "cli"
24
+ ],
25
+ "type": "module",
26
+ "main": "dist/index.js",
27
+ "bin": {
28
+ "pubmed-mcp": "dist/index.js",
29
+ "pubmed": "dist/cli.js"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "skills"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsc",
37
+ "dev": "tsx src/index.ts",
38
+ "cli": "tsx src/cli.ts",
39
+ "start": "node dist/index.js",
40
+ "test": "vitest run",
41
+ "test:watch": "vitest",
42
+ "lint": "eslint src",
43
+ "typecheck": "tsc --noEmit",
44
+ "prepublishOnly": "npm run typecheck && npm run lint && npm test && npm run build"
45
+ },
46
+ "dependencies": {
47
+ "@modelcontextprotocol/sdk": "^1.12.0",
48
+ "axios": "^1.7.9",
49
+ "dotenv": "^17.3.1",
50
+ "express": "^4.21.0",
51
+ "fast-xml-parser": "^5.11.2",
52
+ "jose": "^5.10.0",
53
+ "zod": "^4.6.7"
54
+ },
55
+ "devDependencies": {
56
+ "@types/express": "^5.0.0",
57
+ "@types/node": "^22.10.0",
58
+ "@typescript-eslint/eslint-plugin": "^8.18.0",
59
+ "@typescript-eslint/parser": "^8.18.0",
60
+ "eslint": "^9.17.0",
61
+ "tsx": "^4.19.2",
62
+ "typescript": "^5.7.2",
63
+ "vitest": "^4.1.11"
64
+ },
65
+ "engines": {
66
+ "node": ">=22"
67
+ },
68
+ "allowScripts": {
69
+ "esbuild@0.27.2": true
70
+ },
71
+ "publishConfig": {
72
+ "access": "public"
73
+ }
74
+ }