返回市场
arxiv-mcp服务器

arxiv-mcp服务器

作者:align-sec2 星标更新:2025-11-04

项目介绍

arXiv MCP 客户端与服务器

这是一个完整的模型上下文协议(MCP)实现,用于通过自然语言查询搜索arXiv论文,该查询由Claude提供支持。

概述

该项目包括客户端、服务器和Web界面:

  • 客户端 (arxiv_client.py):接受自然语言查询,使用Claude将其解析为结构化参数,调用服务器,并根据相关性评分结果。
  • 服务器 (arxiv_server.py):实现了find_papers工具,查询arXiv API并返回匹配的论文。
  • Web应用 (app.py):一个漂亮的Streamlit界面,便于论文搜索。

功能

  • 自然语言处理:使用Claude理解诸如“找到我关于LLM红队在AI代理安全中的应用的最近10篇论文”这样的查询。
  • 智能参数提取:自动提取:
    • 搜索词(arXiv搜索的关键字)
    • 日期范围(例如,“最近”→过去6个月,“去年”→1年前)
    • 结果数量(未指定时默认为10)
  • 智能相关性评分:从服务器检索论文后:
    • 根据搜索词在标题和摘要中的匹配计算相关性得分。
    • 得分在客户端计算(无需额外API调用)。
    • 结果按相关性得分排序(最高分优先)。
  • MCP集成:准备好连接到实现find_papers工具的MCP服务器。

安装

  1. 克隆仓库并创建新的Python 3.12环境
git clone git@github.com:align-sec/arxiv-mcp.git
conda create -n mcp_env python=3.12
conda activate mcp_env
conda install pip
pip install --upgrade pip
pip install -r requirements.txt
  1. 安装依赖项:
pip install -r requirements.txt
  1. 设置您的Anthropic API密钥(用于命令行使用):
export ANTHROPIC_API_KEY="your-api-key-here"

快速开始 - Web界面 🌟

最简单的方式是通过Streamlit Web应用使用系统:

streamlit run app.py

然后:

  1. 在侧边栏中输入您的Anthropic API密钥。
  2. 输入您的搜索查询(例如,“找到我关于transformers的最近10篇论文”)。
  3. 点击“搜索论文”。
  4. 查看漂亮格式化的、按相关性评分的结果!

Web应用特性:

  • 🎨 每篇论文都有美丽的渐变瓷砖(颜色编码为相关性)。
  • ⭐ 视觉相关性评分(0.00至1.00)。
  • 📱 响应式设计,适用于所有设备。
  • 🔗 直接链接到arXiv论文。
  • 💡 示例查询和帮助文本。
  • 🔒 安全的API密钥输入(不存储)。
  • 快速:仅需一次API调用(查询解析),其余都是即时处理!

注意:Streamlit应用使用arxiv_client_simple.py,它直接调用服务器函数(进程内)以提高Web环境下的性能和可靠性。如需真正的MCP客户端/服务器架构,请参见下面的示例。

替代启动器:

./run_app.sh

使用方法

作为库

import asyncio
from arxiv_client import ArxivMCPClient

async def search_papers():
    # 使用您的API密钥初始化客户端
    client = ArxivMCPClient(anthropic_api_key="your-api-key")
    
    # 解析自然语言查询
    query = "找到我关于LLM红队的最近10篇论文"
    params = client.parse_query_with_claude(query)
    print(params)
    # 输出:{
    #   "search_terms": ["LLM", "红队", "语言模型", "安全"],
    #   "min_date": "2024-04-21",
    #   "max_results": 10
    # }
    
    # 当服务器可用时,连接并搜索:
    # from mcp import StdioServerParameters
    # server_params = StdioServerParameters(
    #     command="python",
    #     args=["arxiv_server.py"]
    # )
    # await client.connect_to_server(server_params)
    # results = await client.search_papers(query)
    # # 结果会自动评分并按相关性排序
    # for paper in results:
    #     print(f"得分: {paper['relevance_score']:.2f} - {paper['title']}")
    # await client.disconnect()

asyncio.run(search_papers())

命令行演示

运行包含的演示(仅解析查询,无服务器):

python arxiv_client.py

集成测试

运行完整的客户端-服务器集成测试:

export ANTHROPIC_API_KEY="your-api-key"
python test_integration.py

这将:

  1. 启动服务器。
  2. 解析自然语言查询。
  3. 查询arXiv API。
  4. 计算论文的相关性得分。
  5. 显示排序后的结果。

查询示例

客户端可以理解各种自然语言查询:

  • "找到我关于LLM红队在AI代理安全中的应用的最近10篇论文"
  • "搜索过去一年关于量子计算的论文"
  • "获取过去3个月内发表的关于神经网络的5篇论文"
  • "查找关于transformer架构的论文"

解析参数模式

客户端将查询解析为以下JSON结构:

{
    "search_terms": ["关键词", "列表"],
    "min_date": "YYYY-MM-DD",  // 可选
    "max_results": 10          // 默认为10
}

参数

  • search_terms(必需):从查询中提取的相关关键字列表。
  • min_date(可选):最小发布日期(YYYY-MM-DD格式)。
    • “最近”没有具体说明 → 6个月前。
    • “去年” → 1年前。
    • “过去3个月” → 3个月前。
  • max_results(可选):要返回的论文数量(默认:10)。

相关性评分

从服务器检索论文后,客户端会自动:

  1. 计算相关性,通过将搜索词与论文标题和摘要进行匹配。
    • 标题匹配权重更高(60%)。
    • 摘要匹配贡献40%。
    • 所有操作都在客户端完成,无需额外API调用。
  2. 分配相关性得分,基于匹配百分比从0.0到1.0。
  3. 排序结果,按相关性得分排序(最高分优先)。

这确保了最相关的论文出现在结果顶部,即使arXiv搜索返回它们的顺序不同。

性能:仅需一次API调用(解析查询)。其余都是快速的客户端处理。

服务器实现

包含的arxiv_server.py实现了具有以下特性的MCP服务器:

find_papers工具

接受参数:

  • search_terms(必需):要搜索的关键字列表。
  • min_date(可选):最小发布日期(YYYY-MM-DD)。
  • max_results(可选):最大结果数(默认:10)。

返回论文:

  • title:论文标题。
  • summary:论文摘要。
  • authors:作者姓名列表。
  • published:发布日期。
  • updated:最后更新日期。
  • arxiv_id:arXiv标识符。
  • url:完整的arXiv URL。
  • categories:arXiv类别。

arXiv API集成

服务器使用以下方式查询arXiv API:

  • 使用搜索词构建搜索查询(搜索所有字段)。
  • 结果按提交日期排序(最新优先)。
  • 使用正确的命名空间处理XML响应。
  • 在检索后应用日期过滤。

运行整个系统

启动服务器

在一个终端中:

python arxiv_server.py

运行客户端

更新arxiv_client.py以取消注释main()函数中的服务器连接代码,然后:

export ANTHROPIC_API_KEY="your-api-key"
python arxiv_client.py

完整集成示例

import asyncio
from arxiv_client import ArxivMCPClient
from mcp import StdioServerParameters

async def search_with_server():
    # 初始化客户端
    client = ArxivMCPClient(anthropic_api_key="your-key")
    
    # 配置服务器连接
    server_params = StdioServerParameters(
        command="python",
        args=["arxiv_server.py"]
    )
    
    # 连接并搜索
    await client.connect_to_server(server_params)
    
    query = "找到我关于LLM红队的最近10篇论文"
    results = await client.search_papers(query)
    
    # 结果会自动评分并按相关性排序
    for i, paper in enumerate(results, 1):
        print(f"\n{i}. [{paper['relevance_score']:.2f}] {paper['title']}")
        print(f"   作者: {', '.join(paper['authors'][:3])}")
        print(f"   发布日期: {paper['published'][:10]}")
        print(f"   URL: {paper['url']}")
    
    await client.disconnect()

asyncio.run(search_with_server())

要求

  • Python 3.8+
  • Anthropic API密钥
  • 兼容MCP的服务器(用于全部功能)

许可证

MIT