Metadata-Version: 2.4
Name: baidu-scholar-mcp
Version: 0.1.0
Summary: 百度学术论文查询 MCP server:标题搜索 → AI 挑选 → 完整详情(纯标准库 stdio JSON-RPC,零 MCP SDK 依赖)
License-Expression: MIT
Keywords: mcp,baidu,xueshu,scholar,paper,search
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Operating System :: OS Independent
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: curl-cffi>=0.16
Dynamic: license-file

# 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)
