@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,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NCBI E-utilities HTTP client.
|
|
3
|
+
* Handles rate limiting, API key injection, and request construction.
|
|
4
|
+
*
|
|
5
|
+
* Base URL: https://eutils.ncbi.nlm.nih.gov/entrez/eutils/
|
|
6
|
+
* Rate limits:
|
|
7
|
+
* - Without API key: 3 requests/sec
|
|
8
|
+
* - With API key: 10 requests/sec
|
|
9
|
+
* NCBI counts requests by arrival time, so we send at 8 req/s with a key to
|
|
10
|
+
* absorb network jitter, and retry briefly on HTTP 429.
|
|
11
|
+
*/
|
|
12
|
+
import https from 'node:https';
|
|
13
|
+
import axios from 'axios';
|
|
14
|
+
const NCBI_BASE_URL = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/';
|
|
15
|
+
const PMC_ID_CONVERTER_URL = 'https://www.ncbi.nlm.nih.gov/pmc/utils/idconv/v1.0/';
|
|
16
|
+
/**
|
|
17
|
+
* Shared agent for every NCBI request.
|
|
18
|
+
* - ALPN: pmc.ncbi.nlm.nih.gov answers 403 to Node's default TLS handshake,
|
|
19
|
+
* which advertises no ALPN protocol; offering http/1.1 is accepted.
|
|
20
|
+
* - keepAlive: reuse TLS connections across calls instead of re-handshaking.
|
|
21
|
+
*/
|
|
22
|
+
const HTTPS_AGENT = new https.Agent({
|
|
23
|
+
ALPNProtocols: ['http/1.1'],
|
|
24
|
+
keepAlive: true,
|
|
25
|
+
});
|
|
26
|
+
const TOOL_NAME = 'pubmed-mcp';
|
|
27
|
+
const TOOL_EMAIL = 'pubmed-mcp@example.com';
|
|
28
|
+
// ─── Rate limiter ────────────────────────────────────────────────────────────
|
|
29
|
+
class RateLimiter {
|
|
30
|
+
nextSlot = 0;
|
|
31
|
+
minInterval; // ms
|
|
32
|
+
constructor(requestsPerSecond) {
|
|
33
|
+
this.minInterval = 1000 / requestsPerSecond;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reserve the next send slot synchronously, then wait for it.
|
|
37
|
+
* Reserving before awaiting keeps concurrent callers spaced out instead of
|
|
38
|
+
* letting them all read the same timestamp and fire together.
|
|
39
|
+
*/
|
|
40
|
+
async throttle() {
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
const slot = Math.max(now, this.nextSlot);
|
|
43
|
+
this.nextSlot = slot + this.minInterval;
|
|
44
|
+
if (slot > now) {
|
|
45
|
+
await sleep(slot - now);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function sleep(ms) {
|
|
50
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
51
|
+
}
|
|
52
|
+
/** Retries after an HTTP 429 before giving up. */
|
|
53
|
+
const MAX_RATE_LIMIT_RETRIES = 2;
|
|
54
|
+
/** Backoff per retry when NCBI sends no usable Retry-After header. */
|
|
55
|
+
const RATE_LIMIT_BACKOFF_MS = 1000;
|
|
56
|
+
// ─── Error types ─────────────────────────────────────────────────────────────
|
|
57
|
+
export class NcbiNetworkError extends Error {
|
|
58
|
+
cause;
|
|
59
|
+
constructor(message, cause) {
|
|
60
|
+
super(message);
|
|
61
|
+
this.cause = cause;
|
|
62
|
+
this.name = 'NcbiNetworkError';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export class NcbiApiError extends Error {
|
|
66
|
+
statusCode;
|
|
67
|
+
constructor(message, statusCode) {
|
|
68
|
+
super(message);
|
|
69
|
+
this.statusCode = statusCode;
|
|
70
|
+
this.name = 'NcbiApiError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class NcbiParseError extends Error {
|
|
74
|
+
cause;
|
|
75
|
+
constructor(message, cause) {
|
|
76
|
+
super(message);
|
|
77
|
+
this.cause = cause;
|
|
78
|
+
this.name = 'NcbiParseError';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// ─── Client ──────────────────────────────────────────────────────────────────
|
|
82
|
+
export class NcbiClient {
|
|
83
|
+
apiKey;
|
|
84
|
+
rateLimiter;
|
|
85
|
+
constructor(apiKey) {
|
|
86
|
+
// Trim whitespace/newlines that can sneak in from Secret Manager or .env files.
|
|
87
|
+
const raw = apiKey ?? process.env.NCBI_API_KEY;
|
|
88
|
+
this.apiKey = raw?.trim() || undefined;
|
|
89
|
+
const rps = this.apiKey ? 8 : 3; // 8 req/s (margin below NCBI's 10 req/s limit for arrival jitter)
|
|
90
|
+
this.rateLimiter = new RateLimiter(rps);
|
|
91
|
+
}
|
|
92
|
+
commonParams() {
|
|
93
|
+
const params = {
|
|
94
|
+
tool: TOOL_NAME,
|
|
95
|
+
email: TOOL_EMAIL,
|
|
96
|
+
};
|
|
97
|
+
if (this.apiKey) {
|
|
98
|
+
params['api_key'] = this.apiKey;
|
|
99
|
+
}
|
|
100
|
+
return params;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Throttle, send, and retry on HTTP 429. Every NCBI call goes through here
|
|
104
|
+
* so each attempt (including retries) takes its own rate-limiter slot.
|
|
105
|
+
*/
|
|
106
|
+
async request(operation, send) {
|
|
107
|
+
for (let attempt = 0;; attempt++) {
|
|
108
|
+
await this.rateLimiter.throttle();
|
|
109
|
+
try {
|
|
110
|
+
return await send();
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (attempt < MAX_RATE_LIMIT_RETRIES && isRateLimited(err)) {
|
|
114
|
+
await sleep(retryDelayMs(err, attempt));
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
throw wrapAxiosError(err, operation);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* ESearch — search PubMed for article IDs.
|
|
123
|
+
* Returns the raw JSON response from NCBI.
|
|
124
|
+
*/
|
|
125
|
+
async esearch(params) {
|
|
126
|
+
const response = await this.request('esearch', () => axios.get(`${NCBI_BASE_URL}esearch.fcgi`, {
|
|
127
|
+
httpsAgent: HTTPS_AGENT,
|
|
128
|
+
params: {
|
|
129
|
+
...this.commonParams(),
|
|
130
|
+
db: 'pubmed',
|
|
131
|
+
retmode: 'json',
|
|
132
|
+
retmax: params.retmax ?? 20,
|
|
133
|
+
retstart: params.retstart ?? 0,
|
|
134
|
+
term: params.term,
|
|
135
|
+
...(params.sort ? { sort: params.sort } : {}),
|
|
136
|
+
...(params.field ? { field: params.field } : {}),
|
|
137
|
+
...(params.datetype ? { datetype: params.datetype } : {}),
|
|
138
|
+
...(params.mindate ? { mindate: params.mindate } : {}),
|
|
139
|
+
...(params.maxdate ? { maxdate: params.maxdate } : {}),
|
|
140
|
+
},
|
|
141
|
+
}));
|
|
142
|
+
return response.data.esearchresult;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* EFetch — retrieve full records from PubMed or PMC.
|
|
146
|
+
* Returns raw XML text.
|
|
147
|
+
*/
|
|
148
|
+
async efetch(params) {
|
|
149
|
+
const idStr = Array.isArray(params.id) ? params.id.join(',') : params.id;
|
|
150
|
+
const response = await this.request('efetch', () => axios.get(`${NCBI_BASE_URL}efetch.fcgi`, {
|
|
151
|
+
httpsAgent: HTTPS_AGENT,
|
|
152
|
+
params: {
|
|
153
|
+
...this.commonParams(),
|
|
154
|
+
db: params.db,
|
|
155
|
+
id: idStr,
|
|
156
|
+
retmode: params.retmode ?? 'xml',
|
|
157
|
+
...(params.rettype ? { rettype: params.rettype } : {}),
|
|
158
|
+
},
|
|
159
|
+
responseType: 'text',
|
|
160
|
+
}));
|
|
161
|
+
return response.data;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* ELink — find related articles or cross-database links.
|
|
165
|
+
* Accepts multiple IDs and returns the raw JSON response.
|
|
166
|
+
*/
|
|
167
|
+
async elink(params) {
|
|
168
|
+
// Build URL manually to allow repeated id= params
|
|
169
|
+
const searchParams = new URLSearchParams({
|
|
170
|
+
...this.commonParams(),
|
|
171
|
+
dbfrom: params.dbfrom,
|
|
172
|
+
linkname: params.linkname,
|
|
173
|
+
cmd: params.cmd ?? 'neighbor',
|
|
174
|
+
retmode: 'json',
|
|
175
|
+
});
|
|
176
|
+
for (const id of params.id) {
|
|
177
|
+
searchParams.append('id', id);
|
|
178
|
+
}
|
|
179
|
+
const response = await this.request('elink', () => axios.get(`${NCBI_BASE_URL}elink.fcgi?${searchParams.toString()}`, {
|
|
180
|
+
httpsAgent: HTTPS_AGENT,
|
|
181
|
+
}));
|
|
182
|
+
return response.data;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* ECitmatch — look up PubMed IDs from structured citation data.
|
|
186
|
+
* Returns raw text with pipe-delimited fields.
|
|
187
|
+
*/
|
|
188
|
+
async ecitmatch(citations) {
|
|
189
|
+
const bdata = citations
|
|
190
|
+
.map((c) => `${c.journal}|${c.year}|${c.volume}|${c.first_page}|${c.author}|${c.key}|`)
|
|
191
|
+
.join('\r');
|
|
192
|
+
const response = await this.request('ecitmatch', () => axios.get(`${NCBI_BASE_URL}ecitmatch.cgi`, {
|
|
193
|
+
httpsAgent: HTTPS_AGENT,
|
|
194
|
+
params: {
|
|
195
|
+
...this.commonParams(),
|
|
196
|
+
db: 'pubmed',
|
|
197
|
+
retmode: 'xml',
|
|
198
|
+
rettype: 'xml',
|
|
199
|
+
bdata,
|
|
200
|
+
},
|
|
201
|
+
responseType: 'text',
|
|
202
|
+
}));
|
|
203
|
+
const contentType = String(response.headers?.['content-type'] ?? '').toLowerCase();
|
|
204
|
+
const text = String(response.data ?? '');
|
|
205
|
+
if (contentType.includes('html') || looksLikeHtml(text)) {
|
|
206
|
+
throw new NcbiApiError('NCBI ecitmatch returned HTML instead of citation match text. ' +
|
|
207
|
+
'Check the ECitMatch endpoint and bdata parameter format.', response.status);
|
|
208
|
+
}
|
|
209
|
+
return text;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* PMC ID Converter — convert between PMID, PMCID, and DOI.
|
|
213
|
+
*/
|
|
214
|
+
async idConvert(params) {
|
|
215
|
+
const response = await this.request('idConvert', () => axios.get(PMC_ID_CONVERTER_URL, {
|
|
216
|
+
httpsAgent: HTTPS_AGENT,
|
|
217
|
+
params: {
|
|
218
|
+
tool: TOOL_NAME,
|
|
219
|
+
email: TOOL_EMAIL,
|
|
220
|
+
...(this.apiKey ? { api_key: this.apiKey } : {}),
|
|
221
|
+
format: 'json',
|
|
222
|
+
ids: params.ids.join(','),
|
|
223
|
+
idtype: params.idtype ?? 'pmid',
|
|
224
|
+
versions: 'no',
|
|
225
|
+
},
|
|
226
|
+
}));
|
|
227
|
+
return sanitizeIdConvResponse(response.data);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
231
|
+
function wrapAxiosError(err, operation) {
|
|
232
|
+
if (err instanceof NcbiApiError || err instanceof NcbiNetworkError) {
|
|
233
|
+
return err;
|
|
234
|
+
}
|
|
235
|
+
if (axios.isAxiosError(err)) {
|
|
236
|
+
const status = err.response?.status;
|
|
237
|
+
if (status !== undefined) {
|
|
238
|
+
const body = describeResponseBody(err.response?.data);
|
|
239
|
+
const message = redactApiKey(body || err.message);
|
|
240
|
+
return new NcbiApiError(`NCBI ${operation} returned HTTP ${status}: ${message}`, status);
|
|
241
|
+
}
|
|
242
|
+
return new NcbiNetworkError(`Network error during NCBI ${operation}: ${err.message}`, err);
|
|
243
|
+
}
|
|
244
|
+
if (err instanceof Error)
|
|
245
|
+
return err;
|
|
246
|
+
return new Error(`Unknown error during NCBI ${operation}`);
|
|
247
|
+
}
|
|
248
|
+
const MAX_ERROR_BODY_LENGTH = 300;
|
|
249
|
+
/** Render an error response body (JSON object, string, or buffer) as readable text. */
|
|
250
|
+
function describeResponseBody(data) {
|
|
251
|
+
if (data === undefined || data === null)
|
|
252
|
+
return '';
|
|
253
|
+
let text;
|
|
254
|
+
if (typeof data === 'string') {
|
|
255
|
+
text = data;
|
|
256
|
+
}
|
|
257
|
+
else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
|
|
258
|
+
text = Buffer.from(data).toString('utf8');
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
try {
|
|
262
|
+
text = JSON.stringify(data);
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
text = String(data);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
text = text.trim();
|
|
269
|
+
return text.length > MAX_ERROR_BODY_LENGTH
|
|
270
|
+
? `${text.slice(0, MAX_ERROR_BODY_LENGTH)}…`
|
|
271
|
+
: text;
|
|
272
|
+
}
|
|
273
|
+
function isRateLimited(err) {
|
|
274
|
+
return axios.isAxiosError(err) && err.response?.status === 429;
|
|
275
|
+
}
|
|
276
|
+
/** Honor a numeric Retry-After header (seconds, capped); otherwise back off linearly. */
|
|
277
|
+
function retryDelayMs(err, attempt) {
|
|
278
|
+
const fallback = RATE_LIMIT_BACKOFF_MS * (attempt + 1);
|
|
279
|
+
if (!axios.isAxiosError(err))
|
|
280
|
+
return fallback;
|
|
281
|
+
const headers = err.response?.headers;
|
|
282
|
+
const seconds = Number(headers?.['retry-after']);
|
|
283
|
+
if (Number.isFinite(seconds) && seconds > 0) {
|
|
284
|
+
return Math.min(seconds * 1000, 10_000);
|
|
285
|
+
}
|
|
286
|
+
return fallback;
|
|
287
|
+
}
|
|
288
|
+
function looksLikeHtml(text) {
|
|
289
|
+
return /^\s*(?:<!doctype\s+html|<html\b)/i.test(text);
|
|
290
|
+
}
|
|
291
|
+
function sanitizeIdConvResponse(response) {
|
|
292
|
+
return {
|
|
293
|
+
...response,
|
|
294
|
+
request: {
|
|
295
|
+
...response.request,
|
|
296
|
+
echo: redactApiKey(response.request.echo),
|
|
297
|
+
},
|
|
298
|
+
records: response.records.map((record) => ({
|
|
299
|
+
...record,
|
|
300
|
+
...(record.pmid !== undefined ? { pmid: String(record.pmid) } : {}),
|
|
301
|
+
...(record.pmcid !== undefined ? { pmcid: String(record.pmcid) } : {}),
|
|
302
|
+
...(record.doi !== undefined ? { doi: String(record.doi) } : {}),
|
|
303
|
+
...(record['requested-id'] !== undefined
|
|
304
|
+
? { 'requested-id': String(record['requested-id']) }
|
|
305
|
+
: {}),
|
|
306
|
+
})),
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function redactApiKey(value) {
|
|
310
|
+
// NCBI echoes the key both as a query param and as "api-key" in JSON error bodies.
|
|
311
|
+
return value
|
|
312
|
+
.replace(/(^|[?&])(api_key=)[^&\s]+/gi, '$1$2<redacted>')
|
|
313
|
+
.replace(/("api[-_]key"\s*:\s*")[^"]*/gi, '$1<redacted>');
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/pubmed/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript types for PubMed MCP tool responses.
|
|
3
|
+
* These match the exact API surface of the official Anthropic PubMed connector.
|
|
4
|
+
*/
|
|
5
|
+
export interface SearchArticlesWarnings {
|
|
6
|
+
phrases_ignored: string[];
|
|
7
|
+
quoted_phrases_not_found: string[];
|
|
8
|
+
output_messages: string[];
|
|
9
|
+
}
|
|
10
|
+
/** NCBI ESearch query diagnostics, not transport or MCP execution errors. */
|
|
11
|
+
export interface SearchArticlesErrors {
|
|
12
|
+
phrases_not_found: string[];
|
|
13
|
+
fields_not_found: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface SearchArticlesResponse {
|
|
16
|
+
pmids: string[];
|
|
17
|
+
total_count: number;
|
|
18
|
+
returned_count: number;
|
|
19
|
+
query: string;
|
|
20
|
+
query_translation: string;
|
|
21
|
+
has_more: boolean;
|
|
22
|
+
warnings: SearchArticlesWarnings;
|
|
23
|
+
errors: SearchArticlesErrors;
|
|
24
|
+
}
|
|
25
|
+
export interface ArticleIdentifiers {
|
|
26
|
+
pmid: string;
|
|
27
|
+
doi?: string;
|
|
28
|
+
pii?: string;
|
|
29
|
+
pmcid?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ArticleJournal {
|
|
32
|
+
title: string;
|
|
33
|
+
iso_abbreviation: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ArticleAuthor {
|
|
36
|
+
last_name: string;
|
|
37
|
+
fore_name: string;
|
|
38
|
+
initials: string;
|
|
39
|
+
/** Group author (e.g. a study group); the name fields above are empty for it. */
|
|
40
|
+
collective_name?: string;
|
|
41
|
+
affiliations?: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface ArticlePublicationDate {
|
|
44
|
+
year: string;
|
|
45
|
+
month?: string;
|
|
46
|
+
day?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface ArticleCitation {
|
|
49
|
+
volume?: string;
|
|
50
|
+
issue?: string;
|
|
51
|
+
pages?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface ArticleMetadata {
|
|
54
|
+
identifiers: ArticleIdentifiers;
|
|
55
|
+
title: string;
|
|
56
|
+
abstract: string;
|
|
57
|
+
doi?: string;
|
|
58
|
+
journal: ArticleJournal;
|
|
59
|
+
authors: ArticleAuthor[];
|
|
60
|
+
/** Number of authors PubMed lists, even when `authors` was cut down. */
|
|
61
|
+
author_count: number;
|
|
62
|
+
publication_date: ArticlePublicationDate;
|
|
63
|
+
keywords: string[];
|
|
64
|
+
mesh_terms: string[];
|
|
65
|
+
article_types: string[];
|
|
66
|
+
language: string;
|
|
67
|
+
citation: ArticleCitation;
|
|
68
|
+
}
|
|
69
|
+
export interface GetArticleMetadataResponse {
|
|
70
|
+
articles: ArticleMetadata[];
|
|
71
|
+
count: number;
|
|
72
|
+
important_legal_notice: string;
|
|
73
|
+
}
|
|
74
|
+
export interface LinksetDb {
|
|
75
|
+
dbto: string;
|
|
76
|
+
linkname: string;
|
|
77
|
+
links: string[];
|
|
78
|
+
}
|
|
79
|
+
export interface Linkset {
|
|
80
|
+
dbfrom: string;
|
|
81
|
+
ids: string[];
|
|
82
|
+
linksetdbs: LinksetDb[];
|
|
83
|
+
}
|
|
84
|
+
export interface FindRelatedArticlesResponse {
|
|
85
|
+
linksets: Linkset[];
|
|
86
|
+
}
|
|
87
|
+
export interface CitationResult {
|
|
88
|
+
journal: string;
|
|
89
|
+
year: string;
|
|
90
|
+
volume: string;
|
|
91
|
+
first_page: string;
|
|
92
|
+
author: string;
|
|
93
|
+
pmid: string;
|
|
94
|
+
key: string;
|
|
95
|
+
}
|
|
96
|
+
export interface LookupArticleByCitationResponse {
|
|
97
|
+
citations: CitationResult[];
|
|
98
|
+
}
|
|
99
|
+
export interface IdConversionRecord {
|
|
100
|
+
pmid?: string;
|
|
101
|
+
pmcid?: string;
|
|
102
|
+
doi?: string;
|
|
103
|
+
'requested-id': string;
|
|
104
|
+
errmsg?: string;
|
|
105
|
+
[key: string]: string | undefined;
|
|
106
|
+
}
|
|
107
|
+
export interface IdConversionRequest {
|
|
108
|
+
warnings: string[];
|
|
109
|
+
format: string;
|
|
110
|
+
idtype: string;
|
|
111
|
+
ids: string[];
|
|
112
|
+
email: string;
|
|
113
|
+
tool: string;
|
|
114
|
+
echo: string;
|
|
115
|
+
versions: string;
|
|
116
|
+
showaiid: string;
|
|
117
|
+
}
|
|
118
|
+
export interface ConvertArticleIdsResponse {
|
|
119
|
+
status: string;
|
|
120
|
+
'response-date': string;
|
|
121
|
+
request: IdConversionRequest;
|
|
122
|
+
records: IdConversionRecord[];
|
|
123
|
+
}
|
|
124
|
+
export interface FullTextIdentifiers {
|
|
125
|
+
pmcid: string;
|
|
126
|
+
pmid?: string;
|
|
127
|
+
doi?: string;
|
|
128
|
+
}
|
|
129
|
+
export interface FullTextArticle {
|
|
130
|
+
identifiers: FullTextIdentifiers;
|
|
131
|
+
title: string;
|
|
132
|
+
abstract: string;
|
|
133
|
+
doi?: string;
|
|
134
|
+
full_text: string;
|
|
135
|
+
}
|
|
136
|
+
export interface FullTextArticleError {
|
|
137
|
+
pmcid: string;
|
|
138
|
+
error: string;
|
|
139
|
+
}
|
|
140
|
+
export interface GetFullTextArticleResponse {
|
|
141
|
+
important_legal_notice: string;
|
|
142
|
+
articles: FullTextArticle[];
|
|
143
|
+
errors: FullTextArticleError[];
|
|
144
|
+
count: number;
|
|
145
|
+
}
|
|
146
|
+
export interface CopyrightStatus {
|
|
147
|
+
pmid: string;
|
|
148
|
+
pmcid?: string;
|
|
149
|
+
has_full_text: boolean;
|
|
150
|
+
license?: string;
|
|
151
|
+
copyright_statement?: string;
|
|
152
|
+
is_open_access?: boolean;
|
|
153
|
+
}
|
|
154
|
+
export interface GetCopyrightStatusResponse {
|
|
155
|
+
statuses: CopyrightStatus[];
|
|
156
|
+
count: number;
|
|
157
|
+
}
|
|
158
|
+
export declare const IMPORTANT_LEGAL_NOTICE: string;
|
|
159
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pubmed/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript types for PubMed MCP tool responses.
|
|
3
|
+
* These match the exact API surface of the official Anthropic PubMed connector.
|
|
4
|
+
*/
|
|
5
|
+
// ─── Shared constants ────────────────────────────────────────────────────────
|
|
6
|
+
export const IMPORTANT_LEGAL_NOTICE = 'PubMed data is provided by the National Library of Medicine (NLM). ' +
|
|
7
|
+
'When citing articles, include the complete DOI as required by the journal and publisher. ' +
|
|
8
|
+
'Use of this data is subject to NLM copyright and terms of use. ' +
|
|
9
|
+
'For PubMed Central full-text articles, proper attribution including the PMCID is required. ' +
|
|
10
|
+
'See: https://www.ncbi.nlm.nih.gov/home/about/policies/';
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pubmed/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiMH,gFAAgF;AAEhF,MAAM,CAAC,MAAM,sBAAsB,GACjC,qEAAqE;IACrE,2FAA2F;IAC3F,iEAAiE;IACjE,6FAA6F;IAC7F,wDAAwD,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server setup and tool registration.
|
|
3
|
+
*
|
|
4
|
+
* All seven PubMed tools are registered here. Each tool handler calls
|
|
5
|
+
* the appropriate function from src/tools/, catches errors, and returns
|
|
6
|
+
* a text content block (never throws — MCP protocol requires graceful errors).
|
|
7
|
+
*/
|
|
8
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
+
import { NcbiClient } from './pubmed/client.js';
|
|
10
|
+
/**
|
|
11
|
+
* Create and return a configured MCP server instance.
|
|
12
|
+
*
|
|
13
|
+
* @param client NCBI client used by every tool. Rate limiting is per client,
|
|
14
|
+
* so pass one shared client when creating several servers (HTTP mode
|
|
15
|
+
* creates one per request). Defaults to a new client.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createServer(client?: NcbiClient): McpServer;
|
|
18
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AA+BhD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,UAA6B,GAAG,SAAS,CAyK7E"}
|