【AI大模型】MCP 模型上下文协议:客户端-服务器架构、JSON-RPC 消息与能力协商、工具发现与调用链路、与函数调用的分工

🌈 say-fall:个人主页 🚀 专栏:《手把手教你学会C++》 | 《系统深入Linux操作系统》 | 《数据结构与算法》 | 《小游戏与项目》 💪 格言:做好你自己,才能吸引更多人,与他们共赢,这才是最好的成长方式。
前言
我们把大模型怎么调、函数调用怎么写说得差不多了,接下来更躲不开的是模型外面那一堆数据和服务。这一篇就以MCP为例,把 AI 应用连接外部世界的原理从头捋一遍。
刚把函数调用弄明白,面对真实项目可能会有这些疑问:同一个查数据库的工具,换个 AI 客户端为什么就得重写一遍?模型明明只吐出一段 JSON,外部系统是怎么真的被改动的?
| 现象 | 你可能以为的原因 | 真正发生的事情 |
|---|---|---|
| AI 助手能读到本地文件 | 模型自己有文件系统权限 | 有一个独立的服务器进程代它读,结果按约定格式回传 |
| 换个客户端还能用同一个工具 | 新客户端做了兼容适配 | 工具描述由服务器提供,客户端在运行时动态发现 |
| 工具列表会自己变多 | 应用升级时把工具写死进代码了 | 服务器发一条变更通知,客户端重新拉取清单 |
| 模型能改外部系统里的数据 | 模型直接调了外部 API | 模型只产出调用意图,真正执行的是 MCP 服务器 |
问题来了: 客户端和服务器之间传的到底是什么样的消息?工具清单是怎么被发现的?一次调用从模型吐参数到外部系统返回结果,中间经过了谁?MCP 和函数调用,究竟谁管哪一段?
答案就是------统一的消息格式 + 固定的交互流程!MCP 把「AI 应用怎么用外部工具」拆成客户端和服务器两侧,两边靠 JSON-RPC 2.0 对话,工具的描述、发现、调用、回传全走同一份约定。而所谓工具调用,说到底还是一次客户端与服务器之间的请求和响应,只是中间多了一个会吐 JSON 的模型。
通过本文,你将掌握:
| 技能 | 应用场景 |
|---|---|
| Host / Client / Server 三层角色 | 看懂一个 AI 应用是怎么同时接上多个外部服务的 |
| 数据层与传输层的分工 | 理解为什么换传输不用改业务逻辑 |
| JSON-RPC 2.0 的三种消息 | 读懂真实报文,分清协议错误和工具执行错误 |
| stdio 与 Streamable HTTP | 选对本地和远端两种接法,避开 stdout 被日志污染的坑 |
| 生命周期与 capabilities 能力协商 | 明白「能做什么」是怎么在协议层被限制住的 |
| Tools、Resources、Prompts 三类原语 | 区分让模型做的事、给模型看的数据、可复用的提示模板 |
| 一次工具调用的完整链路 | 把模型吐参数、客户端转发、服务器执行、结果回填串成一条线 |
| MCP 与函数调用的分层关系 | 知道两者各自管哪一段,不再当成二选一 |
前置知识: 大模型 API 的基本调用、函数调用(工具使用)的概念、JSON 与 HTTP 常识、进程间通信的基本概念。
文章目录
- [【AI大模型】MCP 模型上下文协议:客户端-服务器架构、JSON-RPC 消息与能力协商、工具发现与调用链路、与函数调用的分工](#【AI大模型】MCP 模型上下文协议:客户端-服务器架构、JSON-RPC 消息与能力协商、工具发现与调用链路、与函数调用的分工)
- 正文:
- [一、MCP 是什么:先把「协议」两个字说清楚](#一、MCP 是什么:先把「协议」两个字说清楚)
- [二、整体架构:Host、Client、Server 各管什么](#二、整体架构:Host、Client、Server 各管什么)
- [三、协议的地基:JSON-RPC 2.0 与两种传输](#三、协议的地基:JSON-RPC 2.0 与两种传输)
- 四、一次连接怎么建立:生命周期与能力协商
- 五、服务端三类原语:工具、资源、提示
- 六、一次工具调用的完整链路
- [七、MCP 与函数调用:不是二选一,是两层](#七、MCP 与函数调用:不是二选一,是两层)
- 八、为什么需要它:三个痛点
- [九、应用场景:AI 从「只会说」到「能动手」](#九、应用场景:AI 从「只会说」到「能动手」)
- 十、生态与未来:开放标准的意义
- 十一、挑战与安全边界
- 十二、结语
正文:
一、MCP 是什么:先把「协议」两个字说清楚
MCP 全称 Model Context Protocol,模型上下文协议,是 Anthropic 在 2024 年末开放出来的一套标准。它要解决的问题很具体:AI 应用想接外部的数据、工具和服务,以前每接一个都得专门写一遍集成代码。
拿 USB-C 打比方是合适的,但得说清像在哪儿。USB-C 统一的是接口的形状、引脚和电气信号,插得上、供得了电、传得了数据;MCP 统一的是消息的语义和交互的流程:工具怎么描述自己、客户端怎么发现、调用怎么发、结果怎么回。一个管硬件怎么连,一个管软件怎么说话。
在没有这套约定之前,集成成本是一个乘法。假设有 M 个 AI 客户端、N 个外部系统,每个客户端各自去适配每个系统,就要写 M×N 份适配代码。有了统一协议之后,客户端实现一次协议,每个系统实现一次服务器,工作量变成 M+N。
| 对比 | 没有统一协议 | 有 MCP |
|---|---|---|
| 集成代码量 | M 个客户端 × N 个系统 | M 个客户端 + N 个服务器 |
| 工具描述放在哪 | 写死在每个应用的请求代码里 | 由 MCP 服务器自己提供 |
| 换一个 AI 客户端 | 重新写一遍适配 | 配置里加一个服务器 |
| 新增一个工具 | 所有客户端跟着升级 | 服务器自己加,客户端运行时发现 |
这里要划一条线: MCP 只管上下文怎么在 AI 应用和外部能力之间交换,它不规定 AI 应用该选哪个模型、怎么组织提示词、拿到上下文之后怎么用。这些仍然归应用自己管。
二、整体架构:Host、Client、Server 各管什么
MCP 是客户端-服务器架构,但参与方有三个,别把 Host 和 Client 混成一个。
- Host(宿主):用户直接面对的那个 AI 应用,Claude Desktop、Cursor、VS Code 里的编码助手都算。它负责跟大模型对话、管权限、决定什么时候用哪个外部能力。
- Client(客户端):Host 内部的一个组件,一个 Client 专门对接一个 Server,维持一条独立连接,负责收发消息、处理错误、管会话。
- Server(服务器):一个独立的进程或服务,把文件、数据库、API、工作流包装成 MCP 规定的样子暴露出去。
Host 连几个 Server,就创建几个 Client,彼此是 1:1 的专用连接。这么设计是有原因的:每个 Server 的能力、鉴权、生命周期都不一样,绑在一条连接上会互相干扰。
text
用户 <--> Host(AI 应用,里面跑着大模型)
|
+-- Client A <-- 专用连接 --> Server A(本地文件系统,stdio)
|
+-- Client B <-- 专用连接 --> Server B(数据库,stdio)
|
+-- Client C <-- 专用连接 --> Server C(远端服务,HTTP)
协议自己还分了两层:
| 层 | 管什么 | 具体内容 |
|---|---|---|
| 数据层 | 消息「是什么意思」 | JSON-RPC 2.0 消息格式、生命周期、能力协商、tools / resources / prompts 等原语 |
| 传输层 | 消息「怎么送到」 | 建连、分帧、鉴权、取消与断连 |
分层的好处是换传输不用改协议:同一份 JSON-RPC 报文,跑在本地进程的标准输入输出上,和跑在远端的 HTTP 上,内容完全一样。
三、协议的地基:JSON-RPC 2.0 与两种传输
三种消息
MCP 选了 JSON-RPC 2.0 作为消息格式,全部 UTF-8 编码。消息只有三种,把「请求-响应」和「单向通知」分得很干净。下面报文里的 // 是讲解用的注释,真实报文里不带。
请求:
json
// 客户端 -> 服务器,带 id,等一个对应的响应
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
响应:
json
// 服务器 -> 客户端,id 必须和请求一致,result 与 error 二选一
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": []
}
}
通知:
json
// 单向消息,没有 id,收的一方不回包
{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}
几个容易踩的点:
① 请求 id 不能是 null,同一个会话里也不能重复用还没收到响应的 id,靠它对上响应。
② 响应里 result 和 error 只能出现一个,错误码是整数,常见的 -32601 是方法不存在,-32602 是参数不对或者能力没声明。
③ 工具本身执行失败(比如查不到数据)不算协议错误,要在工具结果里用 isError: true 把错误文本带回去,让模型看得见、能自己决定下一步。
第 ③ 条值得多说一句:协议的错是「这句话没听懂」,工具的错是「事没办成」。把两者分开,模型才能对后者做出重试或者换参数的反应。
两种传输
| 传输 | 用在哪 | 怎么传 | 鉴权 |
|---|---|---|---|
| stdio | 本地,Server 是 Host 拉起的子进程 | 换行分隔的 JSON-RPC 走 stdin / stdout | 靠进程隔离,凭据从环境变量拿 |
| Streamable HTTP | 远端,一个 Server 服务多个 Client | 客户端 POST 到单个 MCP 端点,回 JSON 或按需开 SSE 流 | Bearer Token、API Key,推荐 OAuth |
stdio 是最容易理解也最容易写错的一种。Server 的 stdout 只能输出 JSON-RPC 报文,日志必须写到 stderr。在 Node 里顺手一个 console.log、Python 里一个 print(),都会混进 stdout 把报文流冲坏,客户端解析直接失败。这个坑几乎每个第一次写本地 Server 的人都会踩。
Streamable HTTP 是 2025 年那次修订引进来替代旧的 HTTP + SSE 的:客户端只用 POST 发消息,服务器可以直接回一个 JSON,也可以在需要推进度、流式结果时开一条 SSE。会话靠 Mcp-Session-Id 一类的头部标识,断连和取消都有对应约定。远程服务要走标准 HTTP 鉴权,规范里明确建议用 OAuth,而不是把上游凭据原样透传给服务器。
传输层对上层是透明的。写 Server 的人实现一遍
tools/list的逻辑,本地跑 stdio 还是远端跑 HTTP,业务逻辑不用改一行。
四、一次连接怎么建立:生命周期与能力协商
MCP 是一条有状态的对话,正式干活之前得先对齐两件事:用哪个版本的协议、双方各自支持什么能力。
早期(也是目前实现里最常见)的做法是握手:
json
// 1. 客户端发起 initialize,声明版本、自己有的能力、自己是谁
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": { "sampling": {}, "roots": {} },
"clientInfo": { "name": "my-client", "version": "1.0.0" }
}
}
json
// 2. 服务器回应,带回自己支持的能力
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-06-18",
"capabilities": {
"tools": { "listChanged": true },
"resources": { "subscribe": true },
"prompts": {}
},
"serverInfo": { "name": "my-server", "version": "1.0.0" }
}
}
json
// 3. 客户端发一条通知,表示「我准备好了」,这条不需要回应
{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}
之后进入运行阶段,最后关掉传输。stdio 是结束子进程,HTTP 是删掉会话。
能力协商不是走个过场。capabilities 里没声明的东西,对方就不能用:服务器没声明 resources,客户端发 resources/read 就该收到方法不存在;客户端没声明 sampling,服务器反过来请求模型补全,会拿到 -32602。这就是最小权限在协议层的落地方式,能做什么明明白白写在握手里。
| 谁声明 | 能力 | 含义 |
|---|---|---|
| 服务器 | tools |
有可调用的工具,listChanged 表示列表变化时会发通知 |
| 服务器 | resources |
有可读的数据,subscribe 表示支持变更订阅 |
| 服务器 | prompts |
有可复用的提示模板 |
| 服务器 | logging |
会往客户端推日志 |
| 客户端 | sampling |
服务器可以借宿主的模型做一次补全 |
| 客户端 | elicitation |
服务器可以向用户追问补充信息 |
| 客户端 | roots |
客户端会告诉服务器可操作的文件系统边界 |
版本提示: 协议还在演进。2026 年的新版规范把「版本 + 客户端能力 + 客户端信息」从一次性握手挪到了每个请求的
_meta字段里(形如io.modelcontextprotocol/protocolVersion),服务器不再依赖先前的连接状态来判断对面会什么;服务器反向要模型补全、要用户输入这类动作,也被整理成多轮往返请求。分层的思路、JSON-RPC 消息格式、能力必须显式声明的规则都没变,只是握手从「建连时谈一次」变成「每条请求自带」。读老资料时看到initialize,别以为是写错了。
五、服务端三类原语:工具、资源、提示
「原语」这个词听着唬人,其实就是协议预先定义好的几类能力,双方照着同一套方法名交互。服务器对外主要提供三类。
Tools:模型能调用的函数
工具是唯一一类由模型决定要不要调的能力,也是最容易和函数调用搞混的地方。服务器先用 tools/list 把清单交出来,每个工具带三样东西:名字、给模型看的描述、用 JSON Schema 写好的入参约束。
json
// tools/list 的响应片段
{
"tools": [
{
"name": "query_weather",
"description": "查询指定城市指定日期的天气,返回温度、天气状况和风力",
"inputSchema": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "城市名,如 北京" },
"date": { "type": "string", "description": "YYYY-MM-DD" }
},
"required": ["city", "date"]
}
}
]
}
json
// 客户端发起 tools/call
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "query_weather",
"arguments": { "city": "北京", "date": "2026-11-14" }
}
}
json
// 服务器回传结果,content 是内容块数组,文本、图片都能装
{
"jsonrpc": "2.0",
"id": 7,
"result": {
"content": [ { "type": "text", "text": "北京 11-14:晴,3~12℃,西北风 3 级" } ],
"isError": false
}
}
描述和 inputSchema 是给模型看的,不是给人看的文档。写得含糊,模型就会选错工具或者编出参数;写得清楚,模型不用改一行代码就能用好新工具。工具列表变了,服务器发一条 notifications/tools/list_changed,客户端重新拉一次即可,不用重启应用。
Resources:能被读进上下文的数据
资源是只读的数据,用 URI 标识,比如 file:///project/README.md、db://orders/schema。方法主要就两个:resources/list 列清单,resources/read 按 URI 读内容;支持订阅的服务器还能在内容变化时推更新通知。
和 Tools 的区别要分清:
| 对比 | Tools | Resources |
|---|---|---|
| 谁决定使用 | 模型在对话中自己判断 | 应用或用户主动挑,塞进上下文 |
| 有没有副作用 | 可以有,写文件、发消息都算 | 只读 |
| 典型内容 | 查询、创建、执行、控制 | 文件、表结构、日志、文档 |
| 对应方法 | tools/list、tools/call |
resources/list、resources/read |
把「给模型看的数据」和「让模型做的事」分开,权限就好管了:读某个文件可以默认放行,删某个文件必须弹窗让用户确认。
Prompts:可复用的提示模板
提示模板是服务器预先写好的一段交互骨架,客户端用 prompts/list 看有哪些、prompts/get 按参数取出来,常见形态就是应用里的斜杠命令。比如一个代码审查服务器提供 /review,用户填个文件路径,客户端取回拼装好的提示词再发给模型。它省的是「每个客户端都要重写一遍同样提示词」的功夫。
反过来借能力:Sampling、Roots、Elicitation
协议不是单向的。服务器干活干到一半,也可以向客户端要东西:
① sampling:服务器想让宿主的模型帮忙做一次补全(比如给抓下来的文本做个摘要),不必自己配 API Key,也不必自己选模型。客户端拿回请求后由用户把关,再把结果交回服务器。
② elicitation:参数不够时向用户追问一句,比如「要删的是这三个文件里的哪几个」。
③ roots:客户端告诉服务器「你只能碰这几个目录」,服务器据此收窄自己的操作范围。
这三条的共同点:最后拍板的都是宿主和用户,不是服务器。协议把人留在回路里,是有意留的。
六、一次工具调用的完整链路
用户问一句、模型答一句,中间其实跨了好几层。把每一步对应的方法和数据形态补上,链路是这样的。用户问「帮我查一下北京周六的天气」:
text
[1] 用户提问
↓
[2] Host 把问题 + 已发现的工具清单一起交给模型
(工具清单来自各 Server 的 tools/list,被转成模型 API 的 tools 参数)
↓
[3] 模型输出一次工具调用意图:name=query_weather, arguments={city:"北京",date:"..."}
↓
[4] Host 找到对应的 Client,由它组装 tools/call 请求
↓
[5] Client --JSON-RPC--> Server(stdio 或 HTTP)
↓
[6] Server 校验参数、调用背后的真实 API、把结果包装成 content 回传
↓
[7] Client 把结果作为一条工具消息回填进对话上下文
↓
[8] 模型接着生成最终回答
几个关键点:
- 服务器从不和大模型直接说话。 它眼里只有客户端发来的 JSON-RPC 请求。模型看到的是 Host 转换过的工具描述,不是服务器进程。
- 决策权在模型,执行权在服务器。 模型只负责说「我想调这个名字、这些参数」,参数对不对由服务器校验,动作由服务器执行。
- 第 7 步是上下文真正变多的地方。 工具结果不替换用户问题,而是作为新消息追加进对话,模型基于「问题 + 工具结果」再回答一次。这也是为什么协议叫「模型上下文协议」,它扩的是上下文,不是模型的权重。
再拿旅行规划套一遍就直白了。用户说「帮我规划一个北京周末两日游」:
① 客户端连上天气、景点、地图三个 Server,各自 tools/list 拿到清单。
② 模型判断先要天气,Host 发 tools/call 给天气 Server,拿到结果回填。
③ 模型继续要景点推荐,再要路线计算,每一轮都是「意图 → tools/call → 回填 → 再生成」。
④ 三次结果都进上下文之后,模型一次写出带天气、景点、交通和餐饮的完整行程。
用户只看见一段回答,背后是三轮请求-响应和一份不断变长的上下文。这个过程对用户是透明的,协调多个外部服务的活全在协议这一层。
七、MCP 与函数调用:不是二选一,是两层
一个常见疑问是:MCP 和 OpenAI 的函数调用、Anthropic 的工具使用有什么区别。它们不在同一个技术层次上,谈不上竞争。
| 维度 | 函数调用 / 工具使用 | MCP 模型上下文协议 |
|---|---|---|
| 本质 | 模型 API 的一项功能,是「动词」 | 一套集成协议,是「管道」 |
| 关心的事 | 模型怎么表达「我要调工具」 | 工具怎么被描述、发现、连接和执行 |
| 工具定义 | 每次 API 请求里由应用代码写死 | 由独立的 MCP 服务器提供,可复用 |
| 工具发现 | 应用硬编码,加工具要重新部署 | 客户端运行时动态发现 |
| 执行位置 | 在你的应用代码里 | 在 MCP 服务器进程里 |
| 复用范围 | 服务于当前这一个应用 | 同一个 Server 能被多种 AI 客户端接 |
| 典型场景 | 单应用,工具和业务逻辑紧耦合 | 把工具做成能被多家客户端用的服务 |
把两者拼起来看最清楚。Host 里干的事拆开是四步:拉工具清单、连问题一起交给模型、把调用意图转成 MCP 请求、结果回填后再生成一次。大致是这么一段逻辑:
python
tools = []
for client in clients:
tools += client.request("tools/list")["tools"] # 拉工具清单
resp = llm.chat(messages=messages, tools=tools) # 连问题带工具一起交给模型
if resp.tool_call:
result = find_client(resp.tool_call.name).request( # 意图转成 MCP 请求
"tools/call",
{"name": resp.tool_call.name, "arguments": resp.tool_call.arguments}
)
messages.append(tool_result_message(result)) # 结果回填上下文
answer = llm.chat(messages=messages, tools=tools) # 再生成最终回答
第 2、3 步用的是函数调用,第 1、3、4 步里和 Server 打交道用的是 MCP。函数调用负责「在具体这轮对话里怎么把意图说出来」,MCP 负责「这些工具从哪来、谁去执行、结果按什么格式回来」。少了前者,模型没法表达调用;少了后者,每个应用都得自己把工具实现一遍。
说白了: 函数调用是模型侧的表达能力,MCP 是工具侧的分发与连接约定,一次回答里两者常常同时在场。
八、为什么需要它:三个痛点
回到工程上,MCP 对准的是三件很具体的事。
开发效率低。 以前让 AI 接一个 Notion 或 GitHub,针对每个 AI 平台都要写一套集成代码,认证、数据格式、错误重试各写各的。标准化之后,接一个新系统等于写一个 Server 或者配一个现成的 Server,工作量从「每个客户端一遍」变成「一次」。
能力孤岛。 每个 AI 应用都维护自己的工具列表,Claude 里能用的工具,换个客户端就用不上。Server 把工具统一暴露出来之后,工具不再属于某个应用,一次构建,处处可用。
体验割裂。 用户在不同 AI 应用之间切换,能访问的外部服务、要重新授权的方式都不一样。协议统一之后,日历、数据库、设计工具在各个兼容客户端里是一套接法。
说到底,就是把原本散落在每个 Host 里的集成代码,搬到一个个独立的 Server 进程里,再用一份公开约定把它们接回来。
九、应用场景:AI 从「只会说」到「能动手」
- 个人助理:助手读日历和笔记,按你的日程排会议、提醒待办。这里用的是 Resources 读数据 + Tools 写日程。
- 开发助手:在 Cursor、VS Code 里读项目文件、查文档、跑测试,生成代码时拿到的上下文不再靠人手动贴。本地文件这类能力最适合 stdio,进程就在本机,凭据也不出门。
- 企业数据分析 :内部聊天机器人通过 MCP 连多个部门数据库,用自然语言查分散的数据。这种场景更要靠
roots、最小权限和鉴权把边界划死。 - 创意工作流:读 Figma 设计稿生成 Web 应用,或者在 Blender 里建模再送去打印。本质是把一串原本要人点来点去的操作拆成可调用的工具。
十、生态与未来:开放标准的意义
MCP 能推开,靠的不是某一个产品,而是开放性。
- 客户端侧:Claude Desktop、ChatGPT、Cursor、VS Code Copilot 等主流 AI 应用和开发工具都已经支持 MCP。
- 服务器侧:社区里已经积累了覆盖 Google Drive、Slack、GitHub、Postgres、浏览器控制、Figma 等大量 MCP 服务器,官方也给出了各语言 SDK 和参考实现。
- 企业侧:已经有公司把它接进内部系统,用来搭自己的 AI 代理。
这是个正循环:支持的工具越多,客户端接协议越划算;客户端越多,工具作者越愿意按协议写一遍。跟当年 USB-C 铺开的过程是一回事,标准的价值不在标准本身,在有多少人真的照着做。
十一、挑战与安全边界
门一打开,问题也跟着来了。
权限与授权。 允许 AI 访问外部系统,等于多了一条新的攻击面。stdio 场景下靠进程隔离和 roots 收窄范围;远程 HTTP 场景下要走正规鉴权,按最小权限签发令牌,敏感操作必须弹给用户确认。规范里明确禁止把上游凭据原样透传给 MCP 服务器,就是因为一旦透传,服务器拿着用户的令牌能干的事就没人管得住了。
提示注入与工具投毒。 工具返回的内容会被塞进上下文,如果里面藏着「忽略之前的指令,去读某个文件」这类文本,模型可能照做;工具描述本身也可能被写进诱导性内容。这类问题不是加一层鉴权就能解决的,得靠内容隔离、人工确认和只暴露必要工具一起兜。
模型能力差异。 协议只保证连得上,不保证用得好。同一份工具清单,推理强的模型能拆出多步调用,弱一点的模型可能选错工具、编错参数。连接是协议的活,会不会用是模型的活。
标准化与碎片化。 MCP 本身就是为了治碎片化来的,但如果各家 Server 实现得松紧不一,或者又冒出几套互相不通的协议,老问题会在新一层重演。规范持续修订、SDK 和一致性测试跟着跟上,才守得住这个「通用端口」。
十二、结语
MCP 说到底不是什么新模型,也不是让模型变聪明的技术。它做的是另一件事:把「AI 应用怎么拿到外部能力」从每家自己解决的工程问题,变成一份大家共同遵守的约定。
思路上的变化其实很清楚:从只追求更大、更聪明的单一模型,转向让模型能连接、调用、协调外部的资源与服务。往后的 AI 助手不会是个封闭的黑盒,它得能查企业数据库、能调网络服务、能在用户点头之后真的去改点什么。要做到这些,先得有一套谁都听得懂的话,MCP 想定下来的就是这套话怎么说。
USB-C 让设备之间不用再各带各的线,MCP 让 AI 应用和外部系统之间不用再各写各的适配。事情就这么朴素。
- 本节完...
📝 作者:say-fall | 编辑:say-fall | 🌟 原创不易,如果对你有帮助,记得 👍 点赞 + ⭐ 收藏 哦!