一份MCP与 Google Gemini 2.5 Pro 深度解析的逐步指南(附完整代码)

大模型向量数据库云安全

随着 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,实现自然语言航班搜索功能:

picture.image

组件交互流程

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-keyyour-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 是否正确安装:

picture.image

第三步:理解 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 中,readwrite 是异步流对象,用于与 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 2.5 Pro + MCP 联合运作展示

以下调试日志展示了 Gemini模型上下文协议(MCP) 如何协同工作:

•解读用户意图•匹配合适工具•返回实时数据响应

picture.image

使用 Gemini LLM 与 MCP的最佳实践指南

1. 工具设计

命名清晰简洁 :使用简短且有意义的名称(如 search\_flightsget\_weather)•提供清晰描述 :为每个工具编写简洁明了的说明,模型将依据此内容判断何时以及如何调用工具•使用强类型定义参数 :显式指定输入参数的类型(如 stringenumnumber),有助于模型准确填充内容

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

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论