read_crossref_paper
Explains that CrossRef provides metadata only, not full-text papers, and directs users to alternative tools for accessing paper content.
Instructions
CrossRef does NOT support direct paper reading.
CrossRef provides metadata only, not full-text content.
INSTEAD (try in order):
1. read_arxiv_paper(id) - if arXiv preprint
2. read_scihub_paper(doi) - if published before 2023
3. read_semantic_paper(id) - last resort
Args:
paper_id: DOI (e.g., '10.1038/nature12373').
save_path: Unused.
Returns:
Error message explaining alternatives.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| paper_id | Yes | ||
| save_path | No |
Implementation Reference
- paper_find_mcp/server.py:707-725 (handler)Primary handler function for the MCP tool 'read_crossref_paper'. Registered via @mcp.tool() decorator, which also generates the input schema from type hints and docstring. Implements tool logic by delegating to generic _read helper.@mcp.tool() async def read_crossref_paper(paper_id: str, save_path: Optional[str] = None) -> str: """CrossRef does NOT support direct paper reading. CrossRef provides metadata only, not full-text content. INSTEAD (try in order): 1. read_arxiv_paper(id) - if arXiv preprint 2. read_scihub_paper(doi) - if published before 2023 3. read_semantic_paper(id) - last resort Args: paper_id: DOI (e.g., '10.1038/nature12373'). save_path: Unused. Returns: Error message explaining alternatives. """ return await _read('crossref', paper_id, save_path)
- paper_find_mcp/server.py:137-156 (helper)Generic _read helper used by multiple read_*_paper tools. For 'crossref', it retrieves CrossRefSearcher instance and calls its read_paper method, handling exceptions.async def _read( searcher_name: str, paper_id: str, save_path: Optional[str] = None ) -> str: """通用阅读函数""" if save_path is None: save_path = get_download_path() searcher = SEARCHERS.get(searcher_name) if not searcher: return f"Error: Unknown searcher {searcher_name}" try: return searcher.read_paper(paper_id, save_path) except NotImplementedError as e: return str(e) except Exception as e: logger.error(f"Read failed for {searcher_name}: {e}") return f"Error reading paper: {str(e)}"
- Core logic in CrossRefSearcher.read_paper method, which returns a detailed error message explaining that CrossRef only provides metadata, not full-text, and suggests alternatives.def read_paper(self, paper_id: str, save_path: str) -> str: """ CrossRef doesn't provide direct paper content access. Args: paper_id: DOI of the paper save_path: Directory for potential PDF storage (unused) Returns: str: Error message indicating PDF reading is not supported """ message = ("CrossRef papers cannot be read directly through this tool. " "CrossRef is a citation database that provides metadata about academic papers. " "Only metadata and abstracts are available through CrossRef's API. " "To access the full text, please use the paper's DOI or URL to visit the publisher's website.") return message