academia-mcp 1.9.0__tar.gz → 1.9.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. academia_mcp-1.9.2/PKG-INFO +170 -0
  2. academia_mcp-1.9.2/README.md +136 -0
  3. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/server.py +10 -1
  4. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/__init__.py +5 -1
  5. academia_mcp-1.9.0/academia_mcp/tools/s2_citations.py → academia_mcp-1.9.2/academia_mcp/tools/s2.py +35 -0
  6. academia_mcp-1.9.2/academia_mcp/tools/show_image.py +41 -0
  7. academia_mcp-1.9.2/academia_mcp.egg-info/PKG-INFO +170 -0
  8. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp.egg-info/SOURCES.txt +4 -2
  9. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/pyproject.toml +1 -1
  10. academia_mcp-1.9.0/tests/test_s2_citations.py → academia_mcp-1.9.2/tests/test_s2.py +21 -1
  11. academia_mcp-1.9.2/tests/test_show_image.py +25 -0
  12. academia_mcp-1.9.0/PKG-INFO +0 -122
  13. academia_mcp-1.9.0/README.md +0 -88
  14. academia_mcp-1.9.0/academia_mcp.egg-info/PKG-INFO +0 -122
  15. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/LICENSE +0 -0
  16. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/__init__.py +0 -0
  17. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/__main__.py +0 -0
  18. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/files.py +0 -0
  19. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/latex_templates/agents4science_2025/agents4science_2025.sty +0 -0
  20. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/latex_templates/agents4science_2025/agents4science_2025.tex +0 -0
  21. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/llm.py +0 -0
  22. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/pdf.py +0 -0
  23. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/py.typed +0 -0
  24. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/settings.py +0 -0
  25. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/anthology_search.py +0 -0
  26. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/arxiv_download.py +0 -0
  27. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/arxiv_search.py +0 -0
  28. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/bitflip.py +0 -0
  29. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/document_qa.py +0 -0
  30. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/hf_datasets_search.py +0 -0
  31. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/latex.py +0 -0
  32. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/py.typed +0 -0
  33. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/review.py +0 -0
  34. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/visit_webpage.py +0 -0
  35. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/tools/web_search.py +0 -0
  36. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp/utils.py +0 -0
  37. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp.egg-info/dependency_links.txt +0 -0
  38. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp.egg-info/entry_points.txt +0 -0
  39. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp.egg-info/requires.txt +0 -0
  40. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/academia_mcp.egg-info/top_level.txt +0 -0
  41. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/setup.cfg +0 -0
  42. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_anthology_search.py +0 -0
  43. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_arxiv_download.py +0 -0
  44. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_arxiv_search.py +0 -0
  45. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_bitflip.py +0 -0
  46. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_document_qa.py +0 -0
  47. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_extract_json.py +0 -0
  48. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_hf_dataset_search.py +0 -0
  49. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_latex.py +0 -0
  50. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_review.py +0 -0
  51. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_visit_webpage.py +0 -0
  52. {academia_mcp-1.9.0 → academia_mcp-1.9.2}/tests/test_web_search.py +0 -0
@@ -0,0 +1,170 @@
1
+ Metadata-Version: 2.4
2
+ Name: academia-mcp
3
+ Version: 1.9.2
4
+ Summary: MCP server that provides different tools to search for scientific publications
5
+ Author-email: Ilya Gusev <phoenixilya@gmail.com>
6
+ Project-URL: Homepage, https://github.com/IlyaGusev/academia_mcp
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Requires-Python: >=3.12
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: mcp>=1.10.1
14
+ Requires-Dist: xmltodict>=0.14.0
15
+ Requires-Dist: types-xmltodict>=0.14.0
16
+ Requires-Dist: requests>=2.32.0
17
+ Requires-Dist: types-requests>=2.32.0
18
+ Requires-Dist: pypdf>=5.1.0
19
+ Requires-Dist: beautifulsoup4>=4.12.0
20
+ Requires-Dist: types-beautifulsoup4>=4.12.0
21
+ Requires-Dist: markdownify==0.14.1
22
+ Requires-Dist: acl-anthology==0.5.2
23
+ Requires-Dist: markdown==3.7.0
24
+ Requires-Dist: types-markdown==3.7.0.20250322
25
+ Requires-Dist: huggingface-hub>=0.32.4
26
+ Requires-Dist: fire>=0.7.0
27
+ Requires-Dist: openai>=1.97.1
28
+ Requires-Dist: jinja2>=3.1.6
29
+ Requires-Dist: datasets>=4.0.0
30
+ Requires-Dist: pymupdf>=1.26.4
31
+ Requires-Dist: pillow>=11.3.0
32
+ Requires-Dist: pydantic-settings>=2.6.0
33
+ Dynamic: license-file
34
+
35
+ # Academia MCP
36
+
37
+ [![PyPI](https://img.shields.io/pypi/v/academia-mcp?label=PyPI%20package)](https://pypi.org/project/academia-mcp/)
38
+ [![CI](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml/badge.svg)](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml)
39
+ [![License](https://img.shields.io/github/license/IlyaGusev/academia_mcp)](LICENSE)
40
+ [![smithery badge](https://smithery.ai/badge/@IlyaGusev/academia_mcp)](https://smithery.ai/server/@IlyaGusev/academia_mcp)
41
+ [![Verified on MseeP](https://mseep.ai/badge.svg)](https://mseep.ai/app/e818878b-c3a6-4b3d-a5b4-e54dcd1f1fed)
42
+
43
+ MCP server with tools to search, fetch, analyze, and report on scientific papers and datasets.
44
+
45
+ ### Features
46
+ - ArXiv search and download
47
+ - ACL Anthology search
48
+ - Hugging Face datasets search
49
+ - Semantic Scholar citations and references
50
+ - Web search via Exa, Brave, or Tavily
51
+ - Web page crawler, LaTeX compilation, PDF reading
52
+ - Optional LLM-powered tools for document QA and research proposal workflows
53
+
54
+ ### Requirements
55
+ - Python 3.12+
56
+
57
+ ### Install
58
+ - Using pip (end users):
59
+ ```bash
60
+ pip3 install academia-mcp
61
+ ```
62
+
63
+ - For development (uv + Makefile):
64
+ ```bash
65
+ uv venv .venv
66
+ make install
67
+ ```
68
+
69
+ ### Quickstart
70
+ - Run over HTTP (default transport):
71
+ ```bash
72
+ uv run -m academia_mcp --transport streamable-http
73
+ ```
74
+
75
+ - Run over stdio (for local MCP clients like Claude Desktop):
76
+ ```bash
77
+ python -m academia_mcp --transport stdio
78
+ ```
79
+
80
+ Notes:
81
+ - Transports: `stdio`, `sse`, `streamable-http`.
82
+ - `host`/`port` are used for HTTP transports; ignored for `stdio`. Default port is `5056` (or `PORT`).
83
+
84
+ ### Claude Desktop config
85
+ ```json
86
+ {
87
+ "mcpServers": {
88
+ "academia": {
89
+ "command": "python3",
90
+ "args": [
91
+ "-m",
92
+ "academia_mcp",
93
+ "--transport",
94
+ "stdio"
95
+ ]
96
+ }
97
+ }
98
+ }
99
+ ```
100
+
101
+ ### Available tools (one-liners)
102
+ - `arxiv_search`: Query arXiv with field-specific queries and filters.
103
+ - `arxiv_download`: Fetch a paper by ID and convert to structured text (HTML/PDF modes).
104
+ - `anthology_search`: Search ACL Anthology with fielded queries and optional date filtering.
105
+ - `hf_datasets_search`: Find Hugging Face datasets with filters and sorting.
106
+ - `s2_get_citations`: List papers citing a given arXiv paper (Semantic Scholar Graph).
107
+ - `s2_get_references`: List papers referenced by a given arXiv paper.
108
+ - `visit_webpage`: Fetch and normalize a web page.
109
+ - `web_search`: Unified search wrapper; available when at least one of Exa/Brave/Tavily keys is set.
110
+ - `exa_web_search`, `brave_web_search`, `tavily_web_search`: Provider-specific search.
111
+ - `get_latex_templates_list`, `get_latex_template`: Enumerate and fetch built-in LaTeX templates.
112
+ - `compile_latex`: Compile LaTeX to PDF in `WORKSPACE_DIR`.
113
+ - `read_pdf`: Extract text per page from a PDF.
114
+ - `download_pdf_paper`, `review_pdf_paper`: Download and optionally review PDFs (requires LLM + workspace).
115
+ - `document_qa`: Answer questions over provided document chunks (requires LLM).
116
+ - `extract_bitflip_info`, `generate_research_proposals`, `score_research_proposals`: Research proposal helpers (requires LLM).
117
+
118
+ Availability notes:
119
+ - Set `WORKSPACE_DIR` to enable `compile_latex`, `read_pdf`, `download_pdf_paper`, and `review_pdf_paper`.
120
+ - Set `OPENROUTER_API_KEY` to enable LLM tools (`document_qa`, `review_pdf_paper`, and bitflip tools).
121
+ - Set one or more of `EXA_API_KEY`, `BRAVE_API_KEY`, `TAVILY_API_KEY` to enable `web_search` and provider tools.
122
+
123
+ ### Environment variables
124
+ Set as needed depending on which tools you use:
125
+
126
+ - `OPENROUTER_API_KEY`: required for LLM-related tools.
127
+ - `BASE_URL`: override OpenRouter base URL.
128
+ - `DOCUMENT_QA_MODEL_NAME`: override default model for `document_qa`.
129
+ - `BITFLIP_MODEL_NAME`: override default model for bitflip tools.
130
+ - `TAVILY_API_KEY`: enables Tavily in `web_search`.
131
+ - `EXA_API_KEY`: enables Exa in `web_search` and `visit_webpage`.
132
+ - `BRAVE_API_KEY`: enables Brave in `web_search`.
133
+ - `WORKSPACE_DIR`: directory for generated files (PDFs, temp artifacts).
134
+ - `PORT`: HTTP port (default `5056`).
135
+
136
+ You can put these in a `.env` file in the project root.
137
+
138
+ ### Docker
139
+ Build the image:
140
+ ```bash
141
+ docker build -t academia_mcp .
142
+ ```
143
+
144
+ Run the server (HTTP):
145
+ ```bash
146
+ docker run --rm -p 5056:5056 \
147
+ -e PORT=5056 \
148
+ -e OPENROUTER_API_KEY=your_key_here \
149
+ -e WORKSPACE_DIR=/workspace \
150
+ -v "$PWD/workdir:/workspace" \
151
+ academia_mcp
152
+ ```
153
+
154
+ Or use existing image: `phoenix120/academia_mcp`
155
+
156
+ ### Examples
157
+ - [Comprehensive report screencast (YouTube)](https://www.youtube.com/watch?v=4bweqQcN6w8)
158
+ - [Single paper screencast (YouTube)](https://www.youtube.com/watch?v=IAAPMptJ5k8)
159
+
160
+ ### Makefile targets
161
+ - `make install`: install the package in editable mode with uv
162
+ - `make validate`: run black, flake8, and mypy (strict)
163
+ - `make test`: run the test suite with pytest
164
+ - `make publish`: build and publish using uv
165
+
166
+ ### LaTeX/PDF requirements
167
+ Only needed for LaTeX/PDF tools. Ensure a LaTeX distribution is installed and `pdflatex` is on PATH, as well as `latexmk`. On Debian/Ubuntu:
168
+ ```bash
169
+ sudo apt install texlive-latex-base texlive-fonts-recommended texlive-latex-extra texlive-science latexmk
170
+ ```
@@ -0,0 +1,136 @@
1
+ # Academia MCP
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/academia-mcp?label=PyPI%20package)](https://pypi.org/project/academia-mcp/)
4
+ [![CI](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml/badge.svg)](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml)
5
+ [![License](https://img.shields.io/github/license/IlyaGusev/academia_mcp)](LICENSE)
6
+ [![smithery badge](https://smithery.ai/badge/@IlyaGusev/academia_mcp)](https://smithery.ai/server/@IlyaGusev/academia_mcp)
7
+ [![Verified on MseeP](https://mseep.ai/badge.svg)](https://mseep.ai/app/e818878b-c3a6-4b3d-a5b4-e54dcd1f1fed)
8
+
9
+ MCP server with tools to search, fetch, analyze, and report on scientific papers and datasets.
10
+
11
+ ### Features
12
+ - ArXiv search and download
13
+ - ACL Anthology search
14
+ - Hugging Face datasets search
15
+ - Semantic Scholar citations and references
16
+ - Web search via Exa, Brave, or Tavily
17
+ - Web page crawler, LaTeX compilation, PDF reading
18
+ - Optional LLM-powered tools for document QA and research proposal workflows
19
+
20
+ ### Requirements
21
+ - Python 3.12+
22
+
23
+ ### Install
24
+ - Using pip (end users):
25
+ ```bash
26
+ pip3 install academia-mcp
27
+ ```
28
+
29
+ - For development (uv + Makefile):
30
+ ```bash
31
+ uv venv .venv
32
+ make install
33
+ ```
34
+
35
+ ### Quickstart
36
+ - Run over HTTP (default transport):
37
+ ```bash
38
+ uv run -m academia_mcp --transport streamable-http
39
+ ```
40
+
41
+ - Run over stdio (for local MCP clients like Claude Desktop):
42
+ ```bash
43
+ python -m academia_mcp --transport stdio
44
+ ```
45
+
46
+ Notes:
47
+ - Transports: `stdio`, `sse`, `streamable-http`.
48
+ - `host`/`port` are used for HTTP transports; ignored for `stdio`. Default port is `5056` (or `PORT`).
49
+
50
+ ### Claude Desktop config
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "academia": {
55
+ "command": "python3",
56
+ "args": [
57
+ "-m",
58
+ "academia_mcp",
59
+ "--transport",
60
+ "stdio"
61
+ ]
62
+ }
63
+ }
64
+ }
65
+ ```
66
+
67
+ ### Available tools (one-liners)
68
+ - `arxiv_search`: Query arXiv with field-specific queries and filters.
69
+ - `arxiv_download`: Fetch a paper by ID and convert to structured text (HTML/PDF modes).
70
+ - `anthology_search`: Search ACL Anthology with fielded queries and optional date filtering.
71
+ - `hf_datasets_search`: Find Hugging Face datasets with filters and sorting.
72
+ - `s2_get_citations`: List papers citing a given arXiv paper (Semantic Scholar Graph).
73
+ - `s2_get_references`: List papers referenced by a given arXiv paper.
74
+ - `visit_webpage`: Fetch and normalize a web page.
75
+ - `web_search`: Unified search wrapper; available when at least one of Exa/Brave/Tavily keys is set.
76
+ - `exa_web_search`, `brave_web_search`, `tavily_web_search`: Provider-specific search.
77
+ - `get_latex_templates_list`, `get_latex_template`: Enumerate and fetch built-in LaTeX templates.
78
+ - `compile_latex`: Compile LaTeX to PDF in `WORKSPACE_DIR`.
79
+ - `read_pdf`: Extract text per page from a PDF.
80
+ - `download_pdf_paper`, `review_pdf_paper`: Download and optionally review PDFs (requires LLM + workspace).
81
+ - `document_qa`: Answer questions over provided document chunks (requires LLM).
82
+ - `extract_bitflip_info`, `generate_research_proposals`, `score_research_proposals`: Research proposal helpers (requires LLM).
83
+
84
+ Availability notes:
85
+ - Set `WORKSPACE_DIR` to enable `compile_latex`, `read_pdf`, `download_pdf_paper`, and `review_pdf_paper`.
86
+ - Set `OPENROUTER_API_KEY` to enable LLM tools (`document_qa`, `review_pdf_paper`, and bitflip tools).
87
+ - Set one or more of `EXA_API_KEY`, `BRAVE_API_KEY`, `TAVILY_API_KEY` to enable `web_search` and provider tools.
88
+
89
+ ### Environment variables
90
+ Set as needed depending on which tools you use:
91
+
92
+ - `OPENROUTER_API_KEY`: required for LLM-related tools.
93
+ - `BASE_URL`: override OpenRouter base URL.
94
+ - `DOCUMENT_QA_MODEL_NAME`: override default model for `document_qa`.
95
+ - `BITFLIP_MODEL_NAME`: override default model for bitflip tools.
96
+ - `TAVILY_API_KEY`: enables Tavily in `web_search`.
97
+ - `EXA_API_KEY`: enables Exa in `web_search` and `visit_webpage`.
98
+ - `BRAVE_API_KEY`: enables Brave in `web_search`.
99
+ - `WORKSPACE_DIR`: directory for generated files (PDFs, temp artifacts).
100
+ - `PORT`: HTTP port (default `5056`).
101
+
102
+ You can put these in a `.env` file in the project root.
103
+
104
+ ### Docker
105
+ Build the image:
106
+ ```bash
107
+ docker build -t academia_mcp .
108
+ ```
109
+
110
+ Run the server (HTTP):
111
+ ```bash
112
+ docker run --rm -p 5056:5056 \
113
+ -e PORT=5056 \
114
+ -e OPENROUTER_API_KEY=your_key_here \
115
+ -e WORKSPACE_DIR=/workspace \
116
+ -v "$PWD/workdir:/workspace" \
117
+ academia_mcp
118
+ ```
119
+
120
+ Or use existing image: `phoenix120/academia_mcp`
121
+
122
+ ### Examples
123
+ - [Comprehensive report screencast (YouTube)](https://www.youtube.com/watch?v=4bweqQcN6w8)
124
+ - [Single paper screencast (YouTube)](https://www.youtube.com/watch?v=IAAPMptJ5k8)
125
+
126
+ ### Makefile targets
127
+ - `make install`: install the package in editable mode with uv
128
+ - `make validate`: run black, flake8, and mypy (strict)
129
+ - `make test`: run the test suite with pytest
130
+ - `make publish`: build and publish using uv
131
+
132
+ ### LaTeX/PDF requirements
133
+ Only needed for LaTeX/PDF tools. Ensure a LaTeX distribution is installed and `pdflatex` is on PATH, as well as `latexmk`. On Debian/Ubuntu:
134
+ ```bash
135
+ sudo apt install texlive-latex-base texlive-fonts-recommended texlive-latex-extra texlive-science latexmk
136
+ ```
@@ -10,7 +10,12 @@ from uvicorn.config import LOGGING_CONFIG as UVICORN_LOGGING_CONFIG
10
10
  from academia_mcp.settings import settings
11
11
  from academia_mcp.tools.arxiv_search import arxiv_search
12
12
  from academia_mcp.tools.arxiv_download import arxiv_download
13
- from academia_mcp.tools.s2_citations import s2_get_citations, s2_get_references
13
+ from academia_mcp.tools.s2 import (
14
+ s2_get_citations,
15
+ s2_get_references,
16
+ s2_corpus_id_from_arxiv_id,
17
+ s2_get_info,
18
+ )
14
19
  from academia_mcp.tools.hf_datasets_search import hf_datasets_search
15
20
  from academia_mcp.tools.anthology_search import anthology_search
16
21
  from academia_mcp.tools.document_qa import document_qa
@@ -33,6 +38,7 @@ from academia_mcp.tools.bitflip import (
33
38
  score_research_proposals,
34
39
  )
35
40
  from academia_mcp.tools.review import review_pdf_paper, download_pdf_paper
41
+ from academia_mcp.tools.show_image import show_image
36
42
 
37
43
 
38
44
  def configure_uvicorn_style_logging(level: int = logging.INFO) -> None:
@@ -75,11 +81,14 @@ def run(
75
81
  server.add_tool(arxiv_download)
76
82
  server.add_tool(s2_get_citations)
77
83
  server.add_tool(s2_get_references)
84
+ server.add_tool(s2_corpus_id_from_arxiv_id)
85
+ server.add_tool(s2_get_info)
78
86
  server.add_tool(hf_datasets_search)
79
87
  server.add_tool(anthology_search)
80
88
  server.add_tool(get_latex_template)
81
89
  server.add_tool(get_latex_templates_list)
82
90
  server.add_tool(visit_webpage)
91
+ server.add_tool(show_image)
83
92
 
84
93
  if settings.WORKSPACE_DIR:
85
94
  server.add_tool(compile_latex)
@@ -2,7 +2,7 @@ from .arxiv_search import arxiv_search
2
2
  from .anthology_search import anthology_search
3
3
  from .arxiv_download import arxiv_download
4
4
  from .hf_datasets_search import hf_datasets_search
5
- from .s2_citations import s2_get_references, s2_get_citations
5
+ from .s2 import s2_get_references, s2_get_citations, s2_corpus_id_from_arxiv_id, s2_get_info
6
6
  from .document_qa import document_qa
7
7
  from .latex import (
8
8
  compile_latex,
@@ -14,6 +14,7 @@ from .web_search import web_search, tavily_web_search, exa_web_search, brave_web
14
14
  from .visit_webpage import visit_webpage
15
15
  from .bitflip import extract_bitflip_info, generate_research_proposals, score_research_proposals
16
16
  from .review import review_pdf_paper, download_pdf_paper, review_pdf_paper_by_url
17
+ from .show_image import show_image
17
18
 
18
19
  __all__ = [
19
20
  "arxiv_search",
@@ -21,6 +22,8 @@ __all__ = [
21
22
  "anthology_search",
22
23
  "s2_get_references",
23
24
  "s2_get_citations",
25
+ "s2_corpus_id_from_arxiv_id",
26
+ "s2_get_info",
24
27
  "hf_datasets_search",
25
28
  "document_qa",
26
29
  "compile_latex",
@@ -38,4 +41,5 @@ __all__ = [
38
41
  "review_pdf_paper_by_url",
39
42
  "download_pdf_paper",
40
43
  "read_pdf",
44
+ "show_image",
41
45
  ]
@@ -126,3 +126,38 @@ def s2_get_references(
126
126
  entries = result["data"]
127
127
  total_count = len(result["data"]) + result["offset"]
128
128
  return _format_entries(entries, offset if offset else 0, total_count)
129
+
130
+
131
+ def s2_corpus_id_from_arxiv_id(arxiv_id: str) -> int:
132
+ """
133
+ Get the S2 Corpus ID for a given arXiv ID.
134
+
135
+ Args:
136
+ arxiv_id: The ID of a given arXiv paper.
137
+ """
138
+ assert isinstance(arxiv_id, str), "Error: Your arxiv_id must be a string"
139
+ if "v" in arxiv_id:
140
+ arxiv_id = arxiv_id.split("v")[0]
141
+ paper_url = PAPER_URL_TEMPLATE.format(paper_id=f"arxiv:{arxiv_id}", fields="externalIds")
142
+ response = get_with_retries(paper_url)
143
+ result = response.json()
144
+ return int(result["externalIds"]["CorpusId"])
145
+
146
+
147
+ def s2_get_info(arxiv_id: str) -> str:
148
+ """
149
+ Get the S2 info for a given arXiv ID.
150
+
151
+ Returns a JSON object serialized to a string. The structure is:
152
+ {"title": ..., "authors": ..., "externalIds": ..., "venue": ..., "citationCount": ..., "publicationDate": ...}
153
+ Use `json.loads` to deserialize the result if you want to get specific fields.
154
+
155
+ Args:
156
+ arxiv_id: The ID of a given arXiv paper.
157
+ """
158
+ assert isinstance(arxiv_id, str), "Error: Your arxiv_id must be a string"
159
+ if "v" in arxiv_id:
160
+ arxiv_id = arxiv_id.split("v")[0]
161
+ paper_url = PAPER_URL_TEMPLATE.format(paper_id=f"arxiv:{arxiv_id}", fields=FIELDS)
162
+ response = get_with_retries(paper_url)
163
+ return json.dumps(response.json(), ensure_ascii=False)
@@ -0,0 +1,41 @@
1
+ import base64
2
+ from pathlib import Path
3
+ from io import BytesIO
4
+ from typing import Dict
5
+
6
+ import httpx
7
+ from PIL import Image
8
+
9
+ from academia_mcp.files import get_workspace_dir
10
+ from academia_mcp.settings import settings
11
+
12
+
13
+ def show_image(path: str) -> Dict[str, str]:
14
+ """
15
+ Reads an image from the specified URL or from the current work directory.
16
+ Always call this function at the end of the code block.
17
+ For instance:
18
+ ```python
19
+ show_image("https://example.com/image.png")
20
+ ```
21
+ Do not print it ever, just return as the last expression.
22
+
23
+ Returns an dictionary with a single "image" key.
24
+ Args:
25
+ url: Path to file inside current work directory or web URL
26
+ """
27
+ if path.startswith("http"):
28
+ response = httpx.get(path, timeout=10)
29
+ response.raise_for_status()
30
+ image = Image.open(BytesIO(response.content))
31
+ else:
32
+ assert settings.WORKSPACE_DIR is not None, "WORKSPACE_DIR is not set"
33
+ full_path = Path(path)
34
+ if not full_path.exists():
35
+ full_path = Path(get_workspace_dir()) / path
36
+ assert full_path.exists(), f"Image file {path} does not exist"
37
+ image = Image.open(str(full_path))
38
+ buffer_io = BytesIO()
39
+ image.save(buffer_io, format="PNG")
40
+ img_bytes = buffer_io.getvalue()
41
+ return {"image_base64": base64.b64encode(img_bytes).decode("utf-8")}
@@ -0,0 +1,170 @@
1
+ Metadata-Version: 2.4
2
+ Name: academia-mcp
3
+ Version: 1.9.2
4
+ Summary: MCP server that provides different tools to search for scientific publications
5
+ Author-email: Ilya Gusev <phoenixilya@gmail.com>
6
+ Project-URL: Homepage, https://github.com/IlyaGusev/academia_mcp
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Requires-Python: >=3.12
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: mcp>=1.10.1
14
+ Requires-Dist: xmltodict>=0.14.0
15
+ Requires-Dist: types-xmltodict>=0.14.0
16
+ Requires-Dist: requests>=2.32.0
17
+ Requires-Dist: types-requests>=2.32.0
18
+ Requires-Dist: pypdf>=5.1.0
19
+ Requires-Dist: beautifulsoup4>=4.12.0
20
+ Requires-Dist: types-beautifulsoup4>=4.12.0
21
+ Requires-Dist: markdownify==0.14.1
22
+ Requires-Dist: acl-anthology==0.5.2
23
+ Requires-Dist: markdown==3.7.0
24
+ Requires-Dist: types-markdown==3.7.0.20250322
25
+ Requires-Dist: huggingface-hub>=0.32.4
26
+ Requires-Dist: fire>=0.7.0
27
+ Requires-Dist: openai>=1.97.1
28
+ Requires-Dist: jinja2>=3.1.6
29
+ Requires-Dist: datasets>=4.0.0
30
+ Requires-Dist: pymupdf>=1.26.4
31
+ Requires-Dist: pillow>=11.3.0
32
+ Requires-Dist: pydantic-settings>=2.6.0
33
+ Dynamic: license-file
34
+
35
+ # Academia MCP
36
+
37
+ [![PyPI](https://img.shields.io/pypi/v/academia-mcp?label=PyPI%20package)](https://pypi.org/project/academia-mcp/)
38
+ [![CI](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml/badge.svg)](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml)
39
+ [![License](https://img.shields.io/github/license/IlyaGusev/academia_mcp)](LICENSE)
40
+ [![smithery badge](https://smithery.ai/badge/@IlyaGusev/academia_mcp)](https://smithery.ai/server/@IlyaGusev/academia_mcp)
41
+ [![Verified on MseeP](https://mseep.ai/badge.svg)](https://mseep.ai/app/e818878b-c3a6-4b3d-a5b4-e54dcd1f1fed)
42
+
43
+ MCP server with tools to search, fetch, analyze, and report on scientific papers and datasets.
44
+
45
+ ### Features
46
+ - ArXiv search and download
47
+ - ACL Anthology search
48
+ - Hugging Face datasets search
49
+ - Semantic Scholar citations and references
50
+ - Web search via Exa, Brave, or Tavily
51
+ - Web page crawler, LaTeX compilation, PDF reading
52
+ - Optional LLM-powered tools for document QA and research proposal workflows
53
+
54
+ ### Requirements
55
+ - Python 3.12+
56
+
57
+ ### Install
58
+ - Using pip (end users):
59
+ ```bash
60
+ pip3 install academia-mcp
61
+ ```
62
+
63
+ - For development (uv + Makefile):
64
+ ```bash
65
+ uv venv .venv
66
+ make install
67
+ ```
68
+
69
+ ### Quickstart
70
+ - Run over HTTP (default transport):
71
+ ```bash
72
+ uv run -m academia_mcp --transport streamable-http
73
+ ```
74
+
75
+ - Run over stdio (for local MCP clients like Claude Desktop):
76
+ ```bash
77
+ python -m academia_mcp --transport stdio
78
+ ```
79
+
80
+ Notes:
81
+ - Transports: `stdio`, `sse`, `streamable-http`.
82
+ - `host`/`port` are used for HTTP transports; ignored for `stdio`. Default port is `5056` (or `PORT`).
83
+
84
+ ### Claude Desktop config
85
+ ```json
86
+ {
87
+ "mcpServers": {
88
+ "academia": {
89
+ "command": "python3",
90
+ "args": [
91
+ "-m",
92
+ "academia_mcp",
93
+ "--transport",
94
+ "stdio"
95
+ ]
96
+ }
97
+ }
98
+ }
99
+ ```
100
+
101
+ ### Available tools (one-liners)
102
+ - `arxiv_search`: Query arXiv with field-specific queries and filters.
103
+ - `arxiv_download`: Fetch a paper by ID and convert to structured text (HTML/PDF modes).
104
+ - `anthology_search`: Search ACL Anthology with fielded queries and optional date filtering.
105
+ - `hf_datasets_search`: Find Hugging Face datasets with filters and sorting.
106
+ - `s2_get_citations`: List papers citing a given arXiv paper (Semantic Scholar Graph).
107
+ - `s2_get_references`: List papers referenced by a given arXiv paper.
108
+ - `visit_webpage`: Fetch and normalize a web page.
109
+ - `web_search`: Unified search wrapper; available when at least one of Exa/Brave/Tavily keys is set.
110
+ - `exa_web_search`, `brave_web_search`, `tavily_web_search`: Provider-specific search.
111
+ - `get_latex_templates_list`, `get_latex_template`: Enumerate and fetch built-in LaTeX templates.
112
+ - `compile_latex`: Compile LaTeX to PDF in `WORKSPACE_DIR`.
113
+ - `read_pdf`: Extract text per page from a PDF.
114
+ - `download_pdf_paper`, `review_pdf_paper`: Download and optionally review PDFs (requires LLM + workspace).
115
+ - `document_qa`: Answer questions over provided document chunks (requires LLM).
116
+ - `extract_bitflip_info`, `generate_research_proposals`, `score_research_proposals`: Research proposal helpers (requires LLM).
117
+
118
+ Availability notes:
119
+ - Set `WORKSPACE_DIR` to enable `compile_latex`, `read_pdf`, `download_pdf_paper`, and `review_pdf_paper`.
120
+ - Set `OPENROUTER_API_KEY` to enable LLM tools (`document_qa`, `review_pdf_paper`, and bitflip tools).
121
+ - Set one or more of `EXA_API_KEY`, `BRAVE_API_KEY`, `TAVILY_API_KEY` to enable `web_search` and provider tools.
122
+
123
+ ### Environment variables
124
+ Set as needed depending on which tools you use:
125
+
126
+ - `OPENROUTER_API_KEY`: required for LLM-related tools.
127
+ - `BASE_URL`: override OpenRouter base URL.
128
+ - `DOCUMENT_QA_MODEL_NAME`: override default model for `document_qa`.
129
+ - `BITFLIP_MODEL_NAME`: override default model for bitflip tools.
130
+ - `TAVILY_API_KEY`: enables Tavily in `web_search`.
131
+ - `EXA_API_KEY`: enables Exa in `web_search` and `visit_webpage`.
132
+ - `BRAVE_API_KEY`: enables Brave in `web_search`.
133
+ - `WORKSPACE_DIR`: directory for generated files (PDFs, temp artifacts).
134
+ - `PORT`: HTTP port (default `5056`).
135
+
136
+ You can put these in a `.env` file in the project root.
137
+
138
+ ### Docker
139
+ Build the image:
140
+ ```bash
141
+ docker build -t academia_mcp .
142
+ ```
143
+
144
+ Run the server (HTTP):
145
+ ```bash
146
+ docker run --rm -p 5056:5056 \
147
+ -e PORT=5056 \
148
+ -e OPENROUTER_API_KEY=your_key_here \
149
+ -e WORKSPACE_DIR=/workspace \
150
+ -v "$PWD/workdir:/workspace" \
151
+ academia_mcp
152
+ ```
153
+
154
+ Or use existing image: `phoenix120/academia_mcp`
155
+
156
+ ### Examples
157
+ - [Comprehensive report screencast (YouTube)](https://www.youtube.com/watch?v=4bweqQcN6w8)
158
+ - [Single paper screencast (YouTube)](https://www.youtube.com/watch?v=IAAPMptJ5k8)
159
+
160
+ ### Makefile targets
161
+ - `make install`: install the package in editable mode with uv
162
+ - `make validate`: run black, flake8, and mypy (strict)
163
+ - `make test`: run the test suite with pytest
164
+ - `make publish`: build and publish using uv
165
+
166
+ ### LaTeX/PDF requirements
167
+ Only needed for LaTeX/PDF tools. Ensure a LaTeX distribution is installed and `pdflatex` is on PATH, as well as `latexmk`. On Debian/Ubuntu:
168
+ ```bash
169
+ sudo apt install texlive-latex-base texlive-fonts-recommended texlive-latex-extra texlive-science latexmk
170
+ ```
@@ -28,7 +28,8 @@ academia_mcp/tools/hf_datasets_search.py
28
28
  academia_mcp/tools/latex.py
29
29
  academia_mcp/tools/py.typed
30
30
  academia_mcp/tools/review.py
31
- academia_mcp/tools/s2_citations.py
31
+ academia_mcp/tools/s2.py
32
+ academia_mcp/tools/show_image.py
32
33
  academia_mcp/tools/visit_webpage.py
33
34
  academia_mcp/tools/web_search.py
34
35
  tests/test_anthology_search.py
@@ -40,6 +41,7 @@ tests/test_extract_json.py
40
41
  tests/test_hf_dataset_search.py
41
42
  tests/test_latex.py
42
43
  tests/test_review.py
43
- tests/test_s2_citations.py
44
+ tests/test_s2.py
45
+ tests/test_show_image.py
44
46
  tests/test_visit_webpage.py
45
47
  tests/test_web_search.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "academia-mcp"
7
- version = "1.9.0"
7
+ version = "1.9.2"
8
8
  description = "MCP server that provides different tools to search for scientific publications"
9
9
  readme = "README.md"
10
10
  authors = [
@@ -1,6 +1,11 @@
1
1
  import json
2
2
 
3
- from academia_mcp.tools import s2_get_citations, s2_get_references
3
+ from academia_mcp.tools import (
4
+ s2_get_citations,
5
+ s2_get_references,
6
+ s2_corpus_id_from_arxiv_id,
7
+ s2_get_info,
8
+ )
4
9
 
5
10
 
6
11
  def test_s2_citations_pingpong() -> None:
@@ -22,3 +27,18 @@ def test_s2_citations_reversed() -> None:
22
27
  def test_s2_citations_versions() -> None:
23
28
  citations = json.loads(s2_get_citations("2409.06820v4"))
24
29
  assert citations["total_count"] >= 1
30
+
31
+
32
+ def test_s2_corpus_id_from_arxiv_id() -> None:
33
+ assert s2_corpus_id_from_arxiv_id("2409.06820") == 272593138
34
+
35
+
36
+ def test_s2_get_info() -> None:
37
+ info = json.loads(s2_get_info("2409.06820"))
38
+ assert info["title"] is not None
39
+ assert info["authors"] is not None
40
+ assert info["externalIds"] is not None
41
+ assert info["venue"] is not None
42
+ assert info["citationCount"] is not None
43
+ assert info["publicationDate"] is not None
44
+ assert info["externalIds"]["CorpusId"] == 272593138
@@ -0,0 +1,25 @@
1
+ from io import BytesIO
2
+
3
+ import httpx
4
+ from PIL import Image
5
+
6
+ from academia_mcp.tools import show_image
7
+ from academia_mcp.files import get_workspace_dir
8
+
9
+
10
+ def test_show_image_base(test_image_url: str) -> None:
11
+ result = show_image(test_image_url)
12
+ assert result is not None
13
+ assert "image_base64" in result
14
+ assert result["image_base64"] is not None
15
+
16
+
17
+ def test_show_image_local(test_image_url: str) -> None:
18
+ response = httpx.get(test_image_url, timeout=10)
19
+ response.raise_for_status()
20
+ image = Image.open(BytesIO(response.content))
21
+ image.save(get_workspace_dir() / "test_image.png")
22
+ result = show_image("test_image.png")
23
+ assert result is not None
24
+ assert "image_base64" in result
25
+ assert result["image_base64"] is not None
@@ -1,122 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: academia-mcp
3
- Version: 1.9.0
4
- Summary: MCP server that provides different tools to search for scientific publications
5
- Author-email: Ilya Gusev <phoenixilya@gmail.com>
6
- Project-URL: Homepage, https://github.com/IlyaGusev/academia_mcp
7
- Classifier: Programming Language :: Python :: 3
8
- Classifier: License :: OSI Approved :: MIT License
9
- Classifier: Operating System :: OS Independent
10
- Requires-Python: >=3.12
11
- Description-Content-Type: text/markdown
12
- License-File: LICENSE
13
- Requires-Dist: mcp>=1.10.1
14
- Requires-Dist: xmltodict>=0.14.0
15
- Requires-Dist: types-xmltodict>=0.14.0
16
- Requires-Dist: requests>=2.32.0
17
- Requires-Dist: types-requests>=2.32.0
18
- Requires-Dist: pypdf>=5.1.0
19
- Requires-Dist: beautifulsoup4>=4.12.0
20
- Requires-Dist: types-beautifulsoup4>=4.12.0
21
- Requires-Dist: markdownify==0.14.1
22
- Requires-Dist: acl-anthology==0.5.2
23
- Requires-Dist: markdown==3.7.0
24
- Requires-Dist: types-markdown==3.7.0.20250322
25
- Requires-Dist: huggingface-hub>=0.32.4
26
- Requires-Dist: fire>=0.7.0
27
- Requires-Dist: openai>=1.97.1
28
- Requires-Dist: jinja2>=3.1.6
29
- Requires-Dist: datasets>=4.0.0
30
- Requires-Dist: pymupdf>=1.26.4
31
- Requires-Dist: pillow>=11.3.0
32
- Requires-Dist: pydantic-settings>=2.6.0
33
- Dynamic: license-file
34
-
35
- # Academia MCP
36
-
37
- [![PyPI](https://img.shields.io/pypi/v/codearkt?label=PyPI%20package)](https://pypi.org/project/academia-mcp/)
38
- [![CI](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml/badge.svg)](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml)
39
- [![License](https://img.shields.io/github/license/IlyaGusev/academia_mcp)](LICENSE)
40
- [![smithery badge](https://smithery.ai/badge/@IlyaGusev/academia_mcp)](https://smithery.ai/server/@IlyaGusev/academia_mcp)
41
-
42
- A collection of MCP tools related to the search of scientific papers:
43
- - ArXiv search and download
44
- - ACL Anthology search
45
- - HuggingFact datasets search
46
- - Semantic Scholar citation graphs
47
- - Web search: Exa/Brave/Tavily
48
- - Page crawler
49
-
50
- ## Install
51
-
52
- - Using pip (end users):
53
- ```
54
- pip3 install academia-mcp
55
- ```
56
-
57
- - For development (uv + Makefile):
58
- ```
59
- uv venv .venv
60
- make install
61
- ```
62
-
63
- ## Examples
64
- Comprehensive report screencast: https://www.youtube.com/watch?v=4bweqQcN6w8
65
-
66
- Single paper screencast: https://www.youtube.com/watch?v=IAAPMptJ5k8
67
-
68
-
69
- ## Claude Desktop config
70
- ```
71
- {
72
- "mcpServers": {
73
- "academia": {
74
- "command": "python3",
75
- "args": [
76
- "-m",
77
- "academia_mcp",
78
- "--transport",
79
- "stdio"
80
- ]
81
- }
82
- }
83
- }
84
- ```
85
-
86
- ## Running the server (CLI)
87
-
88
- ```
89
- uv run -m academia_mcp --transport streamable-http
90
- ```
91
-
92
- Notes:
93
- - Transports supported: `stdio`, `sse`, `streamable-http`.
94
- - Host/port are used for HTTP transports; for `stdio` they are ignored.
95
-
96
- ## Makefile targets
97
-
98
- - `make install`: install the package in editable mode with uv.
99
- - `make validate`: run black, flake8, and mypy (strict).
100
- - `make test`: run the test suite with pytest.
101
- - `make publish`: build and publish using uv.
102
-
103
- ## Environment variables
104
-
105
- Set as needed depending on which tools you use:
106
-
107
- - `TAVILY_API_KEY`: enables Tavily in `web_search`.
108
- - `EXA_API_KEY`: enables Exa in `web_search` and `visit_webpage`.
109
- - `BRAVE_API_KEY`: enables Brave in `web_search`.
110
- - `OPENROUTER_API_KEY`: required for `document_qa`.
111
- - `BASE_URL`: override OpenRouter base URL for `document_qa` and bitflip tools.
112
- - `DOCUMENT_QA_MODEL_NAME`: override default model for `document_qa`.
113
- - `BITFLIP_MODEL_NAME`: override default model for bitflip tools.
114
- - `WORKSPACE_DIR`: directory for generated files (PDFs, temp artifacts).
115
-
116
- ## md_to_pdf requirements
117
-
118
- The `md_to_pdf` tool invokes `pdflatex`. Ensure a LaTeX distribution is installed and `pdflatex` is on PATH. On Debian/Ubuntu:
119
-
120
- ```
121
- sudo apt install texlive-latex-base texlive-fonts-recommended texlive-latex-extra texlive-science
122
- ```
@@ -1,88 +0,0 @@
1
- # Academia MCP
2
-
3
- [![PyPI](https://img.shields.io/pypi/v/codearkt?label=PyPI%20package)](https://pypi.org/project/academia-mcp/)
4
- [![CI](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml/badge.svg)](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml)
5
- [![License](https://img.shields.io/github/license/IlyaGusev/academia_mcp)](LICENSE)
6
- [![smithery badge](https://smithery.ai/badge/@IlyaGusev/academia_mcp)](https://smithery.ai/server/@IlyaGusev/academia_mcp)
7
-
8
- A collection of MCP tools related to the search of scientific papers:
9
- - ArXiv search and download
10
- - ACL Anthology search
11
- - HuggingFact datasets search
12
- - Semantic Scholar citation graphs
13
- - Web search: Exa/Brave/Tavily
14
- - Page crawler
15
-
16
- ## Install
17
-
18
- - Using pip (end users):
19
- ```
20
- pip3 install academia-mcp
21
- ```
22
-
23
- - For development (uv + Makefile):
24
- ```
25
- uv venv .venv
26
- make install
27
- ```
28
-
29
- ## Examples
30
- Comprehensive report screencast: https://www.youtube.com/watch?v=4bweqQcN6w8
31
-
32
- Single paper screencast: https://www.youtube.com/watch?v=IAAPMptJ5k8
33
-
34
-
35
- ## Claude Desktop config
36
- ```
37
- {
38
- "mcpServers": {
39
- "academia": {
40
- "command": "python3",
41
- "args": [
42
- "-m",
43
- "academia_mcp",
44
- "--transport",
45
- "stdio"
46
- ]
47
- }
48
- }
49
- }
50
- ```
51
-
52
- ## Running the server (CLI)
53
-
54
- ```
55
- uv run -m academia_mcp --transport streamable-http
56
- ```
57
-
58
- Notes:
59
- - Transports supported: `stdio`, `sse`, `streamable-http`.
60
- - Host/port are used for HTTP transports; for `stdio` they are ignored.
61
-
62
- ## Makefile targets
63
-
64
- - `make install`: install the package in editable mode with uv.
65
- - `make validate`: run black, flake8, and mypy (strict).
66
- - `make test`: run the test suite with pytest.
67
- - `make publish`: build and publish using uv.
68
-
69
- ## Environment variables
70
-
71
- Set as needed depending on which tools you use:
72
-
73
- - `TAVILY_API_KEY`: enables Tavily in `web_search`.
74
- - `EXA_API_KEY`: enables Exa in `web_search` and `visit_webpage`.
75
- - `BRAVE_API_KEY`: enables Brave in `web_search`.
76
- - `OPENROUTER_API_KEY`: required for `document_qa`.
77
- - `BASE_URL`: override OpenRouter base URL for `document_qa` and bitflip tools.
78
- - `DOCUMENT_QA_MODEL_NAME`: override default model for `document_qa`.
79
- - `BITFLIP_MODEL_NAME`: override default model for bitflip tools.
80
- - `WORKSPACE_DIR`: directory for generated files (PDFs, temp artifacts).
81
-
82
- ## md_to_pdf requirements
83
-
84
- The `md_to_pdf` tool invokes `pdflatex`. Ensure a LaTeX distribution is installed and `pdflatex` is on PATH. On Debian/Ubuntu:
85
-
86
- ```
87
- sudo apt install texlive-latex-base texlive-fonts-recommended texlive-latex-extra texlive-science
88
- ```
@@ -1,122 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: academia-mcp
3
- Version: 1.9.0
4
- Summary: MCP server that provides different tools to search for scientific publications
5
- Author-email: Ilya Gusev <phoenixilya@gmail.com>
6
- Project-URL: Homepage, https://github.com/IlyaGusev/academia_mcp
7
- Classifier: Programming Language :: Python :: 3
8
- Classifier: License :: OSI Approved :: MIT License
9
- Classifier: Operating System :: OS Independent
10
- Requires-Python: >=3.12
11
- Description-Content-Type: text/markdown
12
- License-File: LICENSE
13
- Requires-Dist: mcp>=1.10.1
14
- Requires-Dist: xmltodict>=0.14.0
15
- Requires-Dist: types-xmltodict>=0.14.0
16
- Requires-Dist: requests>=2.32.0
17
- Requires-Dist: types-requests>=2.32.0
18
- Requires-Dist: pypdf>=5.1.0
19
- Requires-Dist: beautifulsoup4>=4.12.0
20
- Requires-Dist: types-beautifulsoup4>=4.12.0
21
- Requires-Dist: markdownify==0.14.1
22
- Requires-Dist: acl-anthology==0.5.2
23
- Requires-Dist: markdown==3.7.0
24
- Requires-Dist: types-markdown==3.7.0.20250322
25
- Requires-Dist: huggingface-hub>=0.32.4
26
- Requires-Dist: fire>=0.7.0
27
- Requires-Dist: openai>=1.97.1
28
- Requires-Dist: jinja2>=3.1.6
29
- Requires-Dist: datasets>=4.0.0
30
- Requires-Dist: pymupdf>=1.26.4
31
- Requires-Dist: pillow>=11.3.0
32
- Requires-Dist: pydantic-settings>=2.6.0
33
- Dynamic: license-file
34
-
35
- # Academia MCP
36
-
37
- [![PyPI](https://img.shields.io/pypi/v/codearkt?label=PyPI%20package)](https://pypi.org/project/academia-mcp/)
38
- [![CI](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml/badge.svg)](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml)
39
- [![License](https://img.shields.io/github/license/IlyaGusev/academia_mcp)](LICENSE)
40
- [![smithery badge](https://smithery.ai/badge/@IlyaGusev/academia_mcp)](https://smithery.ai/server/@IlyaGusev/academia_mcp)
41
-
42
- A collection of MCP tools related to the search of scientific papers:
43
- - ArXiv search and download
44
- - ACL Anthology search
45
- - HuggingFact datasets search
46
- - Semantic Scholar citation graphs
47
- - Web search: Exa/Brave/Tavily
48
- - Page crawler
49
-
50
- ## Install
51
-
52
- - Using pip (end users):
53
- ```
54
- pip3 install academia-mcp
55
- ```
56
-
57
- - For development (uv + Makefile):
58
- ```
59
- uv venv .venv
60
- make install
61
- ```
62
-
63
- ## Examples
64
- Comprehensive report screencast: https://www.youtube.com/watch?v=4bweqQcN6w8
65
-
66
- Single paper screencast: https://www.youtube.com/watch?v=IAAPMptJ5k8
67
-
68
-
69
- ## Claude Desktop config
70
- ```
71
- {
72
- "mcpServers": {
73
- "academia": {
74
- "command": "python3",
75
- "args": [
76
- "-m",
77
- "academia_mcp",
78
- "--transport",
79
- "stdio"
80
- ]
81
- }
82
- }
83
- }
84
- ```
85
-
86
- ## Running the server (CLI)
87
-
88
- ```
89
- uv run -m academia_mcp --transport streamable-http
90
- ```
91
-
92
- Notes:
93
- - Transports supported: `stdio`, `sse`, `streamable-http`.
94
- - Host/port are used for HTTP transports; for `stdio` they are ignored.
95
-
96
- ## Makefile targets
97
-
98
- - `make install`: install the package in editable mode with uv.
99
- - `make validate`: run black, flake8, and mypy (strict).
100
- - `make test`: run the test suite with pytest.
101
- - `make publish`: build and publish using uv.
102
-
103
- ## Environment variables
104
-
105
- Set as needed depending on which tools you use:
106
-
107
- - `TAVILY_API_KEY`: enables Tavily in `web_search`.
108
- - `EXA_API_KEY`: enables Exa in `web_search` and `visit_webpage`.
109
- - `BRAVE_API_KEY`: enables Brave in `web_search`.
110
- - `OPENROUTER_API_KEY`: required for `document_qa`.
111
- - `BASE_URL`: override OpenRouter base URL for `document_qa` and bitflip tools.
112
- - `DOCUMENT_QA_MODEL_NAME`: override default model for `document_qa`.
113
- - `BITFLIP_MODEL_NAME`: override default model for bitflip tools.
114
- - `WORKSPACE_DIR`: directory for generated files (PDFs, temp artifacts).
115
-
116
- ## md_to_pdf requirements
117
-
118
- The `md_to_pdf` tool invokes `pdflatex`. Ensure a LaTeX distribution is installed and `pdflatex` is on PATH. On Debian/Ubuntu:
119
-
120
- ```
121
- sudo apt install texlive-latex-base texlive-fonts-recommended texlive-latex-extra texlive-science
122
- ```
File without changes
File without changes