这是一个完整的模型上下文协议(MCP)实现,用于通过自然语言查询搜索arXiv论文,该查询由Claude提供支持。
该项目包括客户端、服务器和Web界面:
arxiv_client.py):接受自然语言查询,使用Claude将其解析为结构化参数,调用服务器,并根据相关性评分结果。arxiv_server.py):实现了find_papers工具,查询arXiv API并返回匹配的论文。app.py):一个漂亮的Streamlit界面,便于论文搜索。find_papers工具的MCP服务器。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
export ANTHROPIC_API_KEY="your-api-key-here"
最简单的方式是通过Streamlit Web应用使用系统:
streamlit run app.py
然后:
Web应用特性:
注意: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
这将:
客户端可以理解各种自然语言查询:
"找到我关于LLM红队在AI代理安全中的应用的最近10篇论文""搜索过去一年关于量子计算的论文""获取过去3个月内发表的关于神经网络的5篇论文""查找关于transformer架构的论文"客户端将查询解析为以下JSON结构:
{
"search_terms": ["关键词", "列表"],
"min_date": "YYYY-MM-DD", // 可选
"max_results": 10 // 默认为10
}
从服务器检索论文后,客户端会自动:
这确保了最相关的论文出现在结果顶部,即使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:
在一个终端中:
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())
MIT