MCP协议介绍和应用细节简明教程

news/2025/3/24 22:19:09/文章来源:https://www.cnblogs.com/magicdmer/p/18787748

前言

在 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 迈向真正智能化的关键! 🚀🚀🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904171.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pass-15

function isImage($filename){//需要开启php_exif模块$image_type = exif_imagetype($filename);switch ($image_type) {case IMAGETYPE_GIF:return "gif";break;case IMAGETYPE_JPEG:return "jpg";break;case IMAGETYPE_PNG:return "png";break…

Pass-16

$is_upload = false; $msg = null; if (isset($_POST[submit])){// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径$filename = $_FILES[upload_file][name];$filetype = $_FILES[upload_file][type];$tmpname = $_FILES[upload_file][tmp_name];$target_path=UPLO…

upload pass-01

直接上传一句话木马貌似不行,尝试抓包看看发现全是get请求抓不到post传参上传一句话木马的包,合理猜测是不是前段验证,F12禁用JavaScript验证试试看可以看到成功上传并且返回了图片使用phpinfo()命令发现一句话木马成功上传 同理,是不是我们上传一个图片(此时通过了前段白…

# 集美大学课程实验报告-实验3:栈和队列

集美大学课程实验报告-实验2:线性表项目名称 内容课程名称 数据结构班级 网安2411指导教师 郑如滨学生姓名 李斌财学号 202421336021实验项目名称 站和队列上机实践日期上机实践时间 2学时一、目的(本次实验所涉及并要求掌握的知识点) 掌握STL中栈和队列的基本存储结构 掌握…

L3 设计,开发,认证

我都想笑了之十万八千个视频需要看。L3 设计,开发,认证 这里我暂时跳过了那些PPT里面要求看的视频,过一会再整理。 利益相关者和需求 ​ 从图中我们可以得到如下信息:航空器的生命周期:设计——生产——认证——运营 原始设备制造商(original equipment manufacturer,OE…

KMP 入门

前传:BF 算法 BF 算法即为暴力解法,一位一位向下匹配。 时间复杂度约为 \(O(n \times m)\)。KMP KMP 算法的主要思想是利用部分匹配信息,避免重复匹配,提高字符串查找效率。 KMP 算法总时间复杂度是 \(O(n + m)\),匹配用时 \(O(n)\)。 \(m\) 为模式串长度,\(n\) 为目标串…

web-CodeInject

<?php#Author: h1xaerror_reporting(0); show_source(__FILE__);eval("var_dump((Object)$_POST[1]);");eval("var_dump((Object)$_POST[1]);");:这行代码使用了eval()函数,这是一个非常危险的函数,因为它会执行传递给它的字符串作为PHP代码。这意味…

kettle插件-dm达梦数人大金仓Vastbase数据库插件

在国家大力倡导原创技术、推动信息技术应用创新(信创)的政策背景下,摆脱对国外技术的依赖、构建自主可控的信息技术体系成为重要发展方向。大数据作为信息技术的重要组成部分,国产大数据技术和产品迎来了前所未有的发展机遇。 信创旨在实现核心技术自主可控,保障国家信息安…

广义优势估计(GAE):端策略优化PPO中偏差与方差平衡的关键技术

广义优势估计(Generalized Advantage Estimation, GAE)由Schulman等人在2016年的论文中提出,是近端策略优化(PPO)算法的重要基础理论,也是促使PPO成为高效强化学习算法的核心因素之一。 GAE的理论基础建立在资格迹(eligibility traces)和时序差分λ(TD-λ)之上,为深入理解GA…

集合体系介绍、collection的使用--java进阶day09

1.集合体系结构 我们要学习的集合大体分为两种,一种是单列集合,一种是双列集合2.单列集合 单列集合又分为两个派系,分别为list接口和set接口,这两个接口皆是collection接口的子接口3.Collection接口既然要使用,那就必然要创建对象,但我们知道Collection是接口,不能实例化…

mybatis组件SqlSource的种类

SqlSource是mybatis重要的组件,是对你写的sql语句的简单封装。public interface SqlSource {BoundSql getBoundSql(Object parameterObject);}这个接口有很多种实现:VelocitySqlSource这个实现类是一个测试。实际上mybatis根本就不会使用这个实现类。 那么在mybatis内部是在哪…