Skip to main content
Glama
README.md
# Scholar Search MCP

基于 Python MCP (Model Context Protocol) 的谷歌学术搜索工具,供 CherryStudio 等 AI 客户端调用。

## 功能

| Tool | 说明 |
|------|------|
| `search_papers` | 谷歌学术论文搜索,支持年份过滤、自动精确去重、SSL 断连重试 |
| `get_paper_detail` | 获取单篇论文详细信息,自动从外部源(arxiv API / meta 标签)获取**完整摘要** |
| `analyze_relevance` | TF-IDF + 余弦相似度相关性排序,关键词提取,方向聚类摘要 |
| `generate_relevance_chart` | Matplotlib 多角度图表(柱状图 / K-Means 聚类 / 关键词)+ 本地 HTTP 服务端 |

## 环境要求

- Python >= 3.10
- conda 环境 `MCP`(或任意虚拟环境)
- 谷歌学术需 HTTP 代理(Clash / V2Ray 等)

## 安装

```bash
conda activate MCP
pip install -r requirements.txt
# 或
pip install -e .
```

## 环境变量

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `SCHOLAR_PROXY` | `http://localhost:7890` | 代理地址,优先级最高 |
| `HTTP_PROXY` / `HTTPS_PROXY` | - | 标准代理环境变量(备选) |
| `SCHOLAR_NO_PROXY` | - | 设为 `1`/`true`/`yes` 禁用代理 |
| `SCHOLAR_TIMEOUT` | `30` | 单次 HTTP 请求超时(秒) |
| `SCHOLAR_RETRIES` | `3` | 搜索失败最大重试次数 |
| `SCHOLAR_CHART_PORT` | `8765` | 图表 HTTP 服务端端口 |

### 代理配置

三层优先级,从高到低:

```
SCHOLAR_PROXY  >  HTTP_PROXY / HTTPS_PROXY  >  默认 http://localhost:7890
```

### 摘要说明

Google Scholar 搜索结果页只提供摘要**片段**,多结果页面中不包含完整摘要。

| 工具 | 摘要行为 |
|------|----------|
| `search_papers` | 返回 Google Scholar 片段(适合快速浏览,速度优先) |
| `get_paper_detail` | 自动从外部源获取完整摘要:arxiv 走结构化 API,其他走页面 meta 标签;失败时回退到 Google Scholar 片段 |

## CherryStudio 接入

### 1. MCP 配置

```json
{
  "scholar-search": {
    "command": "C:/Users/mulim/.conda/envs/MCP/python.exe",
    "args": ["C:/Users/mulim/Desktop/Project/scholar_search/server.py"],
    "env": {
      "SCHOLAR_PROXY": "http://localhost:7890",
      "SCHOLAR_CHART_PORT": "8765"
    }
  }
}
```

> 路径需替换为实际路径。macOS/Linux 用户去掉盘符,使用 Unix 路径风格。

### 2. 在对话中使用

CherryStudio 对话时,直接描述你的研究需求即可,AI 会自动调用工具链:

**示例**:
> "搜索 2020 年后关于 graph neural network for recommendation system 的论文,取前 10 篇,做相关性分析并生成图表"

**典型调用链**:
```
search_papers → analyze_relevance → generate_relevance_chart → 浏览器打开 http://localhost:8765
```

### 3. 图表查看

`generate_relevance_chart` 会启动本地 HTTP 服务并返回链接:
```
http://localhost:8765/
```

包含三个图表:
- **相关性柱状图** `/bar.png`
- **K-Means 聚类散点图** `/cluster.png`
- **关键词重要性图** `/keywords.png`

在浏览器中打开后不会自动刷新,重新调用工具即可更新数据。

## 开发

```bash
# 运行测试(默认跳过网络 mock 测试,~7s)
pytest

# 包含网络 mock 测试(~40s)
pytest tests/ --ignore=

# 带 coverage.xml 输出
pytest --cov=scholar_search --cov=server --cov-report=term-missing --cov-report=xml

# Lint 检查 (PEP 8, max-line=127)
flake8 --max-line-length=127 .

# 启动调试
python server.py
```

## 项目结构

```
scholar_search/
├── server.py              # MCP Server 入口 (FastMCP, 4 个 Tool)
├── scholar_search/        # 核心包
│   ├── config.py          # 代理 / 超时 / 重试 / 端口配置
│   ├── search.py          # requests + bs4 直连解析,外部源完整摘要(arxiv API / meta 标签)
│   ├── analysis.py        # TF-IDF + 余弦相似度 + 方向聚类
│   └── viz.py             # Matplotlib 多图表 + HTTP 服务端
├── tests/                 # pytest (137 tests, 100% 覆盖)
│   ├── test_config.py
│   ├── test_search.py
│   ├── test_analysis.py
│   ├── test_viz.py
│   └── test_server.py
├── requirements.txt
├── pyproject.toml
├── CLAUDE.md
└── .gitignore
```

## License

MIT

TDQS

A4.5/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a distinct role in the pipeline: search, analyze relevance, generate charts, and get paper details. No overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., search_papers, analyze_relevance).

Tool Count5/5

Four tools are well-scoped for a scholar search server, covering the essential workflow without excess.

Completeness5/5

The set covers the full pipeline from search to analysis to visualization and detail retrieval, with no obvious gaps.

Maintenance

ActivityStale
ResponsivenessNo issues