使用谷歌ADK构建AI Agent
通过完整代码深度剖析AI Agent 是如何成为 MCP 客户端的
Google Cloud Next '25 发布了几项突破性的公告. 这是一次充满创新, 实践演示, 产品展示和深入讨论的激励人心的经历.
去年的焦点是GenAI(聊天机器人)和Vertex AI, 而今年的主题则非常明确--Agent, Agent和更多Agent . 从ADK到Agent对Agent(A2A)协议和AgentSpace, 以及谷歌旗舰LLM--Gemini 2.5 Pro 预览版.
在本文中, 我的重点将是利用 Gemini LLM, 通过ADK Agent作为MCP 客户端 来利用现有的 MCP 服务器 , 从而使用由外部 MCP 驱动的工具提供的功能来调用工具. 在深入讨论代码实现之前, 我们将讨论ADK的核心概念.
什么是 ADK - Agent开发工具包(Agent Development Kit)?
ADK 是一个开源, 代码优先的 Python 工具包, 用于构建, 评估和部署智能AI Agent.
ADK 使开发人员能够在一个模块化和可扩展的框架内创建Agent工作流, 从简单的单Agent任务到复杂的多Agent协调.
什么是 ADK 中的 Agent?
Agent是一个自主, 自足的执行单元, 旨在实现特定目标. Agent可以:
- 执行任务,
- 与用户互动
- 利用外部工具, 以及
- 与其他Agent协作完成复杂的工作流程.

google.github.io/adk-docs/ag...
核心Agent类别
ADK 提供三种主要Agent类型以支持:
LLM Agent (如 LlmAgent, Agent) : 使用 LLM 来理解, 推理, 计划和行动--非常适合动态的, 语言驱动的任务. 工作流Agent (例如, 顺序Agent(SequentialAgent), 并行Agent(ParallelAgent), 循环Agent(LoopAgent) : 以可预测的模式协调其他Agent, 无需依赖 LLM 进行流程控制--最适合结构化, 可重复的流程. 自定义Agent: 通过扩展 BaseAgent 来构建, 以启用自定义逻辑, 专门工作流或独特工具集成--非常适合高级定制解决方案.
在本文中, 我们将使用LLM Agent 类型 与MCPTools.
在 ADK 中, 什么是工具(Kit)?
工具(Kit)代表授予AI Agent的一种特定能力, 使其能够执行操作并与外部世界进行交互, 而不仅仅是基本的文本生成和推理.
工具通常是一个模块化的代码组件--如 Python 函数, 类方法, 甚至是另一个Agent--旨在执行一项定义的任务.
Agent如何使用工具?
Agent通过函数调用机制动态地利用工具, LLM 会根据上下文进行推理, 选择并调用适当的工具, 同时生成输入, 观察结果, 并将输出整合到下一步行动或响应中.
ADK 中的工具类型
ADK 支持几种工具类型:
1. 功能工具: 专为我们应用程序的独特逻辑和工作流程定制的工具.
函数/方法 : 作为工具注册的标准同步 Python 函数(def)或类方法. Agent即工具 : 在父Agent中使用专门Agent作为可调用工具, 以实现模块化行为. 长期运行函数工具: 为异步或时间密集型操作而设计的工具.
2. 内置工具: 框架中包含的预定义工具, 用于网络搜索, 代码执行或 RAG 等任务.
3. 第三方工具: 轻松集成来自 LangChain 或 CrewAI 等流行生态系统的工具.
架构
我们将使用与前文相同的架构, 此外, 我们还将在此使用 ADK:

实现
让我们深入了解使用 ADK + MCP + Gemini AI 构建此管道的关键实施步骤.
前置条件
-
安装Python 3.8+
-
通过 API 密钥访问谷歌 Gemini生成式AI
-
有效的 SerpAPI key (用于获取实时飞行数据)
步骤 1: 设置虚拟环境
使用安装依赖项
bash
# Setup virtual environment (mac or Unix )
python -m venv venv && source venv/bin/active
# Install agent development kit
pip install google-adk
# Install MCP server
pip install mcp-flight-search
# Install GenAI Python SDK
pip install google-genai
google-sdk : 谷歌用于构建Agent的ADK.
google-genai : 谷歌用于与生成式AI模型(如 Gemini)交互的库.
mcp-flight-search : 使用 SerpAPI 的 MCP 服务器, 可使用 MCP 库获取航班信息.

设置环境变量 :
注意这里的区别: ADK 中的 GEMINI_API_KEY
将改为 GOOGLE_API_KEY
.
ini
export GOOGLE_API_KEY="your-google-api-key"
export SERP_API_KEY="your-serpapi-key"
步骤 2:安装 MCP 服务器 - mcp-flight-search
为使Gemini能够与真实世界的 API 交互, 我们将使用兼容 MCP 的服务器
在本文中, 我们将使用mcp-flight-search--一个使用FastMCP构建的轻量级 MCP 服务器, 它公开了一个使用 SerpAPI 搜索实时飞行数据的工具.
验证已安装的 MCP 服务器软件包 pypi.org/project/mcp...
ini
# Install from PyPI ( Already Installed from Step 1)
pip install mcp-flight-search
第 3 步:了解作为 MCP 客户端的 ADK
javascript
from google.adk.agents.llm_agent import LlmAgent
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters
LlmAgent - 是 ADK 的核心组件, 充当我们应用程序的"思考"部分, 利用LLM的强大功能进行推理, 理解自然语言, 做出决策, 生成响应以及与工具交互.

Runner
负责协调Agent生命周期中各个组件之间的交互. Runner
使用内存中的实现来实现工件, 会话和内存服务, 为Agent的执行提供了一个轻量级, 自足的环境.

InMemorySessionService
是 ADK 的会话服务接口的实现, 可将所有会话数据(如对话历史, 状态和元数据)直接存储在应用程序的内存中. 这意味着当应用程序停止或重新启动时, 所有会话信息都会丢失.
当用户与AI Agent交互时, 会创建一个会话对象来跟踪对话.

MCPToolSet - 是 ADK 中的一个类, 可使我们的AI Agent与外部 MCP 服务器连接. 这些服务器会公开一些工具(如 API 或服务), Agent可以利用它们来执行特定任务. 通过使用 MCPToolset, Agent可以无缝地发现, 调用和管理这些外部工具.

StdioServerParameters
是一个配置类, 用于指定Agent应如何通过标准输入/输出流连接到MCP服务器. 当 MCP 服务器是一个通过控制台进行通信的本地进程时, 这一点尤其有用.
MCPToolSet
和 StdioServerParameters
如何协同工作?
结合使用 MCPToolset
和 StdioServerParameters
时, ADK Agent可实现以下功能:
- 建立连接 : 使用
StdioServerParameters
, 定义启动 MCP 服务器进程所需的命令和参数. - 发现可用工具 :
MCPToolset
连接到 MCP 服务器, 并检索Agent可使用的可用工具列表. - 将工具整合到Agent中: 将发现的工具调整为与 ADK Agent兼容的格式, 以便在Agent执行期间无缝调用.
- 管理连接生命周期 :
MCPToolset
处理与 MCP 服务器连接的设置和拆卸, 确保资源得到适当管理.
步骤 4:连接到 MCP 服务器
StdioServerParameters
定义了 MCP 配置, 以便使用 MCPToolSet 以异步方式列表和监听.
python
# --- Step 1: Get tools from MCP server ---
async def get_tools_async():
"""Gets tools from the Flight Search MCP Server."""
print("Attempting to connect to MCP Flight Search server...")
server_params = StdioServerParameters(
command="mcp-flight-search",
args=["--connection_type", "stdio"],
env={"SERP_API_KEY": os.getenv("SERP_API_KEY")},
)
tools, exit_stack = await MCPToolset.from_server(
connection_params=server_params
)
print("MCP Toolset created successfully.")
return tools, exit_stack
步骤 5:从 ADK 创建Agent
如上所述, 我们使用的是 Llm Agent, 它是应用程序的一部分.
python
# --- Step 2: Define ADK Agent Creation ---
async def get_agent_async():
"""Creates an ADK Agent equipped with tools from the MCP Server."""
tools, exit_stack = await get_tools_async()
print(f"Fetched {len(tools)} tools from MCP server.")
# Create the LlmAgent matching the example structure
root_agent = LlmAgent(
model=os.getenv("GEMINI_MODEL", "gemini-2.5-pro-preview-03-25"),
name='flight_search_assistant',
instruction='Help user to search for flights using available tools based on prompt. If return date not specified, use an empty string for one-way trips.',
tools=tools,
)
return root_agent, exit_stack
第 6 步:将Agent创建, 会话管理和协调与运行程序整合
ini
async def async_main():
# Create services
session_service = InMemorySessionService()
# Create a session
session = session_service.create_session(
state={}, app_name='flight_search_app', user_id='user_flights'
)
# Define the user prompt
query = "Find flights from Atlanta to Las Vegas 2025-05-05"
print(f"User Query: '{query}'")
# Format input as types.Content
content = types.Content(role='user', parts=[types.Part(text=query)])
# Get agent and exit_stack
root_agent, exit_stack = await get_agent_async()
# Create Runner
runner = Runner(
app_name='flight_search_app',
agent=root_agent,
session_service=session_service,
)
print("Running agent...")
events_async = runner.run_async(
session_id=session.id,
user_id=session.user_id,
new_message=content
)
# Process events
final_content = None
async for event in events_async:
print(f"Event received: {event}")
# Always clean up resources
print("Closing MCP server connection...")
await exit_stack.aclose()
print("Cleanup complete.")
第 7 步 : 演示
在MCP客户端进行用户查询:
ini
query = "Find flights from Atlanta to Las Vegas 2025-05-05"
使用Standard Logging的演示

使用Debug Logging的演示

将 MCP 与 ADK 集成的主要考虑因素
- MCP 与 ADK
MCP : 是一个开放协议, 它规范了AI模型与外部工具和数据源的交互方式. ADK : 是一个基于 Python 的框架, 用于构建和部署AI Agent. MCPToolset: 使 ADK Agent能够使用 MCP 服务器提供的工具, 从而在 MCP 和 ADK 之间架起桥梁.
要在 Python 中构建 MCP 服务器, 请使用
model-context-protocol
库.
- 工具类型与集成
ADK 工具 : 专为在 ADK Agent中直接使用而设计的 Python 对象(如 BaseTool
, FunctionTool
). MCP 工具 : 由 MCP 服务器提供的功能, MCPToolset
将其调整为可在 ADK Agent中使用. 第三方工具 : 像LangChain
和 CrewAI
这样的库提供的工具, 可使用包装器(如 LangchainTool
和 CrewaiTool
)集成到ADK.
- 异步架构
- ADK 和 MCP Python 库都是基于 Python 的 asyncio 框架构建的.
- 工具实现和服务器处理程序应为异步(
async def
), 以确保无阻塞操作.
- MCP 中的稳定会话
- 与典型的无状态 REST API 不同, MCP 在客户端和服务器之间建立持久的有状态连接.
- 这种有状态性允许在交互过程中保留上下文, 但需要谨慎的会话管理.
- 部署考虑因素
- MCP 连接的持久性会给扩展和部署带来挑战, 特别是对于处理多个用户的远程服务器.
- 基础设施方面的考虑因素包括负载平衡和会话亲和性, 以保持连接的稳定性.
- 在 ADK 中管理 MCP 连接
- MCPToolset 在 ADK 中管理 MCP 连接的生命周期.
- 使用
exit_stack
可确保在Agent执行完成时正确终止连接.
故障排除:
- 默认情况下, adk 库需要 GCP 项目顶点 AI, 位置和顶点 AI 配置. 确保使用
GOOGLE_API_KEY
, 而不是GEMINI_API_KEY
, 因为错误信息可能不会明确指出缺少的env
值.
解决方法 : 确保将变量设置为 GOOGLE_API_KEY
javascript
ValueError: Missing key inputs argument! To use the Google AI API,provide (`api_key`) arguments. To use the Google Cloud API, provide (`vertexai`, `project` & `location`) arguments.
- 经常出现 429 速率限制错误和 500 内部服务器错误.
解决方法 : 切换到 Gemini 2 Flash 作为Gemini API "免费层"通过 API 服务提供, 其速率限制较低, 用于测试目的
css
google.genai.errors.ClientError: 429 RESOURCE_EXHAUSTED. {'error': {'code': 429, 'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits.', 'status': 'RESOURCE_EXHAUSTED', 'details': [{'@type': 'type.googleapis.com/google.rpc.QuotaFailure', 'violations': [{'quotaMetric': 'generativelanguage.googleapis.com/generate_content_free_tier_requests', 'quotaId': 'GenerateRequestsPerDayPerProjectPerModel-FreeTier', 'quotaDimensions': {'model': 'gemini-2.0-pro-exp', 'location': 'global'}, 'quotaValue': '25'}]}, {'@type': 'type.googleapis.com/google.rpc.Help', 'links': [{'description': 'Learn more about Gemini API quotas', 'url': 'https://ai.google.dev/gemini-api/docs/rate-limits'}]}, {'@type': 'type.googleapis.com/google.rpc.RetryInfo', 'retryDelay': '27s'}]}}
An error occurred during execution: 500 INTERNAL. {'error': {'code': 500, 'message': 'An internal error has occurred. Please retry or report in https://developers.generativeai.google/guide/troubleshooting', 'status': 'INTERNAL'}}
官方文档参考
- ADK文档 - 与 Gemini 和 Google 集成的开源AI Agent框架的完整指南.
- ADK 中的 LLM Agent - 实现 LLM Agent的详细文档, 包括定义身份, 说明, 工具和高级配置.
- 使用 ADK 的 MCP 工具 - 将 ADK 用作 MCP 客户端以连接 MCP 服务器的具体指导.
GitHub 仓库:
你可以在我的 GitHub 上访问本教程中使用的所有代码: adk-python-mcp-client
总结一下
在本文中, 探讨了如何使用开源 ADK 以 Google Gemini LLM 作为 MCP 客户端, 使用MCP构建Agent设置助手.
好吧, 今天的内容就分享到这里啦!
一家之言, 欢迎拍砖!
Happy Coding! Stay GOLDEN!