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
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string | |
| maxResults | No | Maximum number of results to return | |
| year | No | Publication year filter (e.g., "2023", "2020-2023") | |
| author | No | Author name filter | |
| journal | No | Journal name filter | |
| publicationType | No | Publication type filter (e.g., ["Journal Article", "Review"]) | |
| sortBy | No | Sort results by relevance or date |
Implementation Reference
- src/platforms/PubMedSearcher.ts:160-184 (handler)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'); } }
- src/mcp/handleToolCall.ts:128-151 (handler)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 )}` ); }
- src/mcp/schemas.ts:69-79 (schema)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();
- src/mcp/tools.ts:131-159 (registration)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'] }
- src/mcp/searchers.ts:44-64 (helper)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,