背景
随着今年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主要功能
主页:github.com/google/adk-…
文档:google.github.io/adk-docs/
- 多智能体协作:支持构建包含协调器、执行器等角色的智能体网络,实现复杂任务分解
- 工具链集成:预置搜索引擎、代码执行器等基础工具,支持OpenAPI规范扩展
- 动态工作流:通过SequentialAgent、ParallelAgent等组件定义任务执行顺序
- 双向流式交互:实时处理文本/音频输入,与Gemini API深度集成
- 云部署适配:提供容器化方案,支持Cloud Run和Vertex AI平台快速迁移
adk架构图
Agent流程
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的作用
既然概念已经介绍完毕,当然就到了我们的实操环节,下面即将介绍如何通过ADK创建智能体,并通过MCP协议调用工具来完成工作。
安装依赖
#安装adk
pip install google-adk
#安装litellm,以便使用本地ollama模型
pip install litellm
创建python工程
具体创建工程结构和文件内容可以参考:
创建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”,运行后终端效果如下
点击终端的url “http://localhost:8000"
即可打开终端的web ui界面,提问"请写一篇200字的科幻小说",运行效果如下
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文件
运行结果如下
/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能做的事情也必然会越来越多,希望大家能在此篇文章有所启发。