scansci-pdf 1.1.1__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 (63) hide show
  1. scansci_pdf-1.1.1/LICENSE +52 -0
  2. scansci_pdf-1.1.1/PKG-INFO +299 -0
  3. scansci_pdf-1.1.1/README.md +273 -0
  4. scansci_pdf-1.1.1/pyproject.toml +35 -0
  5. scansci_pdf-1.1.1/setup.cfg +4 -0
  6. scansci_pdf-1.1.1/setup.py +87 -0
  7. scansci_pdf-1.1.1/src/scansci_pdf/__init__.py +3 -0
  8. scansci_pdf-1.1.1/src/scansci_pdf/__main__.py +6 -0
  9. scansci_pdf-1.1.1/src/scansci_pdf/_core/__init__.py +3 -0
  10. scansci_pdf-1.1.1/src/scansci_pdf/_core/racing.c +14979 -0
  11. scansci_pdf-1.1.1/src/scansci_pdf/_core/racing.cp312-win_amd64.pyd +0 -0
  12. scansci_pdf-1.1.1/src/scansci_pdf/_core/racing.pyx +212 -0
  13. scansci_pdf-1.1.1/src/scansci_pdf/_core/scihub_core.c +10787 -0
  14. scansci_pdf-1.1.1/src/scansci_pdf/_core/scihub_core.cp312-win_amd64.pyd +0 -0
  15. scansci_pdf-1.1.1/src/scansci_pdf/_core/scihub_core.pyx +118 -0
  16. scansci_pdf-1.1.1/src/scansci_pdf/_core/vpnsci_core.c +15741 -0
  17. scansci_pdf-1.1.1/src/scansci_pdf/_core/vpnsci_core.cp312-win_amd64.pyd +0 -0
  18. scansci_pdf-1.1.1/src/scansci_pdf/_core/vpnsci_core.pyx +190 -0
  19. scansci_pdf-1.1.1/src/scansci_pdf/bibparser.py +119 -0
  20. scansci_pdf-1.1.1/src/scansci_pdf/bibtex.py +140 -0
  21. scansci_pdf-1.1.1/src/scansci_pdf/cache.py +62 -0
  22. scansci_pdf-1.1.1/src/scansci_pdf/citation.py +225 -0
  23. scansci_pdf-1.1.1/src/scansci_pdf/config.py +141 -0
  24. scansci_pdf-1.1.1/src/scansci_pdf/data/webvpn.dat +0 -0
  25. scansci_pdf-1.1.1/src/scansci_pdf/data/webvpn.json +574 -0
  26. scansci_pdf-1.1.1/src/scansci_pdf/deps.py +113 -0
  27. scansci_pdf-1.1.1/src/scansci_pdf/domain_db.py +135 -0
  28. scansci_pdf-1.1.1/src/scansci_pdf/embedded_tor.py +310 -0
  29. scansci_pdf-1.1.1/src/scansci_pdf/flaresolverr.py +206 -0
  30. scansci_pdf-1.1.1/src/scansci_pdf/identifiers.py +64 -0
  31. scansci_pdf-1.1.1/src/scansci_pdf/log.py +20 -0
  32. scansci_pdf-1.1.1/src/scansci_pdf/main.py +55 -0
  33. scansci_pdf-1.1.1/src/scansci_pdf/network.py +259 -0
  34. scansci_pdf-1.1.1/src/scansci_pdf/paperlist.py +190 -0
  35. scansci_pdf-1.1.1/src/scansci_pdf/pdf_utils.py +190 -0
  36. scansci_pdf-1.1.1/src/scansci_pdf/rename.py +132 -0
  37. scansci_pdf-1.1.1/src/scansci_pdf/resolver.py +105 -0
  38. scansci_pdf-1.1.1/src/scansci_pdf/schools.py +98 -0
  39. scansci_pdf-1.1.1/src/scansci_pdf/search.py +131 -0
  40. scansci_pdf-1.1.1/src/scansci_pdf/server.py +593 -0
  41. scansci_pdf-1.1.1/src/scansci_pdf/setup.py +205 -0
  42. scansci_pdf-1.1.1/src/scansci_pdf/sources/__init__.py +645 -0
  43. scansci_pdf-1.1.1/src/scansci_pdf/sources/arxiv.py +50 -0
  44. scansci_pdf-1.1.1/src/scansci_pdf/sources/core_api.py +46 -0
  45. scansci_pdf-1.1.1/src/scansci_pdf/sources/crossref.py +160 -0
  46. scansci_pdf-1.1.1/src/scansci_pdf/sources/europepmc.py +74 -0
  47. scansci_pdf-1.1.1/src/scansci_pdf/sources/libgen.py +79 -0
  48. scansci_pdf-1.1.1/src/scansci_pdf/sources/nature.py +39 -0
  49. scansci_pdf-1.1.1/src/scansci_pdf/sources/oa_discovery.py +135 -0
  50. scansci_pdf-1.1.1/src/scansci_pdf/sources/openalex.py +105 -0
  51. scansci_pdf-1.1.1/src/scansci_pdf/sources/publishers.py +606 -0
  52. scansci_pdf-1.1.1/src/scansci_pdf/sources/scihub.py +332 -0
  53. scansci_pdf-1.1.1/src/scansci_pdf/sources/semantic_scholar.py +43 -0
  54. scansci_pdf-1.1.1/src/scansci_pdf/sources/unpaywall.py +70 -0
  55. scansci_pdf-1.1.1/src/scansci_pdf/sources/vpnsci.py +535 -0
  56. scansci_pdf-1.1.1/src/scansci_pdf/tor.py +98 -0
  57. scansci_pdf-1.1.1/src/scansci_pdf/zotero.py +202 -0
  58. scansci_pdf-1.1.1/src/scansci_pdf.egg-info/PKG-INFO +299 -0
  59. scansci_pdf-1.1.1/src/scansci_pdf.egg-info/SOURCES.txt +61 -0
  60. scansci_pdf-1.1.1/src/scansci_pdf.egg-info/dependency_links.txt +1 -0
  61. scansci_pdf-1.1.1/src/scansci_pdf.egg-info/entry_points.txt +2 -0
  62. scansci_pdf-1.1.1/src/scansci_pdf.egg-info/requires.txt +20 -0
  63. scansci_pdf-1.1.1/src/scansci_pdf.egg-info/top_level.txt +1 -0
@@ -0,0 +1,52 @@
1
+ ScanSci PDF - Proprietary License
2
+
3
+ Copyright (C) 2024 ScanSci PDF Contributors. All rights reserved.
4
+
5
+ IMPORTANT: READ THIS LICENSE CAREFULLY BEFORE USING THIS SOFTWARE.
6
+
7
+ 1. GRANT OF LICENSE
8
+ Subject to the terms of this License, the Licensor grants you a
9
+ non-exclusive, non-transferable, limited license to install and use
10
+ the Software for personal, non-commercial purposes only.
11
+
12
+ 2. RESTRICTIONS
13
+ You may NOT:
14
+ a) Modify, adapt, translate, reverse engineer, decompile, or
15
+ disassemble the Software;
16
+ b) Create derivative works based on the Software;
17
+ c) Redistribute, sell, lease, rent, lend, or sublicense the Software;
18
+ d) Use the Software for any commercial purpose without a separate
19
+ commercial license from the Licensor;
20
+ e) Remove or alter any proprietary notices, labels, or marks on the
21
+ Software.
22
+
23
+ 3. INTELLECTUAL PROPERTY
24
+ The Software is protected by copyright laws and international treaty
25
+ provisions. All title, ownership rights, and intellectual property
26
+ rights in and to the Software shall remain with the Licensor.
27
+
28
+ 4. NO WARRANTY
29
+ THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
30
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
32
+ IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
33
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
34
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
35
+ OTHER DEALINGS IN THE SOFTWARE.
36
+
37
+ 5. TERMINATION
38
+ This License is effective until terminated. Your rights under this
39
+ License will terminate automatically without notice if you fail to
40
+ comply with any term(s) of this License. Upon termination, you must
41
+ destroy all copies of the Software in your possession.
42
+
43
+ 6. COMMERCIAL USE
44
+ For commercial licensing inquiries, please contact the Licensor.
45
+ Commercial use requires a separate written agreement.
46
+
47
+ 7. ENTIRE AGREEMENT
48
+ This License constitutes the entire agreement between you and the
49
+ Licensor relating to the Software and supersedes all prior or
50
+ contemporaneous oral or written communications, proposals, and
51
+ representations with respect to the Software or any other subject
52
+ matter covered by this License.
@@ -0,0 +1,299 @@
1
+ Metadata-Version: 2.4
2
+ Name: scansci-pdf
3
+ Version: 1.1.1
4
+ Summary: MCP server for academic paper downloading with Sci-Hub, OA sources, multi-university WebVPN, and Tor support
5
+ License: Proprietary - All rights reserved. See LICENSE for details.
6
+ Requires-Python: >=3.11
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: requests>=2.31
10
+ Requires-Dist: requests[socks]>=2.31
11
+ Requires-Dist: beautifulsoup4>=4.12
12
+ Requires-Dist: curl_cffi>=0.15
13
+ Requires-Dist: mcp[cli]>=1.12
14
+ Requires-Dist: typer>=0.15
15
+ Requires-Dist: uvicorn>=0.34
16
+ Provides-Extra: fast
17
+ Requires-Dist: lxml>=4.9; extra == "fast"
18
+ Provides-Extra: vpnsci
19
+ Requires-Dist: pycryptodome>=3.20; extra == "vpnsci"
20
+ Requires-Dist: selenium>=4.15; extra == "vpnsci"
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest>=8.0; extra == "dev"
23
+ Provides-Extra: compile
24
+ Requires-Dist: cython>=3.0; extra == "compile"
25
+ Dynamic: license-file
26
+
27
+ # ScanSci PDF
28
+
29
+ > 学术论文下载 MCP 服务器 — 支持 13+ 数据源、100+ 高校 WebVPN、并行下载
30
+
31
+ `Python 3.11+` `MCP 兼容` `Docker 就绪`
32
+
33
+ ---
34
+
35
+ ## 功能特性
36
+
37
+ - **13+ 下载源**:arXiv、Sci-Hub、LibGen、Unpaywall、OpenAlex、Semantic Scholar、DOAJ、EuropePMC、CORE、PMC、出版商直链等
38
+ - **多校 WebVPN**:100+ 所中国高校机构代理
39
+ - **并行下载**:多数据源同时尝试,自动选择最快可用源
40
+ - **论文列表解析**:APA 引文、BibTeX、DOI 列表,自动补全缺失 DOI
41
+ - **自动重命名**:PDF 自动重命名为 `作者年份_标题.pdf` 格式
42
+ - **引文导出**:BibTeX、RIS、EndNote 格式
43
+ - **Zotero 集成**:下载后直接推送到 Zotero
44
+ - **Tor 支持**:通过 Tor 代理访问 Sci-Hub/LibGen
45
+
46
+ ---
47
+
48
+ ## 快速开始
49
+
50
+ ### 安装
51
+
52
+ ```bash
53
+ pip install scansci-pdf
54
+ ```
55
+
56
+ ### 启动 MCP 服务器
57
+
58
+ ```bash
59
+ # stdio 模式(Claude Desktop / Claude Code)
60
+ scansci-pdf run
61
+
62
+ # HTTP 模式(Web 调用)
63
+ scansci-pdf run --mode streamable_http --host 0.0.0.0 --port 8000
64
+ ```
65
+
66
+ ### 检查依赖
67
+
68
+ ```bash
69
+ scansci-pdf check
70
+ ```
71
+
72
+ ### MCP 配置
73
+
74
+ 在 Claude Desktop 或 Claude Code 中添加:
75
+
76
+ ```json
77
+ {
78
+ "mcpServers": {
79
+ "scansci-pdf": {
80
+ "command": "scansci-pdf",
81
+ "args": ["run"]
82
+ }
83
+ }
84
+ }
85
+ ```
86
+
87
+ Docker 方式:
88
+
89
+ ```json
90
+ {
91
+ "mcpServers": {
92
+ "scansci-pdf": {
93
+ "command": "docker",
94
+ "args": ["compose", "-f", "path/to/docker-compose.yml", "run", "--rm", "scansci-pdf"]
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ ---
101
+
102
+ ## MCP 工具一览
103
+
104
+ ### 论文下载
105
+
106
+ | 工具 | 描述 | 关键参数 |
107
+ |------|------|----------|
108
+ | `scansci_pdf_download` | 下载单篇论文 | `identifier`(必需,DOI 或 arXiv ID)、`strategy`、`use_vpnsci`、`use_tor` |
109
+ | `scansci_pdf_batch_download` | 批量下载多篇论文 | `identifiers`(必需,列表)、`use_vpnsci`、`use_tor` |
110
+ | `scansci_pdf_resolve_and_download` | 完整流水线:解析列表 → 补全 DOI → 批量下载 | `file_path`(必需)、`resolve_titles` |
111
+
112
+ ### 搜索与解析
113
+
114
+ | 工具 | 描述 | 关键参数 |
115
+ |------|------|----------|
116
+ | `scansci_pdf_search` | 按关键词搜索论文(OpenAlex) | `query`(必需)、`limit`、`year_from`、`year_to`、`sort` |
117
+ | `scansci_pdf_parse_list` | 解析 APA/BibTeX/DOI 列表文件 | `file_path`(必需) |
118
+
119
+ ### 引文管理
120
+
121
+ | 工具 | 描述 | 关键参数 |
122
+ |------|------|----------|
123
+ | `scansci_pdf_citation` | 获取论文引文 | `identifier`(必需)、`format`(bibtex/ris/endnote) |
124
+ | `scansci_pdf_import_bib` | 导入 .bib 文件并下载全部论文 | `bib_file`(必需) |
125
+ | `scansci_pdf_zotero_push` | 推送论文到 Zotero | `identifier`(必需) |
126
+
127
+ ### WebVPN 管理
128
+
129
+ | 工具 | 描述 | 关键参数 |
130
+ |------|------|----------|
131
+ | `scansci_pdf_vpnsci_login` | 打开浏览器进行 CAS 认证登录 | 无 |
132
+ | `scansci_pdf_vpnsci_test` | 测试 WebVPN 连接性 | `doi`(可选) |
133
+ | `scansci_pdf_vpnsci_status` | 检查 WebVPN 登录状态 | 无 |
134
+ | `scansci_pdf_vpnsci_schools` | 搜索支持的大学 | `query`(可选,如"清华") |
135
+ | `scansci_pdf_vpnsci_set_school` | 设置当前大学 | `school`(必需,如"清华大学") |
136
+
137
+ ### 系统管理
138
+
139
+ | 工具 | 描述 | 关键参数 |
140
+ |------|------|----------|
141
+ | `scansci_pdf_health_check` | 检查所有数据源可用性 | `detailed`(默认 false) |
142
+ | `scansci_pdf_setup_check` | 检测系统环境并给出安装建议 | 无 |
143
+ | `scansci_pdf_config_get` | 查看当前配置 | 无 |
144
+ | `scansci_pdf_config_set` | 修改配置项 | `key`(必需)、`value`(必需) |
145
+ | `scansci_pdf_cache_clear` | 清除下载缓存 | `identifier`(可选,省略则清除全部) |
146
+
147
+ ### Tor 管理
148
+
149
+ | 工具 | 描述 | 关键参数 |
150
+ |------|------|----------|
151
+ | `scansci_pdf_tor_install` | 自动下载安装 Tor Expert Bundle | 无 |
152
+ | `scansci_pdf_tor_start` | 启动内嵌 Tor SOCKS5 代理 | `use_bridges`(默认 false) |
153
+ | `scansci_pdf_tor_stop` | 停止内嵌 Tor 代理 | 无 |
154
+
155
+ ---
156
+
157
+ ## 下载策略
158
+
159
+ | 策略 | 描述 |
160
+ |------|------|
161
+ | `fastest`(默认) | 多数据源并行,自动选择最快可用源 |
162
+ | `oa_first` | 优先尝试合法开放获取源,Sci-Hub 作为兜底 |
163
+ | `scihub_only` | 仅使用 Sci-Hub |
164
+ | `legal_only` | 仅使用合法数据源(不含 Sci-Hub/LibGen) |
165
+
166
+ ---
167
+
168
+ ## WebVPN 设置
169
+
170
+ WebVPN 通过中国高校机构代理访问论文全文,5 步启用:
171
+
172
+ ```bash
173
+ # 1. 启用 WebVPN
174
+ scansci_pdf_config_set key=vpnsci_enabled value=true
175
+
176
+ # 2. 设置你的大学
177
+ scansci_pdf_vpnsci_set_school school=清华大学
178
+
179
+ # 3. 登录(浏览器打开 CAS 认证)
180
+ scansci_pdf_vpnsci_login
181
+
182
+ # 4. 测试连接
183
+ scansci_pdf_vpnsci_test
184
+
185
+ # 5. 使用 WebVPN 下载
186
+ scansci_pdf_download identifier=10.1038/nature12373 use_vpnsci=true
187
+ ```
188
+
189
+ 支持 100+ 所高校,使用 `scansci_pdf_vpnsci_schools` 搜索。部分示例:
190
+
191
+ > 清华大学、北京大学、浙江大学、上海交通大学、复旦大学、南京大学、中国科学技术大学、华中科技大学、武汉大学、中山大学……
192
+
193
+ ---
194
+
195
+ ## 配置参考
196
+
197
+ 关键配置项(通过 `scansci_pdf_config_set` 修改):
198
+
199
+ | 配置项 | 默认值 | 说明 |
200
+ |--------|--------|------|
201
+ | `scihub_enabled` | `true` | 启用 Sci-Hub |
202
+ | `download_strategy` | `fastest` | 下载策略 |
203
+ | `output_dir` | `~/.scansci-pdf/papers` | PDF 输出目录 |
204
+ | `auto_rename` | `true` | 自动重命名 PDF |
205
+ | `network_proxy` | (空) | HTTP/SOCKS 代理地址 |
206
+ | `batch_workers` | `10` | 批量下载并发数 |
207
+ | `email` | (占位符) | Unpaywall API 邮箱 |
208
+ | `vpnsci_enabled` | `false` | 启用 WebVPN |
209
+ | `vpnsci_school` | `清华大学` | 默认大学 |
210
+ | `use_tor_for_scihub` | `false` | Sci-Hub 使用 Tor |
211
+
212
+ ---
213
+
214
+ ## Docker 部署
215
+
216
+ ```bash
217
+ docker compose up -d
218
+ ```
219
+
220
+ 启动服务:
221
+
222
+ | 服务 | 说明 | 端口 |
223
+ |------|------|------|
224
+ | `scansci-pdf` | MCP 服务器 | 8000 |
225
+ | `tor` | Tor SOCKS5 代理 | 1080 |
226
+
227
+ 数据持久化在 Docker 卷 `scansci-pdf-data` 中。
228
+
229
+ ---
230
+
231
+ ## 环境配置
232
+
233
+ 运行 `scansci_pdf_setup_check` 可自动检测系统环境并给出安装建议。
234
+
235
+ ### Tor 安装
236
+
237
+ Tor 用于匿名访问 Sci-Hub/LibGen,在网络封锁 Sci-Hub 的地区必需。
238
+
239
+ **推荐方式:内嵌 Tor(无需 Docker)**
240
+
241
+ ```
242
+ # 自动下载安装 Tor Expert Bundle
243
+ scansci_pdf_tor_install
244
+
245
+ # 启动 Tor 代理
246
+ scansci_pdf_tor_start
247
+
248
+ # 受限网络(防火墙封锁 Tor)使用 obfs4 桥接
249
+ scansci_pdf_tor_start(use_bridges=true)
250
+ ```
251
+
252
+ Tor 二进制自动下载到 `~/.scansci-pdf/tor/`,不污染系统环境。首次使用时下载约 30MB。
253
+
254
+ **备选方式:Docker**
255
+ ```bash
256
+ docker compose up -d tor # 启动 Tor 容器,监听 1080 端口
257
+ ```
258
+
259
+ 使用的镜像:[`shahradel/torproxy`](https://github.com/shahradel/TorProxy)(轻量 Tor SOCKS5 代理,仅 30MB)。
260
+
261
+ **手动安装:**
262
+
263
+ | 系统 | 命令 |
264
+ |------|------|
265
+ | Windows | 下载 [Tor Expert Bundle](https://www.torproject.org/download/tor/),解压后运行 `tor.exe` |
266
+ | macOS | `brew install tor && brew services start tor` |
267
+ | Ubuntu/Debian | `sudo apt install tor && sudo systemctl enable --now tor` |
268
+
269
+ 默认端口:`1080`(Docker)/ `9050`(手动安装)。可通过 `scansci_pdf_config_set key=network_proxy value=socks5h://127.0.0.1:9050` 修改。
270
+
271
+ ### Docker 安装
272
+
273
+ | 系统 | 方式 |
274
+ |------|------|
275
+ | Windows | [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/)(需 WSL2) |
276
+ | macOS | [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/)(支持 Apple Silicon) |
277
+ | Linux | `curl -fsSL https://get.docker.com \| sh` |
278
+
279
+ ---
280
+
281
+ ## 常见问题
282
+
283
+ **Sci-Hub 下载失败**
284
+ Sci-Hub 域名经常变化,工具会自动处理。运行 `scansci_pdf_health_check detailed=true` 查看各数据源状态。
285
+
286
+ **Tor 连接不上**
287
+ 确保 Tor 运行在 `socks5h://127.0.0.1:1080`。Docker 部署时 Tor 自动启动。
288
+
289
+ **WebVPN 登录失败**
290
+ WebVPN 需要 Chrome/ChromeDriver。登录在你的浏览器中完成,密码不会经过本工具。
291
+
292
+ **下载速度慢**
293
+ 运行 `scansci_pdf_health_check detailed=true` 检查各数据源延迟。如果 Sci-Hub 在你的网络中被封锁,尝试 `legal_only` 策略。
294
+
295
+ ---
296
+
297
+ ## 许可证
298
+
299
+ 专有许可证 - 保留所有权利。详见 [LICENSE](LICENSE)。
@@ -0,0 +1,273 @@
1
+ # ScanSci PDF
2
+
3
+ > 学术论文下载 MCP 服务器 — 支持 13+ 数据源、100+ 高校 WebVPN、并行下载
4
+
5
+ `Python 3.11+` `MCP 兼容` `Docker 就绪`
6
+
7
+ ---
8
+
9
+ ## 功能特性
10
+
11
+ - **13+ 下载源**:arXiv、Sci-Hub、LibGen、Unpaywall、OpenAlex、Semantic Scholar、DOAJ、EuropePMC、CORE、PMC、出版商直链等
12
+ - **多校 WebVPN**:100+ 所中国高校机构代理
13
+ - **并行下载**:多数据源同时尝试,自动选择最快可用源
14
+ - **论文列表解析**:APA 引文、BibTeX、DOI 列表,自动补全缺失 DOI
15
+ - **自动重命名**:PDF 自动重命名为 `作者年份_标题.pdf` 格式
16
+ - **引文导出**:BibTeX、RIS、EndNote 格式
17
+ - **Zotero 集成**:下载后直接推送到 Zotero
18
+ - **Tor 支持**:通过 Tor 代理访问 Sci-Hub/LibGen
19
+
20
+ ---
21
+
22
+ ## 快速开始
23
+
24
+ ### 安装
25
+
26
+ ```bash
27
+ pip install scansci-pdf
28
+ ```
29
+
30
+ ### 启动 MCP 服务器
31
+
32
+ ```bash
33
+ # stdio 模式(Claude Desktop / Claude Code)
34
+ scansci-pdf run
35
+
36
+ # HTTP 模式(Web 调用)
37
+ scansci-pdf run --mode streamable_http --host 0.0.0.0 --port 8000
38
+ ```
39
+
40
+ ### 检查依赖
41
+
42
+ ```bash
43
+ scansci-pdf check
44
+ ```
45
+
46
+ ### MCP 配置
47
+
48
+ 在 Claude Desktop 或 Claude Code 中添加:
49
+
50
+ ```json
51
+ {
52
+ "mcpServers": {
53
+ "scansci-pdf": {
54
+ "command": "scansci-pdf",
55
+ "args": ["run"]
56
+ }
57
+ }
58
+ }
59
+ ```
60
+
61
+ Docker 方式:
62
+
63
+ ```json
64
+ {
65
+ "mcpServers": {
66
+ "scansci-pdf": {
67
+ "command": "docker",
68
+ "args": ["compose", "-f", "path/to/docker-compose.yml", "run", "--rm", "scansci-pdf"]
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
74
+ ---
75
+
76
+ ## MCP 工具一览
77
+
78
+ ### 论文下载
79
+
80
+ | 工具 | 描述 | 关键参数 |
81
+ |------|------|----------|
82
+ | `scansci_pdf_download` | 下载单篇论文 | `identifier`(必需,DOI 或 arXiv ID)、`strategy`、`use_vpnsci`、`use_tor` |
83
+ | `scansci_pdf_batch_download` | 批量下载多篇论文 | `identifiers`(必需,列表)、`use_vpnsci`、`use_tor` |
84
+ | `scansci_pdf_resolve_and_download` | 完整流水线:解析列表 → 补全 DOI → 批量下载 | `file_path`(必需)、`resolve_titles` |
85
+
86
+ ### 搜索与解析
87
+
88
+ | 工具 | 描述 | 关键参数 |
89
+ |------|------|----------|
90
+ | `scansci_pdf_search` | 按关键词搜索论文(OpenAlex) | `query`(必需)、`limit`、`year_from`、`year_to`、`sort` |
91
+ | `scansci_pdf_parse_list` | 解析 APA/BibTeX/DOI 列表文件 | `file_path`(必需) |
92
+
93
+ ### 引文管理
94
+
95
+ | 工具 | 描述 | 关键参数 |
96
+ |------|------|----------|
97
+ | `scansci_pdf_citation` | 获取论文引文 | `identifier`(必需)、`format`(bibtex/ris/endnote) |
98
+ | `scansci_pdf_import_bib` | 导入 .bib 文件并下载全部论文 | `bib_file`(必需) |
99
+ | `scansci_pdf_zotero_push` | 推送论文到 Zotero | `identifier`(必需) |
100
+
101
+ ### WebVPN 管理
102
+
103
+ | 工具 | 描述 | 关键参数 |
104
+ |------|------|----------|
105
+ | `scansci_pdf_vpnsci_login` | 打开浏览器进行 CAS 认证登录 | 无 |
106
+ | `scansci_pdf_vpnsci_test` | 测试 WebVPN 连接性 | `doi`(可选) |
107
+ | `scansci_pdf_vpnsci_status` | 检查 WebVPN 登录状态 | 无 |
108
+ | `scansci_pdf_vpnsci_schools` | 搜索支持的大学 | `query`(可选,如"清华") |
109
+ | `scansci_pdf_vpnsci_set_school` | 设置当前大学 | `school`(必需,如"清华大学") |
110
+
111
+ ### 系统管理
112
+
113
+ | 工具 | 描述 | 关键参数 |
114
+ |------|------|----------|
115
+ | `scansci_pdf_health_check` | 检查所有数据源可用性 | `detailed`(默认 false) |
116
+ | `scansci_pdf_setup_check` | 检测系统环境并给出安装建议 | 无 |
117
+ | `scansci_pdf_config_get` | 查看当前配置 | 无 |
118
+ | `scansci_pdf_config_set` | 修改配置项 | `key`(必需)、`value`(必需) |
119
+ | `scansci_pdf_cache_clear` | 清除下载缓存 | `identifier`(可选,省略则清除全部) |
120
+
121
+ ### Tor 管理
122
+
123
+ | 工具 | 描述 | 关键参数 |
124
+ |------|------|----------|
125
+ | `scansci_pdf_tor_install` | 自动下载安装 Tor Expert Bundle | 无 |
126
+ | `scansci_pdf_tor_start` | 启动内嵌 Tor SOCKS5 代理 | `use_bridges`(默认 false) |
127
+ | `scansci_pdf_tor_stop` | 停止内嵌 Tor 代理 | 无 |
128
+
129
+ ---
130
+
131
+ ## 下载策略
132
+
133
+ | 策略 | 描述 |
134
+ |------|------|
135
+ | `fastest`(默认) | 多数据源并行,自动选择最快可用源 |
136
+ | `oa_first` | 优先尝试合法开放获取源,Sci-Hub 作为兜底 |
137
+ | `scihub_only` | 仅使用 Sci-Hub |
138
+ | `legal_only` | 仅使用合法数据源(不含 Sci-Hub/LibGen) |
139
+
140
+ ---
141
+
142
+ ## WebVPN 设置
143
+
144
+ WebVPN 通过中国高校机构代理访问论文全文,5 步启用:
145
+
146
+ ```bash
147
+ # 1. 启用 WebVPN
148
+ scansci_pdf_config_set key=vpnsci_enabled value=true
149
+
150
+ # 2. 设置你的大学
151
+ scansci_pdf_vpnsci_set_school school=清华大学
152
+
153
+ # 3. 登录(浏览器打开 CAS 认证)
154
+ scansci_pdf_vpnsci_login
155
+
156
+ # 4. 测试连接
157
+ scansci_pdf_vpnsci_test
158
+
159
+ # 5. 使用 WebVPN 下载
160
+ scansci_pdf_download identifier=10.1038/nature12373 use_vpnsci=true
161
+ ```
162
+
163
+ 支持 100+ 所高校,使用 `scansci_pdf_vpnsci_schools` 搜索。部分示例:
164
+
165
+ > 清华大学、北京大学、浙江大学、上海交通大学、复旦大学、南京大学、中国科学技术大学、华中科技大学、武汉大学、中山大学……
166
+
167
+ ---
168
+
169
+ ## 配置参考
170
+
171
+ 关键配置项(通过 `scansci_pdf_config_set` 修改):
172
+
173
+ | 配置项 | 默认值 | 说明 |
174
+ |--------|--------|------|
175
+ | `scihub_enabled` | `true` | 启用 Sci-Hub |
176
+ | `download_strategy` | `fastest` | 下载策略 |
177
+ | `output_dir` | `~/.scansci-pdf/papers` | PDF 输出目录 |
178
+ | `auto_rename` | `true` | 自动重命名 PDF |
179
+ | `network_proxy` | (空) | HTTP/SOCKS 代理地址 |
180
+ | `batch_workers` | `10` | 批量下载并发数 |
181
+ | `email` | (占位符) | Unpaywall API 邮箱 |
182
+ | `vpnsci_enabled` | `false` | 启用 WebVPN |
183
+ | `vpnsci_school` | `清华大学` | 默认大学 |
184
+ | `use_tor_for_scihub` | `false` | Sci-Hub 使用 Tor |
185
+
186
+ ---
187
+
188
+ ## Docker 部署
189
+
190
+ ```bash
191
+ docker compose up -d
192
+ ```
193
+
194
+ 启动服务:
195
+
196
+ | 服务 | 说明 | 端口 |
197
+ |------|------|------|
198
+ | `scansci-pdf` | MCP 服务器 | 8000 |
199
+ | `tor` | Tor SOCKS5 代理 | 1080 |
200
+
201
+ 数据持久化在 Docker 卷 `scansci-pdf-data` 中。
202
+
203
+ ---
204
+
205
+ ## 环境配置
206
+
207
+ 运行 `scansci_pdf_setup_check` 可自动检测系统环境并给出安装建议。
208
+
209
+ ### Tor 安装
210
+
211
+ Tor 用于匿名访问 Sci-Hub/LibGen,在网络封锁 Sci-Hub 的地区必需。
212
+
213
+ **推荐方式:内嵌 Tor(无需 Docker)**
214
+
215
+ ```
216
+ # 自动下载安装 Tor Expert Bundle
217
+ scansci_pdf_tor_install
218
+
219
+ # 启动 Tor 代理
220
+ scansci_pdf_tor_start
221
+
222
+ # 受限网络(防火墙封锁 Tor)使用 obfs4 桥接
223
+ scansci_pdf_tor_start(use_bridges=true)
224
+ ```
225
+
226
+ Tor 二进制自动下载到 `~/.scansci-pdf/tor/`,不污染系统环境。首次使用时下载约 30MB。
227
+
228
+ **备选方式:Docker**
229
+ ```bash
230
+ docker compose up -d tor # 启动 Tor 容器,监听 1080 端口
231
+ ```
232
+
233
+ 使用的镜像:[`shahradel/torproxy`](https://github.com/shahradel/TorProxy)(轻量 Tor SOCKS5 代理,仅 30MB)。
234
+
235
+ **手动安装:**
236
+
237
+ | 系统 | 命令 |
238
+ |------|------|
239
+ | Windows | 下载 [Tor Expert Bundle](https://www.torproject.org/download/tor/),解压后运行 `tor.exe` |
240
+ | macOS | `brew install tor && brew services start tor` |
241
+ | Ubuntu/Debian | `sudo apt install tor && sudo systemctl enable --now tor` |
242
+
243
+ 默认端口:`1080`(Docker)/ `9050`(手动安装)。可通过 `scansci_pdf_config_set key=network_proxy value=socks5h://127.0.0.1:9050` 修改。
244
+
245
+ ### Docker 安装
246
+
247
+ | 系统 | 方式 |
248
+ |------|------|
249
+ | Windows | [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/)(需 WSL2) |
250
+ | macOS | [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/)(支持 Apple Silicon) |
251
+ | Linux | `curl -fsSL https://get.docker.com \| sh` |
252
+
253
+ ---
254
+
255
+ ## 常见问题
256
+
257
+ **Sci-Hub 下载失败**
258
+ Sci-Hub 域名经常变化,工具会自动处理。运行 `scansci_pdf_health_check detailed=true` 查看各数据源状态。
259
+
260
+ **Tor 连接不上**
261
+ 确保 Tor 运行在 `socks5h://127.0.0.1:1080`。Docker 部署时 Tor 自动启动。
262
+
263
+ **WebVPN 登录失败**
264
+ WebVPN 需要 Chrome/ChromeDriver。登录在你的浏览器中完成,密码不会经过本工具。
265
+
266
+ **下载速度慢**
267
+ 运行 `scansci_pdf_health_check detailed=true` 检查各数据源延迟。如果 Sci-Hub 在你的网络中被封锁,尝试 `legal_only` 策略。
268
+
269
+ ---
270
+
271
+ ## 许可证
272
+
273
+ 专有许可证 - 保留所有权利。详见 [LICENSE](LICENSE)。
@@ -0,0 +1,35 @@
1
+ [project]
2
+ name = "scansci-pdf"
3
+ version = "1.1.1"
4
+ description = "MCP server for academic paper downloading with Sci-Hub, OA sources, multi-university WebVPN, and Tor support"
5
+ readme = "README.md"
6
+ license = {text = "Proprietary - All rights reserved. See LICENSE for details."}
7
+ requires-python = ">=3.11"
8
+ dependencies = [
9
+ "requests>=2.31",
10
+ "requests[socks]>=2.31",
11
+ "beautifulsoup4>=4.12",
12
+ "curl_cffi>=0.15",
13
+ "mcp[cli]>=1.12",
14
+ "typer>=0.15",
15
+ "uvicorn>=0.34",
16
+ ]
17
+
18
+ [project.optional-dependencies]
19
+ fast = ["lxml>=4.9"]
20
+ vpnsci = ["pycryptodome>=3.20", "selenium>=4.15"]
21
+ dev = ["pytest>=8.0"]
22
+ compile = ["cython>=3.0"]
23
+
24
+ [project.scripts]
25
+ scansci-pdf = "scansci_pdf.main:main"
26
+
27
+ [build-system]
28
+ requires = ["setuptools>=68.0", "pycryptodome>=3.20"]
29
+ build-backend = "setuptools.build_meta"
30
+
31
+ [tool.setuptools.packages.find]
32
+ where = ["src"]
33
+
34
+ [tool.setuptools.package-data]
35
+ scansci_pdf = ["data/*.json", "data/*.dat", "_core/*.pyd", "_core/*.so", "_core/*.pyx", "_core/*.c"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+