Skip to main content
Glama
chrismannina

PubMed MCP Server

by chrismannina

advanced_search

Perform complex PubMed searches using multiple criteria, fields, and filters to find specific biomedical literature.

Instructions

Perform complex PubMed searches with multiple criteria

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
search_termsYesComplex search criteria with fields and operators
filtersNoAdditional filters
max_resultsNo

Implementation Reference

  • Main execution logic for advanced_search tool: parses arguments, constructs complex PubMed query with field-specific terms and operators, applies filters (publication types, languages, species), performs search via pubmed_client, formats and returns results using _format_article_summary.
    async def _handle_advanced_search(self, arguments: Dict[str, Any]) -> MCPResponse: """Handle advanced search with multiple criteria.""" try: search_terms = arguments.get("search_terms", []) if not search_terms: return MCPResponse( content=[{"type": "text", "text": "Search terms are required"}], is_error=True ) max_results = arguments.get("max_results", 50) filters = arguments.get("filters", {}) # Build complex query query_parts = [] for i, term_info in enumerate(search_terms): term = term_info.get("term", "") field = term_info.get("field", "all") operator = term_info.get("operator", "AND") if i > 0 else "" if field == "title": field_query = f'"{term}"[Title]' elif field == "abstract": field_query = f'"{term}"[Abstract]' elif field == "author": field_query = f'"{term}"[Author]' elif field == "journal": field_query = f'"{term}"[Journal]' elif field == "mesh": field_query = f'"{term}"[MeSH Terms]' else: field_query = term if i > 0: query_parts.append(f" {operator} ") query_parts.append(f"({field_query})") query = "".join(query_parts) # Apply filters filter_parts = [] if filters.get("publication_types"): type_queries = [f'"{pt}"[Publication Type]' for pt in filters["publication_types"]] filter_parts.append(f"({' OR '.join(type_queries)})") if filters.get("languages"): lang_queries = [f'"{lang}"[Language]' for lang in filters["languages"]] filter_parts.append(f"({' OR '.join(lang_queries)})") if filters.get("species"): if "humans" in [s.lower() for s in filters["species"]]: filter_parts.append("humans[MeSH Terms]") if filter_parts: query += " AND " + " AND ".join(filter_parts) # Perform search search_result = await self.pubmed_client.search_articles( query=query, max_results=max_results, cache=self.cache ) content = [] content.append( { "type": "text", "text": f"**Advanced Search Results**\n\n" f"Query: {query}\n" f"Total Results: {search_result.total_results:,}\n" f"Returned: {search_result.returned_results}\n", } ) for i, article_data in enumerate(search_result.articles, 1): article_text = self._format_article_summary(article_data, i) content.append({"type": "text", "text": article_text}) return MCPResponse(content=content) except Exception as e: logger.error(f"Error in advanced_search: {e}") return MCPResponse( content=[{"type": "text", "text": f"Error: {str(e)}"}], is_error=True )
  • Input schema defining parameters for advanced_search: array of search_terms (with term, field, operator), optional filters object, and max_results.
    { "name": "advanced_search", "description": ("Perform complex PubMed searches with multiple criteria"), "inputSchema": { "type": "object", "properties": { "search_terms": { "type": "array", "items": { "type": "object", "properties": { "term": {"type": "string"}, "field": { "type": "string", "enum": ["title", "abstract", "author", "journal", "mesh", "all"], }, "operator": {"type": "string", "enum": ["AND", "OR", "NOT"]}, }, "required": ["term", "field"], }, "description": ("Complex search criteria with fields and operators"), }, "filters": { "type": "object", "properties": { "publication_types": {"type": "array", "items": {"type": "string"}}, "species": {"type": "array", "items": {"type": "string"}}, "languages": {"type": "array", "items": {"type": "string"}}, "age_groups": {"type": "array", "items": {"type": "string"}}, "sex": {"type": "string", "enum": ["male", "female", "both"]}, }, "description": "Additional filters", }, "max_results": {"type": "integer", "minimum": 1, "maximum": 200, "default": 50}, }, "required": ["search_terms"], }, },
  • Maps tool name 'advanced_search' to its handler method _handle_advanced_search in the tool_handler's routing dictionary.
    handler_map = { "search_pubmed": self._handle_search_pubmed, "get_article_details": self._handle_get_article_details, "search_by_author": self._handle_search_by_author, "find_related_articles": self._handle_find_related_articles, "export_citations": self._handle_export_citations, "search_mesh_terms": self._handle_search_mesh_terms, "search_by_journal": self._handle_search_by_journal, "get_trending_topics": self._handle_get_trending_topics, "analyze_research_trends": self._handle_analyze_research_trends, "compare_articles": self._handle_compare_articles, "get_journal_metrics": self._handle_get_journal_metrics, "advanced_search": self._handle_advanced_search, }

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/chrismannina/pubmed-mcp'

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