第10章:模型上下文协议
为了使大型语言模型(LLM)能够作为智能体有效运作,它们的职能必须超越多模态生成。与外部环境的交互是必要的,包括访问当前数据、使用外部软件以及执行特定操作任务。模型上下文协议(MCP)通过为LLM提供与外部资源交互的标准接口来满足这一需求。该协议作为促进一致性和可预测集成的关键机制。
MCP模式概述
想象一个通用的适配器,它能让任何大型语言模型(LLM)无需为每个系统、数据库或工具进行定制集成即可接入。这就是模型上下文协议(MCP)的本质。它是一个开放标准,旨在标准化像Gemini、OpenAI的GPT模型、Mixtral和Claude这样的LLM与外部应用、数据源和工具的通信方式。可以将其视为一种通用连接机制,它简化了LLM获取上下文、执行操作以及与各种系统交互的方式。
MCP采用客户端-服务器架构。它定义了不同的元素——数据(称为资源)、交互式模板(本质上就是提示)和可执行功能(称为工具)——是如何由MCP服务器暴露的。随后,这些元素被MCP客户端消费,客户端可以是LLM宿主应用,也可以是AI智能体本身。这种标准化方法显著降低了将LLM集成到各种运营环境中的复杂性。
然而,MCP是一个针对“智能体接口”的合约,其有效性在很大程度上取决于它所暴露的底层API的设计。存在一种风险,即开发者只是简单地封装了现有的、遗留的API而没有进行修改,这对智能体来说可能不是最优的。例如,如果售票系统的API只允许逐个检索完整的票务详情,那么被要求总结高优先级票务的智能体在高量级工作时将会速度慢且不准确。为了真正有效,底层API应该通过添加如过滤和排序等确定性功能来改进,以帮助非确定性智能体高效工作。这表明,智能体并非神奇地取代确定性工作流程;它们通常需要更强的确定性支持才能成功。
此外,MCP可以封装一个输入或输出对智能体来说仍然难以理解的API。只有当API的数据格式对智能体友好时,它才有用,而这一点MCP本身并不强制执行。例如,为返回PDF文件的文档存储创建一个MCP服务器,如果消费智能体无法解析PDF内容,那么这基本上是毫无用处的。更好的方法是首先创建一个返回文档文本版本(如Markdown)的API,这样智能体才能真正阅读并处理这些内容。这表明,开发者必须考虑的不仅仅是连接,还要考虑交换数据的性质,以确保真正的兼容性。
MCP与工具函数调用对比
模型上下文协议(MCP)和工具功能调用是两种不同的机制,它们使大型语言模型(LLM)能够与外部能力(包括工具)交互并执行操作。虽然两者都旨在扩展LLM的能力以超越文本生成,但它们在方法和抽象级别上存在差异。
工具函数调用可以理解为大型语言模型(LLM)对特定、预定义的工具或函数的直接请求。请注意,在此语境中,我们使用“工具”和“函数”这两个词可以互换。这种交互的特点是一对一通信模型,其中LLM根据其对用户意图的理解,需要外部行动,格式化一个请求。然后应用程序代码执行这个请求,并将结果返回给LLM。这个过程通常是专有的,并且在不同的大型语言模型提供商之间有所不同。
相比之下,模型上下文协议(MCP)作为LLM发现、通信和利用外部能力的标准化接口运行。它作为一个开放协议,促进了与各种工具和系统的交互,旨在建立一个任何符合标准的工具都可以被任何符合标准的LLM访问的生态系统。这促进了不同系统和实现之间的互操作性、可组合性和可重用性。通过采用联邦模型,我们显著提高了互操作性并释放了现有资产的价值。这种策略允许我们只需将这些服务包裹在符合MCP接口的包装中,就可以将不同的和遗留服务带入现代生态系统。这些服务继续独立运行,但现在可以组合成新的应用程序和工作流程,其协作由LLM进行编排。这促进了敏捷性和可重用性,而无需对基础系统进行昂贵的重写。
以下是MCP与工具函数调用的基本区别概述:
| Feature | Tool Function Calling | Model Context Protocol (MCP) |
|---|---|---|
| Standardization | Proprietary and vendor-specific. The format and implementation differ across LLM providers. | An open, standardized protocol, promoting interoperability between different LLMs and tools. |
| Scope | A direct mechanism for an LLM to request the execution of a specific, predefined function. | A broader framework for how LLMs and external tools discover and communicate with each other. |
| Architecture | A one-to-one interaction between the LLM and the application's tool-handling logic. | A client-server architecture where LLM-powered applications (clients) can connect to and utilize various MCP servers (tools). |
| Discovery | The LLM is explicitly told which tools are available within the context of a specific conversation. | Enables dynamic discovery of available tools. An MCP client can query a server to see what capabilities it offers. |
| Reusability | Tool integrations are often tightly coupled with the specific application and LLM being used. | Promotes the development of reusable, standalone "MCP servers" that can be accessed by any compliant application. |
将工具功能调用想象成给AI提供一套特定的定制工具,就像一把特定的扳手和螺丝刀。这对于一个固定任务的工作室来说效率很高。然而,MCP(模型上下文协议)就像创建一个通用、标准化的电源插座系统。它本身不提供工具,但它允许任何制造商的符合标准的工具插入并工作,从而实现一个动态且不断扩展的工作室。
简而言之,函数调用提供了对少数特定功能的直接访问,而MCP(模型上下文协议)是标准化的通信框架,使得LLM(大型语言模型)能够发现并使用大量外部资源。对于简单的应用,特定的工具就足够了;而对于需要适应的复杂、互联的AI系统,像MCP这样的通用标准是必不可少的。
MCP(模型上下文协议)的额外考虑因素
尽管MCP提供了一个强大的框架,但对其进行全面评估需要考虑影响其在特定用例中适用性的几个关键方面。让我们更详细地看看一些方面:
- 工具 vs. 资源 vs. 提示:理解这些组件的具体角色非常重要。资源是静态数据(例如,PDF文件、数据库记录)。工具是执行特定操作的执行函数(例如,发送电子邮件、查询API)。提示是一个模板,指导LLM如何与资源或工具交互,确保交互结构化且有效。
- 可发现性:MCP的一个关键优势是,MCP客户端可以动态查询服务器以了解它提供哪些工具和资源。这种“即时”的发现机制对于需要适应新功能而不需要重新部署的智能体来说非常强大。
- 安全: 通过任何协议暴露工具和数据都需要强大的安全措施。MCP实现必须包括身份验证和授权,以控制哪些客户端可以访问哪些服务器以及它们被允许执行的具体操作。
- 实施:虽然MCP是一个开放标准,但其实施过程可能较为复杂。然而,服务提供商正开始简化这一过程。例如,一些模型提供商如Anthropic或FastMCP提供SDK,这些SDK可以抽象掉大部分样板代码,使得开发者更容易创建和连接MCP客户端和服务器。
- 错误处理:一个全面的错误处理策略至关重要。协议必须定义如何将错误(例如,工具执行失败、服务器不可用、无效请求)传达给LLM,以便LLM能够理解失败并可能尝试另一种方法。
- 本地服务器与远程服务器:MCP服务器可以部署在智能体所在机器上,也可以部署在远程服务器上。对于需要处理敏感数据的场景,可能会选择本地服务器以获得速度和安全性的优势;而远程服务器架构则允许组织内部共享和可扩展地访问常用工具。
- 按需与批量:MCP可以支持按需的交互式会话和更大规模的批量处理。选择取决于应用场景,从需要即时工具访问的实时对话智能体,到批量处理记录的数据分析管道。
- 传输机制:该协议还定义了通信的底层传输层。对于本地交互,它使用基于STDIO(标准输入/输出)的JSON-RPC,以实现高效的进程间通信。对于远程连接,它利用流式HTTP和服务器发送事件(SSE)等对Web友好的协议,以实现持久且高效的客户端-服务器通信。
模型上下文协议采用客户端-服务器模型来标准化信息流。理解组件交互是MCP高级智能体行为的关键:
- 大型语言模型(LLM):核心智能。它处理用户请求,制定计划,并决定何时需要访问外部信息或执行操作。
- MCP 客户端:这是一个围绕 LLM 的应用程序或包装器。它充当中介,将 LLM 的意图翻译成符合 MCP 标准的正式请求。它负责发现、连接到并与 MCP 服务器进行通信。
- MCP服务器:这是通往外部世界的入口。它向任何授权的MCP客户端提供一系列工具、资源和提示。每个服务器通常负责特定的领域,例如连接到公司的内部数据库、电子邮件服务或公共API。
- 可选第三方(3P)服务: 这代表MCP服务器管理和暴露的实际外部工具、应用程序或数据源。它是执行请求操作(如查询专有数据库、与SaaS平台交互或调用公共天气API)的最终端点。
交互流程如下:
- 发现:MCP客户端代表LLM向MCP服务器查询其提供的功能。服务器响应,返回一个清单,列出了其可用的工具(例如,send_email)、资源(例如,customer_database)和提示。
- 请求制定:LLM确定需要使用已发现的一个工具。例如,它决定发送一封电子邮件。它制定了一个请求,指定要使用的工具(send_email)以及必要的参数(收件人、主题、正文)。
- 客户端通信:MCP客户端接收LLM生成的请求,并将其作为标准调用发送到相应的MCP服务器。
- 服务器执行:MCP服务器接收请求。它验证客户端身份,验证请求,然后通过与底层软件(例如,调用电子邮件API的send()函数)接口执行指定的操作。
- 响应和上下文更新:执行后,MCP服务器向MCP客户端发送标准化的响应。此响应指示操作是否成功,并包含任何相关输出(例如,发送电子邮件的确认ID)。然后客户端将此结果传递回LLM,更新其上下文,使其能够继续执行任务的下一步。
实际应用与用例
MCP显著扩展了AI/LLM的能力,使它们更加灵活和强大。以下是九个关键应用场景:
- 数据库集成:MCP允许智能体和LLM无缝访问和交互数据库中的结构化数据。例如,使用MCP数据库工具箱,智能体可以通过自然语言命令查询Google BigQuery数据集以获取实时信息、生成报告或更新记录。
- 生成式媒体编排:MCP使智能体能够集成先进的生成式媒体服务。通过MCP工具包中的Genmedia Services,智能体可以编排涉及Google的Imagen(图像生成)、Google的Veo(视频创作)、Google的Chirp 3 HD(逼真声音)或Google的Lyria(音乐创作)的工作流程,从而在AI应用中实现动态内容创作。
- 外部API交互: MCP为LLM提供了一种标准化的方式来调用和接收来自任何外部API的响应。这意味着智能体可以获取实时天气数据、获取股价、发送电子邮件或与CRM系统交互,从而扩展其功能远超其核心语言模型。
- 基于推理的信息提取:利用大型语言模型(LLM)强大的推理能力,模型上下文协议(MCP)促进了有效、查询依赖的信息提取,超越了传统的搜索和检索系统。与传统搜索工具返回整个文档不同,智能体可以分析文本并提取出直接回答用户复杂问题的精确子句、数据或陈述。
- 自定义工具开发: 开发者可以构建自定义工具,并通过MCP服务器(例如,使用FastMCP)将其公开。这使得专门的内部功能或专有系统可以以标准化、易于消费的格式提供给LLM和其他智能体,而无需直接修改LLM。
- 标准化的LLM到应用通信: MCP确保了LLM与其交互的应用程序之间的一致通信层。这减少了集成开销,促进了不同LLM提供商和主机应用程序之间的互操作性,并简化了复杂智能体系统的开发。
- 复杂工作流编排: 通过结合各种MCP(模型上下文协议)公开的工具和数据源,智能体可以编排高度复杂的多步骤工作流。例如,一个智能体可以通过与不同的MCP服务交互,从数据库中检索客户数据,生成个性化的营销图像,撰写定制化的电子邮件,并将其发送出去。
- 物联网设备控制:MCP可以促进大型语言模型(LLM)与物联网(IoT)设备的交互。智能体可以使用MCP发送指令到智能家居设备、工业传感器或机器人,实现物理系统的自然语言控制和自动化。
- 金融服务自动化: 在金融服务领域,MCP可以使LLM与各种金融数据源、交易平台或合规系统进行交互。智能体可以分析市场数据、执行交易、生成个性化金融建议或自动化监管报告,同时保持安全且标准化的通信。
简而言之,模型上下文协议(MCP)使智能体能够从数据库、API和网页资源中访问实时信息。它还允许智能体通过整合和处理来自各种来源的数据,执行发送邮件、更新记录、控制设备以及执行复杂任务等操作。此外,MCP还支持AI应用的媒体生成工具。
动手实践:ADK代码示例
本节概述了如何连接到提供文件系统操作的本地MCP服务器,使ADK智能体能够与本地文件系统进行交互。
智能体设置与MCPToolset
要配置智能体以进行文件系统交互,必须创建一个名为 agent.py 的文件(例如,在 ./adk_agent_samples/mcp_agent/agent.py)。在 LlmAgent 对象的 tools 列表中实例化 MCPToolset。将 args 列表中的 "/path/to/your/folder" 替换为本地系统上 MCP 服务器可以访问的目录的绝对路径至关重要。此目录将成为智能体执行文件系统操作的根目录。
import os
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters
# Create a reliable absolute path to a folder named 'mcp_managed_files'
# within the same directory as this agent script.
# This ensures the agent works out-of-the-box for demonstration.
# For production, you would point this to a more persistent and secure location.
TARGET_FOLDER_PATH = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
"mcp_managed_files"
)
# Ensure the target directory exists before the agent needs it.
os.makedirs(TARGET_FOLDER_PATH, exist_ok=True)
root_agent = LlmAgent(
model='gemini-2.0-flash',
name='filesystem_assistant_agent',
instruction=(
'Help the user manage their files. You can list files, read files, and write files. '
f'You are operating in the following directory: {TARGET_FOLDER_PATH}'
),
tools=[
MCPToolset(
connection_params=StdioServerParameters(
command='npx',
args=[
"-y", # Argument for npx to auto-confirm install
"@modelcontextprotocol/server-filesystem",
# This MUST be an absolute path to a folder.
TARGET_FOLDER_PATH,
],
),
# Optional: You can filter which tools from the MCP server are exposed.
# For example, to only allow reading:
# tool_filter=['list_directory', 'read_file']
)
],
)
npx(Node Package Execute),随npm(Node Package Manager)5.2.0及更高版本捆绑提供,是一种实用工具,它允许直接从npm注册表中执行Node.js包。这消除了全局安装的需求。本质上,npx充当了npm包运行器的角色,它通常用于运行许多以Node.js包形式分发的社区MCP服务器。
创建一个 __init__.py 文件是必要的,以确保 agent.py 文件被识别为 Agent 开发工具包(ADK)的可发现 Python 包的一部分。此文件应位于 agent.py 所在的同一目录中。
# ./adk_agent_samples/mcp_agent/__init__.py
from . import agent
当然,还有其他可用的支持命令。例如,连接到python3可以通过以下方式实现:
connection_params = StdioConnectionParams(
server_params={
"command": "python3",
"args": ["./agent/mcp_server.py"],
"env": {
"SERVICE_ACCOUNT_PATH": SERVICE_ACCOUNT_PATH,
"DRIVE_FOLDER_ID": DRIVE_FOLDER_ID
}
}
)
UVX在Python的语境中,指的是一个利用uv执行命令的命令行工具,它可以在一个临时、隔离的Python环境中运行。本质上,它允许您运行Python工具和包,而无需全局安装或在你的项目环境中安装。您可以通过MCP服务器运行它。
connection_params = StdioConnectionParams(
server_params={
"command": "uvx",
"args": ["mcp-google-sheets@latest"],
"env": {
"SERVICE_ACCOUNT_PATH": SERVICE_ACCOUNT_PATH,
"DRIVE_FOLDER_ID": DRIVE_FOLDER_ID
}
}
)
一旦创建MCP服务器,下一步就是连接到它。
连接MCP服务器与ADK Web
首先,执行 'adk web'。在您的终端中导航到 mcp_agent(例如,adk_agent_samples)的父目录,然后运行:
cd ./adk_agent_samples # Or your equivalent parent directory
adk web
一旦ADK Web UI在您的浏览器中加载完成,从智能体菜单中选择“filesystem_assistant_agent”。接下来,尝试使用以下提示进行实验:
显示此文件夹的内容。
* "读取sample.txt文件。"(此假设sample.txt位于TARGET_FOLDER_PATH目录。)
"另一个文件(another_file.md)里有什么内容?"
创建FastMCP的MCP服务器
FastMCP是一个旨在简化MCP服务器开发的Python高级框架。它提供了一个抽象层,简化了协议复杂性,使开发者能够专注于核心逻辑。
该库通过简单的Python装饰器,实现了工具、资源和提示的快速定义。其显著优势在于自动生成模式,它能够智能地解析Python函数签名、类型提示和文档字符串,构建必要的AI模型接口规范。这种自动化减少了手动配置,降低了人为错误。
除了基本的工具创建之外,FastMCP还支持高级架构模式,如服务器组合和代理。这有助于模块化开发复杂的多组件系统,并实现现有服务与人工智能可访问框架的无缝集成。此外,FastMCP还包括针对高效、分布式和可扩展的人工智能驱动应用的优化。
服务器配置使用FastMCP
为了说明,考虑服务器提供的一个基本“问候”工具。一旦该工具激活,ADK智能体和其他MCP客户端可以使用HTTP与其交互。
# fastmcp_server.py
# This script demonstrates how to create a simple MCP server using FastMCP.
# It exposes a single tool that generates a greeting.
# 1. Make sure you have FastMCP installed:
# pip install fastmcp
from fastmcp import FastMCP, Client
# Initialize the FastMCP server.
mcp_server = FastMCP()
# Define a simple tool function.
# The `@mcp_server.tool` decorator registers this Python function as an MCP tool.
# The docstring becomes the tool's description for the LLM.
@mcp_server.tool
def greet(name: str) -> str:
"""Generates a personalized greeting.
Args:
name: The name of the person to greet.
Returns:
A greeting string.
"""
return f"Hello, {name}! Nice to meet you."
# Or if you want to run it from the script:
if __name__ == "__main__":
mcp_server.run(
transport="http",
host="127.0.0.1",
port=8000
)
此Python脚本定义了一个名为greet的单个函数,该函数接受一个人的名字并返回一个个性化的问候。位于该函数上方的@tool()装饰器自动将其注册为一个AI或另一个程序可以使用的工具。该函数的文档字符串和类型提示被FastMCP用于告知智能体该工具的工作方式、所需输入以及将返回的内容。
当脚本执行时,它启动了FastMCP服务器,该服务器监听localhost:8000上的请求。这使得greet函数可以作为网络服务提供。然后可以配置一个智能体连接到该服务器,并使用greet工具生成问候语,作为更大任务的一部分。服务器将持续运行,直到手动停止。
使用ADK智能体消费FastMCP服务器
ADK智能体可以配置为MCP客户端,以使用运行中的FastMCP服务器。这需要配置HttpServerParameters,使用FastMCP服务器的网络地址,通常是http://localhost:8000。
可以包含一个tool_filter参数,以限制智能体的工具使用仅限于服务器提供的特定工具,例如“greet”。当接收到类似“问候John Doe”的请求时,智能体嵌入的LLM通过MCP识别到可用的“greet”工具,并使用“John Doe”作为参数调用它,然后返回服务器的响应。这个过程展示了通过MCP暴露的用户定义工具与ADK智能体的集成。
为了建立此配置,需要一个智能体文件(例如,位于 ./adk_agent_samples/fastmcp_client_agent/ 下的 agent.py)。此文件将实例化一个ADK智能体,并使用 HttpServerParameters 与操作中的 FastMCP 服务器建立连接。
# ./adk_agent_samples/fastmcp_client_agent/agent.py
import os
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, HttpServerParameters
# Define the FastMCP server's address.
# Make sure your fastmcp_server.py (defined previously) is running on this port.
FASTMCP_SERVER_URL = "http://localhost:8000"
root_agent = LlmAgent(
model='gemini-2.0-flash', # Or your preferred model
name='fastmcp_greeter_agent',
instruction='You are a friendly assistant that can greet people by their name. Use the "greet" tool.',
tools=[
MCPToolset(
connection_params=HttpServerParameters(
url=FASTMCP_SERVER_URL,
),
# Optional: Filter which tools from the MCP server are exposed
# For this example, we're expecting only 'greet'
tool_filter=['greet']
)
],
)
该脚本定义了一个名为fastmcp_greeter_agent的智能体,该智能体使用Gemini语言模型。它被赋予了一项特定指令,即扮演一个友好的助手,其目的是问候人们。关键的是,代码为这个智能体配备了一个执行任务的工具。它配置了一个MCPToolset以连接到运行在localhost:8000上的独立服务器,预期该服务器是前一个示例中的FastMCP服务器。该智能体被特别授权访问该服务器上托管的greet工具。本质上,这段代码设置了系统的客户端,创建了一个理解其目标是问候人们,并且确切知道要使用哪个外部工具来完成这一目标的智能体。
在fastmcp_client_agent目录下创建一个__init__.py文件是必要的。这确保智能体被识别为ADK的可发现Python包。
首先,打开一个新的终端并运行 python fastmcp_server.py 以启动 FastMCP 服务器。接下来,在终端中进入 fastmcp_client_agent(例如,adk_agent_samples)的父目录,并执行 adk web。一旦 ADK Web UI 在您的浏览器中加载,从智能体菜单中选择 fastmcp_greeter_agent。您可以通过输入类似“问候约翰·多伊”的提示来测试它。智能体将使用您 FastMCP 服务器上的 greet 工具来创建响应。
概览
内容: 为了成为有效的智能体,大型语言模型必须超越简单的文本生成。它们需要具备与外部环境交互的能力,以获取当前数据并利用外部软件。如果没有标准化的通信方法,每个LLM与外部工具或数据源的集成都将成为一项定制化、复杂且不可重复的努力。这种临时性的方法阻碍了可扩展性,使得构建复杂、互联的AI系统变得困难且效率低下。
原因: 模型上下文协议(MCP)通过充当LLM与外部系统之间的通用接口,提供了一种标准化的解决方案。它建立了一个开放、标准化的协议,定义了如何发现和使用外部能力。在客户端-服务器模型上运行,MCP允许服务器向任何符合规范的客户端暴露工具、数据资源和交互式提示。由LLM驱动的应用程序作为这些客户端,以可预测的方式动态发现和交互可用的资源。这种标准化的方法促进了一个可互操作和可重用组件的生态系统,极大地简化了复杂智能体工作流的开发。
经验法则: 在构建复杂、可扩展或企业级智能体系统,且需要与多样化的外部工具、数据源和API交互时,请使用模型上下文协议(MCP)。当不同LLM和工具之间的互操作性是重点,且智能体需要具备动态发现新功能的能力而不需要重新部署时,它尤为理想。对于具有固定和有限数量预定义功能的简单应用,直接调用工具功能可能就足够了。
视觉摘要

图1:模型上下文协议
关键要点
以下是关键要点:
模型上下文协议(MCP)是一个开放标准,它促进了大型语言模型(LLM)与外部应用程序、数据源和工具之间的标准化通信。 它采用客户端-服务器架构,定义了暴露和消费资源、提示和工具的方法。 智能体开发工具包(ADK)支持使用现有的MCP服务器,并通过MCP服务器暴露ADK工具。 FastMCP简化了MCP服务器的开发和管理工作,尤其是对于暴露用Python实现的工具。 MCP Tools for Genmedia Services 允许智能体集成到谷歌云的生成式媒体功能(Imagen、Veo、Chirp 3 HD、Lyria)。 MCP使LLM和智能体能够与真实世界系统交互,访问动态信息,并执行超出文本生成的操作。
结论
模型上下文协议(MCP)是一个开放标准,它促进了大型语言模型(LLM)与外部系统之间的通信。它采用客户端-服务器架构,使LLM能够通过标准化工具访问资源、使用提示并执行操作。MCP允许LLM与数据库交互、管理生成型媒体工作流程、控制物联网设备以及自动化金融服务。实际示例展示了设置智能体与MCP服务器通信的过程,包括文件系统服务器和基于FastMCP构建的服务器,展示了其与智能体开发工具包(ADK)的集成。MCP是开发超越基本语言能力的交互式AI智能体的关键组件。