dsh-paper-access
by Mrizhou
README.md
# dsh-paper-access
**查「这本刊 / 这篇论文,学校订没订」,并给出可以自己点开的网址。只查不下。**
给 [DeepSeek Harness](https://github.com/deepseek-ai) 的插件:一个 MCP server(5 个查询工具)
+ 一个「选学校」配置面板。也支持多所学校。
> 🔴 **本项目永不下载任何全文。** 它只回答「学校订没订」,然后把链接交给你自己点。
> 图书馆的订阅资格是有风险的——早稻田大学 2025-03-17 的停服通报,诱因就是
> 文献管理软件的自动下载功能。详见 [CONTRIBUTING.md](CONTRIBUTING.md) 的红线一节。
---
## 能干什么
| 你说 | 工具 | 回答 |
|---|---|---|
| 找几篇 LLM 做车间调度的论文 | `search_papers` | 一批候选 + 每篇的刊级馆藏标注 |
| `10.1016/j.aei.2025.103527` 学校订了吗 | `check_paper` | 有电子 / 只有纸本 / **问不到** + 链接 |
| 查一下 *Journal of Manufacturing Systems* | `check_journal` | 几份电子、几份纸本 |
| 学校买了哪些数据库 | `list_databases` | 清单 + 哪些开了 CARSI |
| 有哪些电子期刊包 | `journal_packages` | 刊包与刊数 |
外加一个 DSH 面板(插件面板 →「已安装」→ dsh-paper-access)**选当前学校**。
选完立刻生效——不用重启,改完的学校马上反映到所有查询里。
### 实际长什么样
```
## 「large language model job shop scheduling」的候选文献(5 篇)
1. **MASC: Large language model-based multi-agent scheduling chain for flexible
job shop scheduling problem**
Wang、Wan、Liu 等 · 2025 · Advanced Engineering Informatics · 🟢 电子 2 份
DOI: 10.1016/j.aei.2025.103527
...
```
标记含义:🟢 有电子 · 🟡 仅纸本 · ⚪ 刊级没查到 · **无标记** = 这篇没 ISSN,查不动。
---
## 怎么装
### DeepSeek Harness
```
插件面板 → 添加插件 → 填 github:Mrizhou/dsh-paper-access
```
装完两样东西一起就有了:MCP 工具 + 选学校面板。**不需要手填路径**——
bundle 自己会定位 `server.py`(先看 `DSH_PROFILE_DIR`,取不到就按 `DSH_HOME` 扫)。
万一对你的环境不生效,在你的 `~/.dsh/profiles/<profile>/cordis.patch.yml` 里
用**同 id 覆盖**(注意不写 `insert:`):
```yaml
- id: mcp-paper-access
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: papers
transport: stdio
command: python
args: ['D:/绝对路径/到/本仓库/server.py']
toolCallTimeoutMs: 120000
failOnStartupError: false
```
### 只要 MCP(Claude Code / Codex / 任何 MCP 客户端)
本仓库的 `server.py` 是**零第三方依赖**的 stdio MCP server,可以单独用:
```json
{
"mcpServers": {
"papers": {
"command": "python",
"args": ["/绝对路径/到/dsh-paper-access/server.py"]
}
}
}
```
Python ≥ 3.10,只用标准库。
---
## 怎么用
直接说人话就行,不用记工具名:
> 找几篇 LLM 做生产调度的论文,看学校能拿到哪些
> 这篇 `10.1016/j.aei.2025.103527` 学校订了吗,给我能点开的链接
**想知道某一篇到底能不能下**:用 `search_papers` 找候选 → 挑出想要的 DOI →
交给 `check_paper`。前者是「这批里学校订了哪本刊」,后者是「这一篇的结论 + 链接」。
---
## 三个必须知道的限制
1. **馆藏结论是「刊级」的。** 学校的发现系统只索引到期刊,不索引单篇论文
(实测:篇名查 `numFound` 恒为 0)。所以「🟢 电子 2 份」说的是**这本刊**学校有 2 份电子,
不是「这一篇你一定能下」。要确认某一篇,用 `check_paper`。
2. **中文论文检索很弱。** `search_papers` 走 Crossref,以英文题录为主。
中文文献请直接用知网/万方。
3. **它是核对工具,不是学术搜索引擎。** 结果按相关度排,不看引用数、不筛顶刊。
挑哪几篇是你的判断。
**另一个诚实的边界**:查询有时会回答「**问不到**」——元数据里既没 ISSN 也没刊名时
(会议论文集、预印本常这样),没有可查的键。**「问不到」不等于「学校没订」**,
本项目绝不会把前者冒充成后者。
---
## 多所学校
一校一目录:`schools/<id>/school.json` + `schools/<id>/data/`。
加新学校见 **[schools/README.md](schools/README.md)** —— 包括怎么找发现系统、
怎么取馆代码(有坑)。
`ready: false` 的学校在面板里**不可选**,查询时会打横幅警告「结论不可作为『学校没订』的依据」。
宁可显示「还没弄好」,也不让半成品冒充可用。
### 目前支持的学校(18 所)
全部是图星/超星 libsp 发现系统,**匿名可查**(不需要登录),均已在 CARSI 联邦内。
2026-09-27 逐一所实测过 `journal/navInfo`,馆代码都是真的。
| 学校 | id | 发现系统 | 馆代码 |
|---|---|---|---|
| 上海海事大学 | `shmtu` | `findshmtu.libsp.cn` | 201437 |
| 上海大学 | `shu` | `findshu.libsp.cn` | 201578 |
| 同济大学 | `tongji` | `findtongji.libsp.cn` | 201571 |
| 华东师范大学 | `ecnu` | `findecnu.libsp.cn` | 200300 |
| 华东理工大学 | `ecust` | `findecust.libsp.cn` | 200080 |
| 华东政法大学 | `ecupl` | `findecupl.libsp.cn` | 200283 |
| 东华大学 | `dhu` | `finddhu.libsp.cn` | 201183 |
| 上海海洋大学 | `shou` | `findshou.libsp.cn` | 201198 |
| 上海理工大学 | `usst` | `findusst.libsp.cn` | 200291 |
| 上海师范大学 | `shnu` | `findshnu.libsp.cn` | 200471 |
| 上海外国语大学 | `shisu` | `findshisu.libsp.cn` | 200975 |
| 上海财经大学 | `sufe` | `findsufe.libsp.cn` | 201032 |
| 上海对外经贸大学 | `suibe` | `findsuibe.libsp.cn` | 201096 |
| 上海工程技术大学 | `sues` | `findsues.libsp.cn` | 200785 |
| 上海电力大学 | `shiep` | `findshiep.libsp.cn` | 200499 |
| 上海第二工业大学 | `sspu` | `findsspu.libsp.cn` | 200744 |
| 上海电机学院 | `sdju` | `findsdju.libsp.cn` | 201512 |
| 上海政法学院 | `shupl` | `findshupl.libsp.cn` | 200124 |
**已排除的**:上海交通大学、上海立信会计金融学院 —— 实测发现系统里
`journal/navInfo` 返回 **`totalNum=0`**(接口通、馆代码有效,但没有刊级数据)。
它们的所有查询都会返回空,被读成「学校没订」。**「查不到」不等于「没订」**,
所以本项目暂不收录,等找到本入口之外的数据源再说。
**其它学校的已知限制**:
- ⚠️ **馆藏标注是刊级的**,不保证「这一篇一定能下」(见上「三个必须知道的限制」)
- ⚠️ 这些学校的 `library.base` / `identity.idp_entity_id` **尚未查**,所以
文献传递 / 校外访问链接不显示、CARSI 深链不拼(只给出版商原文页)
- ⚠️ `list_databases` 会说「还没抓取」——那**不是「没订」**,是没数据
- ⚠️ 上海工程技术大学:同一本刊用 ISSN 查和用题名查结果不同(0 对 1)。
这套系统上 ISSN 检索不稳,`numFound=0` 一律换查法复核后再说话
---
## 自己跑
```powershell
python server.py --selftest # 打印当前学校、馆藏、端到端结论、几条回归
python tools/build_data.py --school shmtu # 抓资源清单
python tools/build_data.py --school shmtu --dry-run # 只探接口,不写盘
```
`build_data.py` 有门禁:学校缺 `library.database_api` / `offcampus` 时
**报错退出、不写任何文件**(exit 2)。一次空结果覆盖会把「不知道」变成「学校没订」。
---
## 它怎么做到不越红线
| 环节 | 数据源 | 给什么 |
|---|---|---|
| 找论文 | [Crossref](https://www.crossref.org/) 题录 API | 元数据 + DOI |
| 查馆藏 | 学校图书馆发现系统(公开目录) | 这本刊有几份电子/纸本 |
| 校外访问 | 学校图书馆公开页面 | CARSI / VPN / 文献传递链接 |
**三个都不碰出版商站点、都不下载任何全文。** 逐篇查询、串行、限速,不做批量遍历。
---
## 许可
MIT,见 [LICENSE](LICENSE)。
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues