Google ADK & MCP 打造通用智能体

754 阅读7分钟

背景

随着今年Agent场景与能力的不断活动,今年可以谈的上是AI Agent的正在元年,基础模型能力的不断提升,Agent框架与各种SDK的不断成熟,加上MCP的火热带来的AI生态繁荣,各大厂商也不断退出自己的通用人工智能体AI应用。

Google作为AI生态的老大哥,也与4月上旬推出了自己Google Agent Development Kit(简称ADK),ADK是一个灵活的模块化框架,用于开发和部署 AI 代理 。ADK 可以与流行的LLMs开源生成式 AI 工具一起使用,其设计重点是与 Google 生态系统和 Gemini 模型紧密集成 。ADK 使您可以轻松开始使用由 Gemini 模型和 Google AI 工具提供支持的简单代理,同时提供更复杂的代理架构和编排所需的控制和结构。

ADK主要功能

image.png 主页:github.com/google/adk-… 文档:google.github.io/adk-docs/

  • 多智能体协作:支持构建包含协调器、执行器等角色的智能体网络,实现复杂任务分解
  • 工具链集成:预置搜索引擎、代码执行器等基础工具,支持OpenAPI规范扩展
  • 动态工作流:通过SequentialAgent、ParallelAgent等组件定义任务执行顺序
  • 双向流式交互:实时处理文本/音频输入,与Gemini API深度集成
  • 云部署适配:提供容器化方案,支持Cloud Run和Vertex AI平台快速迁移

adk架构图

image.png

Agent流程

image.png

MCP

MCP 的全称是Model Context Protocol,也就是模型上下文协议,是由Claude的母公司Anthropic于24年底开源发布的,MCP就是AI大模型的标准化工具箱,可以把它想象成 AI 大模型和外部数据、工具之间沟通的 “通用语言” 或者 “万能插座”,大模型可以利用这些工具与外界互动,获取信息并且完成具体任务。

MCP可以代替人类访问并且操作外部工具,每个mcp服务或者叫做MCP Server都专精于一类的工作:比如有的负责读写浏览器、有的负责读写本地文件、有的操作git仓库等等,MCP Server 通常就是运行在本地的一段 nodejs 或者 python 程序。

MCP与fuction call的区别

MCP与function call只是功能相似,他们之间是相互独立的,没有依赖关系,function call简单来说就是AI调用外部工具的能力,是某些大模型(如 GPT-4)提供的专有接口特性。它允许模型直接生成结构化的函数调用请求(如查询天气、计算数值),由宿主应用执行并返回结果。本质是模型内部的功能扩展,依赖于特定厂商的实现,无强制标准协议。

MCP的最大优点是集合了之前各家大模型不同的function call的标准,整合成了一个统一的标准协议,而且不仅仅是claude,市面上几乎所有的大模型,都可以接入MCP,类似于 AI 领域的 “USB-C 接口”。它通过统一的通信规范(如 JSON-RPC 2.0),解决大模型与外部工具、数据源之间的兼容性问题。核心目标是让不同模型和工具能高效互操作,开发者只需按 MCP 标准开发一次接口,即可被多个模型调用。

简而言之,MCP 解决 “如何让 AI 连接万物” 的通用性问题,Function Calling 解决 “如何让 AI 快速执行特定操作” 的效率问题,二者互补协作,共同支撑 AI 从对话走向自动化任务执行。

下图很形象的说明了MCP的作用 image.png 既然概念已经介绍完毕,当然就到了我们的实操环节,下面即将介绍如何通过ADK创建智能体,并通过MCP协议调用工具来完成工作。

安装依赖

#安装adk
pip install google-adk
#安装litellm,以便使用本地ollama模型
pip install litellm

创建python工程

image.png 具体创建工程结构和文件内容可以参考:

google.github.io/adk-docs/ge…

image.png

创建agent

本文主要使用本地的ollama模型gemma3:12b,还不会本地部署模型的同学,可以去看看 5分钟手把手系列(一):使用Mac Book Pro本地部署大模型(Ollama+Llama3.1_8B+Docker+OpenWebUI), 在agent.py文件中插入如下代码

# 调用ollama模型
from google.adk.agents import LlmAgent
from google.adk.models.lite_llm import LiteLlm

# 创建使用Ollama Gemma模型的代理
root_agent = LlmAgent(
    model=LiteLlm(model="ollama/gemma3:12b"),  # Correct format for Ollama models
    name="helpful_agent",
    description=(
        "a helpful assistant."
    ),
    instruction=(
        "You are a helpful assistant"
    ),
)

然后运行在pycharm终端运行“ADK web”,运行后终端效果如下 image.png 点击终端的url “http://localhost:8000" 即可打开终端的web ui界面,提问"请写一篇200字的科幻小说",运行效果如下 image.png

MCP调用

本文仅演示简单MCP server调用,以流程走通为主。使用MCP官方serve,获取时间工具mcp_server_time 在agent.py文件插入如下代码

import asyncio
from dotenv import load_dotenv
from google.genai import types
from google.adk.agents.llm_agent import LlmAgent
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, SseServerParams, StdioServerParameters
from google.adk.agents import LlmAgent
from google.adk.models.lite_llm import LiteLlm

# Load environment variables from .env file if needed
load_dotenv()

# --- Step 1: 获取工具的异步函数 ---
async def get_tools_async():
    """从MCP服务器获取工具"""
    print("尝试连接到MCP服务器...")
    tools, exit_stack = await MCPToolset.from_server(
        connection_params=StdioServerParameters(
            command='python3',
            args=["-m", "mcp_server_time", "--local-timezone=Asia/Shanghai"],
        )
    )
    print("MCP Toolset 创建成功.")
    # MCP 需要维持与本地MCP服务器的连接
    # exit_stack 管理这个连接的清理
    return tools, exit_stack

# --- Step 2: 创建代理的异步函数 ---
async def get_agent_async():
    """创建一个配备了MCP服务器工具的ADK代理"""
    tools, exit_stack = await get_tools_async()
    print(f"从MCP服务器获取了 {len(tools)} 个工具.")

    root_agent = LlmAgent(
        model=LiteLlm(model="ollama/gemma3:12b"),  # Correct format for Ollama models
        name="helpful_agent",
        description=(
            "a helpful assistant."
        ),
        instruction=(
            "You are a helpful assistant"
        ),
    )
    return root_agent, exit_stack

# --- Step 3: 主执行逻辑 ---
async def async_main():
    session_service = InMemorySessionService()
    artifacts_service = InMemoryArtifactService()

    session = session_service.create_session(
        state={}, app_name='mcp_time_app', user_id='user_time'
    )

    # 设置查询
    query = "现在几点了"
    print(f"用户查询: '{query}'")
    content = types.Content(role='user', parts=[types.Part(text=query)])

    root_agent, exit_stack = await get_agent_async()

    runner = Runner(
        app_name='mcp_time_app',
        agent=root_agent,
        artifact_service=artifacts_service,
        session_service=session_service,
    )

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

    async for event in events_async:
        print(f"收到事件: {event}")

    # 关键清理步骤: 确保MCP服务器进程连接已关闭
    print("关闭MCP服务器连接...")
    await exit_stack.aclose()
    print("清理完成.")

if __name__ == '__main__':
    try:
        asyncio.run(async_main())
    except Exception as e:
        print(f"发生错误: {e}")

这次直接运行次Python文件 image.png 运行结果如下

/Users/x/PycharmProjects/PythonProjec/ADK/.venv/bin/python /Users/x/PycharmProjects/PythonProjec/ADK/multi_tool_agent/agent.py 
用户查询: '现在几点了'
尝试连接到MCP服务器...
MCP Toolset 创建成功.
从MCP服务器获取了 1 个工具.
运行代理中...
收到事件: content=Content(parts=[Part(video_metadata=None, thought=None, code_execution_result=None, executable_code=None, file_data=None, function_call=None, function_response=None, inline_data=None, text='现在是 2025年4月19日 星期六 下午8:04。')], role='model') grounding_metadata=None partial=False turn_complete=None error_code=None error_message=None interrupted=None invocation_id='e-d569ead4-3d2d-4f9c-a870-16a4ec7f0f4d' author='helpful_agent' actions=EventActions(skip_summarization=None, state_delta={}, artifact_delta={}, transfer_to_agent=None, escalate=None, requested_auth_configs={}) long_running_tool_ids=None branch=None id='lZEuIhPe' timestamp=1744894976.173205
关闭MCP服务器连接...
清理完成.

进程已结束,退出代码为 0

总结

随着AI Agent通用智能体的能力越发成熟,大厂如OPEN AI、GOOGLE、微软都推出了自家的智能体框架,MCP协议的生态成熟也提升了开发智能体的效率,今年势必成为Agent爆发的一年,加上后续A2A协议(Agent-to-Agent)的普及,AI Agent能做的事情也必然会越来越多,希望大家能在此篇文章有所启发。