使用说明
arXiv MCP客户端和服务器
一个完整的模型上下文协议(MCP)实现,用于使用Claude支持的自然语言查询搜索arXiv论文。
概述
此项目包括客户端、服务器和web界面:
- 客户端 (
arxiv_client.py):接受自然语言查询,使用Claude将其解析为结构化参数,调用服务器,并根据相关性对结果进行评分 - 服务器 (
arxiv_server.py):实现find_papers查询arXiv API并返回匹配论文的工具 - 网页应用 (
app.py):漂亮的Streamlit界面,便于纸张搜索
特性
- 自然语言处理:使用Claude来理解诸如“为我找到10篇关于LLM红队的最新论文,因为它适用于AI代理的安全性”之类的查询
- 智能参数提取:自动提取:
- 搜索词(arXiv搜索的关键字)
- 日期范围(例如,“最近”→ 过去6个月,“去年”→ 1 一年前)
- 结果数(如果未指定,则默认为10)
- 智能相关性评分:从服务器检索论文后:
- 根据标题和摘要中的搜索词匹配计算相关性得分
- 客户端计算分数(没有额外的API调用)
- 按相关性得分排序的结果(最高者优先)
- MCP集成:已准备好连接到实施
find_papers工具
安装
- 使用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
- 安装依赖项:
pip install -r requirements.txt
- 设置您的Anthropic API密钥(用于命令行使用):
export ANTHROPIC_API_KEY="your-api-key-here"
快速入门-Web界面🌟
使用该系统最简单的方法是通过Streamlit网络应用程序:
streamlit run app.py
然后:
- 在侧栏中输入您的Anthropic API键
- 键入您的搜索查询(例如,“为我找到10篇关于变压器的最新论文”)
- 点击“搜索论文”
- 查看格式精美、相关性评分的结果!
该网络应用程序具有以下功能:
- 🎨 每张纸都有漂亮的渐变瓷砖(按相关性进行颜色编码)
- ⭐ 视觉相关性得分(0.00至1.00)
- 📱 适用于所有设备的响应式设计
- 🔗 arXiv论文的直接链接
- 💡 示例查询和帮助文本
- 🔒 安全的API密钥输入(未存储)
- ⚡ 快速:只有一个API调用(查询解析),其他一切都是即时的!
备注:Streamlit应用程序使用 arxiv_client_simple.py 它直接(进程内)调用服务器函数,以在web环境中获得更好的性能和可靠性。有关stdio上真正的MCP客户端/服务器架构,请参阅下面的示例。
替代启动器:
./run_app.sh
用法
作为图书馆
import asyncio
from arxiv_client import ArxivMCPClient
async def search_papers():
# Initialize client with your API key
client = ArxivMCPClient(anthropic_api_key="your-api-key")
# Parse a natural language query
query = "find me 10 recent papers about LLM red teaming"
params = client.parse_query_with_claude(query)
print(params)
# Output: {
# "search_terms": ["LLM", "red teaming", "language models", "security"],
# "min_date": "2024-04-21",
# "max_results": 10
# }
# When server is available, connect and search:
# 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)
# # Results are automatically scored and sorted by relevance
# for paper in results:
# print(f"Score: {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
这将:
- 启动服务器
- 解析自然语言查询
- 查询arXiv API
- 相关性评分
- 显示排序结果
查询示例
客户端可以理解各种自然语言查询:
"find me 10 recent papers about LLM red teaming as it applies to security of AI agents""search for papers on quantum computing from the last year""get 5 papers about neural networks published in the last 3 months""find papers on transformer architectures"
解析参数架构
客户端将查询提取到以下JSON结构中:
{
"search_terms": ["list", "of", "keywords"],
"min_date": "YYYY-MM-DD", // optional
"max_results": 10 // defaults to 10
}
参数
- 搜索_术语 (必填):从查询中提取的相关关键字列表
- min_日期 (可选):YYYY-MM-DD格式的最小发布日期
- “最近”没有具体说明→ 6 数月前
- “去年”→ 1 多年前
- “过去3个月”→ 3 数月前
- max_results (可选):要返回的论文数量(默认值:10)
相关性评分
从服务器检索论文后,客户端会自动:
- 计算相关性 通过将搜索词与论文标题和摘要进行匹配
- 标题匹配的权重更大(60%)
- 摘要匹配贡献40%
- 所有已完成的客户端,无需额外的API调用
- 分配相关性得分 根据匹配百分比从0.0到1.0
- 对结果进行排序 按相关性得分(最高者优先)
这确保了最相关的论文出现在结果的顶部,即使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 URLcategories: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():
# Initialize client
client = ArxivMCPClient(anthropic_api_key="your-key")
# Configure server connection
server_params = StdioServerParameters(
command="python",
args=["arxiv_server.py"]
)
# Connect and search
await client.connect_to_server(server_params)
query = "find me 10 recent papers about LLM red teaming"
results = await client.search_papers(query)
# Results are automatically scored and sorted by relevance
for i, paper in enumerate(results, 1):
print(f"\n{i}. [{paper['relevance_score']:.2f}] {paper['title']}")
print(f" Authors: {', '.join(paper['authors'][:3])}")
print(f" Published: {paper['published'][:10]}")
print(f" URL: {paper['url']}")
await client.disconnect()
asyncio.run(search_with_server())
需求
- Python 3.8+
- 无烟煤API键
- MCP兼容服务器(功能齐全)
许可证
麻省理工学院