all-in-mcp 0.2.5__py3-none-any.whl → 0.2.7__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.
@@ -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
- if not paper_id:
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
- Read paper text (downloads PDF first if needed)
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
- if not paper_id:
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, query: str, max_results: int = 10, fetch_details: bool = True
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)
all_in_mcp/server.py CHANGED
@@ -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(query, max_results, fetch_details)
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", text=f"No papers found for query: {query}"
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
- result_text = f"Found {len(papers)} IACR papers for query '{query}':\n\n"
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
 
@@ -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>
@@ -1,14 +1,14 @@
1
1
  all_in_mcp/__init__.py,sha256=REDwcbifpuUnsFAhNowIKCZ-8g6irIzUFTI_f8Aunxk,215
2
2
  all_in_mcp/paper.py,sha256=vSJyC_ehfZX5-ASYG048z8gaD1LKafFdJvR13iQcJRw,7104
3
- all_in_mcp/server.py,sha256=DyfOtcVclzh6qgN42lETH_3cUXe2qrBXdCFUfDfQvH0,27740
3
+ all_in_mcp/server.py,sha256=NQ-AEARpZXafLs_yTUKmSC2I32tLQUVL_KLYdefWdm0,25585
4
4
  all_in_mcp/academic_platforms/__init__.py,sha256=IpI29DMS4_mSmTEa8VkQEiJCl7OyFbswSx7mWSp08P4,285
5
5
  all_in_mcp/academic_platforms/base.py,sha256=VYMp8_tnp7YzXKAXLfr7uUxgvJBNKRyC_NT1uVhBOwY,673
6
- all_in_mcp/academic_platforms/crossref.py,sha256=Lun9-D_MgS9kFlQquktg6NXsG1S6nU24s87Y_sOJc0s,10983
6
+ all_in_mcp/academic_platforms/crossref.py,sha256=D-wvSwnOocP16m9fA3xJ6VGEpmRPtMmGoFm5MlyPdXE,8707
7
7
  all_in_mcp/academic_platforms/cryptobib.py,sha256=F9N23eojfyAIjnFDPrJAYOpZ_Vi9iHOqNHGtKC6O16c,17360
8
8
  all_in_mcp/academic_platforms/google_scholar.py,sha256=_KLFfIOZeFCGxFOt-nwzm1fgZKMlXOf3HvIjXAYE5cI,8737
9
- all_in_mcp/academic_platforms/iacr.py,sha256=MUPxFycVS0eMsJok71y12RUqjxbRrCReG33V5ORAbfU,15450
10
- all_in_mcp-0.2.5.dist-info/METADATA,sha256=PKH2VSeQJzZ7HiVKoh4zmkQntOsOuSDmsM6u0b8eifg,6067
11
- all_in_mcp-0.2.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
12
- all_in_mcp-0.2.5.dist-info/entry_points.txt,sha256=FbQOtUQzOIfkMNp4qQV1NTU9K4J7C0XGH9wKKhfK1VM,47
13
- all_in_mcp-0.2.5.dist-info/licenses/LICENSE,sha256=idExTHItK7AC5FVo4H9HKnr6h51Z8BKCEztZPyP8nK8,1062
14
- all_in_mcp-0.2.5.dist-info/RECORD,,
9
+ all_in_mcp/academic_platforms/iacr.py,sha256=CMv3kVvF7NiZJdtvXc8xoGOP-gMNnAkhIETTbYTP75o,15849
10
+ all_in_mcp-0.2.7.dist-info/METADATA,sha256=r2v5qsm0TwWdfUZwFGuaFxVSeyh9PYlarJym8Kt6pFM,4242
11
+ all_in_mcp-0.2.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
12
+ all_in_mcp-0.2.7.dist-info/entry_points.txt,sha256=FbQOtUQzOIfkMNp4qQV1NTU9K4J7C0XGH9wKKhfK1VM,47
13
+ all_in_mcp-0.2.7.dist-info/licenses/LICENSE,sha256=idExTHItK7AC5FVo4H9HKnr6h51Z8BKCEztZPyP8nK8,1062
14
+ all_in_mcp-0.2.7.dist-info/RECORD,,
@@ -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