Skip to main content
Glama

search_pubmed

Search biomedical literature from PubMed/MEDLINE to find relevant research articles using filters for year, author, journal, and publication type.

Instructions

Search biomedical literature from PubMed/MEDLINE database using NCBI E-utilities API

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query string
maxResultsNoMaximum number of results to return
yearNoPublication year filter (e.g., "2023", "2020-2023")
authorNoAuthor name filter
journalNoJournal name filter
publicationTypeNoPublication type filter (e.g., ["Journal Article", "Review"])
sortByNoSort results by relevance or date

Implementation Reference

  • Core handler function implementing the search_pubmed tool logic using NCBI E-utilities (ESearch for PMIDs, EFetch for details, with rate limiting, query building, and XML parsing to Paper objects).
    async search(query: string, options: PubMedSearchOptions = {}): Promise<Paper[]> { try { logDebug(`PubMed Search Starting: query="${query}"`, options); // 第一步:使用ESearch获取PMID列表 const pmids = await this.searchPMIDs(query, options); if (pmids.length === 0) { return []; } // 第二步:批量获取详细信息 const papers: Paper[] = []; for (let i = 0; i < pmids.length; i += this.retMax) { const batch = pmids.slice(i, i + this.retMax); const batchPapers = await this.fetchPaperDetails(batch); papers.push(...batchPapers); } return papers; } catch (error: any) { logDebug('PubMed Search Error:', error.message); this.handleHttpError(error, 'search'); } }
  • MCP tool call dispatcher case for 'search_pubmed' that parses args, calls PubMedSearcher.search(), formats response with rate limiter status.
    case 'search_pubmed': { const { query, maxResults, year, author, journal, publicationType, sortBy } = args; const results = await searchers.pubmed.search(query, { maxResults, year, author, journal, publicationType, sortBy }); const rateStatus = searchers.pubmed.getRateLimiterStatus(); const apiKeyStatus = searchers.pubmed.hasApiKey() ? 'configured' : 'not configured'; const rateLimit = searchers.pubmed.hasApiKey() ? '10 requests/second' : '3 requests/second'; return jsonTextResponse( `Found ${results.length} PubMed papers.\n\nAPI Status: ${apiKeyStatus} (${rateLimit})\nRate Limiter: ${rateStatus.availableTokens}/${rateStatus.maxTokens} tokens available\n\n${JSON.stringify( results.map((paper: Paper) => PaperFactory.toDict(paper)), null, 2 )}` ); }
  • Zod schema for validating search_pubmed tool input parameters.
    export const SearchPubMedSchema = z .object({ query: z.string().min(1), maxResults: z.number().int().min(1).max(100).optional().default(10), year: z.string().optional(), author: z.string().optional(), journal: z.string().optional(), publicationType: z.array(z.string()).optional(), sortBy: z.enum(['relevance', 'date']).optional() }) .strip();
  • Tool registration definition including name, description, and JSON schema for MCP server.
    { name: 'search_pubmed', description: 'Search biomedical literature from PubMed/MEDLINE database using NCBI E-utilities API', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Search query string' }, maxResults: { type: 'number', minimum: 1, maximum: 100, description: 'Maximum number of results to return' }, year: { type: 'string', description: 'Publication year filter (e.g., "2023", "2020-2023")' }, author: { type: 'string', description: 'Author name filter' }, journal: { type: 'string', description: 'Journal name filter' }, publicationType: { type: 'array', items: { type: 'string' }, description: 'Publication type filter (e.g., ["Journal Article", "Review"])' }, sortBy: { type: 'string', enum: ['relevance', 'date'], description: 'Sort results by relevance or date' } }, required: ['query'] }
  • Initialization and registration of PubMedSearcher instance in the searchers factory.
    const pubmedSearcher = new PubMedSearcher(process.env.PUBMED_API_KEY); const biorxivSearcher = new BioRxivSearcher('biorxiv'); const medrxivSearcher = new MedRxivSearcher(); const semanticSearcher = new SemanticScholarSearcher(process.env.SEMANTIC_SCHOLAR_API_KEY); const iacrSearcher = new IACRSearcher(); const googleScholarSearcher = new GoogleScholarSearcher(); const sciHubSearcher = new SciHubSearcher(); const scienceDirectSearcher = new ScienceDirectSearcher(process.env.ELSEVIER_API_KEY); const springerSearcher = new SpringerSearcher( process.env.SPRINGER_API_KEY, process.env.SPRINGER_OPENACCESS_API_KEY ); const wileySearcher = new WileySearcher(process.env.WILEY_TDM_TOKEN); const scopusSearcher = new ScopusSearcher(process.env.ELSEVIER_API_KEY); const crossrefSearcher = new CrossrefSearcher(process.env.CROSSREF_MAILTO); searchers = { arxiv: arxivSearcher, webofscience: wosSearcher, pubmed: pubmedSearcher, wos: wosSearcher,

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Dianel555/paper-search-mcp-nodejs'

If you have feedback or need assistance with the MCP directory API, please join our Discord server