@cyanheads/pubmed-mcp-server
Version:
Search PubMed/Europe PMC, fetch articles and full text (PMC/EPMC/Unpaywall), citations, MeSH terms via MCP. STDIO or Streamable HTTP.
59 lines • 2.79 kB
JavaScript
/**
* @fileoverview Resource exposing PubMed database metadata via NCBI EInfo.
* Returns field list, record count, last update date, and description.
* @module src/mcp-server/resources/definitions/database-info.resource
*/
import { resource, z } from '@cyanheads/mcp-ts-core';
import { getNcbiService } from '../../../services/ncbi/ncbi-service.js';
import { ensureArray, getText } from '../../../services/ncbi/parsing/xml-helpers.js';
const FieldSchema = z
.object({
name: z.string().describe('Short field name used in queries'),
fullName: z.string().optional().describe('Full display name'),
description: z.string().optional().describe('Field description'),
})
.describe('Searchable field entry');
const OutputSchema = z.object({
dbName: z.string().describe('Database name'),
description: z.string().optional().describe('Database description'),
count: z.string().optional().describe('Total record count'),
lastUpdate: z.string().optional().describe('Last update timestamp'),
fields: z.array(FieldSchema).optional().describe('Searchable fields available in this database'),
});
export const databaseInfoResource = resource('pubmed://database/info', {
name: 'database-info',
title: 'PubMed Database Info',
description: 'PubMed database metadata including field list, last update date, and record count.',
mimeType: 'application/json',
params: z.object({}),
output: OutputSchema,
async handler(_params, ctx) {
ctx.log.info('Fetching PubMed database info');
const raw = (await getNcbiService().eInfo({ db: 'pubmed' }, { signal: ctx.signal }));
const eInfoResult = (raw.eInfoResult ?? raw);
const dbInfo = (eInfoResult.DbInfo ?? eInfoResult);
const dbName = getText(dbInfo.DbName, 'pubmed');
const description = getText(dbInfo.Description) || undefined;
const count = getText(dbInfo.Count) || undefined;
const lastUpdate = getText(dbInfo.LastUpdate) || undefined;
const fieldListContainer = dbInfo.FieldList;
let fields;
if (fieldListContainer) {
const rawFields = ensureArray(fieldListContainer.Field);
fields = rawFields.map((f) => ({
name: getText(f.Name),
fullName: getText(f.FullName) || undefined,
description: getText(f.Description) || undefined,
}));
}
ctx.log.info('PubMed database info retrieved', {
dbName,
fieldCount: fields?.length ?? 0,
});
return { dbName, description, count, lastUpdate, fields };
},
list: () => ({
resources: [{ uri: 'pubmed://database/info', name: 'PubMed Database Info' }],
}),
});
//# sourceMappingURL=database-info.resource.js.map