Skip to main content
Glama
openags

Paper Search MCP

by openags

download_openaire

Download PDFs for academic papers from OpenAIRE using paper identifiers. Save files to specified directories for research access.

Instructions

Download PDF for a paper from OpenAIRE.

Args: paper_id: OpenAIRE paper identifier. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Path to downloaded PDF or error message.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
paper_idYes
save_pathNo./downloads

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The download_openaire tool handler in the MCP server, which delegates the download task to the OpenAiresearcher instance.
    async def download_openaire(paper_id: str, save_path: str = "./downloads") -> str:
        """Download PDF for a paper from OpenAIRE.
    
        Args:
            paper_id: OpenAIRE paper identifier.
            save_path: Directory to save the PDF (default: './downloads').
        Returns:
            str: Path to downloaded PDF or error message.
        """
        return openaire_searcher.download_pdf(paper_id, save_path)
  • The download_pdf method implementation in the OpenAiresearcher class, which currently raises a NotImplementedError, indicating that this specific tool's functionality is not yet implemented.
    def download_pdf(self, paper_id: str, save_path: str) -> str:
        """
        Download PDF for an OpenAIRE paper.
    
        Note: OpenAIRE provides links to open access versions when available.
    
        Args:
            paper_id: OpenAIRE paper identifier
            save_path: Directory to save the PDF
    
        Returns:
            Path to the saved PDF file
    
        Raises:
            Exception: If download fails or no PDF available
        """
        # Implementation would need to:
        # 1. Fetch paper details to get PDF URL
        # 2. Download the PDF if available
        # 3. Save to specified path
    
        raise NotImplementedError(
            f"{self.__class__.__name__} PDF download not implemented yet. "
            "Use the pdf_url field from search results for direct access."
        )
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but provides minimal behavioral context. It mentions the return value format but doesn't disclose important traits like network dependencies, error conditions beyond 'error message', file system permissions needed for save_path, or whether the operation is idempotent/safe.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized with a clear purpose statement followed by structured parameter and return documentation. Every sentence earns its place, though the formatting with 'Args:' and 'Returns:' sections is slightly more verbose than necessary for pure conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (file download operation), no annotations, and an output schema that only specifies return type as 'str', the description is minimally adequate. It covers basic purpose and parameters but lacks important context about error handling, network behavior, and file system implications that would be helpful for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description provides clear semantic explanations for both parameters: paper_id is identified as an 'OpenAIRE paper identifier' and save_path specifies the directory purpose and default value. This effectively compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Download PDF'), target resource ('paper from OpenAIRE'), and distinguishes it from siblings by specifying the source platform. It uses a precise verb+resource combination that differentiates it from other download_* tools for different repositories.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like other download_* tools or read_openaire_paper. The description mentions only what it does, not when it's appropriate or what prerequisites might be needed (e.g., having a valid paper_id).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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

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