Skip to main content
Glama
h-lu

Paper Search MCP Server

by h-lu

search_iacr

Search for cryptography research papers on the IACR ePrint Archive to find open-access publications on encryption, blockchain, zero-knowledge proofs, and security protocols.

Instructions

Search cryptography papers on IACR ePrint Archive.

USE THIS TOOL WHEN:
- Searching for cryptography or security research
- You need papers on encryption, blockchain, zero-knowledge proofs
- Looking for security protocols, hash functions, signatures

DOMAIN: Cryptography ONLY - encryption, signatures, protocols,
blockchain, secure computation, zero-knowledge, hash functions.

All papers are FREE and open access with PDF download.

WORKFLOW:
1. search_iacr(query) -> get paper_id (e.g., '2024/123')
2. download_iacr(paper_id) or read_iacr_paper(paper_id)

Args:
    query: Crypto terms (e.g., 'zero knowledge', 'homomorphic encryption').
    max_results: Number of results (default: 10).
    fetch_details: Get full metadata per paper (default: True).

Returns:
    List of paper dicts with: paper_id, title, authors, abstract,
    published_date, pdf_url.

Example:
    search_iacr("post-quantum cryptography", max_results=5)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYes
max_resultsNo
fetch_detailsNo

Implementation Reference

  • Primary MCP tool handler for 'search_iacr'. Delegates to IACRSearcher instance via SEARCHERS['iacr'].search() method.
    @mcp.tool()
    async def search_iacr(
        query: str, max_results: int = 10, fetch_details: bool = True
    ) -> List[Dict]:
        """Search cryptography papers on IACR ePrint Archive.
        
        USE THIS TOOL WHEN:
        - Searching for cryptography or security research
        - You need papers on encryption, blockchain, zero-knowledge proofs
        - Looking for security protocols, hash functions, signatures
        
        DOMAIN: Cryptography ONLY - encryption, signatures, protocols,
        blockchain, secure computation, zero-knowledge, hash functions.
        
        All papers are FREE and open access with PDF download.
        
        WORKFLOW:
        1. search_iacr(query) -> get paper_id (e.g., '2024/123')
        2. download_iacr(paper_id) or read_iacr_paper(paper_id)
        
        Args:
            query: Crypto terms (e.g., 'zero knowledge', 'homomorphic encryption').
            max_results: Number of results (default: 10).
            fetch_details: Get full metadata per paper (default: True).
        
        Returns:
            List of paper dicts with: paper_id, title, authors, abstract,
            published_date, pdf_url.
        
        Example:
            search_iacr("post-quantum cryptography", max_results=5)
        """
        searcher = SEARCHERS['iacr']
        try:
            papers = searcher.search(query, max_results, fetch_details)
            return [paper.to_dict() for paper in papers] if papers else []
        except Exception as e:
            logger.error(f"IACR search failed: {e}")
            return []
  • Global SEARCHERS dictionary instantiation including 'iacr': IACRSearcher() used by the handler.
    SEARCHERS = {
        'arxiv': ArxivSearcher(),
        'pubmed': PubMedSearcher(),
        'biorxiv': BioRxivSearcher(),
        'medrxiv': MedRxivSearcher(),
        'google_scholar': GoogleScholarSearcher(),
        'iacr': IACRSearcher(),
        'semantic': SemanticSearcher(),
        'crossref': CrossRefSearcher(),
        'repec': RePECSearcher(),
    }
  • Import of IACRSearcher class.
    from .academic_platforms.iacr import IACRSearcher
  • Core search logic in IACRSearcher.search(): performs HTTP search on eprint.iacr.org, parses HTML results with BeautifulSoup, optionally fetches details per paper.
    def search(
        self, query: str, max_results: int = 10, fetch_details: bool = True
    ) -> List[Paper]:
        """
        Search IACR ePrint Archive
    
        Args:
            query: Search query string
            max_results: Maximum number of results to return
            fetch_details: Whether to fetch detailed information for each paper (slower but more complete)
    
        Returns:
            List[Paper]: List of paper objects
        """
        papers = []
    
        try:
            # Construct search parameters
            params = {"q": query}
    
            # Make request
            response = self.session.get(self.IACR_SEARCH_URL, params=params)
    
            if response.status_code != 200:
                logger.error(f"IACR search failed with status {response.status_code}")
                return papers
    
            # Parse results
            soup = BeautifulSoup(response.text, "html.parser")
    
            # Find all paper entries - they are divs with class "mb-4"
            results = soup.find_all("div", class_="mb-4")
    
            if not results:
                logger.info("No results found for the query")
                return papers
    
            # Process each result
            for i, item in enumerate(results):
                if len(papers) >= max_results:
                    break
    
                logger.info(f"Processing paper {i+1}/{min(len(results), max_results)}")
                paper = self._parse_paper(item, fetch_details=fetch_details)
                if paper:
                    papers.append(paper)
    
        except Exception as e:
            logger.error(f"IACR search error: {e}")
    
        return papers[:max_results]
  • Function signature defines input schema (query:str, max_results:int=10, fetch_details:bool=True) and output List[Dict] for MCP tool schema inference.
    async def search_iacr(
        query: str, max_results: int = 10, fetch_details: bool = True
    ) -> List[Dict]:

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/h-lu/paper-search-mcp'

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