@cyanheads/pubmed-mcp-server 2.6.3 → 2.6.5
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/CLAUDE.md +32 -12
- package/README.md +1 -1
- package/dist/mcp-server/prompts/definitions/research-plan.prompt.d.ts.map +1 -1
- package/dist/mcp-server/prompts/definitions/research-plan.prompt.js +1 -1
- package/dist/mcp-server/prompts/definitions/research-plan.prompt.js.map +1 -1
- package/dist/mcp-server/resources/definitions/database-info.resource.d.ts +1 -1
- package/dist/mcp-server/resources/definitions/database-info.resource.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/_error-contracts.d.ts +38 -0
- package/dist/mcp-server/tools/definitions/_error-contracts.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/_error-contracts.js +42 -0
- package/dist/mcp-server/tools/definitions/_error-contracts.js.map +1 -0
- package/dist/mcp-server/tools/definitions/convert-ids.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/convert-ids.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/convert-ids.tool.js +13 -4
- package/dist/mcp-server/tools/definitions/convert-ids.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-articles.tool.d.ts +21 -1
- package/dist/mcp-server/tools/definitions/fetch-articles.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-articles.tool.js +11 -1
- package/dist/mcp-server/tools/definitions/fetch-articles.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts +21 -1
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.js +13 -3
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/find-related.tool.d.ts +21 -1
- package/dist/mcp-server/tools/definitions/find-related.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/find-related.tool.js +18 -1
- package/dist/mcp-server/tools/definitions/find-related.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/format-citations.tool.d.ts +8 -3
- package/dist/mcp-server/tools/definitions/format-citations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/format-citations.tool.js +12 -10
- package/dist/mcp-server/tools/definitions/format-citations.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.js +4 -4
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-mesh.tool.d.ts +4 -3
- package/dist/mcp-server/tools/definitions/lookup-mesh.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-mesh.tool.js +26 -15
- package/dist/mcp-server/tools/definitions/lookup-mesh.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-articles.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/search-articles.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-articles.tool.js +3 -3
- package/dist/mcp-server/tools/definitions/search-articles.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/spell-check.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/spell-check.tool.d.ts.map +1 -1
- package/dist/services/ncbi/api-client.d.ts.map +1 -1
- package/dist/services/ncbi/api-client.js +14 -36
- package/dist/services/ncbi/api-client.js.map +1 -1
- package/dist/services/ncbi/ncbi-service.d.ts.map +1 -1
- package/dist/services/ncbi/ncbi-service.js +24 -19
- package/dist/services/ncbi/ncbi-service.js.map +1 -1
- package/dist/services/ncbi/request-queue.d.ts.map +1 -1
- package/dist/services/ncbi/request-queue.js +9 -9
- package/dist/services/ncbi/request-queue.js.map +1 -1
- package/dist/services/ncbi/response-handler.d.ts +2 -2
- package/dist/services/ncbi/response-handler.d.ts.map +1 -1
- package/dist/services/ncbi/response-handler.js +50 -29
- package/dist/services/ncbi/response-handler.js.map +1 -1
- package/dist/services/unpaywall/unpaywall-service.d.ts.map +1 -1
- package/dist/services/unpaywall/unpaywall-service.js +22 -18
- package/dist/services/unpaywall/unpaywall-service.js.map +1 -1
- package/package.json +6 -3
- package/server.json +3 -3
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* NCBI's inconsistent XML structures where single-element lists are collapsed to scalars.
|
|
5
5
|
* @module src/services/ncbi/response-handler
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import { logger } from '@cyanheads/mcp-ts-core/utils';
|
|
7
|
+
import { serializationError, serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
8
|
+
import { logger, requestContextService } from '@cyanheads/mcp-ts-core/utils';
|
|
9
9
|
import { XMLParser as FastXmlParser, XMLValidator } from 'fast-xml-parser';
|
|
10
10
|
/**
|
|
11
11
|
* jpaths that NCBI may return as either a single value or an array.
|
|
@@ -232,16 +232,20 @@ export class NcbiResponseHandler {
|
|
|
232
232
|
});
|
|
233
233
|
}
|
|
234
234
|
/**
|
|
235
|
-
* Extract a structured error from a parsed NCBI XML body and throw it
|
|
236
|
-
* `
|
|
235
|
+
* Extract a structured error from a parsed NCBI XML body and throw it via
|
|
236
|
+
* `serviceUnavailable()`. Never returns.
|
|
237
237
|
*/
|
|
238
238
|
throwNcbiError(parsedXml, endpoint) {
|
|
239
239
|
const errorMessages = this.extractNcbiErrorMessages(parsedXml);
|
|
240
|
-
logger.error('NCBI API returned an error in XML response.', {
|
|
240
|
+
logger.error('NCBI API returned an error in XML response.', requestContextService.createRequestContext({
|
|
241
|
+
operation: 'NcbiXmlError',
|
|
241
242
|
endpoint,
|
|
242
243
|
errors: errorMessages,
|
|
244
|
+
}));
|
|
245
|
+
throw serviceUnavailable(`NCBI API Error: ${errorMessages.join('; ')}`, {
|
|
246
|
+
endpoint,
|
|
247
|
+
ncbiErrors: errorMessages,
|
|
243
248
|
});
|
|
244
|
-
throw new McpError(JsonRpcErrorCode.ServiceUnavailable, `NCBI API Error: ${errorMessages.join('; ')}`, { endpoint, ncbiErrors: errorMessages });
|
|
245
249
|
}
|
|
246
250
|
extractNcbiErrorMessages(parsedXml) {
|
|
247
251
|
const messages = [];
|
|
@@ -264,26 +268,36 @@ export class NcbiResponseHandler {
|
|
|
264
268
|
parseAndHandleResponse(responseText, endpoint, options) {
|
|
265
269
|
const retmode = options?.retmode ?? 'xml';
|
|
266
270
|
if (retmode === 'text') {
|
|
267
|
-
logger.debug('Received text response from NCBI.', {
|
|
271
|
+
logger.debug('Received text response from NCBI.', requestContextService.createRequestContext({
|
|
272
|
+
operation: 'NcbiParseText',
|
|
273
|
+
endpoint,
|
|
274
|
+
retmode,
|
|
275
|
+
}));
|
|
268
276
|
return responseText;
|
|
269
277
|
}
|
|
270
278
|
if (retmode === 'xml') {
|
|
271
|
-
logger.debug('Parsing XML response from NCBI.', {
|
|
279
|
+
logger.debug('Parsing XML response from NCBI.', requestContextService.createRequestContext({
|
|
280
|
+
operation: 'NcbiParseXml',
|
|
281
|
+
endpoint,
|
|
282
|
+
retmode,
|
|
283
|
+
}));
|
|
272
284
|
const xmlForValidation = responseText.replace(/<!DOCTYPE[^>]*>/gi, '');
|
|
273
285
|
const validationResult = XMLValidator.validate(xmlForValidation);
|
|
274
286
|
if (validationResult !== true) {
|
|
275
287
|
const isHtml = /^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(responseText);
|
|
276
288
|
if (isHtml) {
|
|
277
|
-
logger.warning('NCBI returned HTML instead of XML (likely rate-limited).', {
|
|
289
|
+
logger.warning('NCBI returned HTML instead of XML (likely rate-limited).', requestContextService.createRequestContext({
|
|
290
|
+
operation: 'NcbiHtmlResponse',
|
|
278
291
|
endpoint,
|
|
279
|
-
});
|
|
280
|
-
throw
|
|
292
|
+
}));
|
|
293
|
+
throw serviceUnavailable('NCBI API returned an HTML response instead of XML — likely rate-limited.', { endpoint });
|
|
281
294
|
}
|
|
282
|
-
logger.error('Invalid XML response from NCBI.', {
|
|
295
|
+
logger.error('Invalid XML response from NCBI.', requestContextService.createRequestContext({
|
|
296
|
+
operation: 'NcbiInvalidXml',
|
|
283
297
|
endpoint,
|
|
284
298
|
responseSnippet: responseText.substring(0, 500),
|
|
285
|
-
});
|
|
286
|
-
throw
|
|
299
|
+
}));
|
|
300
|
+
throw serializationError('Received invalid XML from NCBI.', {
|
|
287
301
|
endpoint,
|
|
288
302
|
responseSnippet: responseText.substring(0, 200),
|
|
289
303
|
});
|
|
@@ -307,16 +321,17 @@ export class NcbiResponseHandler {
|
|
|
307
321
|
}
|
|
308
322
|
catch (error) {
|
|
309
323
|
const parserError = error instanceof Error ? error.message : String(error);
|
|
310
|
-
logger.error('Failed to parse validated XML response from NCBI.', {
|
|
324
|
+
logger.error('Failed to parse validated XML response from NCBI.', requestContextService.createRequestContext({
|
|
325
|
+
operation: 'NcbiXmlParseError',
|
|
311
326
|
endpoint,
|
|
312
327
|
parserError,
|
|
313
328
|
responseSnippet: responseText.substring(0, 500),
|
|
314
|
-
});
|
|
315
|
-
throw
|
|
329
|
+
}));
|
|
330
|
+
throw serializationError(`Failed to parse XML response from NCBI: ${parserError}`, {
|
|
316
331
|
endpoint,
|
|
317
332
|
parserError,
|
|
318
333
|
responseSnippet: responseText.substring(0, 200),
|
|
319
|
-
});
|
|
334
|
+
}, { cause: error });
|
|
320
335
|
}
|
|
321
336
|
if (!useOrdered) {
|
|
322
337
|
const parsedObj = parsedXml;
|
|
@@ -326,39 +341,45 @@ export class NcbiResponseHandler {
|
|
|
326
341
|
}
|
|
327
342
|
}
|
|
328
343
|
if (options?.returnRawXml) {
|
|
329
|
-
logger.debug('Returning raw XML string after validation.', { endpoint });
|
|
344
|
+
logger.debug('Returning raw XML string after validation.', requestContextService.createRequestContext({ operation: 'NcbiRawXml', endpoint }));
|
|
330
345
|
return responseText;
|
|
331
346
|
}
|
|
332
|
-
logger.debug('Successfully parsed XML response.', { endpoint });
|
|
347
|
+
logger.debug('Successfully parsed XML response.', requestContextService.createRequestContext({ operation: 'NcbiParseXmlOk', endpoint }));
|
|
333
348
|
return parsedXml;
|
|
334
349
|
}
|
|
335
350
|
if (retmode === 'json') {
|
|
336
|
-
logger.debug('Parsing JSON response from NCBI.', {
|
|
351
|
+
logger.debug('Parsing JSON response from NCBI.', requestContextService.createRequestContext({
|
|
352
|
+
operation: 'NcbiParseJson',
|
|
353
|
+
endpoint,
|
|
354
|
+
retmode,
|
|
355
|
+
}));
|
|
337
356
|
let parsed;
|
|
338
357
|
try {
|
|
339
358
|
parsed = JSON.parse(responseText);
|
|
340
359
|
}
|
|
341
|
-
catch {
|
|
342
|
-
throw
|
|
360
|
+
catch (error) {
|
|
361
|
+
throw serializationError('Failed to parse NCBI JSON response.', { endpoint, responseSnippet: responseText.substring(0, 200) }, { cause: error });
|
|
343
362
|
}
|
|
344
363
|
if (parsed && typeof parsed === 'object' && 'error' in parsed) {
|
|
345
364
|
const errorMessage = String(parsed.error);
|
|
346
|
-
logger.error('NCBI API returned an error in JSON response.', {
|
|
365
|
+
logger.error('NCBI API returned an error in JSON response.', requestContextService.createRequestContext({
|
|
366
|
+
operation: 'NcbiJsonError',
|
|
347
367
|
endpoint,
|
|
348
368
|
error: errorMessage,
|
|
349
|
-
});
|
|
350
|
-
throw
|
|
369
|
+
}));
|
|
370
|
+
throw serviceUnavailable(`NCBI API Error: ${errorMessage}`, {
|
|
351
371
|
endpoint,
|
|
352
372
|
ncbiError: errorMessage,
|
|
353
373
|
});
|
|
354
374
|
}
|
|
355
|
-
logger.debug('Successfully parsed JSON response.', { endpoint });
|
|
375
|
+
logger.debug('Successfully parsed JSON response.', requestContextService.createRequestContext({ operation: 'NcbiParseJsonOk', endpoint }));
|
|
356
376
|
return parsed;
|
|
357
377
|
}
|
|
358
|
-
logger.warning(`Unhandled retmode "${retmode}". Returning raw response text.`, {
|
|
378
|
+
logger.warning(`Unhandled retmode "${retmode}". Returning raw response text.`, requestContextService.createRequestContext({
|
|
379
|
+
operation: 'NcbiUnknownRetmode',
|
|
359
380
|
endpoint,
|
|
360
381
|
retmode,
|
|
361
|
-
});
|
|
382
|
+
}));
|
|
362
383
|
return responseText;
|
|
363
384
|
}
|
|
364
385
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-handler.js","sourceRoot":"","sources":["../../../src/services/ncbi/response-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"response-handler.js","sourceRoot":"","sources":["../../../src/services/ncbi/response-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unpaywall-service.d.ts","sourceRoot":"","sources":["../../../src/services/unpaywall/unpaywall-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"unpaywall-service.d.ts","sourceRoot":"","sources":["../../../src/services/unpaywall/unpaywall-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AAIpB;;;GAGG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM;IAGpC;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAsD9E;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAsBlF,OAAO;CA8CtB;AAiBD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAc3C;AAED,qFAAqF;AACrF,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAElE"}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* resolution; only genuine service failures (5xx, network, timeout) throw.
|
|
8
8
|
* @module src/services/unpaywall/unpaywall-service
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import { fetchWithTimeout, logger, requestContextService } from '@cyanheads/mcp-ts-core/utils';
|
|
10
|
+
import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
|
|
11
|
+
import { fetchWithTimeout, httpErrorFromResponse, logger, requestContextService, } from '@cyanheads/mcp-ts-core/utils';
|
|
12
12
|
import { getServerConfig } from '../../config/server-config.js';
|
|
13
13
|
import { UNPAYWALL_API_BASE, } from './types.js';
|
|
14
14
|
const USER_AGENT = 'pubmed-mcp-server (+https://github.com/cyanheads/pubmed-mcp-server)';
|
|
@@ -43,9 +43,7 @@ export class UnpaywallService {
|
|
|
43
43
|
}
|
|
44
44
|
catch (error) {
|
|
45
45
|
const msg = error instanceof Error ? error.message : String(error);
|
|
46
|
-
throw
|
|
47
|
-
doi: normalized,
|
|
48
|
-
});
|
|
46
|
+
throw serviceUnavailable(`Unpaywall request failed: ${msg}`, { doi: normalized }, { cause: error });
|
|
49
47
|
}
|
|
50
48
|
if (response.status === 404)
|
|
51
49
|
return { kind: 'no-oa', reason: 'DOI unknown to Unpaywall' };
|
|
@@ -53,9 +51,11 @@ export class UnpaywallService {
|
|
|
53
51
|
return { kind: 'no-oa', reason: 'Invalid DOI format' };
|
|
54
52
|
if (!response.ok) {
|
|
55
53
|
const body = await response.text().catch(() => '');
|
|
56
|
-
throw
|
|
57
|
-
|
|
58
|
-
:
|
|
54
|
+
throw await httpErrorFromResponse(response, {
|
|
55
|
+
service: 'Unpaywall',
|
|
56
|
+
captureBody: false,
|
|
57
|
+
data: { doi: normalized, body: body.substring(0, 300) },
|
|
58
|
+
});
|
|
59
59
|
}
|
|
60
60
|
const data = (await response.json());
|
|
61
61
|
if (!data.is_oa)
|
|
@@ -63,12 +63,13 @@ export class UnpaywallService {
|
|
|
63
63
|
const location = data.best_oa_location ?? data.oa_locations?.[0];
|
|
64
64
|
if (!location?.url)
|
|
65
65
|
return { kind: 'no-oa', reason: 'OA flagged but no usable location URL' };
|
|
66
|
-
logger.debug('Unpaywall resolved DOI', {
|
|
66
|
+
logger.debug('Unpaywall resolved DOI', requestContextService.createRequestContext({
|
|
67
|
+
operation: 'UnpaywallResolved',
|
|
67
68
|
doi: normalized,
|
|
68
69
|
hostType: location.host_type ?? null,
|
|
69
70
|
license: location.license ?? null,
|
|
70
71
|
version: location.version ?? null,
|
|
71
|
-
});
|
|
72
|
+
}));
|
|
72
73
|
return { kind: 'found', location };
|
|
73
74
|
}
|
|
74
75
|
/**
|
|
@@ -85,10 +86,11 @@ export class UnpaywallService {
|
|
|
85
86
|
return await this.fetchAs(pdfUrl, 'pdf', signal);
|
|
86
87
|
}
|
|
87
88
|
catch (pdfErr) {
|
|
88
|
-
logger.debug('Unpaywall PDF fetch failed; falling back to HTML URL', {
|
|
89
|
+
logger.debug('Unpaywall PDF fetch failed; falling back to HTML URL', requestContextService.createRequestContext({
|
|
90
|
+
operation: 'UnpaywallPdfFallback',
|
|
89
91
|
url: pdfUrl,
|
|
90
92
|
error: pdfErr instanceof Error ? pdfErr.message : String(pdfErr),
|
|
91
|
-
});
|
|
93
|
+
}));
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
return this.fetchAs(htmlUrl, 'auto', signal);
|
|
@@ -112,12 +114,13 @@ export class UnpaywallService {
|
|
|
112
114
|
}
|
|
113
115
|
catch (error) {
|
|
114
116
|
const msg = error instanceof Error ? error.message : String(error);
|
|
115
|
-
throw
|
|
117
|
+
throw serviceUnavailable(`Unpaywall content fetch failed: ${msg}`, { url }, { cause: error });
|
|
116
118
|
}
|
|
117
119
|
if (!response.ok) {
|
|
118
|
-
throw
|
|
119
|
-
|
|
120
|
-
:
|
|
120
|
+
throw await httpErrorFromResponse(response, {
|
|
121
|
+
service: 'Unpaywall content fetch',
|
|
122
|
+
data: { url },
|
|
123
|
+
});
|
|
121
124
|
}
|
|
122
125
|
const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
|
|
123
126
|
const fetchedUrl = response.url || url;
|
|
@@ -154,9 +157,10 @@ export function initUnpaywallService() {
|
|
|
154
157
|
return;
|
|
155
158
|
}
|
|
156
159
|
_service = new UnpaywallService(config.unpaywallEmail, config.unpaywallTimeoutMs);
|
|
157
|
-
logger.info('Unpaywall service initialized.', {
|
|
160
|
+
logger.info('Unpaywall service initialized.', requestContextService.createRequestContext({
|
|
161
|
+
operation: 'UnpaywallInit',
|
|
158
162
|
timeoutMs: config.unpaywallTimeoutMs,
|
|
159
|
-
});
|
|
163
|
+
}));
|
|
160
164
|
}
|
|
161
165
|
/** Returns the initialized service, or `undefined` when the fallback is disabled. */
|
|
162
166
|
export function getUnpaywallService() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unpaywall-service.js","sourceRoot":"","sources":["../../../src/services/unpaywall/unpaywall-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"unpaywall-service.js","sourceRoot":"","sources":["../../../src/services/unpaywall/unpaywall-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/pubmed-mcp-server",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.5",
|
|
4
4
|
"mcpName": "io.github.cyanheads/pubmed-mcp-server",
|
|
5
5
|
"description": "MCP server for PubMed/NCBI E-utilities integration. Search articles, fetch metadata and open-access full text (PMC + Unpaywall), generate citations, explore MeSH terms, and discover related research.",
|
|
6
6
|
"type": "module",
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
"format": "biome check --write --unsafe",
|
|
20
20
|
"test": "bunx vitest run",
|
|
21
21
|
"lint:mcp": "bun run scripts/lint-mcp.ts",
|
|
22
|
+
"changelog:build": "bun run scripts/build-changelog.ts",
|
|
23
|
+
"changelog:check": "bun run scripts/build-changelog.ts --check",
|
|
22
24
|
"publish-mcp": "mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish",
|
|
23
25
|
"dev:stdio": "MCP_TRANSPORT_TYPE=stdio bun --watch src/index.ts",
|
|
24
26
|
"dev:http": "MCP_TRANSPORT_TYPE=http bun --watch src/index.ts",
|
|
@@ -71,13 +73,13 @@
|
|
|
71
73
|
"access": "public"
|
|
72
74
|
},
|
|
73
75
|
"dependencies": {
|
|
74
|
-
"@cyanheads/mcp-ts-core": "^0.
|
|
76
|
+
"@cyanheads/mcp-ts-core": "^0.8.2",
|
|
75
77
|
"defuddle": "^0.18.1",
|
|
76
78
|
"fast-xml-parser": "^5.7.2",
|
|
77
79
|
"linkedom": "^0.18.12",
|
|
78
80
|
"pino-pretty": "^13.1.3",
|
|
79
81
|
"sanitize-html": "^2.17.3",
|
|
80
|
-
"unpdf": "^1.6.
|
|
82
|
+
"unpdf": "^1.6.1"
|
|
81
83
|
},
|
|
82
84
|
"devDependencies": {
|
|
83
85
|
"@biomejs/biome": "^2.4.13",
|
|
@@ -85,6 +87,7 @@
|
|
|
85
87
|
"@types/sanitize-html": "^2.16.1",
|
|
86
88
|
"@vitest/coverage-istanbul": "^4.1.5",
|
|
87
89
|
"depcheck": "^1.4.7",
|
|
90
|
+
"fast-check": "^4.7.0",
|
|
88
91
|
"ignore": "^7.0.5",
|
|
89
92
|
"tsc-alias": "^1.8.16",
|
|
90
93
|
"typescript": "^6.0.3",
|
package/server.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/cyanheads/pubmed-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "2.6.
|
|
9
|
+
"version": "2.6.5",
|
|
10
10
|
"remotes": [
|
|
11
11
|
{
|
|
12
12
|
"type": "streamable-http",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
20
20
|
"identifier": "@cyanheads/pubmed-mcp-server",
|
|
21
21
|
"runtimeHint": "bun",
|
|
22
|
-
"version": "2.6.
|
|
22
|
+
"version": "2.6.5",
|
|
23
23
|
"packageArguments": [
|
|
24
24
|
{
|
|
25
25
|
"type": "positional",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
67
67
|
"identifier": "@cyanheads/pubmed-mcp-server",
|
|
68
68
|
"runtimeHint": "bun",
|
|
69
|
-
"version": "2.6.
|
|
69
|
+
"version": "2.6.5",
|
|
70
70
|
"packageArguments": [
|
|
71
71
|
{
|
|
72
72
|
"type": "positional",
|