
1. 为什么 Deep Research Agent 需要 MCP 工具链Deep Research Agent 是一类能自主完成“检索—抓取—阅读—汇总—产出带来源结论”的多步智能体。它和普通问答机器人最大的区别在于普通问答一次模型调用就结束而 Deep Research Agent 需要自己决定下一步搜什么、点开哪个链接、信息够不够、要不要再开一个研究分支。AgentScope 是阿里 ModelScope 开源的多智能体框架它内置的 ReActAgent 提供了 Reasoning-Acting 循环正好适合承载这种多步研究流程。而 MCPModel Context Protocol则把外部搜索、网页提取这类能力标准化成工具服务让 Agent 不必把搜索逻辑硬编码进业务代码。这套组合适合谁适合已经会写 Python、想动手做一个能自动查资料并输出带引用报告的开发者也适合正在评估 AgentScope 多智能体能力、想找一个可跑通的最小闭环的工程师。我试过把 ReActAgent 和 Tavily MCP 串起来跑一个“地球到月球马拉松”的研究问题Agent 会自己分解子任务、调用 tavily_search、判断是否需要 tavily_extract 深挖网页最后写出带链接的中间报告和最终报告。要跑通这条链路需要三样东西一个能调用大模型的 API Key、一个搜索服务的 API Key、以及一个稳定的模型接入点。模型接入点这块TaoToken 提供了兼容 OpenAI 与 Anthropic 风格的接口Base URL 是https://taotoken.net/api你可以在控制台创建 API Key 后直接填进 AgentScope 的模型配置里。下面从环境准备开始一步步把 MCP 工具链接进 ReActAgent。2. TaoToken 前置准备与 AgentScope 环境搭建在写 Agent 代码之前先把模型接入和运行环境准备好。AgentScope 的模型层支持多种后端只要提供 Base URL、API Key 和 Model ID 三件套即可。TaoToken 的 API 地址是https://taotoken.net/api控制台地址是https://taotoken.net/consoleAPI Key 在https://taotoken.net/api-keys页面创建。模型对话调试入口在https://taotoken.net/models接入文档在https://taotoken.net/doc。Python 环境要求 3.10 以上建议用虚拟环境隔离依赖python --version python -m venv venv # Windows PowerShell .\venv\Scripts\Activate.ps1 # Linux / macOS source venv/bin/activateTavily MCP 服务基于 Node.js 运行需要先装 Node.js LTS 版本装完确认node --version npm --version接着安装 AgentScope 和依赖pip install agentscope shortuuid pydantic如果 PyPI 版本不满足需求可以从源码装git clone https://github.com/modelscope/agentscope.git cd agentscope pip install -e .环境变量分两类。模型侧用 TaoToken 的 Key搜索侧用 Tavily 的 Key另外指定一个报告输出目录# Windows PowerShell $env:TAOTOKEN_API_KEY 你的 TaoToken Key $env:TAVILY_API_KEY tvly-xxxxxxxx $env:AGENT_OPERATION_DIR D:\my_research_output # Linux / macOS export TAOTOKEN_API_KEY你的 TaoToken Key export TAVILY_API_KEYtvly-xxxxxxxx export AGENT_OPERATION_DIR/path/to/my_research_output这里有个容易踩的坑AGENT_OPERATION_DIR不设置的话报告会写到项目目录下的默认文件夹跑几次就乱了。建议一开始就显式指定。API Key 属于敏感信息别提交到 Git。3. 可复制的 AgentScope 配置与 MCP 服务注册这一节给出可以直接复制的配置片段。先看模型配置AgentScope 用OpenAIChatModel对接 TaoToken 的 OpenAI 兼容接口Base URL 填https://taotoken.net/apiModel ID 按你控制台里可用的模型填import os from agentscope.model import OpenAIChatModel from agentscope.formatter import OpenAIChatFormatter model OpenAIChatModel( config_nametaotoken, model_nameclaude-sonnet-4-5-20250929, api_keyos.environ[TAOTOKEN_API_KEY], client_args{ base_url: https://taotoken.net/api, }, streamTrue, ) formatter OpenAIChatFormatter()注意模型和 Formatter 必须匹配OpenAI 系列模型配OpenAIChatFormatterDashScope 系列配DashScopeChatFormatter换模型时 Formatter 要同步换否则会报格式错误。接下来注册 Tavily MCP 服务。AgentScope 用StdIOStatefulClient启动 Node.js 子进程通过 StdIO 通信from agentscope.mcp import StdIOStatefulClient tavily_search_client StdIOStatefulClient( nametavily_mcp, commandnpx, args[-y, tavily-mcplatest], env{TAVILY_API_KEY: os.environ.get(TAVILY_API_KEY, )}, )在 Agent 内部注册 MCP 客户端注册后 toolkit 会自动获得tavily_search和tavily_extract两个工具async def _ensure_mcp_initialized(self): if not self._mcp_initialized: await self.toolkit.register_mcp_client(self._search_mcp_client) self._mcp_initialized True如果你用 Cline 或 Claude Code 这类工具做本地调试MCP 配置可以写成 JSON 形式三件套同样要写全{ mcpServers: { tavily: { command: npx, args: [-y, tavily-mcplatest], env: { TAVILY_API_KEY: tvly-xxxxxxxx } } } }模型侧如果走 Codex 风格的auth.json结构大致如下Base URL 和 Key 对应填 TaoToken 的值{ base_url: https://taotoken.net/api, api_key: 你的 TaoToken Key, model: claude-sonnet-4-5-20250929 }注册完成后Agent 的推理循环里就能生成ToolUseBlock(nametavily_search, input{query, max_results})这样的调用toolkit 会把它转发给 MCP 客户端再经 StdIO 送到 tavily-mcp 子进程最终打到 Tavily API。4. 验证请求让 Agent 自主调用工具并产出带来源结论配置写完跑一个真实研究问题验证整条链路。入口文件里初始化模型、MCP 客户端和 Agent 实例import asyncio from agentscope.agent import ReActAgent from agentscope.memory import InMemoryMemory async def main(query): await tavily_search_client.connect() try: agent DeepResearchAgent( nameFriday, modelmodel, formatterformatter, memoryInMemoryMemory(), search_mcp_clienttavily_search_client, sys_prompt你是一名深度研究助理。, max_iters30, max_depth3, max_tool_results_words10000, ) msg await agent(query) print(msg.get_text_content()) finally: await tavily_search_client.close() if __name__ __main__: query ( 如果基普乔格能以破纪录的马拉松配速一直跑下去 他从地球跑到月球最近点需要多少千小时请给出计算依据和来源。 ) asyncio.run(main(query))运行python main.py预期会看到这样的流程Agent 先做子任务分解生成工作计划和知识缺口然后进入 Reasoning-Acting 循环先调用tavily_search搜索马拉松配速和地月距离判断搜索结果里有没有值得深挖的 URL如果有调用tavily_extract提取网页正文信息够了就调用summarize_intermediate_results写中间报告所有步骤完成后生成最终报告。验证成功的检查项有四个控制台能看到完整的工具调用过程AGENT_OPERATION_DIR下生成了inprocess_report中间报告文件同目录下生成了detailed_report.md最终报告log/目录下有日志文件。打开最终报告每个事实声明后面应该跟着 Markdown 链接形式的来源引用这是 Deep Research Agent 和普通摘要工具的核心区别。如果想调研究深度改max_iters和max_depth即可。max_iters50、max_depth4会让研究更深入但 API 调用次数和 token 消耗也会上去建议先用默认值跑通再调。5. 本篇常见报错排查跑这条链路时下面几个报错出现频率最高逐个对照排查。ModuleNotFoundError: No module named agentscopeAgentScope 没装或不在当前虚拟环境。确认激活了 venv 后重新pip install agentscope源码安装的话检查pip install -e .是否在 agentscope 目录下执行。npx: command not found或 MCP 连接失败Node.js 没装或不在 PATH。node --version和npm --version都确认一遍Windows 下重装 Node.js 时务必勾选 “Add to PATH”。Tavily 返回 401/403Key 无效或环境变量没生效。echo $env:TAVILY_API_KEYPowerShell或echo $TAVILY_API_KEYBash确认值存在格式应为tvly-开头。如果报错里出现local proxy failed通常是本机网络环境或代理配置干扰了 StdIO 子进程检查是否有残留的代理环境变量。模型侧 401 或reading choices报错TaoToken 的 Key 没填对或 Base URL 写成了带路径的形式。Base URL 应该是https://taotoken.net/api不要多加/v1之类的后缀。如果报 OAuth 相关错误说明模型配置里混入了需要 OAuth 的字段检查client_args是否干净。JSON 解析错误结构化输出失败模型没按 Pydantic 模型返回结构化 JSON。代码里一般有 try-except 重试如果频繁失败换一个 structured output 能力更强的模型并确认 Formatter 与模型类型匹配。文件写入权限错误AGENT_OPERATION_DIR目录不存在或无写权限。手动mkdir一下代码里虽然有os.makedirs(exist_okTrue)但父目录权限不够时仍会失败。6. 把这条工具链用起来跑通之后你可以把研究问题换成任意主题比如“2024 年全球 AI 芯片市场格局”Agent 会自动分解、检索、抓取、汇总。多轮对话模式也很实用把main.py改成循环读取终端输入输入exit退出就能连续追问。成本上要留意两点Tavily 免费额度每月 1000 次搜索复杂任务一次可能消耗几十次模型侧按 token 计费长报告生成消耗较大。先用简单问题验证流程再上复杂任务。如果你想把这条链路接到长期编码或 Agent 工作流里TaoToken 的 Coding Plan 提供了更适合持续调用的方案入口在https://taotoken.net/coding-plan。模型对话调试用https://taotoken.net/models接入文档在https://taotoken.net/docAPI Key 管理在https://taotoken.net/api-keys。Claude Code 用户可以参考https://taotoken.net/ClaudeCodeAnthropic的接入说明。最后给一个实用技巧日志文件是排查问题的最佳工具log/目录下每次运行都会生成带时间戳的 Markdown 日志里面完整记录了每一轮推理、每一次工具调用和返回结果。Agent 行为不符合预期时先翻日志比盲猜快得多。