@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.
- package/LICENSE +21 -0
- package/README.md +793 -3
- package/dist/auth.d.ts +39 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +97 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli/commands.d.ts +42 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +508 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/run.d.ts +21 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +154 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +126 -0
- package/dist/index.js.map +1 -0
- package/dist/pubmed/client.d.ts +150 -0
- package/dist/pubmed/client.d.ts.map +1 -0
- package/dist/pubmed/client.js +315 -0
- package/dist/pubmed/client.js.map +1 -0
- package/dist/pubmed/types.d.ts +159 -0
- package/dist/pubmed/types.d.ts.map +1 -0
- package/dist/pubmed/types.js +11 -0
- package/dist/pubmed/types.js.map +1 -0
- package/dist/server.d.ts +18 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +157 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/convertArticleIds.d.ts +25 -0
- package/dist/tools/convertArticleIds.d.ts.map +1 -0
- package/dist/tools/convertArticleIds.js +39 -0
- package/dist/tools/convertArticleIds.js.map +1 -0
- package/dist/tools/findRelatedArticles.d.ts +30 -0
- package/dist/tools/findRelatedArticles.d.ts.map +1 -0
- package/dist/tools/findRelatedArticles.js +77 -0
- package/dist/tools/findRelatedArticles.js.map +1 -0
- package/dist/tools/getArticleMetadata.d.ts +31 -0
- package/dist/tools/getArticleMetadata.d.ts.map +1 -0
- package/dist/tools/getArticleMetadata.js +72 -0
- package/dist/tools/getArticleMetadata.js.map +1 -0
- package/dist/tools/getCopyrightStatus.d.ts +25 -0
- package/dist/tools/getCopyrightStatus.d.ts.map +1 -0
- package/dist/tools/getCopyrightStatus.js +84 -0
- package/dist/tools/getCopyrightStatus.js.map +1 -0
- package/dist/tools/getFullTextArticle.d.ts +21 -0
- package/dist/tools/getFullTextArticle.d.ts.map +1 -0
- package/dist/tools/getFullTextArticle.js +89 -0
- package/dist/tools/getFullTextArticle.js.map +1 -0
- package/dist/tools/lookupArticleByCitation.d.ts +33 -0
- package/dist/tools/lookupArticleByCitation.d.ts.map +1 -0
- package/dist/tools/lookupArticleByCitation.js +96 -0
- package/dist/tools/lookupArticleByCitation.js.map +1 -0
- package/dist/tools/searchArticles.d.ts +49 -0
- package/dist/tools/searchArticles.d.ts.map +1 -0
- package/dist/tools/searchArticles.js +121 -0
- package/dist/tools/searchArticles.js.map +1 -0
- package/dist/utils/xml.d.ts +37 -0
- package/dist/utils/xml.d.ts.map +1 -0
- package/dist/utils/xml.js +515 -0
- package/dist/utils/xml.js.map +1 -0
- package/package.json +72 -4
- 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
|
+
['&', '&'],
|
|
70
|
+
['<', '<'],
|
|
71
|
+
['>', '>'],
|
|
72
|
+
['"', '"'],
|
|
73
|
+
["'", '''],
|
|
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": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
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
|
+
}
|