为了账号安全,请及时绑定邮箱和手机立即绑定

使用Google ADK和MCP协议构建基于Gemini的智能助手——详细教程及完整代码

谷歌云Next ’25宣布了多个突破性的公告,我有幸亲自参加了这次活动。这次经历充满创新、现场演示、产品演示和深刻讨论,非常启发人心。

去年的焦点是GenAI(聊天机器人)和Vertex AI,而今年的主题非常明确——全都是代理。从ADKA2A协议以及代理空间,还有谷歌的旗舰大型语言模型——Gemini 2.5 Pro预览

在我的上一篇文章里,我探讨了如何通过将Gemini LLM与模型上下文协议(MCP)结合,并作为MCP客户端,实现与外部API和系统的结构化、工具增强型交互。我们还讨论了MCP的核心概念、应用场景以及示例。

在本文中,我们的重点将是利用 现有MCP服务器 并通过 ADK代理 作为 MCP客户端,并通过 Gemini LLM 调用工具的能力,利用外部 MCP 动力工具提供的功能。在讨论代码实现之前,我们先来了解 ADK 的核心概念,实现功能。

ADK是什么?它是一个代理程序开发工具包。

代理开发工具包(ADK,Agent Development Kit的缩写) 是一个开源的、代码优先的Python工具包,用于构建、评估和部署智能AI代理程序。

ADK 允许开发人员创建智能代理流程 — 从单一代理任务到复杂多代理的编排 — 所有这些都可以在一个模块化和可扩展的框架内完成。

在ADK中,Agent是什么?

一个智能代理是自主运行的执行单元,旨在实现特定目标。智能代理可以

  1. 完成任务,
  2. 与用户交流,
  3. 使用外部工具,
  4. 和其他代理一起合作以完成复杂的任务流程。

https://google.github.io/adk-docs/agents/

核心代理类别

ADK 提供三种主要代理类型以支持

  • LLM代理 (例如:LlmAgent, Agent) :利用LLM来理解、推理、规划和行动——适用于动态语言驱动的任务。
  • 工作流代理 (例如:SequentialAgent, ParallelAgent, LoopAgent) :按照可预测的模式调度其他代理而不依赖于LLM进行流程控制——最适合结构化和可重复的过程。
  • 自定义代理 :通过扩展BaseAgent来实现自定义逻辑、专业的流程或独特的工具集成——适合高级定制化的解决方案。

在这篇文章中,我们将使用LLM Agents这种类型的工具与MCPTools。

在ADK上下文中,工具是指什么?

一个 工具 代表赋予AI代理的特定能力,使其能够执行动作和互动,并与基本文本生成和推理之外的外部环境进行互动。

一个工具通常是模块化代码组件,比如一个Python函数、类中的方法,或者是一个其他代理,用来完成特定任务。

如何使用工具?

代理通过功能调用的方式动态利用工具,在此过程中,模型会根据上下文选择并调用合适的工具,同时生成相应的输入,观察到的结果,并然后将输出整合到下一步行动或回应中。

ADK中的工具种类

ADK支持多种工具类型。

  1. 功能工具集:专为我们的应用程序的独特逻辑及工作流程设计的工具。
  • 函数和方法:作为工具注册的标准同步Python函数(def)或类方法。
  • 用作工具的代理:在父代理中使用专门代理作为工具,实现模块化。
  • 长时间运行的工具:设计用于异步或耗时任务的工具。

2. 内置工具:框架中预设的工具,可用于执行网络搜索、代码执行或RAG等任务。RAG是指检索增强生成。

3. 第三方工具:轻松整合来自流行生态系统的工具,如LangChain或CrewAI。

架构

我们将使用和前面文章一样的架构,还会用到ADK。

作者拍摄

实施

让我们着手构建这个基于ADK + MCP + 该Gemini AI的管道,分步骤实施。

预备知识
  1. 安装了 Python 3.8 及以上版本

2. Google Gemini 服务 生成式 AI 功能通过 API 密钥来使用

3. 有效SerpAPI密钥(用于获取实时航班信息)

第一步:设置虚拟环境:
安装依赖项
    # 设置虚拟环境(mac或Unix)
    python -m venv venv && source venv/bin/activate

    # 安装代理开发工具包
    pip install google-adk

    # 安装MCP服务器端
    pip install mcp-flight-search

    # 安装GenAI Python SDK
    pip install google-genai

google-sdk:(^1) Google 的代理开发工具包(ADK),用于构建代理程序。

(^1) 注:google-sdk 是 Google 提供的用于构建代理程序的工具包。

google-genai : Google的生成式AI模型互动库,例如Gemini。

mcp-flight-search : 使用MCP库并通过SerpAPI获取航班信息的MCP服务器

设置一下环境变量:

请注意这里的不同:这里要用 GOOGLE_API_KEY,而不是 GEMINI_API_KEY 在 ADK

    export GOOGLE_API_KEY="你的Google API密钥值"  
    export SERP_API_KEY="你的SerpApi密钥值"
步骤 2: 安装 MCP 服务器(mcp-flight-search)

为了让 Gemini 能与实际的 API 交互,我们将使用一个遵循 MCP 标准的服务器。

我们将使用mcp-flight-search,它是一个使用FastMCP构建的轻量级的MCP服务器。这个工具可以使用SerpAPI实时查询航班数据。

请确认已安装的MCP服务器软件包 https://pypi.org/project/mcp-flight-search/,并检查其状态。

如果你还没装,可以用pip安装mcp-flight-search(之前在步骤 1 已经装过了)
第三步:理解 ADK 如何作为 MCP 客户端
从 google.adk.agents.llm_agent 导入 LlmAgent,  
从 google.adk.runners 导入 Runner,  
从 google.adk.sessions 导入 InMemorySessionService,  
从 google.adk.tools.mcp_tool.mcp_toolset 导入 MCPToolset, StdioServerParameters,

LlmAgent — 是 ADK 中的核心组件,扮演应用程序的‘思考’角色,利用大型语言模型(LLM)来进行推理、理解自然语言、做决定、生成回应以及与工具互动交流。

Runner 负责在整个代理生命周期中协调各组件间的交互。Runner 使用内存实现方式来提供工件、会话和内存服务的内存实现,从而为代理执行提供轻量级且自包含的内存环境。

InMemorySessionService 实现了 ADK 的 SessionService 接口,它将所有会话信息(如对话历史、状态和元数据等信息)直接存储在应用程序的内存中。这表示一旦应用停止或重启,所有会话信息都将丢失。

当用户与AI代理进行交互时,会创建一个会话对象来跟踪对话内容。

MCPToolSet — 是 ADK 中的一个工具类,它使我们的 AI 代理能够连接到外部 MCP 服务器。这些服务器提供工具,例如 API 和服务,代理可以使用这些工具来执行特定的作业。通过 MCPToolSet,代理可以无缝地发现、调用和管理这些工具。

StdioServerParameters 是一个配置类,用于指定代理通过标准输入输出流连接到 MCP 服务器的方式。这在 MCP 服务器作为一个本地进程并通过控制台通信时特别有用。

MCPToolSet和StdioServerParameters是如何协同工作的?

当结合使用MCPToolset和StdioServerParameters时,ADK代理可以做到:

  1. 建立连接:使用StdioServerParameters定义启动MCP服务器进程所需的命令和参数,确保它们正确无误。
  2. 发现可用工具:MCPToolset连接到MCP服务器并检索可用于代理的工具列表。
  3. 将工具集成到代理中:将发现的工具适配为与ADK代理兼容的格式,从而在代理执行过程中实现无缝调用。
  4. 管理连接生命周期:MCPToolset负责建立和终止与MCP服务器的连接,合理管理资源。
步骤四:连接到MCP服务器上

StdioServerParameters定义了使用MCPToolSet进行异步操作,以监听和列出MCP配置。

    # --- 步骤 1:从 MCP 服务器获取工具 ---
    async def get_tools_async():
        """从 MCP 飞行搜索服务器获取工具。"""
        print("正在尝试连接到 MCP 飞行搜索服务器...")
        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 工具集成功创建。")
        return tools, exit_stack
步骤5:从ADK创建智能代理

正如提到的,我们正在使用Llm代理(思考组件),这是应用程序的思考模块。

    # --- 步骤 2:定义 ADK 代理创建过程 ---
    async def get_agent_async():
        """创建一个配备了来自 MCP 服务器的工具的 ADK 代理。"""
        tools, exit_stack = await get_tools_async()
        print(f"异步地从 MCP 服务器获取了 {len(tools)} 个工具。")

        root_agent = LlmAgent(
            model=os.getenv("GEMINI_MODEL", "gemini-2.5-pro-preview-03-25"),
            name='flight_search_assistant',
            instruction='帮助用户根据提示使用可用工具搜索航班。如果没有指定返回日期,则视为单程行程,并使用空字符串。',
            tools=tools,
        )

        return root_agent, exit_stack
第六步:将代理生成、会话处理和编排集成在一起与运行器
     async def async_main():  
        # 创建服务  
        session_service = InMemorySessionService()  

        # 创建一个会话  
        session = session_service.create_session(  
            state={}, app_name='flight_search_app', user_id='user_flights'  
        )  

        # 查找2025年5月5日从亚特兰大到拉斯维加斯的航班  
        query = "查找2025年5月5日从亚特兰大到拉斯维加斯的航班"  
        print(f"用户查询: '{query}'")  

        # 将输入格式化为types.Content  
        content = types.Content(role='user', parts=[types.Part(text=query)])  

        # 获取智能代理和exit_stack  
        root_agent, exit_stack = await get_agent_async()  

        # 创建Runner  
        runner = Runner(  
            app_name='flight_search_app',  
            agent=root_agent,  
            session_service=session_service,  
        )  

        print("正在运行代理...")  
        events_async = runner.run_async(  
            session_id=session.id,   
            user_id=session.user_id,   
            new_message=content  
        )  

        # 正在处理事件...  
        final_content = None  
        async for event in events_async:  
            print(f"收到事件: {event}")  

        # 关闭与MCP服务器的连接...  
        print("关闭与MCP服务器的连接...")  
        await exit_stack.aclose()  
        print("清理完成。")
第七步:演示环节

用户在MCP客户端的查询:

query = "从亚特兰大到拉斯维加斯2025年5月5日的航班"

标准日志记录示例

调试日志演示

集成ADK与MCP的重要考虑事项
  1. MCP VS ADK
  • MCP 是一个 开放标准协议,规范了AI模型与外部工具和数据源之间的交互方式。
  • ADK 是一个 基于Python的框架,用于构建和部署AI代理程序。
  • MCPToolset :通过使ADK代理能够使用MCP服务器提供的工具,连接MCP和ADK。

要构建一个MCP服务器,请使用Python中的MCP库。

2. 工具种类及其集成

  • ADK 工具:例如 BaseTool 和 FunctionTool 这样的 Python 对象,它们专门用于直接在 ADK 代理中使用。
  • MCP 工具:由 MCP 服务器提供的功能,通过 MCPToolset 进行适配,以在 ADK 代理中使用。
  • 第三方工具:例如 LangChain 和 CrewAI 这样的库,它们提供了可以通过 LangchainTool 和 CrewaiTool 等适配器集成到 ADK 中的工具。

3. 异步架构

  • ADK 和 MCP 的 Python 库(库)都是使用 Python 的 asyncio 框架构建的。
  • 工具实现和服务器处理器应当使用异步定义(async def),以确保异步操作。

4. MCP 中的有状态的会话

  • MCP 在客户端和服务器之间建立持久的保持状态的连接,而不同于典型的无状态 REST API。
  • 这种有状态的方式使得跨会话保留上下文成为可能,但需要小心管理会话状态。

5. 部署注意事项

  • MCP连接的持续性可能会对扩展和部署造成挑战,这特别是在需要支持多个用户的远程服务器上。
  • 考虑到架构,需要包括负载均衡和会话保持以保持连接的稳定。
  1. 管理并处理ADK的MCP连接

    *MCPToolset 负责管理 ADK 中 MCP 连接的整个生命周期。

    • 使用 exit_stack 可以确保代理执行结束后正确终止这些连接。

故障解决:

默认情况下,adk库期望GCP项目的Vertex AI、地点和VertexAI配置。请使用GOOGLE_API_KEY而不是GEMINI_API_KEY,因为错误信息可能不会明确指出缺少的环境变量。

解决:确保将变量设置为GOOGLE_API_KEY。

值错误:缺少关键参数!要使用Google AI API,请提供(`api_key`)参数。要使用Google Cloud API,请提供(`vertexai`, `project` 和 `location`)参数。
  1. 经常遇到 429 限速错误和 500 服务器错误。

切换到Gemini 2 Flash作为Gemini API 的“免费层级”通过 API 服务提供,但速率限制较低,适用于测试[更多详情]

google.genai.errors.ClientError: 429 资源已耗尽。{'error': {'code': 429, 'message': '您已超出当前配额,请检查您的配额和计费详情。有关此错误的更多信息,请访问: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': '了解更多关于 Gemini API 配额的信息', 'url': 'https://ai.google.dev/gemini-api/docs/rate-limits'}]}, {'@type': 'type.googleapis.com/google.rpc.RetryInfo', 'retryDelay': '27s'}]}}

执行过程中发生错误:500 内部错误:{'error': {'code': 500, 'message': '发生内部错误。请重试或在此链接 https://developers.generativeai.google/guide/troubleshooting 报告此错误', 'status': 'INTERNAL'}}
双子API: 成本计费

Gemini 2.5 Pro 预览 根据 Google 文档,Gemini API 的“免费层级”提供较低的速率限制,适用于测试。Gemini API 的“付费层级”则提供了更高的速率限制、额外功能和不同的数据处理方法。更多详情请参阅更高的速率限制

官方文档参考
GitHub 项目:

你可以在我的 GitHub 上找到本教程中用到的所有代码:

GitHub - arjunprabhulal/adk-python-mcp-client

通过在 GitHub 上创建账户,加入 arjunprabhulal/adk-python-mcp-client 的开发中。

最后

在这篇文章中,我们探讨了如何使用开源ADK来构建一个使用模型上下文协议(MCP)的代理安装助手,并将Google Gemini LLM作为MCP客户端进行集成。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消