
Paper Mcp
Three academic search engines behind one MCP interface. You get arXiv with full-text retrieval in markdown, HTML, or raw LaTeX source; Semantic Scholar's citation graph, author lookup, and recommendations; and OpenAlex's 316M cross-discipline catalog with institution and topic filters. The unified search_all tool fans out to all three, deduplicates by DOI, and re-ranks with reciprocal rank fusion. Bonus: image to LaTeX OCR for turning formula or table screenshots back into source code, backed by DeepSeek-OCR and texify models. Reach for this when you need programmatic paper discovery plus the actual manuscript text, not just metadata. Hosted at latex-tools.online or run locally with FastMCP.
- GitHub stars
- 1
- tools
- 41
- transport
- HTTP
- last updated
- Jun 17, 2026
Install
From registry metadata$ npx add-mcp https://latex-tools.online/mcp --name paper-mcpRun in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.
Review the command, arguments and environment values before installing. MCP servers run with your local permissions.
Other ways
Claude Code
$ claude mcp add --transport http paper-mcp https://latex-tools.online/mcpRun in your terminal. Add --scope user to make it available in every project.
Tools
Verified live · 41 toolsVerified live against the running server on Nov 6, 2026.
search_papersSearch academic papers. Returns normalized hits with a short abstract preview; call get_paper for the full record.5 params
Search academic papers. Returns normalized hits with a short abstract preview; call get_paper for the full record.
max_resultsintegerquery*stringsort_bystringsourcestringstartintegersearch_allAggregated search across arXiv, Semantic Scholar and OpenAlex at once. Fans out concurrently, de-duplicates the same work across corpora (by DOI or title) and re-ranks with Reciprocal Rank Fusion, so papers found by several sources rank highest. Each hit lists which `sources`...4 params
Aggregated search across arXiv, Semantic Scholar and OpenAlex at once. Fans out concurrently, de-duplicates the same work across corpora (by DOI or title) and re-ranks with Reciprocal Rank Fusion, so papers found by several sources rank highest. Each hit lists which `sources`...
max_resultsintegerper_sourceintegerquery*stringsourcesstringsearch_medicalEvidence-graded MEDICAL literature search (PubMed + Europe PMC). Unlike search_all (generic, ranks high-cited reviews/guidelines above trials), this filters by research type via PubMed Publication-Type tags and re-ranks by the evidence pyramid (meta-analysis / systematic revie...5 params
Evidence-graded MEDICAL literature search (PubMed + Europe PMC). Unlike search_all (generic, ranks high-cited reviews/guidelines above trials), this filters by research type via PubMed Publication-Type tags and re-ranks by the evidence pyramid (meta-analysis / systematic revie...
fetch_fulltextbooleanmax_resultsintegerquery*stringstudy_typesstringyear_fromintegerget_paperFetch one paper by id, with full abstract and PDF link.2 params
Fetch one paper by id, with full abstract and PDF link.
paper_id*stringsourcestringsearch_by_authorFind papers by a specific author, newest first.4 params
Find papers by a specific author, newest first.
author*stringmax_resultsintegersourcestringstartintegerlist_recentList the latest papers in a subject category, newest first.4 params
List the latest papers in a subject category, newest first.
category*stringmax_resultsintegersourcestringstartintegerlist_categoriesList common subject category codes for filtering/recent.1 params
List common subject category codes for filtering/recent.
sourcestringread_paperRead a paper's full text. format='markdown' (default, body with formulas as $LaTeX$), 'html' (raw LaTeXML HTML), or 'latex' (the original LaTeX manuscript from the e-print source). arXiv only; id like 2401.01234.3 params
Read a paper's full text. format='markdown' (default, body with formulas as $LaTeX$), 'html' (raw LaTeXML HTML), or 'latex' (the original LaTeX manuscript from the e-print source). arXiv only; id like 2401.01234.
formatstringpaper_id*stringsourcestringlist_paper_sourcesList available paper corpora.
List available paper corpora.
No parameters. Call it with no arguments.
recognize_formulaRecognize a math formula from an image and return LaTeX. Provide image_url (downloaded server-side) OR image_base64. model: deepseek-ocr (default), paddleocr-vl, or texify. Returns {latex, model, elapsed_ms}.3 params
Recognize a math formula from an image and return LaTeX. Provide image_url (downloaded server-side) OR image_base64. model: deepseek-ocr (default), paddleocr-vl, or texify. Returns {latex, model, elapsed_ms}.
image_base64stringimage_urlstringmodelstringrecognize_tableRecognize a table from an image and return LaTeX tabular code. Provide image_url OR image_base64. model: deepseek-ocr (default), paddleocr-vl, or texify. Returns {latex, model, elapsed_ms}.3 params
Recognize a table from an image and return LaTeX tabular code. Provide image_url OR image_base64. model: deepseek-ocr (default), paddleocr-vl, or texify. Returns {latex, model, elapsed_ms}.
image_base64stringimage_urlstringmodelstringlist_ocr_modelsList the OCR models available for recognize_formula / recognize_table.
List the OCR models available for recognize_formula / recognize_table.
No parameters. Call it with no arguments.
lint_latexLint a LaTeX snippet: report errors and return an auto-fixed version. Input `code` (the LaTeX source). Returns {errors, fixed_code, summary_en, summary_zh, elapsed_ms}.1 params
Lint a LaTeX snippet: report errors and return an auto-fixed version. Input `code` (the LaTeX source). Returns {errors, fixed_code, summary_en, summary_zh, elapsed_ms}.
code*stringextract_pdfExtract a PDF to clean Markdown/LaTeX text via MinerU (great for papers behind no open-access full text — give the user's PDF and get readable text back). Provide pdf_url (downloaded server-side, SSRF-guarded) OR pdf_base64. formula/table toggle math/table reconstruction. Retu...4 params
Extract a PDF to clean Markdown/LaTeX text via MinerU (great for papers behind no open-access full text — give the user's PDF and get readable text back). Provide pdf_url (downloaded server-side, SSRF-guarded) OR pdf_base64. formula/table toggle math/table reconstruction. Retu...
formulabooleanpdf_base64stringpdf_urlstringtablebooleanextract_pdf_resultFetch the result of an extract_pdf job by task_id. Returns {task_id, status, content, chars}: `content` is the extracted text once status='done'; while still 'running' content is null — call again shortly. Results expire server-side, so fetch reasonably soon.1 params
Fetch the result of an extract_pdf job by task_id. Returns {task_id, status, content, chars}: `content` is the extracted text once status='done'; while still 'running' content is null — call again shortly. Results expire server-side, so fetch reasonably soon.
task_id*stringget_paper_citationsSemantic Scholar: papers that CITE this one (forward citation graph). id accepts S2 id / DOI: / ARXIV: / CorpusId:.3 params
Semantic Scholar: papers that CITE this one (forward citation graph). id accepts S2 id / DOI: / ARXIV: / CorpusId:.
max_resultsintegerpaper_id*stringstartintegerget_paper_referencesSemantic Scholar: papers this one REFERENCES (its bibliography). id accepts S2 id / DOI: / ARXIV: / CorpusId:.3 params
Semantic Scholar: papers this one REFERENCES (its bibliography). id accepts S2 id / DOI: / ARXIV: / CorpusId:.
max_resultsintegerpaper_id*stringstartintegerget_paper_authorsSemantic Scholar: the authors of a paper (with h-index, paper/citation counts).3 params
Semantic Scholar: the authors of a paper (with h-index, paper/citation counts).
max_resultsintegerpaper_id*stringstartintegermatch_paper_titleSemantic Scholar: find the single paper whose title best matches the given text (exact-match lookup).1 params
Semantic Scholar: find the single paper whose title best matches the given text (exact-match lookup).
title*stringautocomplete_papersSemantic Scholar: autocomplete paper titles for a partial query (fast type-ahead).1 params
Semantic Scholar: autocomplete paper titles for a partial query (fast type-ahead).
query*stringsearch_papers_bulkSemantic Scholar: bulk paper search (up to 1000 hits, sortable e.g. 'citationCount:desc' or 'publicationDate:desc', with a continuation token). Filters: fields_of_study, year (e.g. '2020-2024'), venue, publication_types, open_access_pdf.9 params
Semantic Scholar: bulk paper search (up to 1000 hits, sortable e.g. 'citationCount:desc' or 'publicationDate:desc', with a continuation token). Filters: fields_of_study, year (e.g. '2020-2024'), venue, publication_types, open_access_pdf.
fields_of_studystringmax_resultsintegeropen_access_pdfbooleanpublication_typesstringquery*stringsortstringtokenstringvenuestringyearstringget_papers_batchSemantic Scholar: fetch many papers at once by id (S2/DOI:/ARXIV:/CorpusId:), up to ~500 per call.1 params
Semantic Scholar: fetch many papers at once by id (S2/DOI:/ARXIV:/CorpusId:), up to ~500 per call.
ids*arraysearch_authorsSemantic Scholar: search for authors by name; returns profiles with h-index and paper/citation counts.3 params
Semantic Scholar: search for authors by name; returns profiles with h-index and paper/citation counts.
max_resultsintegerquery*stringstartintegerget_authorSemantic Scholar: a single author's profile by id.1 params
Semantic Scholar: a single author's profile by id.
author_id*stringget_author_papersSemantic Scholar: all papers by a given author id, newest first.3 params
Semantic Scholar: all papers by a given author id, newest first.
author_id*stringmax_resultsintegerstartintegerget_authors_batchSemantic Scholar: fetch many authors at once by id.1 params
Semantic Scholar: fetch many authors at once by id.
ids*arraysearch_snippetsSemantic Scholar: search INSIDE paper full text and return matching text snippets (not just titles/abstracts).2 params
Semantic Scholar: search INSIDE paper full text and return matching text snippets (not just titles/abstracts).
max_resultsintegerquery*stringrecommend_papers_for_paperSemantic Scholar: recommend papers similar to one paper. pool='recent' (last open corpus) or 'all-cs' (all of CS). If the 'recent' pool yields nothing (common for older papers), it automatically retries the 'all-cs' pool.3 params
Semantic Scholar: recommend papers similar to one paper. pool='recent' (last open corpus) or 'all-cs' (all of CS). If the 'recent' pool yields nothing (common for older papers), it automatically retries the 'all-cs' pool.
max_resultsintegerpaper_id*stringpoolstringrecommend_papers_from_examplesSemantic Scholar: recommend papers from positive (and optional negative) example paper ids.3 params
Semantic Scholar: recommend papers from positive (and optional negative) example paper ids.
max_resultsintegernegative_idsvaluepositive_ids*arraylist_dataset_releasesSemantic Scholar Datasets: list all available release ids (dated snapshots of the full corpus).
Semantic Scholar Datasets: list all available release ids (dated snapshots of the full corpus).
No parameters. Call it with no arguments.
get_dataset_releaseSemantic Scholar Datasets: which datasets a release contains (papers, abstracts, citations, embeddings, s2orc, tldrs…). release_id defaults to 'latest'.1 params
Semantic Scholar Datasets: which datasets a release contains (papers, abstracts, citations, embeddings, s2orc, tldrs…). release_id defaults to 'latest'.
release_idstringget_dataset_download_linksSemantic Scholar Datasets: get download links (presigned URLs) for one dataset in a release. Needs the API key.2 params
Semantic Scholar Datasets: get download links (presigned URLs) for one dataset in a release. Needs the API key.
dataset_name*stringrelease_idstringget_dataset_diffsSemantic Scholar Datasets: incremental diff (added/updated/deleted) for a dataset between two releases. Needs the key.3 params
Semantic Scholar Datasets: incremental diff (added/updated/deleted) for a dataset between two releases. Needs the key.
dataset_name*stringend_releasestringstart_release*stringget_openalex_workOpenAlex: fetch one work's full record (316M-work, all-field corpus). id accepts OpenAlex Wxxxx, a DOI, or an arXiv id.1 params
OpenAlex: fetch one work's full record (316M-work, all-field corpus). id accepts OpenAlex Wxxxx, a DOI, or an arXiv id.
work_id*stringget_openalex_citationsOpenAlex: papers that CITE this work (forward citation graph), most-cited first.3 params
OpenAlex: papers that CITE this work (forward citation graph), most-cited first.
max_resultsintegerstartintegerwork_id*stringget_openalex_referencesOpenAlex: the works this one REFERENCES (its bibliography).2 params
OpenAlex: the works this one REFERENCES (its bibliography).
max_resultsintegerwork_id*stringsearch_openalex_authorsOpenAlex: search authors; returns profiles with h-index, i10-index, works/citation counts and institutions.3 params
OpenAlex: search authors; returns profiles with h-index, i10-index, works/citation counts and institutions.
max_resultsintegerquery*stringstartintegersearch_openalex_institutionsOpenAlex: search institutions (universities, labs) with ROR id, country, works/citation counts.2 params
OpenAlex: search institutions (universities, labs) with ROR id, country, works/citation counts.
max_resultsintegerquery*stringsearch_openalex_worksOpenAlex: advanced filtered work search. Filters: from_year, to_year, is_oa (open access only), min_citations, institution_id. sort_by: relevance|newest|cited.8 params
OpenAlex: advanced filtered work search. Filters: from_year, to_year, is_oa (open access only), min_citations, institution_id. sort_by: relevance|newest|cited.
from_yearintegerinstitution_idstringis_oabooleanmax_resultsintegermin_citationsintegerquerystringsort_bystringto_yearintegerget_openalex_trendsOpenAlex: publication-trend analytics for a query — counts grouped by year (default), or by 'institutions.id', 'authorships.author.id', 'open_access.is_oa', 'type', 'language'. Returns aggregate counts only (cheap, no rows).2 params
OpenAlex: publication-trend analytics for a query — counts grouped by year (default), or by 'institutions.id', 'authorships.author.id', 'open_access.is_oa', 'type', 'language'. Returns aggregate counts only (cheap, no rows).
group_bystringquery*stringlist_openalex_topicsOpenAlex: search the topic taxonomy (~4500 topics) to find the right subject term for filtering or recent-work queries.2 params
OpenAlex: search the topic taxonomy (~4500 topics) to find the right subject term for filtering or recent-work queries.
max_resultsintegerquery*stringSponsors
Readme
paper-mcp
Remotely-callable MCP server for academic paper search, full-text retrieval & image→LaTeX, served at https://latex-tools.online/mcp.
Four corpora behind one normalized interface:
arxiv(default) — search, metadata, and full-text (HTML / markdown / LaTeX source)semanticscholar(aliass2) — the full S2 API surface: citation graph, authors, recommendations, full-text snippets, bulk datasetsopenalex(aliasoa) — 316M all-field works: citation graph, authors with h-index, institutions, topics, influence metricsyongleji(aliasyl) — Yongleji, ~465M works; relevance search is semantic and understands questions in Chinese or English
Plus a unified search_all that fuses all four corpora, image→LaTeX OCR, and LaTeX lint + PDF→text tooling.
Tools (41)
Details
- Repository
- github.com/mcpservings/paper-mcp
- Website
- latex-tools.online/mcp
- Categories
- Documents & Knowledge, Search & Web Crawling
- Transport
- HTTP
- Registry
- MCP registry, active
- Tools verified
- Nov 6, 2026