academia-mcp 1.6.1__py3-none-any.whl → 1.6.3__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 +3 -2
- academia_mcp/tools/__init__.py +3 -2
- academia_mcp/tools/review.py +38 -17
- {academia_mcp-1.6.1.dist-info → academia_mcp-1.6.3.dist-info}/METADATA +1 -1
- {academia_mcp-1.6.1.dist-info → academia_mcp-1.6.3.dist-info}/RECORD +9 -10
- academia_mcp/latex_templates/agents4science_2025/acl_natbib.bst +0 -1928
- {academia_mcp-1.6.1.dist-info → academia_mcp-1.6.3.dist-info}/WHEEL +0 -0
- {academia_mcp-1.6.1.dist-info → academia_mcp-1.6.3.dist-info}/entry_points.txt +0 -0
- {academia_mcp-1.6.1.dist-info → academia_mcp-1.6.3.dist-info}/licenses/LICENSE +0 -0
- {academia_mcp-1.6.1.dist-info → academia_mcp-1.6.3.dist-info}/top_level.txt +0 -0
academia_mcp/server.py
CHANGED
@@ -25,7 +25,7 @@ from .tools.bitflip import (
|
|
25
25
|
generate_research_proposal,
|
26
26
|
score_research_proposals,
|
27
27
|
)
|
28
|
-
from .tools.review import
|
28
|
+
from .tools.review import review_pdf_paper, download_pdf_paper
|
29
29
|
|
30
30
|
|
31
31
|
load_dotenv()
|
@@ -69,6 +69,7 @@ def run(
|
|
69
69
|
server.add_tool(get_latex_template)
|
70
70
|
server.add_tool(get_latex_templates_list)
|
71
71
|
server.add_tool(visit_webpage)
|
72
|
+
server.add_tool(download_pdf_paper)
|
72
73
|
|
73
74
|
if not disable_web_search_tools:
|
74
75
|
if os.getenv("TAVILY_API_KEY"):
|
@@ -85,7 +86,7 @@ def run(
|
|
85
86
|
server.add_tool(generate_research_proposal)
|
86
87
|
server.add_tool(score_research_proposals)
|
87
88
|
server.add_tool(document_qa)
|
88
|
-
server.add_tool(
|
89
|
+
server.add_tool(review_pdf_paper)
|
89
90
|
|
90
91
|
if port is None:
|
91
92
|
port = int(os.environ.get("PORT", -1))
|
academia_mcp/tools/__init__.py
CHANGED
@@ -13,7 +13,7 @@ from .latex import (
|
|
13
13
|
from .web_search import web_search, tavily_web_search, exa_web_search, brave_web_search
|
14
14
|
from .visit_webpage import visit_webpage
|
15
15
|
from .bitflip import extract_bitflip_info, generate_research_proposal, score_research_proposals
|
16
|
-
from .review import
|
16
|
+
from .review import review_pdf_paper, download_pdf_paper
|
17
17
|
|
18
18
|
__all__ = [
|
19
19
|
"arxiv_search",
|
@@ -35,5 +35,6 @@ __all__ = [
|
|
35
35
|
"extract_bitflip_info",
|
36
36
|
"generate_research_proposal",
|
37
37
|
"score_research_proposals",
|
38
|
-
"
|
38
|
+
"review_pdf_paper",
|
39
|
+
"download_pdf_paper",
|
39
40
|
]
|
academia_mcp/tools/review.py
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
import base64
|
2
2
|
import os
|
3
|
+
import uuid
|
3
4
|
from io import BytesIO
|
4
5
|
from pathlib import Path
|
5
6
|
from typing import List, Dict, Any
|
6
7
|
|
7
|
-
from academia_mcp.pdf import parse_pdf_file_to_images, parse_pdf_file
|
8
|
+
from academia_mcp.pdf import parse_pdf_file_to_images, parse_pdf_file, download_pdf
|
8
9
|
from academia_mcp.llm import llm_acall, ChatMessage
|
9
10
|
from academia_mcp.files import get_workspace_dir
|
10
11
|
|
@@ -14,7 +15,6 @@ You are an expert peer reviewer for top CS/ML venues (e.g., NeurIPS/ICML/ACL).
|
|
14
15
|
Your goal is to produce a fair, rigorous, and reproducible review that is maximally useful to authors and area chairs.
|
15
16
|
Be specific: cite paper sections/figures/tables when criticizing or praising.
|
16
17
|
Use actionable language ("Provide variance across 5 seeds on Dataset X; add leakage control Y").
|
17
|
-
Try to be as harsh as possible, but still be fair and constructive.
|
18
18
|
|
19
19
|
# Summary
|
20
20
|
Briefly summarize the paper and its contributions.
|
@@ -54,25 +54,27 @@ As the questions above indicates, originality does not necessarily require intro
|
|
54
54
|
Rather, a work that provides novel insights by evaluating existing methods, or demonstrates improved efficiency, fairness, etc. is also equally valuable.
|
55
55
|
|
56
56
|
# Scores
|
57
|
-
|
57
|
+
Try to be specific and detailed in your assessment. Try not to set the same score for all the dimensions.
|
58
|
+
|
59
|
+
Quality: Based on what you discussed in the “Quality” section, please assign the paper a numerical rating on the following scale to indicate the quality of the work.
|
58
60
|
4 = excellent
|
59
61
|
3 = good
|
60
62
|
2 = fair
|
61
63
|
1 = poor
|
62
64
|
|
63
|
-
Clarity: Based on what you discussed in “
|
65
|
+
Clarity: Based on what you discussed in the “Clarity” section, please assign the paper a numerical rating on the following scale to indicate the clarity of the paper.
|
64
66
|
4 = excellent
|
65
67
|
3 = good
|
66
68
|
2 = fair
|
67
69
|
1 = poor
|
68
70
|
|
69
|
-
Significance: Based on what you discussed in “
|
71
|
+
Significance: Based on what you discussed in the “Significance” section, please assign the paper a numerical rating on the following scale to indicate the significance of the paper.
|
70
72
|
4 = excellent
|
71
73
|
3 = good
|
72
74
|
2 = fair
|
73
75
|
1 = poor
|
74
76
|
|
75
|
-
Originality: Based on what you discussed in “
|
77
|
+
Originality: Based on what you discussed in the “Originality” section, please assign the paper a numerical rating on the following scale to indicate the originality of the paper.
|
76
78
|
4 = excellent
|
77
79
|
3 = good
|
78
80
|
2 = fair
|
@@ -117,31 +119,50 @@ Return the result as a JSON object in the following format:
|
|
117
119
|
"summary": "Summary of the paper",
|
118
120
|
"strengths_and_weaknesses": {
|
119
121
|
"quality": "Quality-related strengths and weaknesses",
|
122
|
+
"quality_score": ...,
|
120
123
|
"clarity": "Clarity-related strengths and weaknesses",
|
124
|
+
"clarity_score": ...,
|
121
125
|
"significance": "Significance-related strengths and weaknesses",
|
126
|
+
"significance_score": ...,
|
122
127
|
"originality": "Originality-related strengths and weaknesses",
|
123
|
-
|
124
|
-
"scores": {
|
125
|
-
"quality": ...,
|
126
|
-
"clarity": ...,
|
127
|
-
"significance": ...,
|
128
|
-
"originality": ...,
|
128
|
+
"originality_score": ...,
|
129
129
|
},
|
130
130
|
"questions": "Questions and suggestions for the authors",
|
131
131
|
"limitations": "Limitations of the paper",
|
132
|
-
"overall":
|
133
|
-
"confidence":
|
132
|
+
"overall": "Number + short description",
|
133
|
+
"confidence": "Number + short description",
|
134
134
|
"format_issues": "Format issues",
|
135
135
|
}
|
136
136
|
"""
|
137
137
|
|
138
138
|
|
139
|
-
|
139
|
+
def download_pdf_paper(pdf_url: str) -> str:
|
140
|
+
"""
|
141
|
+
Download a pdf file from a url to the workspace directory.
|
142
|
+
|
143
|
+
Returns the path to the downloaded pdf file.
|
144
|
+
|
145
|
+
Args:
|
146
|
+
pdf_url: The url of the pdf file.
|
147
|
+
"""
|
148
|
+
if "arxiv.org/pdf" in pdf_url:
|
149
|
+
pdf_filename = pdf_url.split("/")[-1]
|
150
|
+
else:
|
151
|
+
pdf_filename = str(uuid.uuid4())
|
152
|
+
if not pdf_filename.endswith(".pdf"):
|
153
|
+
pdf_filename += ".pdf"
|
154
|
+
|
155
|
+
pdf_path = Path(get_workspace_dir()) / pdf_filename
|
156
|
+
download_pdf(pdf_url, pdf_path)
|
157
|
+
return pdf_filename
|
158
|
+
|
159
|
+
|
160
|
+
async def review_pdf_paper(pdf_filename: str) -> str:
|
140
161
|
"""
|
141
|
-
Review a pdf file.
|
162
|
+
Review a pdf file with a paper.
|
142
163
|
It parses the pdf file into images and then sends the images to the LLM for review.
|
143
164
|
It can detect different issues with the paper formatting.
|
144
|
-
|
165
|
+
Returns a proper NeurIPS-style review.
|
145
166
|
|
146
167
|
Args:
|
147
168
|
pdf_filename: The path to the pdf file.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: academia-mcp
|
3
|
-
Version: 1.6.
|
3
|
+
Version: 1.6.3
|
4
4
|
Summary: MCP server that provides different tools to search for scientific publications
|
5
5
|
Author-email: Ilya Gusev <phoenixilya@gmail.com>
|
6
6
|
Project-URL: Homepage, https://github.com/IlyaGusev/academia_mcp
|
@@ -4,12 +4,11 @@ academia_mcp/files.py,sha256=tvt3OPr5q6pAPCZ0XvRHHL9ZWuTXINRZvqjeRFmx5YE,815
|
|
4
4
|
academia_mcp/llm.py,sha256=jh-_H3_gNyRsvpFqFx-yWVhGznnXxehFP79inUy4vVQ,995
|
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=MDHWgIIWz99XhTvpoYCouwixjvS6a0BMajcZkW5MpiY,3193
|
8
8
|
academia_mcp/utils.py,sha256=P9U3RjYzcztE0KxXvJSy5wSBaUg2CM9tpByljYrsrl4,4607
|
9
|
-
academia_mcp/latex_templates/agents4science_2025/acl_natbib.bst,sha256=uvSF5iLLPcF0xUmPRiT8OTZEt2oO6R9LcaTOLI3GrLk,44731
|
10
9
|
academia_mcp/latex_templates/agents4science_2025/agents4science_2025.sty,sha256=hGcEPCYBJS4vdhWvN_yEaJC4GvT_yDroI94CfY2Oguk,12268
|
11
10
|
academia_mcp/latex_templates/agents4science_2025/agents4science_2025.tex,sha256=k_nOyPv-OxGbFtKSou6nV6l413EfWvozE6zIx04s8iU,33924
|
12
|
-
academia_mcp/tools/__init__.py,sha256=
|
11
|
+
academia_mcp/tools/__init__.py,sha256=N3GLWvrsDBOlAcCRZUUZ6nkR5AkLvX0k26cNJt3hLKM,1243
|
13
12
|
academia_mcp/tools/anthology_search.py,sha256=rhFpJZqGLABgr0raDuH0CARBiAJNJtEI4dlMrKNHfDQ,7669
|
14
13
|
academia_mcp/tools/arxiv_download.py,sha256=gBY0_Kz0yGtVkLMwn6GrAyfBjovZVgcSMuyy67p65Cw,10474
|
15
14
|
academia_mcp/tools/arxiv_search.py,sha256=pzM18qrF3QL03A53w003kE7hQi3s3QKtjgw0m7K88UY,8355
|
@@ -18,13 +17,13 @@ academia_mcp/tools/document_qa.py,sha256=t9mygYQ7AFIAPiha1nZ-y043luQlkTCBdWb_SDn
|
|
18
17
|
academia_mcp/tools/hf_datasets_search.py,sha256=KiBkqT4rXjEN4oc1AWZOPnqN_Go90TQogY5-DUm3LQo,2854
|
19
18
|
academia_mcp/tools/latex.py,sha256=bf8VZUgCByzBAMTZCeqrRrmakotext3d3DbtkiOTh1k,5892
|
20
19
|
academia_mcp/tools/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
|
-
academia_mcp/tools/review.py,sha256=
|
20
|
+
academia_mcp/tools/review.py,sha256=LbebOHGs76qoSgWvTQ9Uj1fvmjc2eSBudX6n_zCINYI,10247
|
22
21
|
academia_mcp/tools/s2_citations.py,sha256=dqrBp76RrX1zH2XzcMAoWBbvbtyhxLeF-xnqOKD_JiM,4852
|
23
22
|
academia_mcp/tools/visit_webpage.py,sha256=OZdqDkVPIbANyFw5o5jIjU5Rr_dolxrGDs63Ud-GmRM,1966
|
24
23
|
academia_mcp/tools/web_search.py,sha256=mobKm4iqKppn8pduZYMzWRo1MQBjkAqmMtrFLI5XY2Y,6296
|
25
|
-
academia_mcp-1.6.
|
26
|
-
academia_mcp-1.6.
|
27
|
-
academia_mcp-1.6.
|
28
|
-
academia_mcp-1.6.
|
29
|
-
academia_mcp-1.6.
|
30
|
-
academia_mcp-1.6.
|
24
|
+
academia_mcp-1.6.3.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
25
|
+
academia_mcp-1.6.3.dist-info/METADATA,sha256=6JPfXvLaVPY7pMfqMFSxvtrXUeIvLdIqWcjCLU7S_Zs,3714
|
26
|
+
academia_mcp-1.6.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
27
|
+
academia_mcp-1.6.3.dist-info/entry_points.txt,sha256=gxkiKJ74w2FwJpSECpjA3XtCfI5ZfrM6N8cqnwsq4yY,51
|
28
|
+
academia_mcp-1.6.3.dist-info/top_level.txt,sha256=CzGpRFsRRJRqWEb1e3SUlcfGqRzOxevZGaJWrtGF8W0,13
|
29
|
+
academia_mcp-1.6.3.dist-info/RECORD,,
|