article-mcp


Namearticle-mcp JSON
Version 0.1.4 PyPI version JSON
download
home_pageNone
SummaryArticle MCP文献搜索服务器 - 基于Europe PMC、arXiv等多个数据源的学术文献搜索工具
upload_time2025-10-27 02:53:17
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseNone
keywords mcp literature search europe-pmc arxiv academic
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Article MCP 文献搜索服务器

> 🔬 基于 FastMCP 框架开发的专业文献搜索工具,可与 Claude Desktop、Cherry Studio 等 AI 助手无缝集成

## 🚀 快速开始

### 0️⃣ 安装 uv 工具

```bash
# 安装 uv(如果尚未安装)
curl -LsSf https://astral.sh/uv/install.sh | sh
```

### 1️⃣ 安装依赖

#### 方式一:直接使用 PyPI 包(推荐)

```bash
# 直接运行,无需安装依赖
uvx article-mcp server
```

#### 方式二:本地开发环境

```bash
# 克隆项目到本地
git clone https://github.com/gqy20/article-mcp.git
cd article-mcp

# 安装项目依赖
uv sync

# 或使用 pip 安装依赖
pip install fastmcp requests python-dateutil aiohttp markdownify
```

### 2️⃣ 启动服务器

#### 使用 PyPI 包(推荐)

```bash
# 直接运行 PyPI 包
uvx article-mcp server
```

#### 本地开发

```bash
# 启动 MCP 服务器 (推荐新入口点)
uv run python -m article_mcp server

# 或使用 Python
python -m article_mcp server

# 兼容性入口点 (仍然支持)
uv run main.py server
python main.py server
```

### 3️⃣ 配置 AI 客户端

#### Claude Desktop 配置

编辑 Claude Desktop 配置文件,添加:

##### 方式一:使用 PyPI 包(推荐)

```json
{
  "mcpServers": {
    "article-mcp": {
      "command": "uvx",
      "args": [
        "article-mcp",
        "server"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1"
      }
    }
  }
}
```

##### 方式二:本地开发

```json
{
  "mcpServers": {
    "article-mcp": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/path/to/your/article-mcp",
        "main.py",
        "server"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1"
      }
    }
  }
}
```

#### Cherry Studio 配置

```json
{
  "mcpServers": {
    "article-mcp": {
      "command": "uvx",
      "args": [
        "article-mcp",
        "server",
        "--transport",
        "stdio"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1"
      }
    }
  }
}
```

### 4️⃣ 开始使用

配置完成后,重启你的 AI 客户端,即可使用以下功能:

- 🔍 搜索学术文献 (`search_europe_pmc`)
- 📄 获取文献详情 (`get_article_details`)  
- 📚 获取参考文献 (`get_references_by_doi`)
- 🔗 批量处理DOI (`batch_enrich_references_by_dois`)
- 📰 搜索arXiv预印本 (`search_arxiv_papers`)
- ⭐ 评估期刊质量 (`get_journal_quality`)
- 🔗 获取相似文章 (`get_similar_articles`)
- 🔗 获取引用文献 (`get_citing_articles`)
- 🔄 获取所有关联信息 (`get_literature_relations`)

---

## 📋 完整功能列表

### 核心搜索工具

| 工具名称 | 功能描述 | 主要参数 |
|---------|---------|----------|
| `search_europe_pmc` | 搜索 Europe PMC 文献数据库(高性能优化版本) | `keyword`, `email`, `start_date`, `end_date`, `max_results` |
| `get_article_details` | 获取特定文献详细信息(高性能优化版本) | `identifier`, `id_type`, `mode`, `include_fulltext` |
| `search_arxiv_papers` | 搜索 arXiv 预印本文献 | `keyword`, `email`, `start_date`, `end_date`, `max_results` |

### 参考文献工具

| 工具名称 | 功能描述 | 主要参数 |
|---------|---------|----------|
| `get_references_by_doi` | 通过DOI获取参考文献列表(批量优化版本) | `doi` |
| `batch_enrich_references_by_dois` | 批量补全多个DOI参考文献(超高性能版本) | `dois[]` (最多20个), `email` |
| `get_similar_articles` | 获取相似文章推荐(基于PubMed相关文章算法) | `identifier`, `id_type`, `email`, `max_results` |
| `get_citing_articles` | 获取引用该文献的文章 | `identifier`, `id_type`, `max_results`, `email` |
| `get_literature_relations` | 获取文献的所有关联信息 | `identifier`, `id_type`, `max_results` |

### 质量评估工具

| 工具名称 | 功能描述 | 主要参数 |
|---------|---------|----------|
| `get_journal_quality` | 获取期刊影响因子、分区等 | `journal_name`, `secret_key` |
| `evaluate_articles_quality` | 批量评估文献期刊质量 | `articles[]`, `secret_key` |

---

## ⚡ 性能特性

- 🚀 **高性能并行处理** - 比传统方法快 30-50%
- 💾 **智能缓存机制** - 24小时本地缓存,避免重复请求
- 🔄 **批量处理优化** - 支持最多20个DOI同时处理
- 🛡️ **自动重试机制** - 网络异常自动重试
- 📊 **详细性能统计** - 实时监控API调用情况

---

## 🔧 高级配置

### 环境变量

```bash
export PYTHONUNBUFFERED=1     # 禁用Python输出缓冲
export UV_LINK_MODE=copy      # uv链接模式(可选)
export EASYSCHOLAR_SECRET_KEY=your_secret_key  # EasyScholar API密钥(可选)
```

### MCP 配置集成 (v0.1.1 新功能)

现在支持从 MCP 客户端配置文件中读取 EasyScholar API 密钥,无需通过环境变量传递。

#### Claude Desktop 配置

编辑 `~/.config/claude-desktop/config.json` 文件:

```json
{
  "mcpServers": {
    "article-mcp": {
      "command": "uvx",
      "args": ["article-mcp", "server"],
      "env": {
        "PYTHONUNBUFFERED": "1",
        "EASYSCHOLAR_SECRET_KEY": "your_easyscholar_api_key_here"
      }
    }
  }
}
```

#### 密钥优先级

1. **MCP配置文件**中的密钥(最高优先级)
2. **函数参数**中的密钥
3. **环境变量**中的密钥

#### 支持的工具

- `get_journal_quality` - 获取期刊质量评估信息
- `evaluate_articles_quality` - 批量评估文献的期刊质量

配置完成后重启 MCP 客户端即可生效。

### 传输模式

```bash
# STDIO 模式 (推荐用于桌面AI客户端)
uv run main.py server --transport stdio

# SSE 模式 (用于Web应用)
uv run main.py server --transport sse --host 0.0.0.0 --port 9000

# HTTP 模式 (用于API集成)
uv run main.py server --transport streamable-http --host 0.0.0.0 --port 9000
```

### API 限制与优化

- **Crossref API**: 50 requests/second (建议提供邮箱获得更高限额)
- **Europe PMC API**: 1 request/second (保守策略)
- **arXiv API**: 3 seconds/request (官方限制)

---

## 🛠️ 开发与测试

### 运行测试

项目提供了完整的测试套件来验证功能:

```bash
# 核心功能测试(推荐日常使用)
python scripts/test_working_functions.py

# 快速测试(功能验证)
python scripts/quick_test.py

# 完整测试套件
python scripts/run_all_tests.py

# 分类测试
python scripts/test_basic_functionality.py  # 基础功能测试
python scripts/test_cli_functions.py       # CLI功能测试
python scripts/test_service_modules.py     # 服务模块测试
python scripts/test_integration.py         # 集成测试
python scripts/test_performance.py         # 性能测试
```

### 项目信息

```bash
# 查看项目信息
uv run python -m article_mcp info

# 或使用 PyPI 包
uvx article-mcp info

# 查看帮助
uv run python -m article_mcp --help
```

### 故障排除

| 问题 | 解决方案 |
|------|---------|
| `cannot import name 'hdrs' from 'aiohttp'` | 运行 `uv sync --upgrade` 更新依赖 |
| `MCP服务器启动失败` | 检查路径配置,确保使用绝对路径 |
| `API请求失败` | 提供邮箱地址,检查网络连接 |
| `找不到uv命令` | 使用完整路径:`~/.local/bin/uv` |

### 项目结构

```
article-mcp/
├── main.py              # 兼容性入口文件(向后兼容)
├── pyproject.toml       # 项目配置文件
├── README.md            # 项目文档
├── src/                 # 源代码根目录
│   └── article_mcp/     # 主包(标准Python src layout)
│       ├── __init__.py  # 包初始化
│       ├── cli.py       # CLI入口点和MCP服务器创建
│       ├── __main__.py  # Python模块执行入口
│       ├── services/    # 服务层
│       │   ├── europe_pmc.py              # Europe PMC API 集成
│       │   ├── arxiv_search.py            # arXiv 搜索服务
│       │   ├── pubmed_search.py           # PubMed 搜索服务
│       │   ├── reference_service.py       # 参考文献管理
│       │   ├── literature_relation_service.py # 文献关系分析
│       │   ├── crossref_service.py        # Crossref 服务
│       │   ├── openalex_service.py        # OpenAlex 服务
│       │   ├── api_utils.py               # API 工具类
│       │   ├── mcp_config.py              # MCP 配置管理
│       │   ├── error_utils.py             # 错误处理工具
│       │   ├── html_to_markdown.py        # HTML 转换工具
│       │   ├── merged_results.py          # 结果合并工具
│       │   └── similar_articles.py        # 相似文章工具
│       ├── tools/       # 工具层(MCP工具注册)
│       │   ├── core/                      # 核心工具模块
│       │   │   ├── search_tools.py        # 搜索工具注册
│       │   │   ├── article_tools.py       # 文章工具注册
│       │   │   ├── reference_tools.py     # 参考文献工具注册
│       │   │   ├── relation_tools.py      # 关系分析工具注册
│       │   │   ├── quality_tools.py       # 质量评估工具注册
│       │   │   └── batch_tools.py         # 批量处理工具注册
│       │   ├── article_detail_tools.py    # 文章详情工具
│       │   ├── quality_tools.py           # 质量工具
│       │   ├── reference_tools.py         # 参考文献工具
│       │   ├── relation_tools.py          # 关系工具
│       │   └── search_tools.py            # 搜索工具
│       └── legacy/       # 向后兼容模块
│           └── __init__.py
├── src/resource/        # 资源文件目录
│   └── journal_info.json  # 期刊信息缓存
├── tests/               # 测试套件
│   ├── unit/            # 单元测试
│   ├── integration/     # 集成测试
│   └── utils/           # 测试工具
├── scripts/             # 测试脚本
│   ├── test_working_functions.py  # 核心功能测试
│   ├── test_basic_functionality.py # 基础功能测试
│   ├── test_cli_functions.py      # CLI功能测试
│   ├── test_service_modules.py    # 服务模块测试
│   ├── test_integration.py        # 集成测试
│   ├── test_performance.py        # 性能测试
│   ├── run_all_tests.py           # 完整测试套件
│   └── quick_test.py              # 快速测试
└── docs/                # 文档目录
```

---

## 📄 返回数据格式

每篇文献包含以下标准字段:

```json
{
  "pmid": "文献ID",
  "title": "文献标题",
  "authors": ["作者1", "作者2"],
  "journal_name": "期刊名称",
  "publication_date": "发表日期",
  "abstract": "摘要",
  "doi": "DOI标识符",
  "pmid_link": "文献链接"
}
```

---

## 📦 发布包管理

### PyPI 包发布

项目已发布到 PyPI,支持通过 `uvx` 命令直接运行:

```bash
# 从PyPI安装后直接运行(推荐)
uvx article-mcp server

# 或先安装后运行
pip install article-mcp
article-mcp server

# 本地开发测试
uvx --from . article-mcp server
```

### 配置说明

有三种推荐的配置方式:

#### 🥇 方案1:使用 PyPI 包(推荐)

这是最简单和推荐的方式,直接使用已发布的 PyPI 包:

```json
{
  "mcpServers": {
    "article-mcp": {
      "command": "uvx",
      "args": [
        "article-mcp",
        "server"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1"
      }
    }
  }
}
```

#### 🥈 方案2:本地开发

如果您想运行本地代码或进行开发:

```json
{
  "mcpServers": {
    "article-mcp": {
      "command": "uv",
      "args": [
        "run",
        "main.py",
        "server"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1"
      }
    }
  }
}
```

#### 🥉 方案3:Cherry Studio 配置

针对 Cherry Studio 的特定配置:

```json
{
  "mcpServers": {
    "article-mcp": {
      "command": "uvx",
      "args": [
        "article-mcp",
        "server",
        "--transport",
        "stdio"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1"
      }
    }
  }
}
```

### 发布说明

- **PyPI 包名**: `article-mcp`
- **版本管理**: 统一使用语义化版本控制
- **自动更新**: 使用 `@latest` 标签确保获取最新版本

---

## 📜 许可证

本项目遵循 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。

---

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

1. Fork 项目
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 打开 Pull Request

---

## 📞 支持

- 📧 提交 Issue:[GitHub Issues](https://github.com/gqy20/article-mcp/issues)
- 📚 文档:查看 README 和源代码注释
- 💬 讨论:[GitHub Discussions](https://github.com/gqy20/article-mcp/discussions)

---

## 📖 使用示例

### 搜索 Europe PMC 文献

```json
{
  "keyword": "machine learning cancer detection",
  "start_date": "2020-01-01",
  "end_date": "2024-12-31",
  "max_results": 20
}
```

### 获取文献详情(通过PMID)

```json
{
  "identifier": "12345678",
  "id_type": "pmid"
}
```

### 获取文献详情(通过DOI)

```json
{
  "identifier": "10.1000/xyz123",
  "id_type": "doi"
}
```

### 获取文献详情(通过PMCID)

```json
{
  "identifier": "PMC1234567",
  "id_type": "pmcid"
}
```

### 获取文献详情(异步模式)

```json
{
  "identifier": "12345678",
  "id_type": "pmid",
  "mode": "async"
}
```

### 批量获取参考文献

```json
{
  "dois": [
    "10.1126/science.adf6218",
    "10.1038/s41586-020-2649-2",
    "10.1056/NEJMoa2034577"
  ],
  "email": "your.email@example.com"
}
```

### 期刊质量评估

```json
{
  "journal_name": "Nature",
  "secret_key": "your_easyscholar_key"
}
```

### 获取文献的所有关联信息

```json
{
  "identifier": "10.1000/xyz123",
  "id_type": "doi",
  "max_results": 10
}
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "article-mcp",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "mcp, literature, search, europe-pmc, arxiv, academic",
    "author": null,
    "author_email": "gqy20 <qingyu_ge@foxmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/a3/5a/04eba2433a11746d61d812856a6dd394a9c63effad095b9f566856d9054d/article_mcp-0.1.4.tar.gz",
    "platform": null,
    "description": "# Article MCP \u6587\u732e\u641c\u7d22\u670d\u52a1\u5668\n\n> \ud83d\udd2c \u57fa\u4e8e FastMCP \u6846\u67b6\u5f00\u53d1\u7684\u4e13\u4e1a\u6587\u732e\u641c\u7d22\u5de5\u5177\uff0c\u53ef\u4e0e Claude Desktop\u3001Cherry Studio \u7b49 AI \u52a9\u624b\u65e0\u7f1d\u96c6\u6210\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### 0\ufe0f\u20e3 \u5b89\u88c5 uv \u5de5\u5177\n\n```bash\n# \u5b89\u88c5 uv\uff08\u5982\u679c\u5c1a\u672a\u5b89\u88c5\uff09\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n```\n\n### 1\ufe0f\u20e3 \u5b89\u88c5\u4f9d\u8d56\n\n#### \u65b9\u5f0f\u4e00\uff1a\u76f4\u63a5\u4f7f\u7528 PyPI \u5305\uff08\u63a8\u8350\uff09\n\n```bash\n# \u76f4\u63a5\u8fd0\u884c\uff0c\u65e0\u9700\u5b89\u88c5\u4f9d\u8d56\nuvx article-mcp server\n```\n\n#### \u65b9\u5f0f\u4e8c\uff1a\u672c\u5730\u5f00\u53d1\u73af\u5883\n\n```bash\n# \u514b\u9686\u9879\u76ee\u5230\u672c\u5730\ngit clone https://github.com/gqy20/article-mcp.git\ncd article-mcp\n\n# \u5b89\u88c5\u9879\u76ee\u4f9d\u8d56\nuv sync\n\n# \u6216\u4f7f\u7528 pip \u5b89\u88c5\u4f9d\u8d56\npip install fastmcp requests python-dateutil aiohttp markdownify\n```\n\n### 2\ufe0f\u20e3 \u542f\u52a8\u670d\u52a1\u5668\n\n#### \u4f7f\u7528 PyPI \u5305\uff08\u63a8\u8350\uff09\n\n```bash\n# \u76f4\u63a5\u8fd0\u884c PyPI \u5305\nuvx article-mcp server\n```\n\n#### \u672c\u5730\u5f00\u53d1\n\n```bash\n# \u542f\u52a8 MCP \u670d\u52a1\u5668 (\u63a8\u8350\u65b0\u5165\u53e3\u70b9)\nuv run python -m article_mcp server\n\n# \u6216\u4f7f\u7528 Python\npython -m article_mcp server\n\n# \u517c\u5bb9\u6027\u5165\u53e3\u70b9 (\u4ecd\u7136\u652f\u6301)\nuv run main.py server\npython main.py server\n```\n\n### 3\ufe0f\u20e3 \u914d\u7f6e AI \u5ba2\u6237\u7aef\n\n#### Claude Desktop \u914d\u7f6e\n\n\u7f16\u8f91 Claude Desktop \u914d\u7f6e\u6587\u4ef6\uff0c\u6dfb\u52a0\uff1a\n\n##### \u65b9\u5f0f\u4e00\uff1a\u4f7f\u7528 PyPI \u5305\uff08\u63a8\u8350\uff09\n\n```json\n{\n  \"mcpServers\": {\n    \"article-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"article-mcp\",\n        \"server\"\n      ],\n      \"env\": {\n        \"PYTHONUNBUFFERED\": \"1\"\n      }\n    }\n  }\n}\n```\n\n##### \u65b9\u5f0f\u4e8c\uff1a\u672c\u5730\u5f00\u53d1\n\n```json\n{\n  \"mcpServers\": {\n    \"article-mcp\": {\n      \"command\": \"uv\",\n      \"args\": [\n        \"run\",\n        \"--directory\",\n        \"/path/to/your/article-mcp\",\n        \"main.py\",\n        \"server\"\n      ],\n      \"env\": {\n        \"PYTHONUNBUFFERED\": \"1\"\n      }\n    }\n  }\n}\n```\n\n#### Cherry Studio \u914d\u7f6e\n\n```json\n{\n  \"mcpServers\": {\n    \"article-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"article-mcp\",\n        \"server\",\n        \"--transport\",\n        \"stdio\"\n      ],\n      \"env\": {\n        \"PYTHONUNBUFFERED\": \"1\"\n      }\n    }\n  }\n}\n```\n\n### 4\ufe0f\u20e3 \u5f00\u59cb\u4f7f\u7528\n\n\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u91cd\u542f\u4f60\u7684 AI \u5ba2\u6237\u7aef\uff0c\u5373\u53ef\u4f7f\u7528\u4ee5\u4e0b\u529f\u80fd\uff1a\n\n- \ud83d\udd0d \u641c\u7d22\u5b66\u672f\u6587\u732e (`search_europe_pmc`)\n- \ud83d\udcc4 \u83b7\u53d6\u6587\u732e\u8be6\u60c5 (`get_article_details`)  \n- \ud83d\udcda \u83b7\u53d6\u53c2\u8003\u6587\u732e (`get_references_by_doi`)\n- \ud83d\udd17 \u6279\u91cf\u5904\u7406DOI (`batch_enrich_references_by_dois`)\n- \ud83d\udcf0 \u641c\u7d22arXiv\u9884\u5370\u672c (`search_arxiv_papers`)\n- \u2b50 \u8bc4\u4f30\u671f\u520a\u8d28\u91cf (`get_journal_quality`)\n- \ud83d\udd17 \u83b7\u53d6\u76f8\u4f3c\u6587\u7ae0 (`get_similar_articles`)\n- \ud83d\udd17 \u83b7\u53d6\u5f15\u7528\u6587\u732e (`get_citing_articles`)\n- \ud83d\udd04 \u83b7\u53d6\u6240\u6709\u5173\u8054\u4fe1\u606f (`get_literature_relations`)\n\n---\n\n## \ud83d\udccb \u5b8c\u6574\u529f\u80fd\u5217\u8868\n\n### \u6838\u5fc3\u641c\u7d22\u5de5\u5177\n\n| \u5de5\u5177\u540d\u79f0 | \u529f\u80fd\u63cf\u8ff0 | \u4e3b\u8981\u53c2\u6570 |\n|---------|---------|----------|\n| `search_europe_pmc` | \u641c\u7d22 Europe PMC \u6587\u732e\u6570\u636e\u5e93\uff08\u9ad8\u6027\u80fd\u4f18\u5316\u7248\u672c\uff09 | `keyword`, `email`, `start_date`, `end_date`, `max_results` |\n| `get_article_details` | \u83b7\u53d6\u7279\u5b9a\u6587\u732e\u8be6\u7ec6\u4fe1\u606f\uff08\u9ad8\u6027\u80fd\u4f18\u5316\u7248\u672c\uff09 | `identifier`, `id_type`, `mode`, `include_fulltext` |\n| `search_arxiv_papers` | \u641c\u7d22 arXiv \u9884\u5370\u672c\u6587\u732e | `keyword`, `email`, `start_date`, `end_date`, `max_results` |\n\n### \u53c2\u8003\u6587\u732e\u5de5\u5177\n\n| \u5de5\u5177\u540d\u79f0 | \u529f\u80fd\u63cf\u8ff0 | \u4e3b\u8981\u53c2\u6570 |\n|---------|---------|----------|\n| `get_references_by_doi` | \u901a\u8fc7DOI\u83b7\u53d6\u53c2\u8003\u6587\u732e\u5217\u8868\uff08\u6279\u91cf\u4f18\u5316\u7248\u672c\uff09 | `doi` |\n| `batch_enrich_references_by_dois` | \u6279\u91cf\u8865\u5168\u591a\u4e2aDOI\u53c2\u8003\u6587\u732e\uff08\u8d85\u9ad8\u6027\u80fd\u7248\u672c\uff09 | `dois[]` (\u6700\u591a20\u4e2a), `email` |\n| `get_similar_articles` | \u83b7\u53d6\u76f8\u4f3c\u6587\u7ae0\u63a8\u8350\uff08\u57fa\u4e8ePubMed\u76f8\u5173\u6587\u7ae0\u7b97\u6cd5\uff09 | `identifier`, `id_type`, `email`, `max_results` |\n| `get_citing_articles` | \u83b7\u53d6\u5f15\u7528\u8be5\u6587\u732e\u7684\u6587\u7ae0 | `identifier`, `id_type`, `max_results`, `email` |\n| `get_literature_relations` | \u83b7\u53d6\u6587\u732e\u7684\u6240\u6709\u5173\u8054\u4fe1\u606f | `identifier`, `id_type`, `max_results` |\n\n### \u8d28\u91cf\u8bc4\u4f30\u5de5\u5177\n\n| \u5de5\u5177\u540d\u79f0 | \u529f\u80fd\u63cf\u8ff0 | \u4e3b\u8981\u53c2\u6570 |\n|---------|---------|----------|\n| `get_journal_quality` | \u83b7\u53d6\u671f\u520a\u5f71\u54cd\u56e0\u5b50\u3001\u5206\u533a\u7b49 | `journal_name`, `secret_key` |\n| `evaluate_articles_quality` | \u6279\u91cf\u8bc4\u4f30\u6587\u732e\u671f\u520a\u8d28\u91cf | `articles[]`, `secret_key` |\n\n---\n\n## \u26a1 \u6027\u80fd\u7279\u6027\n\n- \ud83d\ude80 **\u9ad8\u6027\u80fd\u5e76\u884c\u5904\u7406** - \u6bd4\u4f20\u7edf\u65b9\u6cd5\u5feb 30-50%\n- \ud83d\udcbe **\u667a\u80fd\u7f13\u5b58\u673a\u5236** - 24\u5c0f\u65f6\u672c\u5730\u7f13\u5b58\uff0c\u907f\u514d\u91cd\u590d\u8bf7\u6c42\n- \ud83d\udd04 **\u6279\u91cf\u5904\u7406\u4f18\u5316** - \u652f\u6301\u6700\u591a20\u4e2aDOI\u540c\u65f6\u5904\u7406\n- \ud83d\udee1\ufe0f **\u81ea\u52a8\u91cd\u8bd5\u673a\u5236** - \u7f51\u7edc\u5f02\u5e38\u81ea\u52a8\u91cd\u8bd5\n- \ud83d\udcca **\u8be6\u7ec6\u6027\u80fd\u7edf\u8ba1** - \u5b9e\u65f6\u76d1\u63a7API\u8c03\u7528\u60c5\u51b5\n\n---\n\n## \ud83d\udd27 \u9ad8\u7ea7\u914d\u7f6e\n\n### \u73af\u5883\u53d8\u91cf\n\n```bash\nexport PYTHONUNBUFFERED=1     # \u7981\u7528Python\u8f93\u51fa\u7f13\u51b2\nexport UV_LINK_MODE=copy      # uv\u94fe\u63a5\u6a21\u5f0f(\u53ef\u9009)\nexport EASYSCHOLAR_SECRET_KEY=your_secret_key  # EasyScholar API\u5bc6\u94a5(\u53ef\u9009)\n```\n\n### MCP \u914d\u7f6e\u96c6\u6210 (v0.1.1 \u65b0\u529f\u80fd)\n\n\u73b0\u5728\u652f\u6301\u4ece MCP \u5ba2\u6237\u7aef\u914d\u7f6e\u6587\u4ef6\u4e2d\u8bfb\u53d6 EasyScholar API \u5bc6\u94a5\uff0c\u65e0\u9700\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u4f20\u9012\u3002\n\n#### Claude Desktop \u914d\u7f6e\n\n\u7f16\u8f91 `~/.config/claude-desktop/config.json` \u6587\u4ef6\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"article-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"article-mcp\", \"server\"],\n      \"env\": {\n        \"PYTHONUNBUFFERED\": \"1\",\n        \"EASYSCHOLAR_SECRET_KEY\": \"your_easyscholar_api_key_here\"\n      }\n    }\n  }\n}\n```\n\n#### \u5bc6\u94a5\u4f18\u5148\u7ea7\n\n1. **MCP\u914d\u7f6e\u6587\u4ef6**\u4e2d\u7684\u5bc6\u94a5\uff08\u6700\u9ad8\u4f18\u5148\u7ea7\uff09\n2. **\u51fd\u6570\u53c2\u6570**\u4e2d\u7684\u5bc6\u94a5\n3. **\u73af\u5883\u53d8\u91cf**\u4e2d\u7684\u5bc6\u94a5\n\n#### \u652f\u6301\u7684\u5de5\u5177\n\n- `get_journal_quality` - \u83b7\u53d6\u671f\u520a\u8d28\u91cf\u8bc4\u4f30\u4fe1\u606f\n- `evaluate_articles_quality` - \u6279\u91cf\u8bc4\u4f30\u6587\u732e\u7684\u671f\u520a\u8d28\u91cf\n\n\u914d\u7f6e\u5b8c\u6210\u540e\u91cd\u542f MCP \u5ba2\u6237\u7aef\u5373\u53ef\u751f\u6548\u3002\n\n### \u4f20\u8f93\u6a21\u5f0f\n\n```bash\n# STDIO \u6a21\u5f0f (\u63a8\u8350\u7528\u4e8e\u684c\u9762AI\u5ba2\u6237\u7aef)\nuv run main.py server --transport stdio\n\n# SSE \u6a21\u5f0f (\u7528\u4e8eWeb\u5e94\u7528)\nuv run main.py server --transport sse --host 0.0.0.0 --port 9000\n\n# HTTP \u6a21\u5f0f (\u7528\u4e8eAPI\u96c6\u6210)\nuv run main.py server --transport streamable-http --host 0.0.0.0 --port 9000\n```\n\n### API \u9650\u5236\u4e0e\u4f18\u5316\n\n- **Crossref API**: 50 requests/second (\u5efa\u8bae\u63d0\u4f9b\u90ae\u7bb1\u83b7\u5f97\u66f4\u9ad8\u9650\u989d)\n- **Europe PMC API**: 1 request/second (\u4fdd\u5b88\u7b56\u7565)\n- **arXiv API**: 3 seconds/request (\u5b98\u65b9\u9650\u5236)\n\n---\n\n## \ud83d\udee0\ufe0f \u5f00\u53d1\u4e0e\u6d4b\u8bd5\n\n### \u8fd0\u884c\u6d4b\u8bd5\n\n\u9879\u76ee\u63d0\u4f9b\u4e86\u5b8c\u6574\u7684\u6d4b\u8bd5\u5957\u4ef6\u6765\u9a8c\u8bc1\u529f\u80fd\uff1a\n\n```bash\n# \u6838\u5fc3\u529f\u80fd\u6d4b\u8bd5\uff08\u63a8\u8350\u65e5\u5e38\u4f7f\u7528\uff09\npython scripts/test_working_functions.py\n\n# \u5feb\u901f\u6d4b\u8bd5\uff08\u529f\u80fd\u9a8c\u8bc1\uff09\npython scripts/quick_test.py\n\n# \u5b8c\u6574\u6d4b\u8bd5\u5957\u4ef6\npython scripts/run_all_tests.py\n\n# \u5206\u7c7b\u6d4b\u8bd5\npython scripts/test_basic_functionality.py  # \u57fa\u7840\u529f\u80fd\u6d4b\u8bd5\npython scripts/test_cli_functions.py       # CLI\u529f\u80fd\u6d4b\u8bd5\npython scripts/test_service_modules.py     # \u670d\u52a1\u6a21\u5757\u6d4b\u8bd5\npython scripts/test_integration.py         # \u96c6\u6210\u6d4b\u8bd5\npython scripts/test_performance.py         # \u6027\u80fd\u6d4b\u8bd5\n```\n\n### \u9879\u76ee\u4fe1\u606f\n\n```bash\n# \u67e5\u770b\u9879\u76ee\u4fe1\u606f\nuv run python -m article_mcp info\n\n# \u6216\u4f7f\u7528 PyPI \u5305\nuvx article-mcp info\n\n# \u67e5\u770b\u5e2e\u52a9\nuv run python -m article_mcp --help\n```\n\n### \u6545\u969c\u6392\u9664\n\n| \u95ee\u9898 | \u89e3\u51b3\u65b9\u6848 |\n|------|---------|\n| `cannot import name 'hdrs' from 'aiohttp'` | \u8fd0\u884c `uv sync --upgrade` \u66f4\u65b0\u4f9d\u8d56 |\n| `MCP\u670d\u52a1\u5668\u542f\u52a8\u5931\u8d25` | \u68c0\u67e5\u8def\u5f84\u914d\u7f6e\uff0c\u786e\u4fdd\u4f7f\u7528\u7edd\u5bf9\u8def\u5f84 |\n| `API\u8bf7\u6c42\u5931\u8d25` | \u63d0\u4f9b\u90ae\u7bb1\u5730\u5740\uff0c\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5 |\n| `\u627e\u4e0d\u5230uv\u547d\u4ee4` | \u4f7f\u7528\u5b8c\u6574\u8def\u5f84\uff1a`~/.local/bin/uv` |\n\n### \u9879\u76ee\u7ed3\u6784\n\n```\narticle-mcp/\n\u251c\u2500\u2500 main.py              # \u517c\u5bb9\u6027\u5165\u53e3\u6587\u4ef6\uff08\u5411\u540e\u517c\u5bb9\uff09\n\u251c\u2500\u2500 pyproject.toml       # \u9879\u76ee\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 README.md            # \u9879\u76ee\u6587\u6863\n\u251c\u2500\u2500 src/                 # \u6e90\u4ee3\u7801\u6839\u76ee\u5f55\n\u2502   \u2514\u2500\u2500 article_mcp/     # \u4e3b\u5305\uff08\u6807\u51c6Python src layout\uff09\n\u2502       \u251c\u2500\u2500 __init__.py  # \u5305\u521d\u59cb\u5316\n\u2502       \u251c\u2500\u2500 cli.py       # CLI\u5165\u53e3\u70b9\u548cMCP\u670d\u52a1\u5668\u521b\u5efa\n\u2502       \u251c\u2500\u2500 __main__.py  # Python\u6a21\u5757\u6267\u884c\u5165\u53e3\n\u2502       \u251c\u2500\u2500 services/    # \u670d\u52a1\u5c42\n\u2502       \u2502   \u251c\u2500\u2500 europe_pmc.py              # Europe PMC API \u96c6\u6210\n\u2502       \u2502   \u251c\u2500\u2500 arxiv_search.py            # arXiv \u641c\u7d22\u670d\u52a1\n\u2502       \u2502   \u251c\u2500\u2500 pubmed_search.py           # PubMed \u641c\u7d22\u670d\u52a1\n\u2502       \u2502   \u251c\u2500\u2500 reference_service.py       # \u53c2\u8003\u6587\u732e\u7ba1\u7406\n\u2502       \u2502   \u251c\u2500\u2500 literature_relation_service.py # \u6587\u732e\u5173\u7cfb\u5206\u6790\n\u2502       \u2502   \u251c\u2500\u2500 crossref_service.py        # Crossref \u670d\u52a1\n\u2502       \u2502   \u251c\u2500\u2500 openalex_service.py        # OpenAlex \u670d\u52a1\n\u2502       \u2502   \u251c\u2500\u2500 api_utils.py               # API \u5de5\u5177\u7c7b\n\u2502       \u2502   \u251c\u2500\u2500 mcp_config.py              # MCP \u914d\u7f6e\u7ba1\u7406\n\u2502       \u2502   \u251c\u2500\u2500 error_utils.py             # \u9519\u8bef\u5904\u7406\u5de5\u5177\n\u2502       \u2502   \u251c\u2500\u2500 html_to_markdown.py        # HTML \u8f6c\u6362\u5de5\u5177\n\u2502       \u2502   \u251c\u2500\u2500 merged_results.py          # \u7ed3\u679c\u5408\u5e76\u5de5\u5177\n\u2502       \u2502   \u2514\u2500\u2500 similar_articles.py        # \u76f8\u4f3c\u6587\u7ae0\u5de5\u5177\n\u2502       \u251c\u2500\u2500 tools/       # \u5de5\u5177\u5c42\uff08MCP\u5de5\u5177\u6ce8\u518c\uff09\n\u2502       \u2502   \u251c\u2500\u2500 core/                      # \u6838\u5fc3\u5de5\u5177\u6a21\u5757\n\u2502       \u2502   \u2502   \u251c\u2500\u2500 search_tools.py        # \u641c\u7d22\u5de5\u5177\u6ce8\u518c\n\u2502       \u2502   \u2502   \u251c\u2500\u2500 article_tools.py       # \u6587\u7ae0\u5de5\u5177\u6ce8\u518c\n\u2502       \u2502   \u2502   \u251c\u2500\u2500 reference_tools.py     # \u53c2\u8003\u6587\u732e\u5de5\u5177\u6ce8\u518c\n\u2502       \u2502   \u2502   \u251c\u2500\u2500 relation_tools.py      # \u5173\u7cfb\u5206\u6790\u5de5\u5177\u6ce8\u518c\n\u2502       \u2502   \u2502   \u251c\u2500\u2500 quality_tools.py       # \u8d28\u91cf\u8bc4\u4f30\u5de5\u5177\u6ce8\u518c\n\u2502       \u2502   \u2502   \u2514\u2500\u2500 batch_tools.py         # \u6279\u91cf\u5904\u7406\u5de5\u5177\u6ce8\u518c\n\u2502       \u2502   \u251c\u2500\u2500 article_detail_tools.py    # \u6587\u7ae0\u8be6\u60c5\u5de5\u5177\n\u2502       \u2502   \u251c\u2500\u2500 quality_tools.py           # \u8d28\u91cf\u5de5\u5177\n\u2502       \u2502   \u251c\u2500\u2500 reference_tools.py         # \u53c2\u8003\u6587\u732e\u5de5\u5177\n\u2502       \u2502   \u251c\u2500\u2500 relation_tools.py          # \u5173\u7cfb\u5de5\u5177\n\u2502       \u2502   \u2514\u2500\u2500 search_tools.py            # \u641c\u7d22\u5de5\u5177\n\u2502       \u2514\u2500\u2500 legacy/       # \u5411\u540e\u517c\u5bb9\u6a21\u5757\n\u2502           \u2514\u2500\u2500 __init__.py\n\u251c\u2500\u2500 src/resource/        # \u8d44\u6e90\u6587\u4ef6\u76ee\u5f55\n\u2502   \u2514\u2500\u2500 journal_info.json  # \u671f\u520a\u4fe1\u606f\u7f13\u5b58\n\u251c\u2500\u2500 tests/               # \u6d4b\u8bd5\u5957\u4ef6\n\u2502   \u251c\u2500\u2500 unit/            # \u5355\u5143\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 integration/     # \u96c6\u6210\u6d4b\u8bd5\n\u2502   \u2514\u2500\u2500 utils/           # \u6d4b\u8bd5\u5de5\u5177\n\u251c\u2500\u2500 scripts/             # \u6d4b\u8bd5\u811a\u672c\n\u2502   \u251c\u2500\u2500 test_working_functions.py  # \u6838\u5fc3\u529f\u80fd\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_basic_functionality.py # \u57fa\u7840\u529f\u80fd\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_cli_functions.py      # CLI\u529f\u80fd\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_service_modules.py    # \u670d\u52a1\u6a21\u5757\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_integration.py        # \u96c6\u6210\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_performance.py        # \u6027\u80fd\u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 run_all_tests.py           # \u5b8c\u6574\u6d4b\u8bd5\u5957\u4ef6\n\u2502   \u2514\u2500\u2500 quick_test.py              # \u5feb\u901f\u6d4b\u8bd5\n\u2514\u2500\u2500 docs/                # \u6587\u6863\u76ee\u5f55\n```\n\n---\n\n## \ud83d\udcc4 \u8fd4\u56de\u6570\u636e\u683c\u5f0f\n\n\u6bcf\u7bc7\u6587\u732e\u5305\u542b\u4ee5\u4e0b\u6807\u51c6\u5b57\u6bb5\uff1a\n\n```json\n{\n  \"pmid\": \"\u6587\u732eID\",\n  \"title\": \"\u6587\u732e\u6807\u9898\",\n  \"authors\": [\"\u4f5c\u80051\", \"\u4f5c\u80052\"],\n  \"journal_name\": \"\u671f\u520a\u540d\u79f0\",\n  \"publication_date\": \"\u53d1\u8868\u65e5\u671f\",\n  \"abstract\": \"\u6458\u8981\",\n  \"doi\": \"DOI\u6807\u8bc6\u7b26\",\n  \"pmid_link\": \"\u6587\u732e\u94fe\u63a5\"\n}\n```\n\n---\n\n## \ud83d\udce6 \u53d1\u5e03\u5305\u7ba1\u7406\n\n### PyPI \u5305\u53d1\u5e03\n\n\u9879\u76ee\u5df2\u53d1\u5e03\u5230 PyPI\uff0c\u652f\u6301\u901a\u8fc7 `uvx` \u547d\u4ee4\u76f4\u63a5\u8fd0\u884c\uff1a\n\n```bash\n# \u4ecePyPI\u5b89\u88c5\u540e\u76f4\u63a5\u8fd0\u884c\uff08\u63a8\u8350\uff09\nuvx article-mcp server\n\n# \u6216\u5148\u5b89\u88c5\u540e\u8fd0\u884c\npip install article-mcp\narticle-mcp server\n\n# \u672c\u5730\u5f00\u53d1\u6d4b\u8bd5\nuvx --from . article-mcp server\n```\n\n### \u914d\u7f6e\u8bf4\u660e\n\n\u6709\u4e09\u79cd\u63a8\u8350\u7684\u914d\u7f6e\u65b9\u5f0f\uff1a\n\n#### \ud83e\udd47 \u65b9\u68481\uff1a\u4f7f\u7528 PyPI \u5305\uff08\u63a8\u8350\uff09\n\n\u8fd9\u662f\u6700\u7b80\u5355\u548c\u63a8\u8350\u7684\u65b9\u5f0f\uff0c\u76f4\u63a5\u4f7f\u7528\u5df2\u53d1\u5e03\u7684 PyPI \u5305\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"article-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"article-mcp\",\n        \"server\"\n      ],\n      \"env\": {\n        \"PYTHONUNBUFFERED\": \"1\"\n      }\n    }\n  }\n}\n```\n\n#### \ud83e\udd48 \u65b9\u68482\uff1a\u672c\u5730\u5f00\u53d1\n\n\u5982\u679c\u60a8\u60f3\u8fd0\u884c\u672c\u5730\u4ee3\u7801\u6216\u8fdb\u884c\u5f00\u53d1\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"article-mcp\": {\n      \"command\": \"uv\",\n      \"args\": [\n        \"run\",\n        \"main.py\",\n        \"server\"\n      ],\n      \"env\": {\n        \"PYTHONUNBUFFERED\": \"1\"\n      }\n    }\n  }\n}\n```\n\n#### \ud83e\udd49 \u65b9\u68483\uff1aCherry Studio \u914d\u7f6e\n\n\u9488\u5bf9 Cherry Studio \u7684\u7279\u5b9a\u914d\u7f6e\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"article-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"article-mcp\",\n        \"server\",\n        \"--transport\",\n        \"stdio\"\n      ],\n      \"env\": {\n        \"PYTHONUNBUFFERED\": \"1\"\n      }\n    }\n  }\n}\n```\n\n### \u53d1\u5e03\u8bf4\u660e\n\n- **PyPI \u5305\u540d**: `article-mcp`\n- **\u7248\u672c\u7ba1\u7406**: \u7edf\u4e00\u4f7f\u7528\u8bed\u4e49\u5316\u7248\u672c\u63a7\u5236\n- **\u81ea\u52a8\u66f4\u65b0**: \u4f7f\u7528 `@latest` \u6807\u7b7e\u786e\u4fdd\u83b7\u53d6\u6700\u65b0\u7248\u672c\n\n---\n\n## \ud83d\udcdc \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u9075\u5faa MIT \u8bb8\u53ef\u8bc1 - \u8be6\u89c1 [LICENSE](LICENSE) \u6587\u4ef6\u3002\n\n---\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4 Issue \u548c Pull Request\uff01\n\n1. Fork \u9879\u76ee\n2. \u521b\u5efa\u529f\u80fd\u5206\u652f (`git checkout -b feature/AmazingFeature`)\n3. \u63d0\u4ea4\u66f4\u6539 (`git commit -m 'Add some AmazingFeature'`)\n4. \u63a8\u9001\u5230\u5206\u652f (`git push origin feature/AmazingFeature`)\n5. \u6253\u5f00 Pull Request\n\n---\n\n## \ud83d\udcde \u652f\u6301\n\n- \ud83d\udce7 \u63d0\u4ea4 Issue\uff1a[GitHub Issues](https://github.com/gqy20/article-mcp/issues)\n- \ud83d\udcda \u6587\u6863\uff1a\u67e5\u770b README \u548c\u6e90\u4ee3\u7801\u6ce8\u91ca\n- \ud83d\udcac \u8ba8\u8bba\uff1a[GitHub Discussions](https://github.com/gqy20/article-mcp/discussions)\n\n---\n\n## \ud83d\udcd6 \u4f7f\u7528\u793a\u4f8b\n\n### \u641c\u7d22 Europe PMC \u6587\u732e\n\n```json\n{\n  \"keyword\": \"machine learning cancer detection\",\n  \"start_date\": \"2020-01-01\",\n  \"end_date\": \"2024-12-31\",\n  \"max_results\": 20\n}\n```\n\n### \u83b7\u53d6\u6587\u732e\u8be6\u60c5\uff08\u901a\u8fc7PMID\uff09\n\n```json\n{\n  \"identifier\": \"12345678\",\n  \"id_type\": \"pmid\"\n}\n```\n\n### \u83b7\u53d6\u6587\u732e\u8be6\u60c5\uff08\u901a\u8fc7DOI\uff09\n\n```json\n{\n  \"identifier\": \"10.1000/xyz123\",\n  \"id_type\": \"doi\"\n}\n```\n\n### \u83b7\u53d6\u6587\u732e\u8be6\u60c5\uff08\u901a\u8fc7PMCID\uff09\n\n```json\n{\n  \"identifier\": \"PMC1234567\",\n  \"id_type\": \"pmcid\"\n}\n```\n\n### \u83b7\u53d6\u6587\u732e\u8be6\u60c5\uff08\u5f02\u6b65\u6a21\u5f0f\uff09\n\n```json\n{\n  \"identifier\": \"12345678\",\n  \"id_type\": \"pmid\",\n  \"mode\": \"async\"\n}\n```\n\n### \u6279\u91cf\u83b7\u53d6\u53c2\u8003\u6587\u732e\n\n```json\n{\n  \"dois\": [\n    \"10.1126/science.adf6218\",\n    \"10.1038/s41586-020-2649-2\",\n    \"10.1056/NEJMoa2034577\"\n  ],\n  \"email\": \"your.email@example.com\"\n}\n```\n\n### \u671f\u520a\u8d28\u91cf\u8bc4\u4f30\n\n```json\n{\n  \"journal_name\": \"Nature\",\n  \"secret_key\": \"your_easyscholar_key\"\n}\n```\n\n### \u83b7\u53d6\u6587\u732e\u7684\u6240\u6709\u5173\u8054\u4fe1\u606f\n\n```json\n{\n  \"identifier\": \"10.1000/xyz123\",\n  \"id_type\": \"doi\",\n  \"max_results\": 10\n}\n```\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Article MCP\u6587\u732e\u641c\u7d22\u670d\u52a1\u5668 - \u57fa\u4e8eEurope PMC\u3001arXiv\u7b49\u591a\u4e2a\u6570\u636e\u6e90\u7684\u5b66\u672f\u6587\u732e\u641c\u7d22\u5de5\u5177",
    "version": "0.1.4",
    "project_urls": {
        "Homepage": "https://github.com/gqy20/article-mcp",
        "Issues": "https://github.com/gqy20/article-mcp/issues",
        "Repository": "https://github.com/gqy20/article-mcp"
    },
    "split_keywords": [
        "mcp",
        " literature",
        " search",
        " europe-pmc",
        " arxiv",
        " academic"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "040c68b3b4657a0d45e0e80335bd48d75e73b7e5c2ed8181e8f0dc61c0a545a9",
                "md5": "402bec2a01b2eb1c9b50e862467839f7",
                "sha256": "657d1a05d01dc2d0a5db66eb5006b56e08e5336847f0c324592f8b80444ebdf6"
            },
            "downloads": -1,
            "filename": "article_mcp-0.1.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "402bec2a01b2eb1c9b50e862467839f7",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 70393,
            "upload_time": "2025-10-27T02:53:16",
            "upload_time_iso_8601": "2025-10-27T02:53:16.004021Z",
            "url": "https://files.pythonhosted.org/packages/04/0c/68b3b4657a0d45e0e80335bd48d75e73b7e5c2ed8181e8f0dc61c0a545a9/article_mcp-0.1.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a35a04eba2433a11746d61d812856a6dd394a9c63effad095b9f566856d9054d",
                "md5": "928b2c06690c51939b5d9b4ab7668934",
                "sha256": "a9b8f576a05e8da3058bf003519315a21d2a75cc59b08788053e07e5d4154341"
            },
            "downloads": -1,
            "filename": "article_mcp-0.1.4.tar.gz",
            "has_sig": false,
            "md5_digest": "928b2c06690c51939b5d9b4ab7668934",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 84819,
            "upload_time": "2025-10-27T02:53:17",
            "upload_time_iso_8601": "2025-10-27T02:53:17.171902Z",
            "url": "https://files.pythonhosted.org/packages/a3/5a/04eba2433a11746d61d812856a6dd394a9c63effad095b9f566856d9054d/article_mcp-0.1.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-27 02:53:17",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "gqy20",
    "github_project": "article-mcp",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "article-mcp"
}
        
Elapsed time: 1.76858s