本文是参考《AI Agent智能体与MCP开发实战》的第13章内容学习
目标:构建一个基于 MCP(Model Context Protocol) 的个性化 arXiv 论文服务,使智能体能够像专业科研助手一样完成检索、摘要、筛选、个性化推荐
一、背景与定位(为什么用 MCP?)
MCP(Model Context Protocol) 是一个把外部能力(API、文件、提示模板等)以标准化资源/工具暴露给智能体的协议。MCP 提供三类能力:
| 能力 | 描述 |
|---|---|
| Tools | 类似 function calling,用于提供 API 级能力,如查询论文、下载 PDF |
| Resources | 文件/数据库等可读取的内容,如缓存论文列表 |
| Prompts | 可复用模板,为 Agent 提供结构化提示 |
为什么适合 arXiv 服务?
-
arXiv 操作(检索、拉元数据、拿 PDF、摘要)天然可抽象为 Tools。
-
用户偏好、历史与缓存适合用 Resources 持久化。
-
推荐 / 生成文本有稳定模板,适合用 Prompts 标准化。
-
多 Agent 场景(检索 agent、摘要 agent、推荐 agent)天然受益于 MCP 的工具共享与权限控制。
对 arXiv 论文服务来说:
-
Query / Fetch / Summaries 都能抽象成 MCP Tool
-
PDF、元数据可以作为 Resource
-
用户研究方向可写入 Prompt,让智能体自动使用
MCP 的优势:
✔ 与任何 LLM 兼容
✔ 易标准化,多 Agent 可共享工具
✔ 自动参数填充,非常适合 arXiv 这种结构化 API
二、 arXiv 论文 MCP 服务整体架构
架构如下:
┌───────────────────────────┐ │ AI Agent │ │ (LLM,具备 MCP 客户端能力) │ └───────────────┬───────────┘ │ MCP ▼ ┌───────────────────────────┐ │ arXiv MCP Server │ ├───────────────────────────┤ │ Tools: │ │ - search_papers │ │ - fetch_metadata │ │ - download_pdf │ │ - summarize_paper │ │ Resources: │ │ - cached_papers.json │ │ Prompts: │ │ - personalized_recommend │ └───────────────────────────┘ │ ▼ arXiv API / arXiv export
三、关键设计点与改进建议
-
查询语言兼容:arXiv 原生以英文为主,中文查询需先翻译或做意图映射(使用专门的翻译模型或 Prompt-based 转换)。
-
结果重排(Reranking)与个性化:在检索后用用户 profile/embedding 做相似度 rerank 或用 LLM 生成个性化理由。
-
PDF 处理:下载后做 OCR / 文本抽取(pdftotext、pdfminer、langchain/pdf-loader)。
-
缓存与去重:缓存元数据与 PDF,避免重复下载并节约配额。
-
异步/批处理:大量检索或长文摘要应异步化,返回任务 ID 并提供进度(但注意 MCP 中对 Agent 的交互方式)。
-
权限与配额控制:避免爬虫式请求,遵守 arXiv 的 rate limit。
-
可扩展性:把摘要/embedding/向量索引(如 FAISS、Weaviate)做为 Resource 暴露给多个 Agent。
四、工具定义与示例实现
4.1 MCP Server
可以通过pip命令安装arxiv-mcp-server库
4.2 论文搜索 search_papers
python
import arxiv
query = "position embedding in attention"
max_results = 3
client = arvix.Client()
search = arxiv.Search(
query = query,
max_results = max_results,
sort_by = arxiv.SortCriterion.SubmittedDate,)
results = []
for paper in client.results(search):
print(paper)
results.append(paper)
print("-------------------------")
if len(results) >= max_results:
break
responese_data = {"total_results":len(results),"paper":results}
print(response_data)
上面这段代码调用的arxiv官方API实现学术论文检索功能,定义搜索关键词为"position emmbedding in attention"并限定返回三项最新成果。再利用arvix.Client创建客户端后配置按提交日期倒序排序。使用中文进行查询时,就不会获得相应的结果
4.3 使用大模型实现辅助工具函数设置
从4.2的实践中可以得出,使用arxiv MCP服务的工具函数调用,当我们使用英文进行查询时,可以较好的完成查询并获取指定数量的返回内容,当使用中文进行查询时返回空值结果。可以采用QWen3在线模型作为翻译模型并通过Prompt的形式完成文本内容的转义。
4.4 设计个性化的科研论文查询函数设计
FASTAPI接口:可以便捷的将评分逻辑封装为RESTful风格。如可以定义一个POST请求接口,接收客户端发送的待评分数据,调用内部模型或函数进行计算后,返回结构化的结果。
下面给出一个精炼的 FastAPI 应用示例,便于将 MCP 服务对外暴露为 HTTP API(也可作为 MCP Server 的内部实现工具)。
python
# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from search_papers import search_papers
from translate_query import translate_to_english
from summarize_paper import summarize_paper
import asyncio
app = FastAPI()
class QueryRequest(BaseModel):
query: str
max_results: int = 5
user_id: str | None = None
language: str = "auto" # 'en' or 'zh' or 'auto'
@app.post("/api/search")
async def api_search(req: QueryRequest):
q = req.query
if req.language == "zh" or (req.language == "auto" and contains_chinese(q)):
q = translate_to_english(q)
try:
res = search_papers(q, max_results=req.max_results)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# 为每篇生成短摘要(并行)
async def summarize_item(p):
return {**p, "summary_short": summarize_paper(p["summary"])}
tasks = [asyncio.to_thread(summarize_item, p) for p in res["papers"]]
summaries = await asyncio.gather(*tasks)
return {"total": res["total_results"], "papers": summaries}
说明与改进点:
-
contains_chinese()为辅助函数判断是否含中文。 -
摘要调用使用线程池/异步避免阻塞主事件循环。
-
生产中应加入缓存(Redis)、限流、鉴权、错误重试与日志。
4.5 基于FLOW过程的科研论文查询
-
接收请求(Client):用户发起查询,包含 query、偏好(领域、期望年份、作者、关键词)等。
-
预处理:判断语言 -> 必要时翻译 -> 语义扩展(同义词扩展)。
-
检索 :调用
search_papers获得候选集(N 条)。 -
后处理 :去重、按发布日期/相关度初筛、并发摘要生成(
summarize_paper)。 -
个性化重排序:使用用户 profile(embedding)或规则进行 rerank,并生成 personalized_recommend 文本。
-
打包输出:返回给前端或 Agent,必要时把 PDF 路径作为 Resource 提供以便后续下载/阅读。
-
异步任务(可选):若用户需要全文解析、长摘要或笔记,开后台任务并通过回调/推送告知完成。