# 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"
}