all-in-mcp 0.2.5__tar.gz → 0.2.7__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.
- all_in_mcp-0.2.7/PKG-INFO +129 -0
- all_in_mcp-0.2.7/README.md +84 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/pyproject.toml +1 -1
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/academic_platforms/crossref.py +4 -76
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/academic_platforms/iacr.py +13 -2
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/server.py +30 -89
- all_in_mcp-0.2.5/PKG-INFO +0 -226
- all_in_mcp-0.2.5/README.md +0 -181
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/.gitignore +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/LICENSE +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/docs/api.md +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/docs/configuration.md +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/docs/cryptobib.md +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/docs/development.md +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/docs/google_scholar.md +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/docs/iacr.md +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/docs/pypi-setup.md +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/__init__.py +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/academic_platforms/__init__.py +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/academic_platforms/base.py +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/academic_platforms/cryptobib.py +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/academic_platforms/google_scholar.py +0 -0
- {all_in_mcp-0.2.5 → all_in_mcp-0.2.7}/src/all_in_mcp/paper.py +0 -0
@@ -0,0 +1,129 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: all-in-mcp
|
3
|
+
Version: 0.2.7
|
4
|
+
Summary: An MCP (Model Context Protocol) server providing daily-use utility functions and academic paper search capabilities
|
5
|
+
Project-URL: Homepage, https://github.com/jiahaoxiang2000/all-in-mcp
|
6
|
+
Project-URL: Repository, https://github.com/jiahaoxiang2000/all-in-mcp
|
7
|
+
Project-URL: Documentation, https://github.com/jiahaoxiang2000/all-in-mcp/tree/main/docs
|
8
|
+
Project-URL: Issues, https://github.com/jiahaoxiang2000/all-in-mcp/issues
|
9
|
+
Author-email: isomo <jiahaoxiang2000@gmail.com>
|
10
|
+
License: MIT
|
11
|
+
License-File: LICENSE
|
12
|
+
Keywords: academic,iacr,mcp,model-context-protocol,papers,utilities
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
14
|
+
Classifier: Intended Audience :: Developers
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
22
|
+
Classifier: Topic :: Scientific/Engineering
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
24
|
+
Classifier: Topic :: Text Processing :: General
|
25
|
+
Requires-Python: >=3.10
|
26
|
+
Requires-Dist: beautifulsoup4>=4.12.0
|
27
|
+
Requires-Dist: feedparser>=6.0.10
|
28
|
+
Requires-Dist: httpx>=0.24.0
|
29
|
+
Requires-Dist: mcp>=1.9.4
|
30
|
+
Requires-Dist: pypdf>=4.0.0
|
31
|
+
Requires-Dist: requests>=2.31.0
|
32
|
+
Provides-Extra: all
|
33
|
+
Requires-Dist: psutil>=5.9.0; extra == 'all'
|
34
|
+
Provides-Extra: dev
|
35
|
+
Requires-Dist: build>=1.0.0; extra == 'dev'
|
36
|
+
Requires-Dist: mypy>=1.5.0; extra == 'dev'
|
37
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
38
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
39
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
40
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
41
|
+
Requires-Dist: twine>=4.0.0; extra == 'dev'
|
42
|
+
Provides-Extra: system
|
43
|
+
Requires-Dist: psutil>=5.9.0; extra == 'system'
|
44
|
+
Description-Content-Type: text/markdown
|
45
|
+
|
46
|
+
# All-in-MCP
|
47
|
+
|
48
|
+
An MCP (Model Context Protocol) server that provides utility functions, including academic paper search capabilities.
|
49
|
+
|
50
|
+
- [**Paper Tools overview _Video_**](https://www.bilibili.com/video/BV1RMKWzdEk8)
|
51
|
+
- [_Overview PDF_](https://github.com/jiahaoxiang2000/tutor/blob/main/Apaper/setup.pdf)
|
52
|
+
|
53
|
+
## Features
|
54
|
+
|
55
|
+
This MCP server exposes the following daily-use utility tools as MCP endpoints:
|
56
|
+
|
57
|
+
### Available Tools
|
58
|
+
|
59
|
+
- **Academic Research**:
|
60
|
+
- `search-iacr-papers`: Search academic papers from IACR ePrint Archive
|
61
|
+
- `download-iacr-paper`: Download PDF of an IACR ePrint paper
|
62
|
+
- `read-iacr-paper`: Read and extract text content from an IACR ePrint paper PDF
|
63
|
+
- **Bibliography Search**:
|
64
|
+
- `search-cryptobib-papers`: Search CryptoBib bibliography database for cryptography papers (structured metadata or raw BibTeX)
|
65
|
+
- **Crossref Search**:
|
66
|
+
- `search-crossref-papers`: Search academic papers from Crossref database
|
67
|
+
- **Google Scholar**:
|
68
|
+
- `search-google-scholar-papers`: Search academic papers across disciplines with citation data
|
69
|
+
- **PDF Reading**:
|
70
|
+
- `read-pdf`: Read and extract text from local and online PDF files
|
71
|
+
|
72
|
+
All tools are implemented as async MCP endpoints with proper validation and error handling.
|
73
|
+
|
74
|
+
## Quick Start
|
75
|
+
|
76
|
+
- [**Video for Env Setup**](https://www.bilibili.com/video/BV1cZKozaEjg)
|
77
|
+
- [_Overview PDF_](https://github.com/jiahaoxiang2000/tutor/blob/main/Apaper/config.pdf)
|
78
|
+
|
79
|
+
### Prerequisites
|
80
|
+
|
81
|
+
- Python 3.10 or higher
|
82
|
+
- UV package manager
|
83
|
+
|
84
|
+
### Installation
|
85
|
+
|
86
|
+
Install from PyPI (Recommended by `UV`)
|
87
|
+
|
88
|
+
```bash
|
89
|
+
uv pip install all-in-mcp
|
90
|
+
```
|
91
|
+
|
92
|
+
### Integration with MCP Clients Vscode
|
93
|
+
|
94
|
+
Add this server to your MCP client configuration. The server runs using stdio transport.
|
95
|
+
|
96
|
+
Example configuration for Vscode:
|
97
|
+
|
98
|
+
```json .vscode/mcp.json
|
99
|
+
{
|
100
|
+
"servers": {
|
101
|
+
"all-in-mcp": {
|
102
|
+
"type": "stdio",
|
103
|
+
"command": "uv",
|
104
|
+
"args": ["run", "all-in-mcp"]
|
105
|
+
}
|
106
|
+
}
|
107
|
+
}
|
108
|
+
```
|
109
|
+
|
110
|
+
<details>
|
111
|
+
<summary>Development</summary>
|
112
|
+
|
113
|
+
For development setup and contribution guidelines, see the [Development Guide](docs/development.md).
|
114
|
+
|
115
|
+
### Quick Development Setup
|
116
|
+
|
117
|
+
```bash
|
118
|
+
# Clone the repository
|
119
|
+
git clone https://github.com/jiahaoxiang2000/all-in-mcp.git
|
120
|
+
cd all-in-mcp
|
121
|
+
|
122
|
+
# Install with development dependencies
|
123
|
+
uv sync --extra dev
|
124
|
+
|
125
|
+
# Run tests
|
126
|
+
uv run pytest
|
127
|
+
```
|
128
|
+
|
129
|
+
</details>
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# All-in-MCP
|
2
|
+
|
3
|
+
An MCP (Model Context Protocol) server that provides utility functions, including academic paper search capabilities.
|
4
|
+
|
5
|
+
- [**Paper Tools overview _Video_**](https://www.bilibili.com/video/BV1RMKWzdEk8)
|
6
|
+
- [_Overview PDF_](https://github.com/jiahaoxiang2000/tutor/blob/main/Apaper/setup.pdf)
|
7
|
+
|
8
|
+
## Features
|
9
|
+
|
10
|
+
This MCP server exposes the following daily-use utility tools as MCP endpoints:
|
11
|
+
|
12
|
+
### Available Tools
|
13
|
+
|
14
|
+
- **Academic Research**:
|
15
|
+
- `search-iacr-papers`: Search academic papers from IACR ePrint Archive
|
16
|
+
- `download-iacr-paper`: Download PDF of an IACR ePrint paper
|
17
|
+
- `read-iacr-paper`: Read and extract text content from an IACR ePrint paper PDF
|
18
|
+
- **Bibliography Search**:
|
19
|
+
- `search-cryptobib-papers`: Search CryptoBib bibliography database for cryptography papers (structured metadata or raw BibTeX)
|
20
|
+
- **Crossref Search**:
|
21
|
+
- `search-crossref-papers`: Search academic papers from Crossref database
|
22
|
+
- **Google Scholar**:
|
23
|
+
- `search-google-scholar-papers`: Search academic papers across disciplines with citation data
|
24
|
+
- **PDF Reading**:
|
25
|
+
- `read-pdf`: Read and extract text from local and online PDF files
|
26
|
+
|
27
|
+
All tools are implemented as async MCP endpoints with proper validation and error handling.
|
28
|
+
|
29
|
+
## Quick Start
|
30
|
+
|
31
|
+
- [**Video for Env Setup**](https://www.bilibili.com/video/BV1cZKozaEjg)
|
32
|
+
- [_Overview PDF_](https://github.com/jiahaoxiang2000/tutor/blob/main/Apaper/config.pdf)
|
33
|
+
|
34
|
+
### Prerequisites
|
35
|
+
|
36
|
+
- Python 3.10 or higher
|
37
|
+
- UV package manager
|
38
|
+
|
39
|
+
### Installation
|
40
|
+
|
41
|
+
Install from PyPI (Recommended by `UV`)
|
42
|
+
|
43
|
+
```bash
|
44
|
+
uv pip install all-in-mcp
|
45
|
+
```
|
46
|
+
|
47
|
+
### Integration with MCP Clients Vscode
|
48
|
+
|
49
|
+
Add this server to your MCP client configuration. The server runs using stdio transport.
|
50
|
+
|
51
|
+
Example configuration for Vscode:
|
52
|
+
|
53
|
+
```json .vscode/mcp.json
|
54
|
+
{
|
55
|
+
"servers": {
|
56
|
+
"all-in-mcp": {
|
57
|
+
"type": "stdio",
|
58
|
+
"command": "uv",
|
59
|
+
"args": ["run", "all-in-mcp"]
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
```
|
64
|
+
|
65
|
+
<details>
|
66
|
+
<summary>Development</summary>
|
67
|
+
|
68
|
+
For development setup and contribution guidelines, see the [Development Guide](docs/development.md).
|
69
|
+
|
70
|
+
### Quick Development Setup
|
71
|
+
|
72
|
+
```bash
|
73
|
+
# Clone the repository
|
74
|
+
git clone https://github.com/jiahaoxiang2000/all-in-mcp.git
|
75
|
+
cd all-in-mcp
|
76
|
+
|
77
|
+
# Install with development dependencies
|
78
|
+
uv sync --extra dev
|
79
|
+
|
80
|
+
# Run tests
|
81
|
+
uv run pytest
|
82
|
+
```
|
83
|
+
|
84
|
+
</details>
|
@@ -224,87 +224,15 @@ class CrossrefSearcher(PaperSource):
|
|
224
224
|
|
225
225
|
def download_pdf(self, paper_id: str, save_path: str) -> str:
|
226
226
|
"""
|
227
|
-
Download PDF for a paper (limited functionality for Crossref)
|
228
|
-
|
229
|
-
Note: Crossref is primarily a metadata service. PDF downloads
|
230
|
-
depend on publisher policies and may not always be available.
|
227
|
+
Not implemented: Download PDF for a paper (limited functionality for Crossref)
|
231
228
|
"""
|
232
|
-
|
233
|
-
return "Error: paper_id is required"
|
234
|
-
|
235
|
-
try:
|
236
|
-
# If paper_id is a DOI, try to get work details first
|
237
|
-
if not paper_id.startswith("http"):
|
238
|
-
work_url = f"{self.WORKS_ENDPOINT}/{quote_plus(paper_id)}"
|
239
|
-
response = self.client.get(work_url, headers=self._get_headers())
|
240
|
-
response.raise_for_status()
|
241
|
-
|
242
|
-
work_data = response.json()
|
243
|
-
work = work_data.get("message", {})
|
244
|
-
|
245
|
-
# Look for PDF link
|
246
|
-
links = work.get("link", [])
|
247
|
-
pdf_url = None
|
248
|
-
for link in links:
|
249
|
-
if link.get("content-type") == "application/pdf":
|
250
|
-
pdf_url = link.get("URL")
|
251
|
-
break
|
252
|
-
|
253
|
-
if not pdf_url:
|
254
|
-
return f"Error: No PDF link found for DOI {paper_id}. Crossref provides metadata; PDFs are hosted by publishers."
|
255
|
-
else:
|
256
|
-
pdf_url = paper_id
|
257
|
-
|
258
|
-
# Attempt to download PDF
|
259
|
-
from pathlib import Path
|
260
|
-
|
261
|
-
save_path_obj = Path(save_path)
|
262
|
-
save_path_obj.mkdir(parents=True, exist_ok=True)
|
263
|
-
|
264
|
-
# Create filename from DOI or URL
|
265
|
-
if paper_id.startswith("10."):
|
266
|
-
filename = (
|
267
|
-
f"crossref_{paper_id.replace('/', '_').replace('.', '_')}.pdf"
|
268
|
-
)
|
269
|
-
else:
|
270
|
-
filename = f"crossref_paper_{hash(paper_id) % 10000}.pdf"
|
271
|
-
|
272
|
-
file_path = save_path_obj / filename
|
273
|
-
|
274
|
-
pdf_response = self.client.get(pdf_url, headers=self._get_headers())
|
275
|
-
pdf_response.raise_for_status()
|
276
|
-
|
277
|
-
with open(file_path, "wb") as f:
|
278
|
-
f.write(pdf_response.content)
|
279
|
-
|
280
|
-
return str(file_path)
|
281
|
-
|
282
|
-
except Exception as e:
|
283
|
-
return f"Error downloading PDF: {e}"
|
229
|
+
return "Crossref does not provide a direct way to download PDFs. Use the paper's URL or DOI to access the publisher's site for PDF downloads if available."
|
284
230
|
|
285
231
|
def read_paper(self, paper_id: str, save_path: str) -> str:
|
286
232
|
"""
|
287
|
-
|
288
|
-
|
289
|
-
Note: Success depends on PDF availability from publishers
|
233
|
+
crossref doesn't provide a direct way to read paper text.
|
290
234
|
"""
|
291
|
-
|
292
|
-
return "Error: paper_id is required"
|
293
|
-
|
294
|
-
try:
|
295
|
-
# First try to download the PDF
|
296
|
-
pdf_path = self.download_pdf(paper_id, save_path)
|
297
|
-
|
298
|
-
if pdf_path.startswith("Error"):
|
299
|
-
return pdf_path
|
300
|
-
|
301
|
-
# Read the PDF using the existing read_pdf function
|
302
|
-
from ..paper import read_pdf
|
303
|
-
|
304
|
-
return read_pdf(pdf_path)
|
305
|
-
|
306
|
-
except Exception as e:
|
307
|
-
return f"Error reading paper: {e}"
|
235
|
+
return "Crossref does not provide a direct way to read paper text. Use the download_pdf method to get the PDF if available."
|
308
236
|
|
309
237
|
def search_by_doi(self, doi: str) -> Optional[Paper]:
|
310
238
|
"""Search for a specific paper by DOI"""
|
@@ -141,7 +141,12 @@ class IACRSearcher(PaperSource):
|
|
141
141
|
return None
|
142
142
|
|
143
143
|
def search(
|
144
|
-
self,
|
144
|
+
self,
|
145
|
+
query: str,
|
146
|
+
max_results: int = 10,
|
147
|
+
fetch_details: bool = True,
|
148
|
+
year_min: int | None = None,
|
149
|
+
year_max: int | None = None,
|
145
150
|
) -> list[Paper]:
|
146
151
|
"""
|
147
152
|
Search IACR ePrint Archive
|
@@ -150,6 +155,8 @@ class IACRSearcher(PaperSource):
|
|
150
155
|
query: Search query string
|
151
156
|
max_results: Maximum number of results to return
|
152
157
|
fetch_details: Whether to fetch detailed information for each paper (slower but more complete)
|
158
|
+
year_min: Minimum publication year (revised after)
|
159
|
+
year_max: Maximum publication year (revised before)
|
153
160
|
|
154
161
|
Returns:
|
155
162
|
List[Paper]: List of paper objects
|
@@ -158,7 +165,11 @@ class IACRSearcher(PaperSource):
|
|
158
165
|
|
159
166
|
try:
|
160
167
|
# Construct search parameters
|
161
|
-
params = {"q": query}
|
168
|
+
params: dict[str, str | int] = {"q": query}
|
169
|
+
if year_min:
|
170
|
+
params["revisedafter"] = year_min
|
171
|
+
if year_max:
|
172
|
+
params["revisedbefore"] = year_max
|
162
173
|
|
163
174
|
# Make request
|
164
175
|
response = self.session.get(self.IACR_SEARCH_URL, params=params)
|
@@ -47,6 +47,14 @@ async def handle_list_tools() -> list[types.Tool]:
|
|
47
47
|
"description": "Whether to fetch detailed information for each paper (default: True)",
|
48
48
|
"default": True,
|
49
49
|
},
|
50
|
+
"year_min": {
|
51
|
+
"type": "integer",
|
52
|
+
"description": "Minimum publication year (revised after)",
|
53
|
+
},
|
54
|
+
"year_max": {
|
55
|
+
"type": "integer",
|
56
|
+
"description": "Maximum publication year (revised before)",
|
57
|
+
},
|
50
58
|
},
|
51
59
|
"required": ["query"],
|
52
60
|
},
|
@@ -185,44 +193,6 @@ async def handle_list_tools() -> list[types.Tool]:
|
|
185
193
|
"required": ["query"],
|
186
194
|
},
|
187
195
|
),
|
188
|
-
types.Tool(
|
189
|
-
name="download-crossref-paper",
|
190
|
-
description="Download PDF of a Crossref paper (when available from publisher)",
|
191
|
-
inputSchema={
|
192
|
-
"type": "object",
|
193
|
-
"properties": {
|
194
|
-
"paper_id": {
|
195
|
-
"type": "string",
|
196
|
-
"description": "DOI or URL of the paper",
|
197
|
-
},
|
198
|
-
"save_path": {
|
199
|
-
"type": "string",
|
200
|
-
"description": "Directory to save the PDF (default: './downloads')",
|
201
|
-
"default": "./downloads",
|
202
|
-
},
|
203
|
-
},
|
204
|
-
"required": ["paper_id"],
|
205
|
-
},
|
206
|
-
),
|
207
|
-
types.Tool(
|
208
|
-
name="read-crossref-paper",
|
209
|
-
description="Read and extract text content from a Crossref paper PDF",
|
210
|
-
inputSchema={
|
211
|
-
"type": "object",
|
212
|
-
"properties": {
|
213
|
-
"paper_id": {
|
214
|
-
"type": "string",
|
215
|
-
"description": "DOI or URL of the paper",
|
216
|
-
},
|
217
|
-
"save_path": {
|
218
|
-
"type": "string",
|
219
|
-
"description": "Directory where the PDF is/will be saved (default: './downloads')",
|
220
|
-
"default": "./downloads",
|
221
|
-
},
|
222
|
-
},
|
223
|
-
"required": ["paper_id"],
|
224
|
-
},
|
225
|
-
),
|
226
196
|
types.Tool(
|
227
197
|
name="read-pdf",
|
228
198
|
description="Read and extract text content from a PDF file (local or online)",
|
@@ -255,6 +225,8 @@ async def handle_call_tool(
|
|
255
225
|
query = arguments.get("query", "")
|
256
226
|
max_results = arguments.get("max_results", 10)
|
257
227
|
fetch_details = arguments.get("fetch_details", True)
|
228
|
+
year_min = arguments.get("year_min")
|
229
|
+
year_max = arguments.get("year_max")
|
258
230
|
|
259
231
|
if not query:
|
260
232
|
return [
|
@@ -263,17 +235,34 @@ async def handle_call_tool(
|
|
263
235
|
)
|
264
236
|
]
|
265
237
|
|
266
|
-
papers = iacr_searcher.search(
|
238
|
+
papers = iacr_searcher.search(
|
239
|
+
query,
|
240
|
+
max_results=max_results,
|
241
|
+
fetch_details=fetch_details,
|
242
|
+
year_min=year_min,
|
243
|
+
year_max=year_max,
|
244
|
+
)
|
267
245
|
|
268
246
|
if not papers:
|
247
|
+
year_filter_msg = ""
|
248
|
+
if year_min or year_max:
|
249
|
+
year_range = f" ({year_min or 'earliest'}-{year_max or 'latest'})"
|
250
|
+
year_filter_msg = f" in year range{year_range}"
|
269
251
|
return [
|
270
252
|
types.TextContent(
|
271
|
-
type="text",
|
253
|
+
type="text",
|
254
|
+
text=f"No papers found for query: {query}{year_filter_msg}",
|
272
255
|
)
|
273
256
|
]
|
274
257
|
|
275
258
|
# Format the results
|
276
|
-
|
259
|
+
year_filter_msg = ""
|
260
|
+
if year_min or year_max:
|
261
|
+
year_range = f" ({year_min or 'earliest'}-{year_max or 'latest'})"
|
262
|
+
year_filter_msg = f" in year range{year_range}"
|
263
|
+
result_text = (
|
264
|
+
f"Found {len(papers)} IACR papers for query '{query}'{year_filter_msg}:\n\n"
|
265
|
+
)
|
277
266
|
for i, paper in enumerate(papers, 1):
|
278
267
|
result_text += f"{i}. **{paper.title}**\n"
|
279
268
|
result_text += f" - Paper ID: {paper.paper_id}\n"
|
@@ -586,54 +575,6 @@ async def handle_call_tool(
|
|
586
575
|
)
|
587
576
|
]
|
588
577
|
|
589
|
-
elif name == "download-crossref-paper":
|
590
|
-
paper_id = arguments.get("paper_id", "")
|
591
|
-
save_path = arguments.get("save_path", "./downloads")
|
592
|
-
|
593
|
-
if not paper_id:
|
594
|
-
return [
|
595
|
-
types.TextContent(
|
596
|
-
type="text", text="Error: paper_id parameter is required"
|
597
|
-
)
|
598
|
-
]
|
599
|
-
|
600
|
-
result = crossref_searcher.download_pdf(paper_id, save_path)
|
601
|
-
|
602
|
-
if result.startswith("Error"):
|
603
|
-
return [types.TextContent(type="text", text=result)]
|
604
|
-
else:
|
605
|
-
return [
|
606
|
-
types.TextContent(
|
607
|
-
type="text", text=f"PDF downloaded successfully to: {result}"
|
608
|
-
)
|
609
|
-
]
|
610
|
-
|
611
|
-
elif name == "read-crossref-paper":
|
612
|
-
paper_id = arguments.get("paper_id", "")
|
613
|
-
save_path = arguments.get("save_path", "./downloads")
|
614
|
-
|
615
|
-
if not paper_id:
|
616
|
-
return [
|
617
|
-
types.TextContent(
|
618
|
-
type="text", text="Error: paper_id parameter is required"
|
619
|
-
)
|
620
|
-
]
|
621
|
-
|
622
|
-
result = crossref_searcher.read_paper(paper_id, save_path)
|
623
|
-
|
624
|
-
if result.startswith("Error"):
|
625
|
-
return [types.TextContent(type="text", text=result)]
|
626
|
-
else:
|
627
|
-
# Truncate very long text for display
|
628
|
-
if len(result) > 5000:
|
629
|
-
truncated_result = (
|
630
|
-
result[:5000]
|
631
|
-
+ f"\n\n... [Text truncated. Full text is {len(result)} characters long]"
|
632
|
-
)
|
633
|
-
return [types.TextContent(type="text", text=truncated_result)]
|
634
|
-
else:
|
635
|
-
return [types.TextContent(type="text", text=result)]
|
636
|
-
|
637
578
|
elif name == "read-pdf":
|
638
579
|
pdf_source = arguments.get("pdf_source", "")
|
639
580
|
|
all_in_mcp-0.2.5/PKG-INFO
DELETED
@@ -1,226 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.4
|
2
|
-
Name: all-in-mcp
|
3
|
-
Version: 0.2.5
|
4
|
-
Summary: An MCP (Model Context Protocol) server providing daily-use utility functions and academic paper search capabilities
|
5
|
-
Project-URL: Homepage, https://github.com/jiahaoxiang2000/all-in-mcp
|
6
|
-
Project-URL: Repository, https://github.com/jiahaoxiang2000/all-in-mcp
|
7
|
-
Project-URL: Documentation, https://github.com/jiahaoxiang2000/all-in-mcp/tree/main/docs
|
8
|
-
Project-URL: Issues, https://github.com/jiahaoxiang2000/all-in-mcp/issues
|
9
|
-
Author-email: isomo <jiahaoxiang2000@gmail.com>
|
10
|
-
License: MIT
|
11
|
-
License-File: LICENSE
|
12
|
-
Keywords: academic,iacr,mcp,model-context-protocol,papers,utilities
|
13
|
-
Classifier: Development Status :: 4 - Beta
|
14
|
-
Classifier: Intended Audience :: Developers
|
15
|
-
Classifier: Intended Audience :: Science/Research
|
16
|
-
Classifier: License :: OSI Approved :: MIT License
|
17
|
-
Classifier: Programming Language :: Python :: 3
|
18
|
-
Classifier: Programming Language :: Python :: 3.10
|
19
|
-
Classifier: Programming Language :: Python :: 3.11
|
20
|
-
Classifier: Programming Language :: Python :: 3.12
|
21
|
-
Classifier: Programming Language :: Python :: 3.13
|
22
|
-
Classifier: Topic :: Scientific/Engineering
|
23
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
24
|
-
Classifier: Topic :: Text Processing :: General
|
25
|
-
Requires-Python: >=3.10
|
26
|
-
Requires-Dist: beautifulsoup4>=4.12.0
|
27
|
-
Requires-Dist: feedparser>=6.0.10
|
28
|
-
Requires-Dist: httpx>=0.24.0
|
29
|
-
Requires-Dist: mcp>=1.9.4
|
30
|
-
Requires-Dist: pypdf>=4.0.0
|
31
|
-
Requires-Dist: requests>=2.31.0
|
32
|
-
Provides-Extra: all
|
33
|
-
Requires-Dist: psutil>=5.9.0; extra == 'all'
|
34
|
-
Provides-Extra: dev
|
35
|
-
Requires-Dist: build>=1.0.0; extra == 'dev'
|
36
|
-
Requires-Dist: mypy>=1.5.0; extra == 'dev'
|
37
|
-
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
38
|
-
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
39
|
-
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
40
|
-
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
41
|
-
Requires-Dist: twine>=4.0.0; extra == 'dev'
|
42
|
-
Provides-Extra: system
|
43
|
-
Requires-Dist: psutil>=5.9.0; extra == 'system'
|
44
|
-
Description-Content-Type: text/markdown
|
45
|
-
|
46
|
-
# All-in-MCP
|
47
|
-
|
48
|
-
An MCP (Model Context Protocol) server that provides daily-use utility functions, including academic paper search capabilities.
|
49
|
-
|
50
|
-
## Features
|
51
|
-
|
52
|
-
### Daily Utilities
|
53
|
-
|
54
|
-
- **Academic Research**: IACR ePrint Archive paper search, download, and reading
|
55
|
-
- **Bibliography Search**: CryptoBib database search for cryptography papers
|
56
|
-
- **Google Scholar**: Search academic papers across disciplines with citation data
|
57
|
-
- **PDF Reading**: Read and extract text from local and online PDF files
|
58
|
-
|
59
|
-
### Paper Search Capabilities
|
60
|
-
|
61
|
-
#### IACR ePrint Archive
|
62
|
-
|
63
|
-
- Search academic papers from IACR ePrint Archive
|
64
|
-
- Download PDF files
|
65
|
-
- Extract and read text content from papers
|
66
|
-
- Metadata extraction (authors, publication dates, abstracts)
|
67
|
-
|
68
|
-
#### CryptoBib Database
|
69
|
-
|
70
|
-
- Search comprehensive cryptography bibliography database
|
71
|
-
- Access to thousands of cryptographic research papers
|
72
|
-
- Retrieve structured paper metadata or raw BibTeX entries
|
73
|
-
- Support for all major cryptography venues and conferences
|
74
|
-
|
75
|
-
#### Google Scholar
|
76
|
-
|
77
|
-
- Search academic papers across multiple disciplines
|
78
|
-
- Access to citation counts and publication metadata
|
79
|
-
- Broad coverage of academic literature from various sources
|
80
|
-
- Year-based filtering for targeted searches
|
81
|
-
|
82
|
-
## Quick Start
|
83
|
-
|
84
|
-
### Prerequisites
|
85
|
-
|
86
|
-
- Python 3.12 or higher
|
87
|
-
- UV package manager
|
88
|
-
|
89
|
-
## Installation
|
90
|
-
|
91
|
-
### Option 1: Install from PyPI (Recommended)
|
92
|
-
|
93
|
-
```bash
|
94
|
-
pip install all-in-mcp
|
95
|
-
```
|
96
|
-
|
97
|
-
### Option 2: Install from Source
|
98
|
-
|
99
|
-
1. Clone this repository:
|
100
|
-
|
101
|
-
```bash
|
102
|
-
git clone https://github.com/jiahaoxiang2000/all-in-mcp.git
|
103
|
-
cd all-in-mcp
|
104
|
-
```
|
105
|
-
|
106
|
-
2. Install with UV:
|
107
|
-
|
108
|
-
```bash
|
109
|
-
uv sync
|
110
|
-
```
|
111
|
-
|
112
|
-
### Running the Server
|
113
|
-
|
114
|
-
After installation, you can run the MCP server directly:
|
115
|
-
|
116
|
-
```bash
|
117
|
-
all-in-mcp
|
118
|
-
```
|
119
|
-
|
120
|
-
Or if you installed from source with UV:
|
121
|
-
|
122
|
-
```bash
|
123
|
-
uv run all-in-mcp
|
124
|
-
```
|
125
|
-
|
126
|
-
## Integration with MCP Clients
|
127
|
-
|
128
|
-
Add this server to your MCP client configuration. The server runs using stdio transport.
|
129
|
-
See detailed integration guide in [`docs/INTEGRATION.md`](docs/INTEGRATION.md).
|
130
|
-
|
131
|
-
Example configuration for Claude Desktop:
|
132
|
-
|
133
|
-
```json
|
134
|
-
{
|
135
|
-
"mcpServers": {
|
136
|
-
"all-in-mcp": {
|
137
|
-
"command": "uv",
|
138
|
-
"args": ["run", "all-in-mcp"],
|
139
|
-
"cwd": "/path/to/all-in-mcp"
|
140
|
-
}
|
141
|
-
}
|
142
|
-
}
|
143
|
-
```
|
144
|
-
|
145
|
-
## Development
|
146
|
-
|
147
|
-
For development setup and contribution guidelines, see the [Development Guide](docs/development.md).
|
148
|
-
|
149
|
-
### Quick Development Setup
|
150
|
-
|
151
|
-
```bash
|
152
|
-
# Clone the repository
|
153
|
-
git clone https://github.com/jiahaoxiang2000/all-in-mcp.git
|
154
|
-
cd all-in-mcp
|
155
|
-
|
156
|
-
# Install with development dependencies
|
157
|
-
uv sync --extra dev
|
158
|
-
|
159
|
-
# Run tests
|
160
|
-
uv run pytest
|
161
|
-
|
162
|
-
# Run linting
|
163
|
-
uv run ruff check src/
|
164
|
-
uv run ruff format src/
|
165
|
-
|
166
|
-
# Type checking
|
167
|
-
uv run mypy src/all_in_mcp
|
168
|
-
```
|
169
|
-
|
170
|
-
### Releases
|
171
|
-
|
172
|
-
This project uses the existing release helper script for creating releases:
|
173
|
-
|
174
|
-
#### Using the Release Script
|
175
|
-
|
176
|
-
Use the release helper script to create a new version:
|
177
|
-
|
178
|
-
```bash
|
179
|
-
python scripts/release.py 0.1.2
|
180
|
-
```
|
181
|
-
|
182
|
-
This script will:
|
183
|
-
|
184
|
-
1. Update the version in `pyproject.toml`
|
185
|
-
2. Create a git commit
|
186
|
-
3. Create a git tag
|
187
|
-
4. Push the changes to trigger CI/CD
|
188
|
-
|
189
|
-
#### Manual Process
|
190
|
-
|
191
|
-
Alternatively, you can manually:
|
192
|
-
|
193
|
-
1. **Update version** in `pyproject.toml`:
|
194
|
-
|
195
|
-
```toml
|
196
|
-
version = "0.1.2" # Change this
|
197
|
-
```
|
198
|
-
|
199
|
-
2. **Commit and tag**:
|
200
|
-
|
201
|
-
```bash
|
202
|
-
git add pyproject.toml
|
203
|
-
git commit -m "Bump version to 0.1.2"
|
204
|
-
git tag v0.1.2
|
205
|
-
git push --follow-tags
|
206
|
-
```
|
207
|
-
|
208
|
-
### Debugging
|
209
|
-
|
210
|
-
For debugging, use the [MCP Inspector](https://github.com/modelcontextprotocol/inspector):
|
211
|
-
|
212
|
-
```bash
|
213
|
-
npx @modelcontextprotocol/inspector uv --directory /path/to/all-in-mcp run all-in-mcp
|
214
|
-
```
|
215
|
-
|
216
|
-
## Documentation
|
217
|
-
|
218
|
-
Complete documentation is available in the [`docs/`](docs/) directory:
|
219
|
-
|
220
|
-
- **[API Reference](docs/api.md)** - Complete API documentation
|
221
|
-
- **[Installation Guide](docs/installation.md)** - Setup instructions
|
222
|
-
- **[IACR Integration](docs/iacr.md)** - Academic paper search details
|
223
|
-
- **[CryptoBib Integration](docs/cryptobib.md)** - Bibliography database search
|
224
|
-
- **[Development Guide](docs/development.md)** - Contributing guidelines
|
225
|
-
- **[PyPI Setup Guide](docs/pypi-setup.md)** - Publishing configuration
|
226
|
-
- **[Examples](docs/examples.md)** - Usage examples
|
all_in_mcp-0.2.5/README.md
DELETED
@@ -1,181 +0,0 @@
|
|
1
|
-
# All-in-MCP
|
2
|
-
|
3
|
-
An MCP (Model Context Protocol) server that provides daily-use utility functions, including academic paper search capabilities.
|
4
|
-
|
5
|
-
## Features
|
6
|
-
|
7
|
-
### Daily Utilities
|
8
|
-
|
9
|
-
- **Academic Research**: IACR ePrint Archive paper search, download, and reading
|
10
|
-
- **Bibliography Search**: CryptoBib database search for cryptography papers
|
11
|
-
- **Google Scholar**: Search academic papers across disciplines with citation data
|
12
|
-
- **PDF Reading**: Read and extract text from local and online PDF files
|
13
|
-
|
14
|
-
### Paper Search Capabilities
|
15
|
-
|
16
|
-
#### IACR ePrint Archive
|
17
|
-
|
18
|
-
- Search academic papers from IACR ePrint Archive
|
19
|
-
- Download PDF files
|
20
|
-
- Extract and read text content from papers
|
21
|
-
- Metadata extraction (authors, publication dates, abstracts)
|
22
|
-
|
23
|
-
#### CryptoBib Database
|
24
|
-
|
25
|
-
- Search comprehensive cryptography bibliography database
|
26
|
-
- Access to thousands of cryptographic research papers
|
27
|
-
- Retrieve structured paper metadata or raw BibTeX entries
|
28
|
-
- Support for all major cryptography venues and conferences
|
29
|
-
|
30
|
-
#### Google Scholar
|
31
|
-
|
32
|
-
- Search academic papers across multiple disciplines
|
33
|
-
- Access to citation counts and publication metadata
|
34
|
-
- Broad coverage of academic literature from various sources
|
35
|
-
- Year-based filtering for targeted searches
|
36
|
-
|
37
|
-
## Quick Start
|
38
|
-
|
39
|
-
### Prerequisites
|
40
|
-
|
41
|
-
- Python 3.12 or higher
|
42
|
-
- UV package manager
|
43
|
-
|
44
|
-
## Installation
|
45
|
-
|
46
|
-
### Option 1: Install from PyPI (Recommended)
|
47
|
-
|
48
|
-
```bash
|
49
|
-
pip install all-in-mcp
|
50
|
-
```
|
51
|
-
|
52
|
-
### Option 2: Install from Source
|
53
|
-
|
54
|
-
1. Clone this repository:
|
55
|
-
|
56
|
-
```bash
|
57
|
-
git clone https://github.com/jiahaoxiang2000/all-in-mcp.git
|
58
|
-
cd all-in-mcp
|
59
|
-
```
|
60
|
-
|
61
|
-
2. Install with UV:
|
62
|
-
|
63
|
-
```bash
|
64
|
-
uv sync
|
65
|
-
```
|
66
|
-
|
67
|
-
### Running the Server
|
68
|
-
|
69
|
-
After installation, you can run the MCP server directly:
|
70
|
-
|
71
|
-
```bash
|
72
|
-
all-in-mcp
|
73
|
-
```
|
74
|
-
|
75
|
-
Or if you installed from source with UV:
|
76
|
-
|
77
|
-
```bash
|
78
|
-
uv run all-in-mcp
|
79
|
-
```
|
80
|
-
|
81
|
-
## Integration with MCP Clients
|
82
|
-
|
83
|
-
Add this server to your MCP client configuration. The server runs using stdio transport.
|
84
|
-
See detailed integration guide in [`docs/INTEGRATION.md`](docs/INTEGRATION.md).
|
85
|
-
|
86
|
-
Example configuration for Claude Desktop:
|
87
|
-
|
88
|
-
```json
|
89
|
-
{
|
90
|
-
"mcpServers": {
|
91
|
-
"all-in-mcp": {
|
92
|
-
"command": "uv",
|
93
|
-
"args": ["run", "all-in-mcp"],
|
94
|
-
"cwd": "/path/to/all-in-mcp"
|
95
|
-
}
|
96
|
-
}
|
97
|
-
}
|
98
|
-
```
|
99
|
-
|
100
|
-
## Development
|
101
|
-
|
102
|
-
For development setup and contribution guidelines, see the [Development Guide](docs/development.md).
|
103
|
-
|
104
|
-
### Quick Development Setup
|
105
|
-
|
106
|
-
```bash
|
107
|
-
# Clone the repository
|
108
|
-
git clone https://github.com/jiahaoxiang2000/all-in-mcp.git
|
109
|
-
cd all-in-mcp
|
110
|
-
|
111
|
-
# Install with development dependencies
|
112
|
-
uv sync --extra dev
|
113
|
-
|
114
|
-
# Run tests
|
115
|
-
uv run pytest
|
116
|
-
|
117
|
-
# Run linting
|
118
|
-
uv run ruff check src/
|
119
|
-
uv run ruff format src/
|
120
|
-
|
121
|
-
# Type checking
|
122
|
-
uv run mypy src/all_in_mcp
|
123
|
-
```
|
124
|
-
|
125
|
-
### Releases
|
126
|
-
|
127
|
-
This project uses the existing release helper script for creating releases:
|
128
|
-
|
129
|
-
#### Using the Release Script
|
130
|
-
|
131
|
-
Use the release helper script to create a new version:
|
132
|
-
|
133
|
-
```bash
|
134
|
-
python scripts/release.py 0.1.2
|
135
|
-
```
|
136
|
-
|
137
|
-
This script will:
|
138
|
-
|
139
|
-
1. Update the version in `pyproject.toml`
|
140
|
-
2. Create a git commit
|
141
|
-
3. Create a git tag
|
142
|
-
4. Push the changes to trigger CI/CD
|
143
|
-
|
144
|
-
#### Manual Process
|
145
|
-
|
146
|
-
Alternatively, you can manually:
|
147
|
-
|
148
|
-
1. **Update version** in `pyproject.toml`:
|
149
|
-
|
150
|
-
```toml
|
151
|
-
version = "0.1.2" # Change this
|
152
|
-
```
|
153
|
-
|
154
|
-
2. **Commit and tag**:
|
155
|
-
|
156
|
-
```bash
|
157
|
-
git add pyproject.toml
|
158
|
-
git commit -m "Bump version to 0.1.2"
|
159
|
-
git tag v0.1.2
|
160
|
-
git push --follow-tags
|
161
|
-
```
|
162
|
-
|
163
|
-
### Debugging
|
164
|
-
|
165
|
-
For debugging, use the [MCP Inspector](https://github.com/modelcontextprotocol/inspector):
|
166
|
-
|
167
|
-
```bash
|
168
|
-
npx @modelcontextprotocol/inspector uv --directory /path/to/all-in-mcp run all-in-mcp
|
169
|
-
```
|
170
|
-
|
171
|
-
## Documentation
|
172
|
-
|
173
|
-
Complete documentation is available in the [`docs/`](docs/) directory:
|
174
|
-
|
175
|
-
- **[API Reference](docs/api.md)** - Complete API documentation
|
176
|
-
- **[Installation Guide](docs/installation.md)** - Setup instructions
|
177
|
-
- **[IACR Integration](docs/iacr.md)** - Academic paper search details
|
178
|
-
- **[CryptoBib Integration](docs/cryptobib.md)** - Bibliography database search
|
179
|
-
- **[Development Guide](docs/development.md)** - Contributing guidelines
|
180
|
-
- **[PyPI Setup Guide](docs/pypi-setup.md)** - Publishing configuration
|
181
|
-
- **[Examples](docs/examples.md)** - Usage examples
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|