Skip to main content
Glama
emi-dm

ArxivSearcher MCP Server

by emi-dm

search_by_author

Find academic papers by a specific author on arXiv, with options to filter by category, date range, and limit results.

Instructions

Search papers by a specific author.

:param author_name: Name of the author to search for :param max_results: Maximum number of results :param category: Optional category filter (e.g., 'cs.SE', 'cs.AI') :param start_date: Optional start date filter (YYYY-MM-DD or YYYY) :param end_date: Optional end date filter (YYYY-MM-DD or YYYY)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
author_nameYes
max_resultsNo
categoryNo
start_dateNo
end_dateNo

Implementation Reference

  • Primary synchronous handler for the 'search_by_author' MCP tool. Constructs arXiv query using 'au:"author"' and optional filters, fetches results, and formats them into a dictionary.
    def search_by_author(
        author_name: str,
        max_results: int = 20,
        category: str | None = None,
        start_date: str | None = None,
        end_date: str | None = None,
    ) -> dict:
        """
        Search papers by a specific author.
    
        :param author_name: Name of the author to search for
        :param max_results: Maximum number of results
        :param category: Optional category filter (e.g., 'cs.SE', 'cs.AI')
        :param start_date: Optional start date filter (YYYY-MM-DD or YYYY)
        :param end_date: Optional end date filter (YYYY-MM-DD or YYYY)
        """
        query_parts = [f'au:"{author_name}"']
    
        if category:
            query_parts.append(f"cat:{category}")
    
        # Add date range if specified
        if start_date or end_date:
            start = "19910814"
            if start_date:
                try:
                    dt = datetime.strptime(start_date, "%Y-%m-%d")
                except ValueError:
                    dt = datetime.strptime(start_date, "%Y")
                start = dt.strftime("%Y%m%d")
    
            end = datetime.now().strftime("%Y%m%d")
            if end_date:
                try:
                    dt = datetime.strptime(end_date, "%Y-%m-%d")
                except ValueError:
                    dt = datetime.strptime(end_date, "%Y")
                    dt = dt.replace(month=12, day=31)
                end = dt.strftime("%Y%m%d")
    
            query_parts.append(f"submittedDate:[{start} TO {end}]")
    
        final_query = " AND ".join(query_parts)
        print(f"[arxiv-search] Author query: {final_query}")
    
        search = arxiv.Search(
            query=final_query,
            max_results=max_results,
            sort_by=arxiv.SortCriterion.SubmittedDate,
            sort_order=arxiv.SortOrder.Descending,
        )
    
        results = []
        for r in search.results():
            results.append(
                {
                    "title": r.title,
                    "authors": [a.name for a in r.authors],
                    "summary": r.summary,
                    "pdf_url": r.pdf_url,
                    "published_date": r.published.strftime("%Y-%m-%d"),
                    "arxiv_id": r.entry_id.split("/")[-1],
                    "categories": r.categories,
                }
            )
    
        return {
            "author": author_name,
            "query_used": final_query,
            "total_results": len(results),
            "results": results,
        }
  • Asynchronous handler for the 'search_by_author' MCP tool in the remote version. Identical logic to the synchronous version but async.
    async def search_by_author(
        author_name: str,
        max_results: int = 20,
        category: str | None = None,
        start_date: str | None = None,
        end_date: str | None = None,
    ) -> dict:
        """
        Search papers by a specific author.
    
        :param author_name: Name of the author to search for
        :param max_results: Maximum number of results
        :param category: Optional category filter (e.g., 'cs.SE', 'cs.AI')
        :param start_date: Optional start date filter (YYYY-MM-DD or YYYY)
        :param end_date: Optional end date filter (YYYY-MM-DD or YYYY)
        """
        query_parts = [f'au:"{author_name}"']
    
        if category:
            query_parts.append(f"cat:{category}")
    
        # Add date range if specified
        if start_date or end_date:
            start = "19910814"
            if start_date:
                try:
                    dt = datetime.strptime(start_date, "%Y-%m-%d")
                except ValueError:
                    dt = datetime.strptime(start_date, "%Y")
                start = dt.strftime("%Y%m%d")
    
            end = datetime.now().strftime("%Y%m%d")
            if end_date:
                try:
                    dt = datetime.strptime(end_date, "%Y-%m-%d")
                except ValueError:
                    dt = datetime.strptime(end_date, "%Y")
                    dt = dt.replace(month=12, day=31)
                end = dt.strftime("%Y%m%d")
    
            query_parts.append(f"submittedDate:[{start} TO {end}]")
    
        final_query = " AND ".join(query_parts)
        print(f"[arxiv-search] Author query: {final_query}")
    
        search = arxiv.Search(
            query=final_query,
            max_results=max_results,
            sort_by=arxiv.SortCriterion.SubmittedDate,
            sort_order=arxiv.SortOrder.Descending,
        )
    
        results = []
        for r in search.results():
            results.append(
                {
                    "title": r.title,
                    "authors": [a.name for a in r.authors],
                    "summary": r.summary,
                    "pdf_url": r.pdf_url,
                    "published_date": r.published.strftime("%Y-%m-%d"),
                    "arxiv_id": r.entry_id.split("/")[-1],
                    "categories": r.categories,
                }
            )
    
        return {
            "author": author_name,
            "query_used": final_query,
            "total_results": len(results),
            "results": results,
        }
  • Helper prompt generator named 'search_by_author' that creates a natural language prompt string for searching papers by author.
    def search_by_author(author_name: str) -> str:
        """Generates a prompt to search for papers by an author."""
        return f"Search for the latest papers by '{author_name}' on Arxiv."
  • Helper prompt generator named 'search_by_author' that creates a natural language prompt string for searching papers by author.
    def search_by_author(author_name: str) -> str:
        """Generates a prompt to search for papers by an author."""
        return f"Search for the latest papers by '{author_name}' on Arxiv."

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/emi-dm/Arxiv-MCP'

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