章
目
录
如今GPT-4、Claude、Gemini和Llama3等大型语言模型(LLM)发展得如火如荼。但这些模型通常基于预训练数据独立运行,没办法直接访问实时数据、数据库、外部API或者本地文件。所以,我们急需一种标准化的方法,将它们与各种工具、API以及系统连接起来。在这篇文章里,咱们就来深入研究如何借助Google Gemini 2.5 Pro实现MCP,还会通过完整代码进行详细剖析。
一、MCP是什么?能干什么?
MCP是Anthropic开发的一种标准化开放协议,简单来说,它就像是AI集成的“通用连接器”,能让AI模型和外部数据源、工具实现无缝交互。打个比方,把MCP看作是“AI集成的USB-C接口”,它为AI模型连接不同的设备和数据源提供了一种通用的方式。
(一)MCP的工作方式
MCP采用的是客户端 – 服务器架构。客户端可以是AI应用程序或者LLM,它们连接到服务器;而服务器由MCP工具提供商提供,主要负责把工具、API或者数据源暴露给客户端。通过这样的架构,就实现了LLM模型与外部API之间动态且结构化的交互。
(二)MCP的优势
- 标准化集成:有了MCP,将LLM连接到任何外部系统变得轻松许多,大大减少了定制开发的工作量。
- 灵活性高:LLM可以根据实际需求,灵活使用多种工具和服务。
- 安全可靠:支持安全的API交互,不用再把凭据硬编码到程序里,降低了安全风险。
- 开发简便:开发人员能更轻松地构建和公开自定义的MCP服务器。
- 维护轻松:避免了重复编写集成逻辑,维护起来更加方便。
MCP还能把API转化为模型友好的工具,具备自动发现、可预测模式以及结构化交互等功能。像文件系统、网络搜索、数据库、客户关系管理、版本控制等场景,都能通过MCP服务器实现与外部资源的交互。
(三)什么时候用MCP?
当遇到以下这些情况时,使用MCP就再合适不过了:
- 正在构建代理系统;
- 希望工具具备模块化、可重用以及可发现的特性;
- 需要使用多个外部资源;
- 打算扩展到多个工具或者工具链。
二、基于Gemini + MCP实现自然语言航班搜索的架构解析
接下来看看一个结合多个组件,使用Gemini + MCP实现自然语言航班搜索的项目架构。这个架构涉及到多个组件之间的交互:
- 用户到客户端:用户输入自然语言查询,比如“查找明天从广州飞往北京的航班”,客户端脚本(
client.py
)负责处理这些输入内容。 - 客户端到MCP服务器:客户端启动MCP服务器进程(
mcp-flight-search
),建立stdio通信通道,然后检索可用工具及其说明。 - 客户端到Gemini API:客户端把用户查询发送给Gemini API,同时提供工具说明,之后接收带有提取参数的结构化函数调用。
- 客户端到MCP工具:从Gemini获取函数调用参数,用这些参数调用相应的MCP工具,并处理响应结果。
- MCP服务器到SerpAPI:MCP服务器向SerpAPI发起请求,查询谷歌航班数据,再处理和格式化航班信息。
三、使用Gemini AI构建实现的具体步骤
(一)准备工作
- 安装Python 3.8及以上版本。
- 获取访问谷歌Gemini生成式AI的API密钥。
- 准备有效的SerpAPI key,用于获取实时飞行数据。
(二)设置虚拟环境并安装依赖项
# 设置虚拟环境
python -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 安装依赖项
pip install google-genai mcp
其中,google-genai
是用于和谷歌生成式AI模型(比如Gemini)交互的官方Python库;mcp
则是和MCP服务器交互的Python SDK,能提供与外部工具或服务通信的功能。安装好依赖项后,还需要设置环境变量:
export GEMINI_API_KEY="your-google-api-key"
export SERP_API_KEY="your-serpapi-key"
(三)安装MCP服务器 – mcp-flight-search
为了让Gemini能够和现实世界的API交互,这里使用mcp-flight-search
,这是一个基于FastMCP构建的轻量级MCP服务器,可以通过SerpAPI搜索实时飞行数据。在PyPI上就能安装这个服务器软件包:
# 从PyPI安装
pip install mcp-flight-search
安装完成后,可以用pip show mcp-flight-search
命令来验证是否安装成功。
(四)理解MCP工具包并进行关键导入
在代码中,需要导入一些关键的库:
from google import genai
from google.genai import types
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from google import genai
:从google-generativeai
库导入genai
模块,通过它可以访问Google的强大LLMs,像Gemini 1.5、2.0、2.5模型等,还包含与模型进行自然语言交互的客户端方法。from google.genai import types
:这个模块提供了Gemini API使用的类型定义和配置结构,比如工具定义、GenerateContentConfig
配置等。from mcp import ClientSession, StdioServerParameters
:ClientSession
用于管理客户端和MCP服务器之间的通信会话;StdioServerParameters
则让服务器能通过标准输入/输出(stdio)进行通信,这种方式不依赖特定语言,方便嵌入不同环境。from mcp.client.stdio import stdio_client
:stdio_client
是一个异步上下文管理器,用于通过标准I/O和MCP服务器建立连接,保证服务器正确启动,客户端能正常收发结构化请求。
(五)初始化Gemini客户端
client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))
初始化后的GenAI.Client()
对象,是和谷歌生成模型(如Gemini 2.5 Pro、Gemini 2 Flash)交互的主要接口。通过这个客户端对象,可以向Gemini模型发送提示、传递工具定义(函数调用),以及接收结构化响应和函数调用对象。
(六)配置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
:指定服务器使用标准输入/输出作为通信渠道,这种方式简单且与语言无关,适合在本地或子进程中运行工具服务器。SERP_API_KEY
:把环境变量传递给运行工具的子进程,因为工具需要这个密钥来验证SerpAPI,从而获取实时飞行数据。
(七)连接到MCP服务器并列出工具
async def run():
# 去除调试打印
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
prompt = f"Find Flights from Atlanta to Las Vegas 2025-05-05"
await session.initialize()
# 去除调试打印
mcp_tools = await session.list_tools()
# 去除调试打印
tools = [
types.Tool(
function_declarations=[
{
"name": tool.name,
"description": tool.description,
"parameters": {
k: v
for k, v in tool.inputSchema.items()
if k not in ["additionalProperties", "$schema"]
},
}
]
)
for tool in mcp_tools.tools
]
# 去除调试打印
response = client.models.generate_content(
model="gemini-2.5-pro-exp-03-25",
contents=prompt,
config=types.GenerateContentConfig(
temperature=0,
tools=tools,
),
)
这段代码实现了三个重要步骤:
- 启动与MCP服务器的连接;
- 为结构化工具通信初始化会话;
- 为Gemini动态发现和格式化可用工具。
(八)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模型。如果Gemini识别出提示与function_mode
匹配,就会返回一个function_call
对象,里面包含工具名称和自动填充的参数。
(九)Gemini LLM最终响应
如果Gemini确定提示和函数一致,就会返回一个结构化的function_call
对象,比如:
{
"function_call": {
"name": "search_flights",
"args": {
"source": "ATL",
"destination": "LAS",
"date": "2025-05-05"
}
}
}
Gemini LLM能够解释自然输入,选择合适的工具,并自动填写函数参数,无需手动编写解析逻辑。
四、与Gemini LLM一起使用MCP的最佳实践
(一)工具设计
- 工具名称要简短且有意义,比如
search_flights
、get_weather
。 - 为每个工具提供清晰明了的描述,方便模型判断何时以及如何调用。
- 明确输入参数的类型,比如字符串、枚举、数字等,帮助模型准确填写参数。
(二)模型交互
- 减少工具数量,避免模型超载,只使用相关工具,以提高准确性。
- 根据用户查询或对话上下文,动态加载工具。
- 明确设定模型的角色,向模型解释如何以及何时使用工具。
(三)服务器设置
- 使用
stdio
作为连接类型启动MCP服务器,方便本地开发。 - 通过环境变量安全地向工具服务器传递密钥,比如
SERP_API_KEY
。
(四)请求处理
- 在列出或调用工具之前,务必先运行
session.initialize()
初始化会话。 - 使用
session.list_tools()
动态列出工具,保持客户端的灵活性和工具无关性。
(五)错误处理与安全
- 工具服务器出现故障时,要返回有意义的错误信息。
- 注意安全,不要在日志或错误信息中泄露API密钥等敏感信息。
五、目前存在的限制
截至2025年3月,在使用Gemini LLM的MCP和函数调用时,还存在一些限制:
- 对OpenAPI只是部分支持。
- Python支持的参数类型有限。
- 自动函数调用目前仅是Python SDK的一项功能。
通过这篇文章,我们详细了解了如何使用MCP和谷歌Gemini LLM构建实时、工具增强型AI助手。希望这些内容能帮助大家在相关开发工作中有所收获。如果有不同的看法,欢迎一起讨论!
相关代码可以在GitHub上的mcp-gemini-search仓库中找到。