Skip to main content
Glama
flyanima

Open Search MCP

by flyanima

search_pubmed

Find medical and life science literature on PubMed with customizable filters for publication type, date range, and sorting. Ideal for researchers and healthcare professionals seeking precise academic resources.

Instructions

Search PubMed for medical and life science literature

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dateRangeNoDate range filter: all, 1year, 5years, 10yearsall
maxResultsNoMaximum number of articles to return (1-200)
publicationTypeNoFilter by publication type: all, review, clinical_trial, meta_analysis, case_reportall
queryYesSearch query for medical literature (e.g., "COVID-19 treatment", "cancer immunotherapy", "diabetes management")
sortNoSort order: relevance, daterelevance

Implementation Reference

  • The main handler function that executes the 'search_pubmed' tool. It destructures input arguments, calls the PubMedAPIClient.searchPubMed method, processes the response with timing and metadata, and handles errors gracefully.
    execute: async (args: any) => { const { query, maxResults = 20, sort = 'relevance', publicationType = 'all', dateRange = 'all' } = args; try { const startTime = Date.now(); // 使用真正的PubMed API const result = await client.searchPubMed(query, { maxResults, sort, publicationType, dateRange }); const searchTime = Date.now() - startTime; return { success: true, data: { source: 'PubMed API', query, sort, publicationType, dateRange, totalResults: result.count, articles: result.articles, searchTime, timestamp: Date.now(), apiUsed: true, searchMetadata: { database: 'PubMed', searchStrategy: 'E-utilities API', filters: { publicationType: publicationType !== 'all' ? publicationType : null, dateRange: dateRange !== 'all' ? dateRange : null, sort } } } }; } catch (error) { // 如果API失败,提供有用的错误信息 return { success: false, error: `PubMed search failed: ${error instanceof Error ? error.message : String(error)}`, data: { source: 'PubMed', query, articles: [], totalResults: 0, apiUsed: false, suggestions: [ 'Check your internet connection', 'Try simpler search terms', 'Use medical subject headings (MeSH terms)', 'Try again in a few moments' ] } }; } }
  • Input schema defining the parameters for the search_pubmed tool: query (required), maxResults, sort, publicationType, and dateRange with descriptions, defaults, and enums.
    inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Search query for medical literature (e.g., "COVID-19 treatment", "cancer immunotherapy", "diabetes management")' }, maxResults: { type: 'number', description: 'Maximum number of articles to return (1-200)', default: 20, minimum: 1, maximum: 200 }, sort: { type: 'string', description: 'Sort order: relevance, date', default: 'relevance', enum: ['relevance', 'date'] }, publicationType: { type: 'string', description: 'Filter by publication type: all, review, clinical_trial, meta_analysis, case_report', default: 'all', enum: ['all', 'review', 'clinical_trial', 'meta_analysis', 'case_report'] }, dateRange: { type: 'string', description: 'Date range filter: all, 1year, 5years, 10years', default: 'all', enum: ['all', '1year', '5years', '10years'] } }, required: ['query'] },
  • src/index.ts:230-230 (registration)
    Call to registerPubMedTools which registers the search_pubmed tool into the main ToolRegistry.
    registerPubMedTools(this.toolRegistry); // 1 tool: search_pubmed
  • The registry.registerTool call that defines and registers the search_pubmed tool including name, description, schema, and execute handler.
    name: 'search_pubmed', description: 'Search PubMed for medical and life science literature', category: 'academic', source: 'PubMed', inputSchema: { type: 'object', properties: { query: { type: 'string', description: 'Search query for medical literature (e.g., "COVID-19 treatment", "cancer immunotherapy", "diabetes management")' }, maxResults: { type: 'number', description: 'Maximum number of articles to return (1-200)', default: 20, minimum: 1, maximum: 200 }, sort: { type: 'string', description: 'Sort order: relevance, date', default: 'relevance', enum: ['relevance', 'date'] }, publicationType: { type: 'string', description: 'Filter by publication type: all, review, clinical_trial, meta_analysis, case_report', default: 'all', enum: ['all', 'review', 'clinical_trial', 'meta_analysis', 'case_report'] }, dateRange: { type: 'string', description: 'Date range filter: all, 1year, 5years, 10years', default: 'all', enum: ['all', '1year', '5years', '10years'] } }, required: ['query'] }, execute: async (args: any) => { const { query, maxResults = 20, sort = 'relevance', publicationType = 'all', dateRange = 'all' } = args; try { const startTime = Date.now(); // 使用真正的PubMed API const result = await client.searchPubMed(query, { maxResults, sort, publicationType, dateRange }); const searchTime = Date.now() - startTime; return { success: true, data: { source: 'PubMed API', query, sort, publicationType, dateRange, totalResults: result.count, articles: result.articles, searchTime, timestamp: Date.now(), apiUsed: true, searchMetadata: { database: 'PubMed', searchStrategy: 'E-utilities API', filters: { publicationType: publicationType !== 'all' ? publicationType : null, dateRange: dateRange !== 'all' ? dateRange : null, sort } } } }; } catch (error) { // 如果API失败,提供有用的错误信息 return { success: false, error: `PubMed search failed: ${error instanceof Error ? error.message : String(error)}`, data: { source: 'PubMed', query, articles: [], totalResults: 0, apiUsed: false, suggestions: [ 'Check your internet connection', 'Try simpler search terms', 'Use medical subject headings (MeSH terms)', 'Try again in a few moments' ] } }; } } });
  • The searchPubMed method in PubMedAPIClient class that handles the core API calls to PubMed ESearch and ESummary endpoints, applies filters for date and publication type, parses results.
    async searchPubMed(query: string, options: any = {}) { // 第一步:搜索获取PMID列表 const searchParams = { db: 'pubmed', term: query, retmax: options.maxResults || 20, sort: options.sort === 'date' ? 'pub_date' : 'relevance', datetype: 'pdat' }; // 添加日期过滤 if (options.dateRange && options.dateRange !== 'all') { const now = new Date(); let startDate; switch (options.dateRange) { case '1year': startDate = new Date(now.getFullYear() - 1, now.getMonth(), now.getDate()); break; case '5years': startDate = new Date(now.getFullYear() - 5, now.getMonth(), now.getDate()); break; case '10years': startDate = new Date(now.getFullYear() - 10, now.getMonth(), now.getDate()); break; } if (startDate) { const startDateStr = startDate.toISOString().split('T')[0].replace(/-/g, '/'); const endDateStr = now.toISOString().split('T')[0].replace(/-/g, '/'); searchParams.term += ` AND ("${startDateStr}"[Date - Publication] : "${endDateStr}"[Date - Publication])`; } } // 添加出版物类型过滤 if (options.publicationType && options.publicationType !== 'all') { const typeMap: Record<string, string> = { 'review': 'Review[Publication Type]', 'clinical_trial': 'Clinical Trial[Publication Type]', 'meta_analysis': 'Meta-Analysis[Publication Type]', 'case_report': 'Case Reports[Publication Type]' }; const pubType = options.publicationType as string; if (typeMap[pubType]) { searchParams.term += ` AND ${typeMap[pubType]}`; } } const searchResult = await this.makeRequest('esearch.fcgi', searchParams); if (!searchResult.esearchresult || !searchResult.esearchresult.idlist || searchResult.esearchresult.idlist.length === 0) { return { articles: [], count: 0 }; } const pmids = searchResult.esearchresult.idlist; // 第二步:获取详细信息 const summaryParams = { db: 'pubmed', id: pmids.join(','), retmode: 'json' }; const summaryResult = await this.makeRequest('esummary.fcgi', summaryParams); return { articles: this.parseSummaryResult(summaryResult), count: parseInt(searchResult.esearchresult.count) || 0 }; }

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/flyanima/open-search-mcp'

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