academia-mcp 1.9.0__py3-none-any.whl → 1.9.1__py3-none-any.whl
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.
- academia_mcp/server.py +8 -1
- academia_mcp/tools/__init__.py +3 -1
- academia_mcp/tools/{s2_citations.py → s2.py} +35 -0
- academia_mcp-1.9.1.dist-info/METADATA +170 -0
- {academia_mcp-1.9.0.dist-info → academia_mcp-1.9.1.dist-info}/RECORD +9 -9
- academia_mcp-1.9.0.dist-info/METADATA +0 -122
- {academia_mcp-1.9.0.dist-info → academia_mcp-1.9.1.dist-info}/WHEEL +0 -0
- {academia_mcp-1.9.0.dist-info → academia_mcp-1.9.1.dist-info}/entry_points.txt +0 -0
- {academia_mcp-1.9.0.dist-info → academia_mcp-1.9.1.dist-info}/licenses/LICENSE +0 -0
- {academia_mcp-1.9.0.dist-info → academia_mcp-1.9.1.dist-info}/top_level.txt +0 -0
academia_mcp/server.py
CHANGED
@@ -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.
|
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
|
@@ -75,6 +80,8 @@ def run(
|
|
75
80
|
server.add_tool(arxiv_download)
|
76
81
|
server.add_tool(s2_get_citations)
|
77
82
|
server.add_tool(s2_get_references)
|
83
|
+
server.add_tool(s2_corpus_id_from_arxiv_id)
|
84
|
+
server.add_tool(s2_get_info)
|
78
85
|
server.add_tool(hf_datasets_search)
|
79
86
|
server.add_tool(anthology_search)
|
80
87
|
server.add_tool(get_latex_template)
|
academia_mcp/tools/__init__.py
CHANGED
@@ -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 .
|
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,
|
@@ -21,6 +21,8 @@ __all__ = [
|
|
21
21
|
"anthology_search",
|
22
22
|
"s2_get_references",
|
23
23
|
"s2_get_citations",
|
24
|
+
"s2_corpus_id_from_arxiv_id",
|
25
|
+
"s2_get_info",
|
24
26
|
"hf_datasets_search",
|
25
27
|
"document_qa",
|
26
28
|
"compile_latex",
|
@@ -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,170 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: academia-mcp
|
3
|
+
Version: 1.9.1
|
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
|
+
[](https://pypi.org/project/academia-mcp/)
|
38
|
+
[](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml)
|
39
|
+
[](LICENSE)
|
40
|
+
[](https://smithery.ai/server/@IlyaGusev/academia_mcp)
|
41
|
+
[](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
|
+
```
|
@@ -4,12 +4,12 @@ academia_mcp/files.py,sha256=ynIt0XbU1Z7EPWkv_hVX0pGKsLlmjYv-MVJLOfi6yzs,817
|
|
4
4
|
academia_mcp/llm.py,sha256=zpGkuJFf58Ofgys_fi28-47_wJ1a7sIs_yZvI1Si6z0,993
|
5
5
|
academia_mcp/pdf.py,sha256=9PlXzHGhb6ay3ldbTdxCcTWvH4TkET3bnb64mgoh9i0,1273
|
6
6
|
academia_mcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
-
academia_mcp/server.py,sha256=
|
7
|
+
academia_mcp/server.py,sha256=qg2Q7sIddx3HH83nks-dIkrHykVEtFxN5UAAVlj5OSI,4331
|
8
8
|
academia_mcp/settings.py,sha256=vkhCrglL_OI1W0Me_1vS0WoQwDhpzj_XTfcuOylweYA,907
|
9
9
|
academia_mcp/utils.py,sha256=P9U3RjYzcztE0KxXvJSy5wSBaUg2CM9tpByljYrsrl4,4607
|
10
10
|
academia_mcp/latex_templates/agents4science_2025/agents4science_2025.sty,sha256=hGcEPCYBJS4vdhWvN_yEaJC4GvT_yDroI94CfY2Oguk,12268
|
11
11
|
academia_mcp/latex_templates/agents4science_2025/agents4science_2025.tex,sha256=Tl1QkHXHRopw9VEfWrD3Layr5JP_0gIzVQjL4KXIWqc,15814
|
12
|
-
academia_mcp/tools/__init__.py,sha256=
|
12
|
+
academia_mcp/tools/__init__.py,sha256=zaEPj0kUo9ng40wkJcrEijbvu2OoBQ0392OhqF6Q0Uo,1337
|
13
13
|
academia_mcp/tools/anthology_search.py,sha256=rhFpJZqGLABgr0raDuH0CARBiAJNJtEI4dlMrKNHfDQ,7669
|
14
14
|
academia_mcp/tools/arxiv_download.py,sha256=gBY0_Kz0yGtVkLMwn6GrAyfBjovZVgcSMuyy67p65Cw,10474
|
15
15
|
academia_mcp/tools/arxiv_search.py,sha256=pzM18qrF3QL03A53w003kE7hQi3s3QKtjgw0m7K88UY,8355
|
@@ -19,12 +19,12 @@ academia_mcp/tools/hf_datasets_search.py,sha256=KiBkqT4rXjEN4oc1AWZOPnqN_Go90TQo
|
|
19
19
|
academia_mcp/tools/latex.py,sha256=B1Leqt1FHY6H3DlUgeYse4LMFpf4-K1FQViXl5MKk8A,6144
|
20
20
|
academia_mcp/tools/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
21
|
academia_mcp/tools/review.py,sha256=Va0lFJJKuk-NvWhKS3UZ-Dnuk7CyuDQ4S1nd70D-ffE,11117
|
22
|
-
academia_mcp/tools/
|
22
|
+
academia_mcp/tools/s2.py,sha256=QX7-pbetab3Xt_1tvVPU6o5D_NAe9y6jcTGRBK1vwtY,6200
|
23
23
|
academia_mcp/tools/visit_webpage.py,sha256=uEqZIkMqscZG58Rx2wd6L_OQkGxo5SrzCkoUB55HhC0,2018
|
24
24
|
academia_mcp/tools/web_search.py,sha256=kj3BrPdTVfyTjZ_9Jl2n3YUGzcRZk8diQs6cVSVmPrQ,6293
|
25
|
-
academia_mcp-1.9.
|
26
|
-
academia_mcp-1.9.
|
27
|
-
academia_mcp-1.9.
|
28
|
-
academia_mcp-1.9.
|
29
|
-
academia_mcp-1.9.
|
30
|
-
academia_mcp-1.9.
|
25
|
+
academia_mcp-1.9.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
26
|
+
academia_mcp-1.9.1.dist-info/METADATA,sha256=_FtfoLH4Nnv7D5oLT33HKW6UzMtUxQk3IR4Wp4O1jWw,6310
|
27
|
+
academia_mcp-1.9.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
28
|
+
academia_mcp-1.9.1.dist-info/entry_points.txt,sha256=gxkiKJ74w2FwJpSECpjA3XtCfI5ZfrM6N8cqnwsq4yY,51
|
29
|
+
academia_mcp-1.9.1.dist-info/top_level.txt,sha256=CzGpRFsRRJRqWEb1e3SUlcfGqRzOxevZGaJWrtGF8W0,13
|
30
|
+
academia_mcp-1.9.1.dist-info/RECORD,,
|
@@ -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
|
-
[](https://pypi.org/project/academia-mcp/)
|
38
|
-
[](https://github.com/IlyaGusev/academia_mcp/actions/workflows/python.yml)
|
39
|
-
[](LICENSE)
|
40
|
-
[](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
|
File without changes
|
File without changes
|