跳到主要内容

R1-0528+MCP进行Agent开发实战

课程说明:

  体验课时间有限,若想深度学习大模型技术,欢迎大家报名由我主讲的《2025大模型Agent智能体开发实战》(MCP强化班)

d0c81dfe43a1becced8c07db33c3a787_

《2025大模型Agent智能体开发实战》(MCP强化班) 为【100+小时】体系大课,总共20大模块精讲精析,零基础直达大模型企业级应用!

img

同时,5月班重磅新增DeepSeek+Agents SDK+谷歌ADK+MCP技术应用与Qwen3智能体开发相关实战内容:

34533e2c95414b3dc5ab1131d9d1e38

部分项目成果演示

from IPython.display import Video
  • MateGen项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/4.MateGen%20Pro%20%E9%A1%B9%E7%9B%AE%E5%8A%9F%E8%83%BD%E6%BC%94%E7%A4%BA.mp4", width=800, height=400)
  • 智能客服项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/%E6%99%BA%E8%83%BD%E5%AE%A2%E6%9C%8D%E6%A1%88%E4%BE%8B%E6%BC%94%E7%A4%BA.mp4", width=800, height=400)
  • Dify项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/2f1b47f42c65fd59e8d3a83e6cb9f13b_raw.mp4", width=800, height=400)
  • LangChain&LangGraph搭建Multi-Agnet
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/%E5%8F%AF%E8%A7%86%E5%8C%96%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90Multi-Agent%E6%95%88%E6%9E%9C%E6%BC%94%E7%A4%BA%E6%95%88%E6%9E%9C.mp4", width=800, height=400)

此外,若是对大模型底层原理感兴趣,也欢迎报名由我和菜菜老师共同主讲的《2025大模型原理与实战课程》(5月班)

da5d51c998df07d747cd223c1ed25f7

两门大模型课程5月班目前上新特惠中,立减2000起,合购还有更多优惠哦~详细信息扫码添加助教,回复“大模型”,即可领取课程大纲&查看课程详情👇

ca76dfaf224da7825b4fa3e9c6ab435

DeepSeek-R1-0528模型Agent开发实战

Part 3.R1-0528+MCP进行Agent开发实战

  在了解了R1-0528模型的基础Function calling功能实现方法后,接下来,我们尝试借助新兴的Agent开发框架,来进行R1模型+MCP智能体开发实战。在学习本节内容前,建议先简单了解MCP完整技术体系,可以选择以下公开课进行参考:

MCP技术参考资料详见大模型技术社区。

f2a020126010dddb844f48fd439b366

此外,本节公开课将采用Qwen-Agent、OpenAI Agents SDK以及谷歌ADK作为基础框架,来快速构建智能体。更多关于新兴热门Agent开发框架技术教学,详见《2025大模型Agent智能体开发实战》(MCP强化班) 课程讲解。

d0c81dfe43a1becced8c07db33c3a787_

一、Qwen-Agent MCP智能体开发实战

  2023年9月24号,Qwen发布了兼容自家Qwen系列模型的Agent开发框架:Qwen-Agent。它是一个基于 Qwen 的指令跟踪、工具使用、规划和内存功能开发 LLM 应用程序的框架。它还附带浏览器助手、代码解释器和自定义助手等示例应用程序。

  上述体验地址的后端支撑架构,就是Qwen-Agent这个项目。Qwen-Agent支持接入阿里云DashScope服务提供的Qwen模型服务,也支持通过OpenAI API方式接入开源的Qwen模型服务。同时对于通过OllamavLLM等框架启动的开源模型,也可以通过OpenAI API 兼容规范快速集成。 目前,Qwen-Agent框架已全面支持Qwen3系列,并且提供了Function Calling功能)和工具(Tool等原子组件,也提供了智能体(Agent)等高级抽象组件,最重要的是:全面支持MCP,可以原生支持公开MCP工具的快速接入。同样,DeepSeek R1 支持通过OpenAI API 规范进行快速接入。

  现在,我们仅需在创建Agent的时候,将MCP服务器视作为一项工具,即可顺利调用MCP服务器进行Agent开发。

4.1 Qwen-Agent SDK下载
  • 从 PyPI 安装稳定版本

  在此命令中,可使用双括号指定如下的可选依赖,其中:

  • [gui] 用于提供基于 Gradio 的 GUI 支持;
  • [rag] 用于支持 RAG;
  • [code_interpreter] 用于提供代码解释器相关支持;
  • [mcp] 用于支持 MCP。
! pip install -U "qwen-agent[rag,code_interpreter,gui,mcp]"

4.2 Qwen-Agent + DS R1构建多轮对话机器人

  Qwen-Agent提供了接入Qwen系列模型,及在线API或者通过OllamaVllm启动本地模型等任意兼容OpenAI API接口规范的模型。其中通过Assistant组件,可以实现工具调用、Agent编排、MCP接入等等一系列功能。注意: 不同于类似OpenAI Agents SDKAssisttant 类仅仅是Qwen-Agent构建不同形式代理的一个子类,主要用于实现tool_use和RAG的工作流。

import os
from dotenv import load_dotenv
load_dotenv(override=True)


DS_API_KEY = os.getenv("DEEPSEEK_API_KEY")
DS_BASE_URL = os.getenv("DEEPSEEK_API_BASE")


print(DS_BASE_URL)

from qwen_agent.agents import Assistant
from qwen_agent.utils.output_beautify import typewriter_print
  • 配置所使用的模型服务:
llm_cfg = {
'model': 'deepseek-reasoner',
'model_server': 'https://api.deepseek.com',
'api_key':DS_API_KEY
}
  • 创建一个智能体对象。

  Assistant 类的构造函数接受以下参数,这些参数允许我们灵活地配置智能体的功能、行为和上下文。

Assistant参数介绍

参数名类型描述
function_listOptional[List[Union[str, Dict, BaseTool]]]定义助手可以调用的功能列表,可以是字符串、字典或 BaseTool 的实例。
llmOptional[Union[Dict, BaseChatModel]]指定要使用的语言模型配置或实例。
system_messageOptional[str]系统消息,用于定义助手的行为和角色,默认为 DEFAULT_SYSTEM_MESSAGE
nameOptional[str]助手的名称。
descriptionOptional[str]助手的描述,提供关于助手功能的简要信息。
filesOptional[List[str]]可以传递的文件列表,助手可以访问这些文件。
rag_cfgOptional[Dict]用于配置检索增强生成(RAG)功能的字典。
bot = Assistant(llm=llm_cfg,
system_message="你是一位乐于助人的小助理",
name="智能助理"
)
  • 构建多轮对话聊天

  其中typewriter_print用于格式化和打印消息,是Qwen-Agent内部构造的函数,会处理函数调用和普通对话的不同执行逻辑(Function Calling),同时对于推理类模型,会判断消息中是否包含 reasoning_content,如果存在,则将其添加到 content 列表中,并在前面加上 THOUGHT_S(表示思考的符号或字符串),从而支持推理类模型和对话模型的不同输入输出形式。核心代码如下所示:

FENCE0

messages = [] # 这里储存聊天历史。
while True:
# 输入请求。
query = input('\n用户请求 (输入 "exit" 退出): ')

# 判断是否退出
if query.strip().lower() in ['exit', 'quit', 'bye']:
print("会话结束,再见!")
break

# 将用户请求添加到聊天历史。
messages.append({'role': 'user', 'content': query})
response = []
response_plain_text = ''

print('AI 回复:')
for response in bot.run(messages=messages):
# 流式输出。
response_plain_text = typewriter_print(response, response_plain_text)

# 将机器人的回应添加到聊天历史。
messages.extend(response)

4.3 Qwen-Agent接入MCP工具

  Assistant类中的function_list参数可以通过tool_use的方式传入MCP格式的调用示例,就像定义Function Calling的 JsonSchema 一样。其中 MCP 调用格式如下所示:

tools = [{
"mcpServers": {
"sqlite" : {
"command": "uvx",
"args": [
"mcp-server-sqlite",
"--db-path",
"test.db"
]
}
}
}]

  这个 MCP 服务器配置的功能是启动一个 SQLite 数据库服务器,允许通过 MCP 协议与该数据库进行交互。具体功能包括:

  • 数据库连接: 允许其他服务或客户端连接到 SQLite 数据库。
  • 执行 SQL 查询: 通过 MCP 协议发送 SQL 查询到 SQLite 数据库并获取结果。
  • 数据管理: 允许对数据库中的数据进行增、删、改、查等操作

  其中我们配置了三个参数:

  • "mcp-server-sqlite": 这是指定要启动的 MCP 服务器类型,表示启动一个 SQLite 服务器。
  • "--db-path": 这是一个选项,后面跟着数据库文件的路径。
  • "test.db": 这是 SQLite 数据库的文件名,表示要使用的数据库文件。

  准备好了MCP服务器后,接下来传递给Assistant对象。

  Jupyter 使用特殊的通信架构,它的内核已经运行在一个事件循环中,负责处理前端和后端通信。这个架构使得某些底层系统操作(如创建带特定标志的子进程)无法实现,尽管通过nest_asyncio.apply() 可以解决嵌套事件循环问题,但是无法修复底层事件循环本身的实现缺陷。而Qwen-Agent底层实现的MCP组件管理并没有完全兼容Jupyter环境下的子兼容,所以创建 MCP 智能体的代码目前无法在Jupyter 环境下运行(除非修改底层源码),因此我们可以创建独立的.py环境直接运行。

  这里我们创建了 dsr1_mcp_sqlite.py, 其核心代码如下:

FENCE0

image-20250529182019949 ca76dfaf224da7825b4fa3e9c6ab435

  在这段代码中,run 方法在 Agent 类中负责处理输入消息并生成响应,包括接收消息、确定消息类型和语言、处理系统消息以及通过 LLM 生成响应的整个过程,而typewriter_print则用于流式的增量输出。演示视频如下:

Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/Qwen-Agent%20%E6%BC%94%E7%A4%BA%E8%A7%86%E9%A2%911.mp4", width=800, height=400)

  运行结束后,在脚本执行的同级目录下会生成一个test.db的文件,这就是MCP自动创建的数据库文件。

202412191720637

  同时,也可以通过sqlite3命令行工具来查看数据库中的数据。

# 查看数据库中的数据
import sqlite3

conn = sqlite3.connect('E:\\mcpCourse\\Qwen-Agent-main\\test.db')
cursor = conn.cursor()

# 先查看数据库中有哪些表
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
print("数据库中的表:", tables)

# 如果有表,则查询第一个表的数据
if tables:
table_name = tables[0][0]
cursor.execute(f"SELECT * FROM {table_name}")
print(f"{table_name} 表中的数据:", cursor.fetchall())
else:
print("数据库中没有表,需要先创建表并插入数据")

conn.close()

4.4 多个MCP服务器并行&串行执行

  大模型不擅长数学运算、数据可视化等精确计算任务,因此我们一般会使用代码解释器,使智能体编写和运行 Python 程序,从而逐步解决复杂的数据问题。如果智能体编写的代码未能成功运行,它还会不断调整代码,尝试不同的方法,直到代码能够顺利执行。

202412191720637

  Qwen-Agent内置集成了 code_interpreter 组件,因此需要先执行安装,执行如下命令:

FENCE0

  调用code_interpreter的方法同样是需要在构建Assistant的时候,定义在tools列表中,并通过 Function_list参数传递。

FENCE0

  这里我们创建了dsr1_mcp_multi.py文件,核心代码如下:

FENCE0

image-20250529182710928 ca76dfaf224da7825b4fa3e9c6ab435

具体运行效果如下:

Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/Qwen-Agent%20%E6%BC%94%E7%A4%BA%E8%A7%86%E9%A2%912.mp4", width=800, height=400)

4.4 Multi-MCP 复杂任务

  接下来构建Multi-MCP Agent 多轮对话执行,并接入高德MCP服务器完成旅行规划助理。

  首先可以在github上找到公开的高德MCP服务器:https://github.com/sugarforever/amap-mcp-server

202412191720637

  然后,需要在高德开放中心注册API进行使用:https://lbs.amap.com/

202412191720637

  创建应用并生成一个有效的key:

202412191720637 202412191720637

  然后在tools列表中添加高德MCP服务器:

FENCE0

  • Firecrawl MCP Server

  接下来我们需要找一个能抓取网页数据的MCP,这里可以选择Firecrawl MCP Server :https://github.com/mendableai/firecrawl-mcp-server

  Firecrawl MCP Server实现与 Firecrawl 集成以实现网页抓取功能。支持的功能如下:

  • 抓取、爬取、搜索、提取、深入研究和批量抓取支持
  • 使用 JS 渲染进行网页抓取
  • URL 发现和抓取
  • 带有内容提取的网页搜索
  • .....

  需要注册Firecrawl的API: https://www.firecrawl.dev/signin/password_signin

202412191720637

  按照如下位置进行API_Keys的创建:

202412191720637

  同样,需要添加到Tools列表中,整体配置如下:

FENCE0

  除此以外,大家也可以使用 mcp-server-fetch:https://github.com/modelcontextprotocol/servers/tree/main/src/fetch ,大家可以根据自己的情况灵活选择。最终我们定义dsr1_mcp_apply.py文件,如下所示:


def init_agent_service():
llm_cfg = {
'model': 'deepseek-reasoner',
'model_server': 'https://api.deepseek.com',
'api_key': 'sk-d9c6cacc8e',
'fncall_prompt_type': 'nous', # 使用nous格式避免推理模型遇到stop符号停止
}

tools = [{
"mcpServers": {
'time': {
'command': 'uvx',
'args': ['mcp-server-time', '--local-timezone=Asia/Shanghai']
},
# "fetch": {
# "command": "uvx",
# "args": ["mcp-server-fetch"]
# },

"sqlite" : {
"command": "uvx",
"args": [
"mcp-server-sqlite",
"--db-path",
"test.db"
]
},

"firecrawl-mcp": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": {
"FIRECRAWL_API_KEY": "fc-724e84ee49fad993ba1"
},
},

"amap-mcp-server": {
"command": "uvx",
"args": [
"amap-mcp-server"
],
"env": {
"AMAP_MAPS_API_KEY": "9b555d31b15968aff4976"
}
}
},


},
# pip install "qwen-agent[code_interpreter]"
'code_interpreter',
]

system = """
你是一个规划师和数据分析师 \
你可以调用高德地图规划旅行路线,同时可以提取网页信息进行数据分析
"""

bot = Assistant(
llm=llm_cfg,
name='智能助理',
description='具备查询高德地图、提取网页信息、数据分析的能力',
system_message=system,
function_list=tools,
)

return bot

def run_query(query=None):
# 定义数据库助手
bot = init_agent_service()

from qwen_agent.gui import WebUI

chatbot_config = {
'prompt.suggestions': [
'请你帮我写一个关于人工智能的论文',
"https://github.com/orgs/QwenLM/repositories 提取这一页的Markdown 文档,然后绘制一个柱状图展示每个项目的收藏量",
'帮我查询从故宫去颐和园的路线',
]
}
WebUI(
bot,
chatbot_config=chatbot_config,
).run()

<img src="https://ml2022.oss-cn-hangzhou.aliyuncs.com/img/image-20250529182944677.png" alt="image-20250529182944677" style="zoom:50%;" />

<img src="https://ml2022.oss-cn-hangzhou.aliyuncs.com/img/ca76dfaf224da7825b4fa3e9c6ab435.png" alt="ca76dfaf224da7825b4fa3e9c6ab435" style="zoom:50%;" />

&emsp;&emsp;这里我们要应用到`Qwen-Agent`内置的`WebUI`,其实现了一个基于Gradio构建的前端页面,通过执行 dsr1_mcp_apply, 启动后即可在 localhost:8000 访问:

<img src="https://muyu001.oss-cn-beijing.aliyuncs.com/img/image-20250529143719826.png" alt="202412191720637" style="zoom:60%;" />

&emsp;&emsp;此时通过浏览器访问:http://localhost:7860/ 即可进行使用。

<img src="https://muyu001.oss-cn-beijing.aliyuncs.com/img/image-20250529143812480.png" alt="202412191720637" style="zoom:60%;" />

具体运行效果如下:

```python
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/fina-3.mp4", width=800, height=400)

五、OpenAI Agents SDK 接入 DS-R1

  2025年3月11号,OpenAI正式推出其下第一款企业级Multi-Agent开发框架Agents-SDK,该框架是此前OpenAI在去年推出的Swarm的升级版,在保留了Swarm的高效便捷的Multi-Agent开发特性的同时,加入了更多面向企业级应用的功能。

  而根据官方介绍,OpenAI Agents SDK 让你能够通过一个轻量、易用、抽象极少的工具包来构建基于智能体的 AI 应用。它是我们此前 Agent 实验项目 Swarm 的一个面向生产环境的升级版本。该 SDK 仅包含极少量的原语(基础构件):

  • Agent(智能体):即带有指令和工具的大语言模型(LLM)
  • Handoff(交接):允许智能体将特定任务委托给其他智能体
  • Guardrail(护栏):用于对输入内容进行验证

结合 Python 使用时,这些原语足够强大,能够表达工具与智能体之间的复杂关系,并让你在没有高学习成本的前提下构建真实可用的应用程序。此外,SDK 自带内置的追踪功能,可以帮助你可视化和调试智能体的执行流程,同时也支持对流程进行评估,甚至用于模型的微调。

  OpenAI的Agents SDK 的设计遵循两个核心原则:

  1. 功能足够强大,值得使用,但原语足够少,容易上手
  2. 默认配置即可很好地运行,但你也可以完全自定义行为逻辑

以下是该 SDK 的主要特性:

  • Agent 循环机制:内置的智能体循环逻辑,自动处理工具调用、结果返回给 LLM、直到任务完成的全过程
  • Python 优先:使用原生 Python 语言特性来编排与串联智能体,而无需学习新的抽象概念
  • Handoff(智能体间任务交接):强大的功能,可在多个智能体间协调与任务委派
  • Guardrail(输入验证护栏):支持与智能体并行运行输入验证逻辑,若验证失败可提前中断流程
  • 函数工具化:可以将任何 Python 函数转为工具,自动生成 Schema,并支持基于 Pydantic 的验证机制
  • 追踪系统(Tracing):内置追踪功能,可视化、调试、监控你的智能体流程,并结合 OpenAI 的评估、微调与蒸馏工具一同使用

同时,在3月27号,Agents SDK正式官宣支持MCP使用,这也使得Agents SDK的实际应用场景得到待拓展。现在,我们仅需在创建Agent的时候,将MCP服务器视作为一项工具,即可顺利调用MCP服务器进行Agent开发。而实际在借助Agents SDK调用MCP的流程也非常简单,我们只需将MCP视作tools,即可进行调用。换而言之,就是如果使用Agents SDK作为Agent开发框架,则可以零门槛快速接入MCP海量服务器生态。

  • Agents SDK安装流程
!pip install openai-agents

  OpenAI Agents SDK框架接入MCP服务器的方法并不复杂,仅需要在构建Agent对象时,像传递通过@function_tool装饰器定义的工具一样,将MCP服务器作为参数传递给Agent对象即可。只不过,不再通过tools参数,而是借助mcp_servers参数来传递。如下所示:

Agent 组件核心参数

属性名类型描述
namestr代理的名称。
instructionsstr | Callable[[RunContextWrapper[TContext], Agent[TContext]], MaybeAwaitable[str]] | None代理的指令,用作“系统提示”。可以是字符串或动态生成指令的函数。
handoff_descriptionstr | None代理的描述,用于代理作为交接时,让 LLM 知道它的功能和何时调用它。
handoffslist[Agent[Any]Handoff[TContext]]
modelstr | Model | None调用 LLM 时使用的模型实现。默认情况下,如果未设置,代理将使用 openai_provider.DEFAULT_MODEL 中配置的默认模型。
model_settingsModelSettings配置模型特定的调优参数(例如温度、top_p)。
toolslist[Tool]代理可以使用的工具列表。
mcp_serverslist[MCPServer]代理可以使用的模型上下文协议(MCP)服务器列表。
mcp_configMCPConfigMCP 服务器的配置。
input_guardrailslist[InputGuardrail[TContext]]在代理执行之前并行运行的检查列表,仅在代理是链中的第一个代理时运行。
output_guardrailslist[OutputGuardrail[TContext]]在生成响应后对代理的最终输出运行的检查列表,仅在代理生成最终输出时运行。
output_typetype[Any]AgentOutputSchemaBase
hooksAgentHooks[TContext]None
tool_use_behaviorLiteral["run_llm_again", "stop_on_first_tool"]StopAtTools
reset_tool_choicebool调用工具后是否将工具选择重置为默认值。默认为 True。确保代理不会进入工具使用的无限循环。

  这两个参数的含义如下所示:

  • mcp_servers:该参数用于接收一个或多个Model Context Protocol (MCP)服务器的实例。当Agent运行时,它会自动加载MCP服务器,并获取MCP服务中定义的可用工具列表。
  • mcp_config:该参数用于配置 MCP 服务器的相关设置。

   因此,如果想给Agent对象传递MCP服务器,其构建的代码形式如下所示:

FENCE0

   所以,接下来核心就是如何去构建mcp_servers_1mcp_servers_2这样的MCP服务器实例。这里需要注意的是:OpenAI Agents SDK框架中兼容的是基于Model Context Protocol 的开放协议规范,而该协议根据所支持和使用的传输协议不同,目前主要分为如下三种类型的服务器:

  • stdio 服务器:作为应用程序的子进程运行。我们一般将这种类型的服务器视为“本地”运行。
  • http over sse 服务器:作为独立的进程运行,并使用sse协议进行通信,可以通过url来访问。
  • StreamableHTTP 服务器:可流式传输的HTTP传输,正在取代 SSE传输。

   其中 StreamableHTTP 的支持刚刚于modelcontextprotocolpython-sdk v1.8.0 发布,所以OpenAI Agents SDK框架目前仅支持stdiohttp over sse这两种类型。源码定义位置:https://github.com/openai/openai-agents-python/blob/main/src/agents/mcp/server.py#L24

  这里我们以SSE模式的MCP服务器接入为例进行演示。

  因为传输协议不同,所以在应用上所需要传递的参数也有所不同。与Stdio类似,MCPServerSse通过接收MCPServerSseParams中定义的参数来连接MCP Server。根据其源码定义,我们首先可以梳理出MCPServerStdio类能够接收的参数如下所示:

MCPServerSseParams参数汇总

参数类型描述使用场景
urlstr服务器的 URL。指定要连接的服务器地址。
headersdict (可选)发送到服务器的请求头。用于传递认证信息或其他自定义头部。
timeoutfloat (可选)HTTP 请求的超时时间,默认为 5 秒。控制请求的最大等待时间,避免长时间无响应。
sse_read_timeoutfloat (可选)SSE 连接的超时时间,默认为 5 分钟。控制服务器推送事件的最大等待时间,确保连接的稳定性。

  在 SSE (Server-Sent Events) 模式 下,我们可以把 MCP 服务器当成一个已经在网络上跑着的「工具 API」,用 URL 建立事件流、再用 POST /messages 发指令。当前主流的使用形式可以归纳为两大类:自托管启动与平台托管直连。

  • 自托管启动(Self-hosted)

  这种方式主要是应用MCP官方的Python / TypeScript MCP SDKServer 代码跑起来(FastAPI / Express 集成), 程序启动后会打印或返回一个本地或内网 SSE URL,然后便可以用这个 URL 建立事件流接入到OpenAI Agents SDK 框架中。如果需要使用MCP 官方的Python SDK构建SSE 模式的MCP 服务器。

  • 平台托管直连(Platform-hosted)

  诸如 ModelScopeMCP 广场mcp.run 等社区维护大量 MPC 服务并支持一键启动MCPSSE 模式。使用的方法非常简单,只需要在平台首页选好MCP Server → 生成一个API-Key,一键生成 SSE URL ,即可直接接入使用。

  对于国内开发者,通过“一键复制 URL + API-Key”就能拿到 SSE 端点的热门网站大致可以分为四类:

  1. 专门的 MCP 服务市场/目录(如 MCP Market、AIbase、MCP Server Hub);
  2. 云厂商推出的 官方托管平台(阿里云 “百炼” 与 Higress Marketplace);
  3. 行业 API 已内置 MCP & SSE(百度地图、腾讯位置服务等);
  4. IDE / 客户端集市 把第三方 SSE URL 聚合到本地(Cherry Studio、Cursor)。

MCP 热门导航网站

平台规模与特点访问链接
ModelScope MCP 广场超过 3000+ 个中文托管 MCP;详情页右侧直接复制 SSE URL,部分服务需在“API Key”栏目填 Token点击进入
MCP Market标榜“国内首个 MCP 服务市场”,已收录 1W+ SSE Server,并提供云托管与 Playground,一键生成专属 URL点击进入
AIbase MCP 资源站整理 GitHub 上的热门 MCP Server 并直接给出 SSE 地址与使用教程点击进入
MCP Server Hub国际化,标签筛选 + “Copy URL” 操作流畅,站内统计数千条 SSE Server点击进入]
阿里云 百炼官方托管“全周期 MCP 服务”,控制台能生成已鉴权的 SSE URL点击进入

5.3 接入 ModelScope MCP

  平台托管直连不需要开发者关心进程与依赖等问题,直接在网页一键生成URL即可接入。下面我们以ModelScopeMCP 广场为例,演示如何在OpenAI Agents SDK框架中通过SSE 模式接入MCP 服务器。

  • Step 2. 点击右上角登录按钮,登录ModelScope账号

  可以通过手机号注册并登录,注意:国内用户记得选择中国大陆 +86 的手机号注册,否则会提示手机号格式错误。

  • Step 3. 挑选MCP 服务,并进入详情页

  这里我们选择的是12306-MCP车票查询工具,该MCP 服务提供了搜索12306购票信息的功能。

  • Step 4. 点击立即使用按钮,进入MCP 服务详情页

  如果是首次使用,在详情页的最右侧会有一个通过SSE URL连接服务的说明

  点击连接按钮,即可生成一个SSE URL,如下图所示:

  • Step 5. 复制SSE URL,并将其接入到OpenAI Agents SDK框架中

  在OpenAI Agents SDK框架中,可以通过MCPServerSSE类来创建SSE 模式的MCP 服务器。该类可接收的配置参数与MCPServerStdio类无异,只不过在params参数中需要接收的是MCPServerSseParams,而不再是MCPServerStdioParams。如下所示:

MCPServerSse可接收参数

参数名称类型默认值描述
paramsMCPServerSseParams-配置服务器的参数,包括服务器的URL、请求头、HTTP请求超时和SSE连时。
cache_tools_listboolFalse是否缓存工具列表。如果为 True,工具列表将被缓存,仅在第一次从服务器获取。如果为 False,每次调用 list_tools() 时都会从服务器获取工具列表。缓存可以通过调用 invalidate_tools_cache() 来失效。
namestr 或 NoneNone服务器的可读名称。如果未提供,将根据命令自动创建名称。
client_session_timeout_secondsfloat 或 None5传递给 MCP ClientSession 的读取超时时间时。

  params参数可接收的数据类型为MCPServerSseParams,如下所示:

MCPServerSseParams参数汇总

参数类型描述使用场景
urlstr服务器的 URL。指定要连接的服务器地址。
headersdict (可选)发送到服务器的请求头。用于传递认证信息或其他自定义头部。
timeoutfloat (可选)HTTP 请求的超时时间,默认为 5 秒。控制请求的最大等待时间,避免长时间无响应。
sse_read_timeoutfloat (可选)SSE 连接的超时时间,默认为 5 分钟。控制服务器推送事件的最大等待时间,确保连接的稳定性。

  最后创建 Agent 实例,并使用mcp 工具进行查询。这里仍然建议大家使用python 脚本运行,而不是在Jupyter Notebook 中运行。完整程序代码文件为OpenAIAgentsSdkMcp.py.py,运行流程如下所示:需要说明的是:OpenAI Agents SDK 框架目前暂时不兼容DeepSeek R1的推理格式输出,代码中的数据显示效果是我们完全自定义了Agents SDK框架中的回调函数以正常提取和运行。

FENCE0

image-20250529185858644 ca76dfaf224da7825b4fa3e9c6ab435

具体运行效果如下:

Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/Agents%20SDK%20%E6%BC%94%E7%A4%BA%E8%A7%86%E9%A2%91.mp4", width=800, height=400)

六、Google ADK 接入 MCP

6.1 谷歌 Agent Development Kit (ADK) 框架功能特性详解

  谷歌 Agent Development Kit (ADK) 是 Google 在 2025 年发布的开源 AI 多代理开发框架。它旨在让开发者像进行软件开发一样来创建和部署自主智能体系统,使构建从简单任务到复杂工作流的多代理应用更为容易。ADK 同时也是支撑 Google 内部 Agentspace 和客户互动套件(CES)代理的底层框架,并已通过开源惠及社区。下面我们从架构设计、API 风格、扩展性、安全性、任务管理、多代理协调等方面,对 ADK 的框架特性进行详细说明。

  ADK 天生支持多代理 (multi-agent) 架构,在设计上鼓励将应用拆分为多个专职的代理,并通过层次化的管理和协作来完成复杂任务。典型模式是采用层次化的主从代理模型:可以定义一个主代理(如“调度/主管”代理)负责统筹,根据用户请求的意图将子任务委派给不同功能特长的子代理处理。这种设计允许代理间自动分工与协调:在处理用户消息时,主代理的底层大模型会参考自己及子代理的能力描述,判断是否将工作转交(handoff)给某个子代理。例如,一个 WeatherAgent 主管可根据用户输入动态决定是自己调用天气查询工具回答天气问题,还是将对话移交给 GreetingAgent 来处理问候语。为此,每个代理在定义时都需要提供清晰的角色说明和能力描述,以帮助大模型决策职责路由。这种通过 LLM 推断驱动的代理转移机制使 ADK 的多代理系统更具自适应性,能够根据对话内容灵活调用最合适的代理处理。除此之外,ADK 还支持多代理并行和循环等复杂编排模式:内置了顺序 (Sequential)并行 (Parallel)、**循环 (Loo...

  模型支持方面,ADK 采用模型无关、插件式设计。虽然针对 Google 自家的 Gemini 大模型和 Vertex AI 平台做了优化,但并不局限于此。通过内置的 LiteLLM 适配层,ADK 可以无缝对接 Vertex AI 模型园中各种模型,甚至包括 Anthropic、Meta、Mistral、AI21 等多家提供商的大模型。这意味着企业可根据需求选择最适合的模型或使用私有模型,而无需更改 ADK 的使用方式,避免供应商锁定。工具扩展方面,ADK 拥有丰富的内置工具第三方工具整合能力。框架自带了诸如网络搜索、代码执行等常用工具模块,并通过开放 API支持开发者注册任意 Python 函数作为自定义工具。ADK 特别提供了模型上下文协议 (MCP) 工具接口和对 OpenAPI 服务的集成,方便调用外部系统。ADK 还能够把其他代理作为工具使用:例如可以将一个由 LangChain 或 CrewAI 构建的代理包装为 ADK 工具供另一个代理调用,从而充分利用社区已有成果。通过这种插件化设计,ADK 的功能可**无限扩...

image-20250427163822992 image-20250427164027877

6.2 LiteLlm快速使用指南

  在介绍ADK之前,我们需要系统介绍ADK默认的大模型调用工具——LiteLlm的使用方法。在后续使用ADK时,选择基础模型是最基础的环节,而ADK目前只支持使用LiteLlm进行模型调用,因此我们先详细介绍国内外在线模型、以及ollama和vLLM驱动下的开源模型如何接入LiteLlm,然后再讲解如何上手使用ADK。

image-20250427154028073 image-20250427154112002

  LiteLLM 是一个轻量级的 Python 库,旨在简化与各种大语言模型(LLM)进行交互的过程。它特别适用于开发者在多种云服务提供商(如 OpenAI、DeepSeek)或本地部署模型(如 Ollama)上运行大语言模型的需求。通过提供简洁的 API 和灵活的配置选项,LiteLLM 使得开发者可以轻松调用和集成各种不同的 LLM,同时支持模型的定制化扩展和高效调度。LiteLLM 核心功能如下:

  • 跨平台模型兼容性:LiteLLM 使开发者能够通过统一接口调用多个大语言模型,无论是云端提供的 API(如 OpenAI)还是本地托管的模型(如 Ollama)。它内置支持常见的大型模型和多模型集成,如 GPT-3.5、GPT-4、DeepSeek 等,也能支持定制模型或自己托管的 LLM。

  • 简化的 API 调用:LiteLLM 提供了一个简单直观的接口,使得开发者无需深入了解底层 API 细节即可实现与模型的交互。用户只需关注模型名称和输入输出内容,LiteLLM 会自动处理与模型的连接、API 调用以及响应解析工作。

  • 多模型支持:LiteLLM 支持通过配置文件和代码直接切换不同的模型。它支持从 OpenAI、Anthropic、Meta、DeepSeek 等多个模型提供商调用,还允许开发者轻松集成自定义模型。例如,您可以在一个项目中同时使用 OpenAI 的 GPT 模型和 DeepSeek 的推理模型,而无需额外的集成工作。

  • 灵活的代理支持:LiteLLM 可以配置为代理模型的 API,通过代理层进行调用,支持本地化部署和代理服务,例如与 Ollama 等工具结合,运行本地大语言模型。这使得 LiteLLM 在需要进行模型切换或构建跨平台服务时,能够提供极大的灵活性。

  • 自定义 API 路由(Base URL):LiteLLM 允许用户设置自定义的 base_url,以支持通过代理或内部 API 调用模型。这为需要在多个环境中运行或通过私有部署调用 LLM 的企业应用提供了便利。

  • 流式响应与事件处理:LiteLLM 支持流式响应(streaming responses),允许开发者在模型生成回复的同时进行处理。通过这种方式,开发者能够实时接收和处理模型输出,适用于需要低延迟响应的应用场景,如实时对话或多轮交互。

  • 工具和任务管理:在集成外部工具(如搜索引擎、数据库查询等)时,LiteLLM 通过简洁的配置支持多任务执行。开发者可以将外部工具与模型结合,形成复杂的自动化任务流,例如通过模型生成的查询请求,调用外部 API 完成任务并返回结果。

  • 灵活的配置和扩展性:LiteLLM 提供了多种配置选项,允许开发者根据具体需求调优模型的行为。用户可以通过传入配置文件来调整模型的推理设置、响应格式、温度参数等,此外,LiteLLM 还支持通过插件扩展其功能,适应更多的使用场景。

  不难看出LiteLLM 是一款强大的模型调用工具,它的核心优势在于跨平台支持、简洁的 API 和灵活的配置选项。无论是调用云端大模型,还是集成本地托管的模型,LiteLLM 都能提供高效且简化的解决方案,使得开发者能够快速集成并灵活调度大语言模型。它特别适用于需要多模型集成、代理服务、任务管理和流式响应的场景,具有极高的可扩展性和适应性。通过 LiteLLM,开发者可以专注于业务逻辑和任务设计,而将模型调用、数据处理和通信细节交给框架来处理,从而大大提高开发效率并降低技术门槛。

  我们可以使用如下命令进行安装

FENCE0

这里需要注意的是,尽管1.67.2不是最新LiteLlm稳定版,但却是可以最好的和ADK兼容的版本,目前最新的LiteLlm库在使用ADK的时候会报错,具体问题详见:https://github.com/BerriAI/litellm/issues/10353 。因此公开课中统一使用1.67.2版本。

image-20250427154609900

  安装完成后即可尝试调用DeepSeek模型在线API进行测试。

from litellm import completion
completion?
api_base = "https://api.deepseek.com"
api_key = "YOUR_DEEPSEEK_API_KEY"
# 使用 LiteLLM 调用 DeepSeek 模型
response = completion(
model="deepseek/deepseek-chat",
messages=[{"role": "user", "content": "你好,好久不见!"}],
api_base=api_base,
api_key=api_key
)
print(response)
print(response.choices[0].message.content)

  使用Gooogle ADK构建Agent其基本的实现形式如下所示。这里我们使用liteLLM接入DeepSeek模型,注意需要在同级目录下创建.env文件,并配置DS_API_KEYDS_BASE_URL。同时,对于Agent的构建,我们使用最简模式,即只设置namemodel。(我们在下一小节课程再详细介绍Agent组件的高阶应用)

from google.adk.agents import Agent
from google.adk.models.lite_llm import LiteLlm
import os
from dotenv import load_dotenv
load_dotenv(override=True)


DS_API_KEY = os.getenv("DS_API_KEY")
DS_BASE_URL = os.getenv("DS_BASE_URL")

# 1. 通过 litellm 接入 DeepSeek 模型
model = LiteLlm(
model="deepseek/deepseek-reasoner",
api_base=DS_BASE_URL,
api_key=DS_API_KEY
)

# 2. 使用最简模式构建一个Agent代理
init_agent = Agent(
name="chatbot",
model=model,
instruction="你是一个乐于助人的中文助手。",
)

  ADK作为最新一代Agent开发框架,不仅功能特性非常领先,而且还内置了非常多的工具,包括Gemini系列模型自带的谷歌搜索、文件检索和代码解释器等功能,同时ADK还拥有内置对话前端,方便开发者更加直观的感受Agent的对话流程,并且实时追踪Agent的events流。而如果Agent中存在外部工具调用,则在内置前端中,还能进一步观察到Agent调用外部工具完整流程,以及各环节调用信息,方便开发者即时debug。如果是使用Gemini模型,这个前端还支持语音和视频实时交互,基本展示效果如下:

7e1032040d5c3bd8447894629c9361e

6.3 ADK内置前端开启流程

  而ADK内置前端开启流程也非常简单,这里我们需要创建一个项目文件,如创建一个ADK_Chat文件夹:

然后创建基本文件结构:(注意,如果是Windows系统,官方推荐手动创建项目文件基本结构,而不是采用IDE如Cursor等进行创建,以避免出现字符乱码情况)

FENCE0

image-20250428112454327

然后使用cursor或者其他IDE打开项目,准备写入代码。(也可以直接使用文本编辑器将代码拷贝进去)

  • init.py

写入如下内容:from . import agent

image-20250428112642693
  • .env

  然后在.env中写入如下内容:

FENCE0

image-20250428113114121
  • agent.py

  写入如下内容。这里我们使用Google ADK框架中的MCPToolset方法接入MCP Server,如下代码所示:

FENCE0

image-20250529191142681 ca76dfaf224da7825b4fa3e9c6ab435

然后再次确认当前环境是否安装adk和litellm两个库:

FENCE0

  dk其实是伴随着安装包一起安装的调用测试命令。在使用adk命令时,我们无需单独设置主函数,只需要按照要求创建一个名为root_agent的主agent,即可顺利开启对话。同时当前项目结构中,.env文件用于保存一些关键变量信息,而__init__.py则负责将当前项目文件test_agent包装为一个可执行的Python文件。这也就是为何我们可以直接输入adk run test_agent的原因。

  接下来即可开启前端了,我们在项目根目录下输入:

FENCE0

这里需要注意的是: Windows 环境下运行 MCP 工具时的子进程创建问题。错误 NotImplementedError 发生在尝试启动 MCP 服务器进程时。因此Windows用户需要使用adk web --no-reload命令启动。

注意选择一个未被使用的端口号

然后在浏览器输入:http://0.0.0.0:8002/即可开启对话:

image-20250428121614162

在对话页面能够看到完整的历史对话消息,并且在左侧还能看到事件流的基本情况,以及每个事件的详细信息:

image-20250428121751965

完整演示效果如下:

Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/Googel%20ADK%E6%BC%94%E7%A4%BA%E8%A7%86%E9%A2%91.mp4", width=800, height=400)