Skip to main content
Glama
smaniches

Semantic Scholar MCP Server

by smaniches

semantic_scholar_get_paper

Retrieve academic paper details using identifiers like DOI, arXiv ID, or S2 ID, with options to include citations and references for comprehensive research analysis.

Instructions

Get paper details. Accepts: S2 ID, DOI:xxx, ARXIV:xxx, PMID:xxx, CorpusId:xxx

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
paramsYes

Implementation Reference

  • The main handler function `get_paper_details` for the `semantic_scholar_get_paper` tool. It fetches paper details from the Semantic Scholar API, optionally including citations and references, and formats the output in Markdown or JSON.
    @mcp.tool(name="semantic_scholar_get_paper")
    async def get_paper_details(params: PaperDetailsInput) -> str:
        """Get paper details. Accepts: S2 ID, DOI:xxx, ARXIV:xxx, PMID:xxx, CorpusId:xxx"""
        logger.info(f"Getting paper: {params.paper_id}")
        
        paper = await _make_request("GET", f"paper/{params.paper_id}", params={"fields": ",".join(PAPER_FIELDS)})
        result = {"paper": paper}
        
        if params.include_citations:
            cit = await _make_request("GET", f"paper/{params.paper_id}/citations", params={"fields": ",".join(PAPER_FIELDS), "limit": params.citations_limit})
            result["citations"] = cit.get("data", [])
        if params.include_references:
            ref = await _make_request("GET", f"paper/{params.paper_id}/references", params={"fields": ",".join(PAPER_FIELDS), "limit": params.references_limit})
            result["references"] = ref.get("data", [])
        
        if params.response_format == ResponseFormat.JSON:
            return json.dumps(result, indent=2)
        
        lines = ["## Paper Details", "", _format_paper_markdown(paper)]
        if result.get("citations"):
            lines.extend(["---", f"### Citing Papers ({len(result['citations'])} shown)", ""])
            for c in result["citations"]:
                p = c.get("citingPaper", {})
                if p: lines.append(f"- **{p.get('title', '?')}** ({p.get('year', '')}) - {p.get('citationCount', 0)} citations")
        if result.get("references"):
            lines.extend(["---", f"### References ({len(result['references'])} shown)", ""])
            for r in result["references"]:
                p = r.get("citedPaper", {})
                if p: lines.append(f"- **{p.get('title', '?')}** ({p.get('year', '')}) - {p.get('citationCount', 0)} citations")
        return "\n".join(lines)
  • Pydantic input schema `PaperDetailsInput` used by the tool handler for input validation and type hints.
    class PaperDetailsInput(BaseModel):
        model_config = ConfigDict(str_strip_whitespace=True, extra="forbid")
        paper_id: str = Field(..., description="Paper ID: S2 ID, DOI:xxx, ARXIV:xxx, PMID:xxx, CorpusId:xxx", min_length=1)
        include_citations: bool = Field(default=False, description="Include citing papers")
        include_references: bool = Field(default=False, description="Include referenced papers")
        citations_limit: int = Field(default=10, description="Max citations to return", ge=1, le=100)
        references_limit: int = Field(default=10, description="Max references to return", ge=1, le=100)
        response_format: ResponseFormat = Field(default=ResponseFormat.MARKDOWN, description="Output format")
  • The `@mcp.tool` decorator registers the `get_paper_details` function as the 'semantic_scholar_get_paper' tool with FastMCP.
    @mcp.tool(name="semantic_scholar_get_paper")

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/smaniches/semantic-scholar-mcp'

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