baidu-scholar-mcp
# baidu-scholar-mcp
百度学术论文查询 MCP server:输入论文标题(支持部分标题/关键词)→ 搜索候选列表 → 调用方大模型挑选 → 返回该论文完整详情。
- **纯标准库实现 stdio JSON-RPC**,不依赖任何 MCP SDK,运行时仅需 `curl-cffi`
- **内置反爬自愈**:Chrome TLS 指纹模拟(curl_cffi)+ cookie 自举 + 多级重试,无需浏览器
- **自带两套自测**(爬虫 13 项 + MCP 协议 8 项),拿到代码一键验证环境可用性
> ⚠️ **免责声明**:本项目为非官方工具,基于对百度学术公开网页接口的逆向分析实现,
> 仅供个人学习与研究使用。使用时请遵守目标网站的服务条款,禁止用于商业用途或高频抓取。
> 百度接口随时可能变更,不保证本工具持续可用;因使用本工具产生的任何问题由使用者自行承担。
## MCP 工具
| 工具 | 说明 |
|---|---|
| `search_papers(query, max_results=10)` | 按标题搜索,返回候选列表:paperid、标题、作者+机构、年份、期刊卷期页、被引、关键词、截断摘要、知网/万方/维普等来源链接。恰好只命中 1 篇时自动附带 `paper_detail` |
| `get_paper_detail(paperid)` | 完整摘要、关键词、作者、期刊(卷/期/页码/ISSN/CN)、被引、DOI、基金、阅读量、研究领域、全部外部全文链接 |
| `get_paper_citations(paperid, cite_type)` | 参考文献(reference)/ 引证文献(citation)列表 |
典型调用流程(由调用方大模型完成"挑选"):`search_papers("新技术革命下人工智能与高质量增长")`
→ 从候选里选最匹配的 paperid → `get_paper_detail(paperid)`。
## 安装与配置
### 方式一:uvx(推荐,零安装)
发布到 PyPI 后,MCP 客户端配置一行即可(uv 会自动拉取并隔离运行):
```json
{
"mcpServers": {
"baidu-scholar": { "command": "uvx", "args": ["baidu-scholar-mcp"] }
}
}
```
### 方式二:pip 安装后直接作命令
```bash
pip install baidu-scholar-mcp
```
```json
{ "command": "baidu-scholar-mcp" }
```
### 方式三:源码运行
```bash
git clone https://github.com/<you>/baidu-scholar-mcp.git
pip install curl-cffi
```
```json
{
"command": "<你的python解释器>",
"args": ["<仓库路径>/baidu_scholar/mcp_server.py"]
}
```
Windows 注意:Python 3.12+ 无 `distutils`,若同时安装可选的浏览器兜底依赖
`undetected-chromedriver`,需先 `pip install setuptools`。
### 自测
```bash
python tests/test_client.py # 爬虫 13 项检查,应"全部通过"(需联网)
python tests/test_mcp_server.py # MCP 协议 8 项检查,应"全部通过"
```
调试时可设环境变量 `BAIDU_SCHOLAR_VERBOSE=1` 查看过程日志(stderr)。
## 反爬实现要点
百度学术已全面 SPA 化,数据全走 JSON 接口,本客户端直接调接口(2026-09 逆向实测):
- **搜索** `GET /usercenter/paper/search?type=related&wd=<标题>&rn=20&page_no=N`
**详情** `GET /scholarai/paper/detail/info?paperId=<id>`
**引文** 同搜索接口,`wd=citepaperuri:(<id>) / refpaperuri:(<id>)`
- 新版搜索接口 `/search/api/search` 必须携带混淆 JS 生成的 `acs-token`,已弃用,上述老接口数据等价。
- **TLS 指纹是核心风控点**:python-requests 的 OpenSSL 指纹无论带什么 cookie 都会被
`/usercenter` 系列接口拒(206 + "请输入验证码"),必须用 `curl_cffi impersonate='chrome'`。
- **cookie 自举无需浏览器**:先 GET `https://www.baidu.com/` 拿 5 条 Set-Cookie
(BAIDUID/BIDUPSID/PSTM 等)即可通过风控;详情接口更宽松,单条 BAIDUID 就够。
- 风控自愈阶梯:请求被拦 → 重新 cookie 自举重试 → (可选)无头浏览器收割 cookie → 报错。
- 数据坑已处理:机构字段内嵌 `\u0001` 分隔符、`<em>` 高亮标签、"查看全部>>"截断尾巴;
搜索接口摘要服务端截断,完整摘要由详情接口补全。
## 已知限制
- 任意乱词百度都会模糊匹配出结果,调用方需自行比对标题相关性。
- 论文本身没有参考文献/引文数据时,`get_paper_citations` 返回业务错误 code=1001,属正常现象。
- 接口为非官方逆向所得,若百度调整风控或字段结构,优先重新抓包核对
`baidu_scholar/scholar_client.py` 顶部的接口说明。
## License
[MIT](LICENSE)
TDQS
Scored across 3 tools
Each tool has a clearly distinct role: search_papers finds candidate papers, get_paper_detail retrieves full metadata for one paper, and get_paper_citations returns reference/citation lists. There is no meaningful overlap between them.
All tool names follow a consistent snake_case verb_noun pattern: search_papers, get_paper_detail, get_paper_citations. The naming style is uniform and predictable across the server.
Three tools is appropriate for a focused academic search MCP server: discovery, detail retrieval, and citation exploration. Each tool earns its place without redundancy or bloat.
The tool surface covers the core academic paper workflow: searching, viewing full details, and exploring reference/citation relationships. No obvious missing operation is apparent for the stated domain.