前言
在 AI 逐步渗透到各类应用的今天,我们需要一种 通用的通信协议,让 AI 能够轻松对接各种业务接口,以提供更加智能化的功能。MCP(Model Communication Protocol) 就是这样一种协议,它定义了一套标准化的 C/S(Client/Server)交互机制,可以让 AI 通过 Function Calling 机制,调用 MCP 提供的各种功能,比如获取天气、查询时间、控制物联网设备等。
本文将详细介绍 MCP 协议的概念、如何调用 MCP 服务,以及 Function Calling 调用 MCP 服务的流程细节,以 OpenAI 举例。
1. 什么是 MCP?
1.1 MCP 的来历和用途
MCP(Model Communication Protocol,模型通信协议)是一种通用的 AI 接口协议,由 Anthropic
推出,用于标准化 AI 和业务服务的交互方式,解决社区中工具实现风格不统一、难以跨模型共享的问题
在 AI 应用开发中,模型本身并不具备执行外部操作的能力,比如:
- 查询 天气 数据
- 获取 当前时间
- 访问 数据库
- 控制 物联网设备
为了解决这个问题,MCP 提供了一种 统一的 API 交互协议,让 AI 可以像调用函数一样,与各种业务接口交互,提高通用性、可扩展性和跨平台能力。
1.2 MCP 的优势
✅ 标准化 JSON 交互:请求和返回数据采用 JSON 格式,保证兼容性。
✅ 兼容 Function Calling:可以无缝配合 Function Call 机制,让 AI 具备调用外部 API 的能力。
✅ 解耦 AI 和业务逻辑:AI 不需要硬编码 API 逻辑,只需要根据 Function Call 选择合适的 MCP 方法,提升开发效率。
2. 如何调用 MCP?
我们首先要获取 MCP 服务提供的函数列表,然后将其转换成对应模型的 Function Call,在 Function Calling 机制 下,AI 不会直接调用 MCP API,而是 解析用户意图,决定调用哪个 MCP 函数,然后由开发者解析 AI 返回的 function call 相关请求,获取需要调用的函数名和参数,进而手动调用 MCP 服务对应功能。
2.1 MCP 的请求与响应格式
🔹 客户端请求(AI → MCP 服务器)
{"request_id": "123456","function": "get_weather","parameters": {"city": "北京"}
}
🔹 服务器返回(MCP → AI)
{"request_id": "123456","status": "success","result": {"city": "北京","weather": "Sunny","temperature": "22°C"}
}
3. Function Call 技术细节
3.1 解析用户意图,选择正确的函数
模型通过 Function Calling 机制,可以分析用户的输入,并自动选择最合适的函数。例如:
用户输入:
"请告诉我北京的天气和当前时间"
AI 解析 function call
{"function_calls": [{"name": "get_current_time","arguments": {}},{"name": "get_weather","arguments": {"city": "北京"}}]
}
AI 识别到用户的问题涉及两个 API:
get_current_time
(获取当前时间)get_weather
(获取天气信息)
AI 主要依赖 description
来确定 function 的作用,而 name
只是辅助信息!
3.2 解析 AI 返回的 function call,并执行 MCP 逻辑
AI 只会返回调用建议,不会自动执行函数。我们需要解析 function call,并手动调用 MCP 服务器。
import openai
import requests
import uuid
import jsonopenai.api_key = "your-openai-api-key"# 定义可调用的 function
functions = [{"name": "get_current_time","description": "获取当前时间","parameters": {}},{"name": "get_weather","description": "获取指定城市的天气","parameters": {"city": {"type": "string","description": "查询天气的城市名称"}}}
]# 发送用户请求
user_input = "请告诉我北京的天气"# 1️⃣ AI 解析用户意图
response = openai.ChatCompletion.create(model="gpt-4-turbo",messages=[{"role": "user", "content": user_input}],functions=functions
)# 解析 function call
if response["choices"][0]["finish_reason"] == "function_call":function_call = response["choices"][0]["message"]["function_call"]function_name = function_call["name"]parameters = json.loads(function_call.get("arguments", "{}"))print(f"AI 选择调用: {function_name}, 参数: {parameters}")# 2️⃣ 调用 MCP 服务器def call_mcp_server(function_name, parameters={}):url = "http://127.0.0.1:5000/mcp"request_id = str(uuid.uuid4())payload = {"request_id": request_id,"function": function_name,"parameters": parameters}response = requests.post(url, json=payload)return response.json()# 执行 MCP 逻辑mcp_response = call_mcp_server(function_name, parameters)print("MCP 服务器返回:", mcp_response)# 3️⃣ 让 AI 进行最终总结if "result" in mcp_response:ai_response = openai.ChatCompletion.create(model="gpt-4-turbo",messages=[{"role": "user", "content": user_input},{"role": "assistant", "content": None, "function_call": function_call}, {"role": "function", "name": function_name, "content": json.dumps(mcp_response["result"])}])print("最终 AI 回复:", ai_response["choices"][0]["message"]["content"])
3.3 让 AI 总结最终结果并回复
调用 MCP 服务器后,返回的结果需要重新传递给 OpenAI,让 AI 生成自然语言回复:
{"role": "function", "name": "get_weather", "content": "MCP返回的天气数据"}
AI 看到这个数据后,就能生成最终的回答:
"北京今天是晴天,气温 22°C,适合外出游玩!"
4. 结论
步骤 | 角色 | 动作 |
---|---|---|
1️⃣ | 用户 | 发送问题 "请告诉我北京的天气" |
2️⃣ | AI模型 | 解析问题,选择 function call { "name": "get_weather", "arguments": { "city": "北京" } } |
3️⃣ | 代码 | 解析 response,提取 function name & 参数 |
4️⃣ | 代码 | 调用 MCP API get_weather("北京") |
5️⃣ | MCP 服务器 | 返回天气数据 { "weather": "Sunny", "temperature": "22°C" } |
6️⃣ | 代码 | 把 MCP 结果作为 function 角色消息,传回 OpenAI |
7️⃣ | AI模型 | 生成自然语言回答 "北京今天是晴天,气温 22°C" |
5. 未来展望
✅ 标准化 API 调用(适用于 AI + 业务集成)
✅ 智能客服、自动化办公、物联网控制
✅ 提升 AI 可操作性,使 AI 具备真正的执行能力!🚀
MCP 让 AI 迈向更强大的执行能力,而 Function Calling 让 AI 能理解并合理调用 API,这才是 AI 迈向真正智能化的关键! 🚀🚀🚀