随着 GPT-4、Claude、Gemini 和 Llama3 等大型语言模型(LLMs)的不断发展,我们迫切需要一种标准化的方式,将它们连接到工具、API 以及各种系统中。然而,这些模型主要依赖于预训练数据进行运作,天生不具备对实时数据、数据库、外部 API 或本地文件的访问能力。
如何帮助模型将自然语言转换为现实中的动作与数据访问,模型上下文协议(Model Context Protocol,MCP)它使整个过程变得结构化、灵活,并能够在各种工具与系统间实现互操作性 。
在本文中,我们将深入探讨 MCP 的概念,并在后续介绍具体的实现方式。
什么是MCP?
模型上下文协议(MCP[1])是由 Anthropic 开发的一种开放标准协议,旨在让 AI 模型能够无缝地与外部数据源和工具进行交互,起到 AI 集成的“通用连接器”作用。
你可以将 MCP 理解为 AI 集成领域的“USB-C”,它为模型提供了一种统一的方式来连接各种设备与数据源。
MCP 是如何运作的?
MCP 遵循客户端-服务器架构,其中:
•客户端 (如 AI 应用或大型语言模型 LLM)连接到•服务器 (MCP 工具提供者),服务器向客户端暴露工具、API 或数据源。
这使得 LLM 模型与外部 API 之间能够实现动态且结构化的交互。
MCP 的优势
•标准化集成 :将 LLM 连接到任何外部系统,无需大量定制工作。•灵活性 :LLM 可以按需使用多个工具与服务。•安全性 :支持安全的 API 交互,无需硬编码凭据。•开发更简单 :可轻松构建并暴露自定义的 MCP 服务器。•维护更容易 :无需重复编写集成逻辑。
MCP 将传统 API 转化为更适合模型使用的工具,具备自动发现、可预测的结构化模式和标准化交互方式。
MCP 服务器的示例
•文件系统 :访问本地文件与目录•网页搜索 :执行实时的网页搜索•数据库 :查询 SQL 或 NoSQL 数据库•客户关系管理(CRM)系统 :连接如 Salesforce 等 CRM 系统•版本控制系统 :访问如 Git 等版本控制平台
何时使用模型上下文协议(MCP)?
以下情况适合使用 MCP:
•我们正在构建智能体(Agentic)系统•我们希望工具是模块化的、可复用的、可发现的•我们需要使用多个外部数据源•我们希望系统可以扩展到多个工具或工具链
架构说明
下图所示项目集成了多个组件,结合 Gemini 与 MCP,实现自然语言航班搜索功能:
组件交互流程
1. 用户 → 客户端
•用户输入自然语言查询(例如:“查找明天从亚特兰大飞往拉斯维加斯的航班”)•客户端脚本(client.py
)处理用户输入
2. 客户端 → MCP 服务器
•客户端启动 MCP 服务器进程(mcp-flight-search
)•建立标准输入输出(stdio)通信通道•获取可用工具及其描述信息
3. 客户端 → Gemini API
•将用户查询发送至 Gemini•同时提供工具描述信息以供函数调用使用•接收结构化的函数调用及提取出的参数
4. 客户端 → MCP 工具
•从 Gemini 获取函数调用参数•调用相应的 MCP 工具并传入参数•处理返回结果
5. MCP 服务器 → SerpAPI
•MCP 服务器向 SerpAPI 发起请求•查询 Google Flights 航班数据•处理并格式化返回的航班信息
实现方式
接下来我们将分步骤介绍如何使用 Gemini AI 构建上述功能流程(Pipeline)。
前置条件
在开始实现之前,请确保你已具备以下条件:
1.安装了 Python 3.8 及以上版本2.拥有 Google Gemini[2] 生成式 AI 的 API 访问权限3.拥有有效的 SerpAPI[3] 密钥(用于获取实时航班数据)
第一步:设置虚拟环境
首先安装所需依赖 :
# 创建虚拟环境
python -n venv venv
# 激活虚拟环境
source venv/bin/activate
# 安装依赖库
pip install google-genai mcp
•google-genai
:Google 官方的 Python 库,用于与 Gemini 等生成式 AI 模型交互。•mcp
:用于与 MCP(Model Context Protocol)服务器交互的 Python SDK,提供连接外部工具或服务的能力。
设置环境变量
请将以下命令中的 your-google-api-key
和 your-serpapi-key
替换为你自己的密钥:
export GEMINI_API_KEY="your-google-api-key"
export SERP_API_KEY="your-serpapi-key"
第二步:安装 MCP 服务器 —— mcp-flight-search
为了让 Gemini 能够与现实世界的 API 进行交互,我们需要使用一个符合 MCP 协议的服务器。
本文将使用 mcp-flight-search[4] —— 这是一个轻量级的 MCP 服务器,基于 FastMCP[5] 构建,提供一个可以通过 SerpAPI 检索实时航班数据的工具。
该 MCP 服务器包已发布至 PyPI:
🔗 mcp-flight-search - PyPI[6]
# 从 PyPI 安装
pip install mcp-flight-search
你可以通过以下方式检查 mcp-flight-search 是否正确安装:
第三步:理解 MCP 工具包的结构
我们首先导入相关库,初始化 Gemini 和 MCP SDK,并准备进行异步执行。
from google import genai
上述代码导入了 google-generativeai 库中的 genai 模块,它提供了访问 Google 强大语言模型(如 Gemini 1.5、2.0 和 2.5)的能力,并包含了与模型进行自然语言交互的客户端方法。
from google.genai import types
该模块提供了 Gemini API 使用的类型定义和配置结构。例如:
•Tool:定义模型可以调用的工具(函数)。•GenerateContentConfig:允许我们配置模型如何响应(例如:温度、是否支持工具等)。
from mcp importClientSession,StdioServerParameters
以上类来自 mcp-sdk-python[7] 库,是与 MCP 服务器交互的核心组件:
•ClientSession
:用于客户端与 MCP 服务器进行通信的会话类。•StdioServerParameters
:用于设置 MCP 服务器参数,通常基于标准输入/输出进行通信。
from mcp.client.stdio import stdio\_client
这段代码导入了 stdio_client —— 一个异步上下文管理器,用于通过标准输入输出(Standard I/O)与 MCP 服务器建立连接。它确保 MCP 服务器被正确启动,并且客户端能够发送和接收结构化请求。
from google import genai
from google.genai import types
from mcp importClientSession,StdioServerParameters
from mcp.client.stdio import stdio_client
以上 4 个关键模块的组合,构成了将 Gemini 的语言模型能力与通过 MCP 工具暴露的现实世界 API 相连接的技术主干 。
第四步:初始化 Gemini 客户端
client = genai.Client(api\_key=os.getenv("GEMINI\_API\_KEY"))
genai.Client() 是与 Google 的生成式 AI 模型(如 Gemini 2.5 Pro、Gemini 2 Flash)进行交互的主要接口。
初始化完成后,该客户端对象可以:
•向 Gemini 模型发送提示词(prompts)•传入工具定义(即函数调用的结构)•接收结构化响应和函数调用对象(Function Call Objects)
第五步:配置 MCP 工具服务器
以下代码块用于设置启动并与 MCP 工具服务器通信所需的参数。该服务器将提供一个工具(本例中为航班搜索功能):
server_params =StdioServerParameters(
command="mcp-flight-search",
args=["--connection_type","stdio"],
env={"SERP_API_KEY": os.getenv("SERP_API_KEY")},
)
参数说明: mcp-flight-search :这是运行本地 MCP 服务器的 CLI 启动命令。它也可以是一个符合 MCP 协议 的 Python 模块。
stdio :指示服务器使用标准输入/输出(stdio)作为通信通道。Stdio 通用、跨语言,特别适合本地或子进程运行的工具服务器。
SERP_API_KEY :将环境变量 SERP_API_KEY 传递给运行该工具的子进程。在本例中,该工具需要通过此密钥访问 SerpAPI ,以获取实时航班数据。
一旦 server_params 定义完毕,就可以通过 stdio_client 的异步上下文管理器启动服务器: 示例交互流程(Python 3.11 环境):
Python3.11.11(main,Dec32024,17:20:40)[Clang16.0.0(clang-1600.0.26.4)] on darwin
Type"help","copyright","credits"or"license"for more information.
>>>import os
>>>from google import genai
>>>from google.genai import types
>>>from mcp importClientSession,StdioServerParameters
>>>from mcp.client.stdio import stdio_client
>>> client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))
>>> server_params =StdioServerParameters(
... command="mcp-flight-search",
... args=["--connection_type","stdio"],
... env={"SERP_API_KEY": os.getenv("SERP_API_KEY")},
...)
>>> server_params
StdioServerParameters(command='mcp-flight-search', args=['--connection_type','stdio'], env={'SERP_API_KEY':'XXXXXXXXX'}, cwd=None, encoding='utf-8', encoding_error_handler='strict')
Gemini 客户端 处理语言理解、提示生成与函数调用逻辑。
MCP 工具服务器 (航班搜索)监听来自模型的工具调用请求,并通过 SerpAPI 实时执行这些调用。
第六步:连接 MCP 服务器并列出可用工具
下面这段代码完成了三个关键操作:
1.启动与 MCP 服务器的连接2.初始化用于结构化工具通信的会话3.动态发现并格式化可用于 Gemini 的工具
async def run():
# 启动 MCP 工具服务器并建立通信通道
async with stdio_client(server_params)as(read, write):
async withClientSession(read, write)as session:
prompt = f"Find Flights from Atlanta to Las Vegas 2025-05-05"
# 初始化会话,准备进行工具调用
await session.initialize()
# 获取可用的 MCP 工具列表
mcp_tools = await session.list_tools()
# 将 MCP 工具转换为 Gemini 所需的 Tool 格式
tools =[
types.Tool(
function_declarations=[
{
"name": tool.name,
"description": tool.description,
"parameters":{
k: v
for k, v in tool.inputSchema.items()
if k notin["additionalProperties","$schema"]
},
}
]
)
for tool in mcp_tools.tools
]
# 向 Gemini 模型发送请求,传入提示词和工具定义
response = client.models.generate_content(
model="gemini-2.5-pro-exp-03-25",
contents=prompt,
config=types.GenerateContentConfig(
temperature=0,
tools=tools,
),
)
MCP 客户端与 Gemini LLM 如何协作?
stdio_client 是一个异步上下文管理器,它负责:
•作为子进程启动 MCP 工具服务器•管理消息交换所需的输入/输出流
这使得整个流程能够自动协调,包括工具的注册、调用、执行以及与 Gemini LLM 的交互配置。
在 stdio\_client
中,read
与 write
是异步流对象,用于与 MCP 服务器进行双向通信:
•read
:用于从服务器读取响应或工具注册信息•write
:用于向服务器发送请求或工具调用指令
prompt = f"Find Flights from Atlanta to Las Vegas 2025-05-05"
上述 prompt 是我们要发送给 Gemini 模型的自然语言查询。Gemini 模型会将其转化为结构化的工具函数调用(Function Call)。
await session.initialize()
这行代码调用了 session.initialize() 方法,触发客户端与 MCP 服务器 之间的初始化握手流程。
•服务器注册它所提供的工具(本例中为“航班搜索工具”)•会话完成初始化后,客户端就可以列出、调用和执行这些工具
mcp\_tools = await session.list\_tools()
上述代码请求 MCP 服务器返回所有可用工具(函数)的列表 。
•每个 tool 对象中包含以下字段:•name:工具名称•description:工具描述•input schema:该工具支持的输入参数,格式为 JSON Schema
借助 mcp_tools.tools ,MCP 服务器具有“自描述”能力,能够向 LLM 模型自动传达每个工具的用途和调用方式。
tools =[
types.Tool(
function_declarations=[
{
"name": tool.name,
"description": tool.description,
"parameters":{
k: v
for k, v in tool.inputSchema.items()
if k notin["additionalProperties","$schema"]
},
}
]
)
for tool in mcp_tools.tools
]
上述步骤将 MCP 工具定义转换为 Gemini 所需的 function_declarations[8] 格式。
现在,Gemini 模型已经准备好可以通过函数调用的方式,利用 MCP 服务器提供的工具来完成自然语言查询任务。
第七步:Gemini —— 解析提示词并建议函数调用
response = client.models.generate_content(
model="gemini-2.5-pro-exp-03-25",
contents=prompt,
config=types.GenerateContentConfig(
temperature=0,
tools=tools,
),
)
这一步将用户的自然语言提示词 prompt 发送给 Gemini 模型 ,同时附上从 MCP 服务器发现的工具列表。
如果 Gemini 模型判断该提示词与某个工具的函数定义匹配,它将返回一个 function_call 对象,其中包括要调用的工具名称和自动填充好的参数列表。
result = await session.call_tool(
function_call.name, arguments=dict(function_call.args)
)
第八步:Gemini LLM 返回最终响应
当 Gemini 判断用户提示词与某个函数(基于名称、描述或参数)相匹配时,它会返回一个结构化的 function\_call
对象,例如:
{
"function_call":{
"name":"search_flights",
"args":{
"source":"ATL",
"destination":"LAS",
"date":"2025-05-05"
}
}
}
Gemini 大模型从一个被动的文本生成模型 ,成功转变为一个主动的智能决策者 ,它能够:
•理解自然语言输入;•选择合适的工具进行调用;•自动填充函数所需的参数;•我们没有编写任何解析逻辑!•所有字段的填充和结构化函数调用的生成,完全由 Gemini LLM 根据用户的自然语言输入自动完成。•最终输出的 function\_call
是结构化的、完整的 ,并且可以直接交由 MCP 工具服务器执行。
以下调试日志展示了 Gemini 与 模型上下文协议(MCP) 如何协同工作:
•解读用户意图•匹配合适工具•返回实时数据响应
使用 Gemini LLM 与 MCP的最佳实践指南
1. 工具设计
•命名清晰简洁 :使用简短且有意义的名称(如 search\_flights
、get\_weather
)•提供清晰描述 :为每个工具编写简洁明了的说明,模型将依据此内容判断何时以及如何调用工具•使用强类型定义参数 :显式指定输入参数的类型(如 string
、enum
、number
),有助于模型准确填充内容
2. 模型交互
•工具数量越少,精度越高 :避免加载过多工具,仅使用与当前任务高度相关的工具•动态加载工具 :根据用户查询或上下文动态引入工具,而不是一次性全部加载•清晰引导模型 :明确提示模型的角色,并解释何时、如何调用工具
3. 服务器设置
•推荐使用 stdio 通信模式 :通过 --connection\_type stdio
启动 MCP 服务器,简化本地开发流程•安全传递环境变量 :使用 env
参数将如 SERP\_API\_KEY
等密钥安全地传递给工具服务器
4. 请求处理
•始终先初始化会话 :在列出或调用工具前,务必运行 session.initialize()
•动态列出工具 :使用 session.list\_tools()
,使客户端更具灵活性和工具无关性(tool-agnostic)
5. 错误处理与安全性
•返回有帮助的错误信息 :确保工具服务器在失败时返回可理解的、对用户友好的错误提示•保护 API 密钥等敏感信息 :切勿在日志或错误信息中泄露密钥等敏感数据
✅ 通过以上实践,可以确保 Gemini 与 MCP 配合更加安全、高效、可扩展。
GitHub 仓库地址
你可以在作者的 GitHub 仓库中获取本教程中使用的全部代码:
🔗 GitHub - arjunprabhulal/mcp-gemini-search[9]
一个基于 Google Gemini LLM 和 Model Context Protocol(MCP)的自然语言航班搜索系统,支持自然语言转函数调用的 AI 应用示例。
⚠️ 当前限制
截至 2025 年 3 月,在使用 Gemini LLM 与 Model Context Protocol(MCP)进行函数调用时,仍存在以下限制:
•OpenAPI 支持尚不完整 •Python 支持的参数类型有限 •自动函数调用仅在 Python SDK 中提供
✅ 结语
在本文中,我们学习了如何通过 MCP 协议 + Google Gemini 模型构建一个实时增强的 AI 助手系统 。通过逐步实践,我们了解了:
•Gemini 如何处理自然语言提示词•MCP 如何暴露结构化、自描述的工具接口•函数调用机制如何实现由自然语言驱动的实时执行流程
通过将我们的 AI 应用(本例中的 mcp-flight-search
)与 LLM 模型(如 Gemini 2.0 Flash 或 Gemini 2.5 Pro 实验版本)集成,我们得以实现:
•模型具备 动态决策能力 •自动完成 函数调用执行 •返回结构化数据结果•无需硬编码业务逻辑
这标志着从传统问答模型向“可行动智能体”迈出了关键一步。
❤️🔥 MCP + Gemini = 你的下一代 AI 工具集成平台。
更多信息
山行AI希望本文对你有所帮助,谢谢阅读!由笔者翻译整理自:https://medium.com/google-cloud/model-context-protocol-mcp-with-google-gemini-llm-a-deep-dive-full-code-ea16e3fac9a3,感谢点赞、转发!
References
[1]
MCP:https://modelcontextprotocol.io/introduction
[2]
Google Gemini:https://aistudio.google.com/prompts/new\_chat
[3]
SerpAPI:https://serpapi.com/
[4]
mcp-flight-search:https://github.com/arjunprabhulal/mcp-flight-search
[5]
FastMCP:https://github.com/jlowin/fastmcp
[6]
mcp-flight-search - PyPI:https://pypi.org/project/mcp-flight-search/
[7]
mcp-sdk-python:https://pypi.org/project/mcp-sdk-python/
[8]
Gemini 所需的 function_declarations:https://ai.google.dev/gemini-api/docs/function-calling?example=weather&hl=zh-cn#function\_declarations
[9]
GitHub - arjunprabhulal/mcp-gemini-search: https://github.com/arjunprabhulal/mcp-gemini-search