Skip to content

在 Gemini 调用中使用 MCP

在 LLM 调用中使用 MCP - 结合 Gemini 模型

Section titled “在 LLM 调用中使用 MCP - 结合 Gemini 模型”

Google 的 Gemini 模型代表了多模态 AI 的一项重大进步。虽然它们本身功能强大,但如果能将其与实时、外部或专有信息连接起来,并使其能够与其他系统交互,其提供最相关和可操作响应的能力将得到极大增强。模型上下文协议 (Model Context Protocol, MCP) 的设计目的正是为了弥补这一鸿沟,它为 Gemini 模型提供了一种标准化的方式来访问外部数据和使用工具,使其更具通用性和有效性。

可以将 MCP 视为一个复杂的中间件。当您的应用程序与 Gemini 模型进行交互时,可以使用 MCP 动态获取所需的上下文或触发外部动作。这使得 Gemini 能够基于最新数据生成响应,并将其能力扩展到文本生成或理解之外。

通过 MCP 将 Gemini 模型桥接到外部数据

Section titled “通过 MCP 将 Gemini 模型桥接到外部数据”

通过 MCP,MCP 服务器可以暴露“资源”,这些资源本质上是结构化的外部数据片段。它们可以是云存储桶中的文件、NoSQL 数据库中的条目、企业知识库中的信息,甚至是公共交通更新等实时数据流。当使用 Gemini 模型的应用程序需要特定的上下文信息来增强其输出时,它可以经由 MCP 客户端请求这些数据。

这个过程是高效的:您的应用程序在调用 Gemini API 之前,会判断是否需要外部数据。它会使用 MCP 客户端从相应的 MCP 服务器获取这些数据(例如,从用户配置存储中检索用户偏好)。MCP 服务器以可用、结构化的格式提供数据。然后,您的应用程序将这些丰富的数据整合到 Gemini 模型的提示(prompt)或请求结构中,从而生成更明智和相关的结果。

  • 示例数据源:产品库存数据库、学术研究论文、用户特定的应用程序设置、实时金融市场数据。

通过 MCP 赋予 Gemini 模型使用外部工具的能力

Section titled “通过 MCP 赋予 Gemini 模型使用外部工具的能力”

LLM 越来越被期望不仅能处理信息,还能发起行动。MCP 通过允许定义“工具”来促进这一点——这些工具是 Gemini 模型可以请求执行的外部功能。这些工具可以从发送通知等简单任务,到与 CI/CD 流水线交互、进行预订或执行自定义数据分析脚本等更复杂的操作。当 Gemini 模型(通常通过其自身的功能调用或工具使用机制)指示需要执行某个操作时,您的应用程序可以使用 MCP 来执行该操作。

例如,如果用户请求由 Gemini 提供支持的助手检查其即将到来的航班状态,如果航班延误,则通知接机人,模型可能首先需要航班详细信息。应用程序可以使用 MCP 资源获取此信息。如果发现延误,Gemini 可以发出信号,表明需要使用“send_sms_tool”。您的应用程序将解释此信号,使用 MCP 客户端在 MCP 服务器上调用指定的工具(提供消息和接收者),然后 MCP 服务器将处理短信发送。此工具使用的成功或失败可以报告回 Gemini,以便其生成最终响应。

  • 示例工具:与 IoT 设备交互、管理云资源、执行高级计算、与第三方服务 API 集成(例如,Google 日历、地图)。

示例场景:MCP 与 Gemini 模型协同工作

Section titled “示例场景:MCP 与 Gemini 模型协同工作”

让我们设想一个由 Gemini 模型驱动的多模态 AI 应用程序,旨在帮助用户规划旅行行程。以下是 MCP 如何增强其能力的方式:

  1. 用户请求:用户提供一张地标图片,并说:“我对参观这个地方很感兴趣。你能帮我查一下下周二的开放时间,并预订一辆出租车,以便我能在上午 10 点从酒店抵达那里吗?”

  2. 数据检索 (MCP 资源):应用程序(在 Gemini 从图片中识别出地标后)需要其详细信息。它使用 MCP 客户端查询链接到旅游数据库的 MCP 服务器:mcp_client.get_resource(server_id='tourism_info_service', resource_path='/landmarks/LouvreMuseum/details')。这可能会返回开放时间、地址等信息。

  3. 为 Gemini 提供上下文提示:获取到的数据(例如,{'name': 'Louvre Museum', 'opening_hours': {'Tuesday': '09:00-18:00'}, 'address': '...'})会提供给 Gemini。如果用户酒店位置未知,应用程序也可能通过另一个 MCP 资源获取。

  4. Gemini 的处理与工具指示:Gemini 处理此信息。它确认地标开放,然后指示需要使用“book_taxi_tool”,并可能为该工具构建请求(例如,如果可用并已配置,则使用 Gemini 的函数调用功能):{"tool_name": "book_taxi_tool", "parameters": {"pickup_location": "UserHotelAddress", "destination": "LouvreAddress", "time": "next Tuesday 10:00"}}。

  5. 工具执行 (MCP 工具):您的应用程序接收到此信息。然后它使用 MCP 客户端,在与网约车服务集成的 MCP 服务器上调用“book_taxi_tool”。MCP 调用示例(概念性):mcp_client.execute_tool(server_id='transport_service_aggregator', tool_id='request_ride', params={'from': 'UserHotelAddress', 'to': 'LouvreAddress', 'pickup_time': 'YYYY-MM-DDTHH:MM:SSZ'})。

  6. 结果与最终响应:MCP 服务器执行工具(预订出租车),并将结果(例如,{'status': 'success', 'booking_id': 'taxi789', 'eta': '15 mins'})返回给应用程序。此结果随后反馈给 Gemini,Gemini 会向用户生成多模态响应:“卢浮宫下周二上午 9 点到下午 6 点开放。我已经为您预订了下周二上午 10 点从您的酒店到卢浮宫的出租车。预订 ID 是 taxi789。”

# 应用逻辑的 Python 概念示例
# 假设 mcp_client 和 gemini_client 已初始化
# --- 阶段 1:使用 MCP 为 Gemini 模型获取数据 ---
def get_landmark_info_for_gemini(landmark_name):
try:
landmark_data = mcp_client.get_resource(
server_id='tourism_info_service',
resource_path=f'/landmarks/{landmark_name}/details'
)
return f"Information for {landmark_name}: {landmark_data}"
except MCPError as e:
print(f"MCP Error fetching landmark data: {e}")
return f"Sorry, I couldn't retrieve information for {landmark_name}."
# 假设 Gemini 从图片中识别出地标名称 = “LouvreMuseum”
landmark_name = "LouvreMuseum"
context_from_mcp = get_landmark_info_for_gemini(landmark_name)
# user_request_for_gemini = (
# f"{context_from_mcp}\n\n"
# f"User wants to visit this place. Query: Can you find out its opening hours for next Tuesday "
# f"and book a taxi for me to get there from my hotel at 10 AM? "
# f"If booking a taxi, please use 'book_taxi_tool' with parameters 'pickup_location', 'destination', and 'time'."
# )
# gemini_response = gemini_client.generate_content(
# user_request_for_gemini,
# tools=[tool_config_for_gemini] # Gemini API 的假设工具配置
# )
# extracted_tool_call = parse_gemini_response_for_tool_call(gemini_response) # 假设的解析过程
# --- 阶段 2:Gemini 模型指示工具使用,通过 MCP 执行 ---
# 假设 gemini_response 导致了以下结果(应用逻辑):
extracted_tool_call = {
'tool_name': 'book_taxi_tool',
'parameters': {
'pickup_location': 'UserHotelAddress', # 假设单独获取
'destination': 'LouvreAddress', # 来自 landmark_data
'time': '2025-06-10T10:00:00Z' # 从用户查询中解析并格式化
}
}
if extracted_tool_call and extracted_tool_call['tool_name'] == 'book_taxi_tool':
try:
mcp_tool_params = extracted_tool_call['parameters']
tool_result = mcp_client.execute_tool(
server_id='transport_service_aggregator',
tool_id='request_ride', # 此 ID 特定于 MCP 服务器的定义
params=mcp_tool_params
)
print(f"MCP Tool execution result: {tool_result}")
# 将 tool_result 反馈给 Gemini 以形成最终响应
# final_response_from_gemini = gemini_client.generate_content(
# f"Taxi booking result: {tool_result}. Please inform the user."
# ).text
# print(final_response_from_gemini)
except MCPError as e:
print(f"MCP Tool Error: {e}")
# 通知 Gemini 或用户工具执行失败

这个场景强调了 MCP 如何作为一个关键的使能者,允许 Gemini 等复杂模型安全高效地利用外部数据和功能,从而极大地扩展了它们的实际应用,特别是在多模态上下文中。