使用谷歌ADK构建AI Agent 用作MCP客户端

使用谷歌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可以:

  1. 执行任务,
  2. 与用户互动
  3. 利用外部工具, 以及
  4. 与其他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 构建此管道的关键实施步骤.

前置条件

  1. 安装Python 3.8+

  2. 通过 API 密钥访问谷歌 Gemini生成式AI

  3. 有效的 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"

为使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 服务器是一个通过控制台进行通信的本地进程时, 这一点尤其有用.

MCPToolSetStdioServerParameters 如何协同工作?

结合使用 MCPToolsetStdioServerParameters 时, ADK Agent可实现以下功能:

  1. 建立连接 : 使用 StdioServerParameters, 定义启动 MCP 服务器进程所需的命令和参数.
  2. 发现可用工具 : MCPToolset 连接到 MCP 服务器, 并检索Agent可使用的可用工具列表.
  3. 将工具整合到Agent中: 将发现的工具调整为与 ADK Agent兼容的格式, 以便在Agent执行期间无缝调用.
  4. 管理连接生命周期 : 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 集成的主要考虑因素

  1. MCP 与 ADK

MCP : 是一个开放协议, 它规范了AI模型与外部工具和数据源的交互方式. ADK : 是一个基于 Python 的框架, 用于构建和部署AI Agent. MCPToolset: 使 ADK Agent能够使用 MCP 服务器提供的工具, 从而在 MCP 和 ADK 之间架起桥梁.

要在 Python 中构建 MCP 服务器, 请使用 model-context-protocol 库.

  1. 工具类型与集成

ADK 工具 : 专为在 ADK Agent中直接使用而设计的 Python 对象(如 BaseTool, FunctionTool). MCP 工具 : 由 MCP 服务器提供的功能, MCPToolset 将其调整为可在 ADK Agent中使用. 第三方工具 : 像LangChainCrewAI这样的库提供的工具, 可使用包装器(如 LangchainToolCrewaiTool)集成到ADK.

  1. 异步架构
  • ADK 和 MCP Python 库都是基于 Python 的 asyncio 框架构建的.
  • 工具实现和服务器处理程序应为异步(async def), 以确保无阻塞操作.
  1. MCP 中的稳定会话
  • 与典型的无状态 REST API 不同, MCP 在客户端和服务器之间建立持久的有状态连接.
  • 这种有状态性允许在交互过程中保留上下文, 但需要谨慎的会话管理.
  1. 部署考虑因素
  • MCP 连接的持久性会给扩展和部署带来挑战, 特别是对于处理多个用户的远程服务器.
  • 基础设施方面的考虑因素包括负载平衡和会话亲和性, 以保持连接的稳定性.
  1. 在 ADK 中管理 MCP 连接
  • MCPToolset 在 ADK 中管理 MCP 连接的生命周期.
  • 使用 exit_stack 可确保在Agent执行完成时正确终止连接.

故障排除:

  1. 默认情况下, 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.
  1. 经常出现 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!

相关推荐
AlfredZhao6 分钟前
揭秘AI编排爆火真相:从"人工智障"到"真正智能"的关键一跃
ai·agent·mcp·a2a
萌萌哒草头将军10 小时前
VsCode Colipot 🚗 + MCP Tools ✈️ = 让你的编程体验直接起飞 🚀🚀🚀
前端·visual studio code·mcp
萌萌哒草头将军10 小时前
🚀🚀🚀MCP SDK 快速接入 DeepSeek 并添加工具!万万没想到MCP这么简单好用!
前端·javascript·mcp
草梅友仁12 小时前
MCP 协议与古茗排队事件解析 | 2025 年第 16 周草梅周报
github·aigc·mcp
Miku1613 小时前
Cline+Playwright-MCP配置浏览器
mcp·cline
nil14 小时前
一文弄懂用Go实现自己的MCP服务
llm·go·mcp
漫谈网络14 小时前
MCP 应用案例-网络设备批量管理
ai·aigc·mcp·aigent
潘锦15 小时前
解构 Google 的 A2A 协议及其和 MCP 的关系
mcp
formulahendry15 小时前
再见,SSE!你好,Streamable HTTP!轻松开发 Streamable HTTP MCP Server
mcp