作为结构化推理的坚定支持者,我一度对MCP感到困惑:Agent和工具调用的概念早已普及,为何还需要MCP这样的额外设计呢?本文就来深入探讨MCP,看看它究竟解决了什么问题。

我们将分几章解析MCP:本章理清基础概念和逻辑,后面我们直接以一个Agent为例演示全MCP接入的实现方案。

工具调用方式的演进

大模型调用工具的概念从ChatGPT亮相后就被提出,其表达形式经历了三个阶段演变:

1. 函数表达阶段

早期的工具描述多采用简单的函数形式,通常通过提示词(Prompt)要求模型输出包含工具名称和参数的JSON对象。例如下面的System Prompt期望模型输出JSON结构来调用天气查询工具:

system_prompt = """你是一个智能助手,可以帮助用户查询天气。
如果你需要查询天气,请调用一个名为 'get_current_weather' 的工具。
这个工具需要一个 'location' (字符串,必填) 参数,表示要查询天气的城市。
请以 JSON 格式输出工具调用,例如:
{"tool_name": "get_current_weather", "parameters": {"location": "上海"}}
"""

模型可能输出

{
"tool_name": "get_current_weather",
"parameters": {
"location": "北京"
}
}

这种方式存在明显痛点:

  • 缺乏统一标准:工具描述格式五花八门
  • 推理脆弱:JSON缺乏强约束,易出现格式错误
  • 解析繁琐:需额外编写解析代码

2. 标准化工具定义

2023年6月,OpenAI推出的Function Calling功能是一个重要转折点。它引入JSON Schema标准化工具描述,明确定义:

  • 工具名称(name)
  • 功能描述(description)
  • 参数列表(parameters),包含类型、描述、是否必填等
{
"name": "get_current_weather",
"description": "获取指定地点的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,例如:旧金山、上海"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位,摄氏度或华氏度"
}
},
"required": ["location"]
}
}

3. 引入结构化推理

虽然OpenAI,Anthropic等闭源模型先后推出了Function Calling的接口能力,但是众多开源模型仍无法使用类似的能力,并且手工编写工具的JSON Schema也较为复杂。

而转折点则是24年结构化推理的普及,基于掩码的结构化推理能力(不熟悉的朋友看这里LLM结构化输出)不仅显著提升了模型生成工具JSON Schema的准确性,同时还让Pydantic这个数据验证和解析库进入了大家的视野中。

像Langchain、LlamaIndex、DSPY等开源框架都开始引入Pydantic来自动生成工具的JSON Schema。这样不仅解析部分能自动化标准化,生成工具描述的部分同样也被标准化。还是上面的查天气,可以使用Pydantic来标准化入参

from langchain_core.tools import tool
class WeatherInput(BaseModel):
location: str = Field(description="需要查询天气的城市名称")
unit: str = Field(description="温度单位,可以是 'celsius' 或 'fahrenheit'", default="celsius") @tool("get_current_weather", args_schema=WeatherInput, return_direct=True)
def get_current_weather(location: str, unit: str):
"获取指定地点的当前天气信息"
return ''

MCP基础概念

既然前三阶段解决了工具描述标准化、推理准确性和解析自动化,为什么还需要MCP?

后来我思考良久才意识到MCP解决的不是Agent算法问题,而是工程问题,可以类比设计模式中的Adapter接口转换思想,MCP推出的是工具的标准化协议。与其说是搭建新的MCP工具服务,不如说是把已有的服务通过MCP的链接中枢转接成统一协议的AI工具服务。

理解MCP:从完整工具调用流程说起

要理解MCP的作用,需先看LLM调用工具的完整流程:

  1. 构建上下文:Agent获取可用工具列表及其描述(JSON Schema/Prompt)
  2. 模型推理:LLM结合用户Query和工具上下文生成工具调用指令
  3. 执行调用:Client解析指令并调用对应服务(本地函数/进程/远程API)获取
  4. 处理结果:Client获取工具结果并反馈给LLM进行后续处理

工具发展的前三个阶段主要解决步骤2的准确性和接口标准化,而步骤1(获取工具列表)和步骤3(调用异构服务),步骤4(处理服务结果) 的工程化集成缺乏统一方案,这也是MCP的价值所在

MCP的核心价值:统一协议,降低复杂度

在没有MCP时,每个Agent需为每个工具服务定制开发连接逻辑,这里包括接口定义,错误处理,鉴权等等。**当存在M个Agent和N个工具服务时,复杂度是O(M×N)(接近平方级)。

而引入MCP后,MCP通过标准协议解决这个问题把复杂度降低到M+N

  • Client侧:Agent只需集成通用MCP客户端,将请求编码为标准MCP消息(JSON-RPC 2.0格式)
  • Server侧:每个工具服务部署MCP服务端适配器,转换请求并返回标准化响应

MCP除核心连接简化外,还提供:

  • 动态上下文构建:工具列表通过标准list_tools方法动态获取,无需在Agent内部硬编码工具描述
  • 协议标准化:明确定义工具发现、调用、返回结构、错误处理等标准操作,无需每个Agent独立处理
  • 传输无关性:支持HTTP、Stdio等多种传输层,统一了Agent进程内本地工具和远程API调用

MCP协议

说到这里MCP相关的核心架构已经比较清晰了,就是按照JSON-RPC 2.0标准协议通信(使用JSON作为消息格式)的Server-Client服务架构,其中client和Server各自提供以下核心能力

  1. Client:在智能体启动时会初始化客户端,每个对应的MCP Server都初始化一个对应的客户端
  • 初始化:根据Server类型(Stdio/HTTP)建立连接
  • 发现工具:通过统一的list_tools获取可用工具及描述
  • 调用工具:将模型输出封装为统一的工具标准请求call_tool请求服务端,同时服务端也会返回标准化的工具调用结果
  1. Server:每个(一组)工具都设计启动一个对应的服务端
  • 提供工具描述:实现list_tools返回工具定义
  • 执行工具调用:通过call_tool转换并执行实际工具
  • 传输层适配
    • Stdio:用于本机进程间通信
    • Http:用于跨网络调用
  • 提供交互提示:可选提供推荐Prompt模板(工具说明/结果解释)

对于MCP中的高级概念如ResourceRootsSamplingElicitation,仅靠定义难以理解。在接下来的章节中,我们将通过具体案例探讨这些概念。

当然其实还有一层概念也就是在client的外层,也就是智能体层或应用层,例如cursor, windsurf, claude desktop等等,在MCP中称之为Host层,这一层也更多是和Resource订阅、Prompt使用这些高级概念相关,我们放在后面的章节再说了。

想看更全的大模型论文·微调预训练数据·开源框架·AIGC应用 >> DecryPrompt

解密prompt系列58. MCP - 工具演变 & MCP基础的更多相关文章

  1. 解密Prompt系列6. lora指令微调扣细节-请冷静,1个小时真不够~

    上一章介绍了如何基于APE+SELF自动化构建指令微调样本.这一章咱就把微调跑起来,主要介绍以Lora为首的低参数微调原理,环境配置,微调代码,以及大模型训练中显存和耗时优化的相关技术细节 标题这样写 ...

  2. 解密prompt系列5. APE+SELF=自动化指令集构建代码实现

    上一章我们介绍了不同的指令微调方案, 这一章我们介绍如何降低指令数据集的人工标注成本!这样每个人都可以构建自己的专属指令集, 哈哈当然我也在造数据集进行时~ 介绍两种方案SELF Instruct和A ...

  3. 解密Prompt系列2. 冻结Prompt微调LM: T5 & PET & LM-BFF

    这一章我们介绍固定prompt微调LM的相关模型,他们的特点都是针对不同的下游任务设计不同的prompt模板,在微调过程中固定模板对预训练模型进行微调.以下按时间顺序介绍,支持任意NLP任务的T5,针 ...

  4. 解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning

    这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型.这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品.和前两章微调LM和全部冻结的pro ...

  5. 解密Prompt系列4. 升级Instruction Tuning:Flan/T0/InstructGPT/TKInstruct

    这一章我们聊聊指令微调,指令微调和前3章介绍的prompt有什么关系呢?哈哈只要你细品,你就会发现大家对prompt和instruction的定义存在些出入,部分认为instruction是promp ...

  6. 5.Java 加解密技术系列之 DES

    Java 加解密技术系列之 DES 序 背景 概念 基本原理 主要流程 分组模式 代码实现 结束语 序 前 几篇文章讲的都是单向加密算法,其中涉及到了 BASE64.MD5.SHA.HMAC 等几个比 ...

  7. .NET Core加解密实战系列之——使用BouncyCastle制作p12(.pfx)数字证书

    简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...

  8. 10.Java 加解密技术系列之 DH

    Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...

  9. 9.Java 加解密技术系列之 RSA

    Java 加解密技术系列之 RSA 序 概念 工作流程 RSA 代码实现 加解密结果 结束语 序 距 离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项 ...

  10. 8.Java 加解密技术系列之 PBE

    Java 加解密技术系列之 PBE 序 概念 原理 代码实现 结束语 序 前 边的几篇文章,已经讲了几个对称加密的算法了,今天这篇文章再介绍最后一种对称加密算法 — — PBE,这种加密算法,对我的认 ...

随机推荐

  1. 用 AI 实现一个 GBK/GB2312 转 UTF-8 工具:轻松解决文本编码转换难题(附完整源码)

    用 AI 实现一个 GBK/GB2312 转 UTF-8 工具:轻松解决文本编码转换难题 在处理历史文件或与不同系统交互时,我们经常会遇到 GBK 或 GB2312 编码的文本文件.虽然现在 UTF- ...

  2. HarmonyOS NEXT开发教程:全局悬浮窗

    今天跟大家分享一下HarmonyOS开发中的悬浮窗. 对于悬浮窗,可能有的同学会想到使用层叠布局是否可以实现,将悬浮窗叠在导航栏组件Tabs上,像这样: Stack({alignContent:Ali ...

  3. linux安全基线自查手册

    1.Redhat/CentOS 7.x配置模板 1.1 帐号管理 1.1.1 检查是否设置除root之外UID为0的用户 严重级别:中危 理论依据:任何UID为0的帐户都具有系统上的超级用户特权,只有 ...

  4. IDEA terminal控制台配置git bash及中文乱码问题

    1.修改控制台shell路径:setting -> Tools -> Terminal -> Shell path,修改为git安装路径. 修改完毕,在控制台输入exit断开sess ...

  5. 如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统?

    title: 如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统? date: 2025/06/11 13:18:54 updated: 2025/06/11 13:18 ...

  6. Java 集合框架底层数据结构实现深度解析

    Java 集合框架(Java Collections Framework, JCF)是支撑高效数据处理的核心组件,其底层数据结构的设计直接影响性能与适用场景.本文从线性集合.集合.映射三大体系出发,系 ...

  7. 未能加载文件或程序集“System.Runtime.WindowsRuntime, Version=4.0.14.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。不应出于执行的目的加载引用程序集。只能在仅限反射的加载程序上下文中加载引用程序集。 (异常来自 HRESULT:0x80131058)

    VS项目编译时报错: 未能加载文件或程序集"System.Runtime.WindowsRuntime, Version=4.0.14.0, Culture=neutral, PublicK ...

  8. Oracle并发控制

    并发与锁定 当多用户同一时刻访问相同的数据库资源时,将产生并发.并发极易破坏数据的一致性.锁定是处理并发的重要手段,用户在修改某一资源前,必须首先获得资源的修改权.而这种修改权具有排他性. 并发与锁定 ...

  9. codemirror代码格式化

    上效果 代码 此处演示纯js版本,而切实5.x版本,最新版本6.x变化较大,不搞 <!DOCTYPE html> <html lang="en"> < ...

  10. CF1918B Minimize Inversions 题解

    CF1918B Minimize Inversions 诈骗题,点破一文不值. 交换元素 \(i,j\) 时可能有以下四种情况: 情况一:\(a_i\lt a_j,b_i\lt b_j\),此时总逆序 ...