传说里,人类曾经想一起造一座通天的高塔。
工程能力不是问题,材料也不是问题。
巴别塔真正崩掉,是因为大家突然开始说不同的语言。
你听不懂我,我也不知道你在喊什么。每个人仍然有手、有工具、有能力,但协作结束了。
Tomz 在我们讲 MCP 的时候突然给了一个特别好的类比:
以前巴别塔为什么倒?因为上帝让人讲不同的语言。MCP 干的事情,就是先让大伙约定一种交流标准。
这个类比很适合第一次理解 MCP。
GitHub 有 GitHub 的 API,飞书有飞书的 API,数据库、浏览器、文件系统、企业微信,各自都有自己的认证、参数、Schema、生命周期和错误格式。
如果每接一个系统,Agent Host 都要重新学一门“方言”,那我们只是把传统 API 集成又做了一遍。
MCP 想解决的是:
大家内部怎么实现无所谓,但先用一种统一方式告诉 Agent:我是谁,我会什么,你该怎么调用我。
当然,这个类比要收一下边界。
MCP 并不是让 GitHub、飞书、数据库真的拥有了同一种业务语言。
它统一的是能力发现、描述和调用的协议边界。
巴别塔不是从此只剩一种语言,而是大家终于有了共同的翻译协议。
MCP 不是智力升级,是世界扩张#
很多人第一次接 MCP,会有一种感觉:
Agent 好像突然变聪明了。
昨天它不会查 GitHub,今天会了。
昨天它碰不到飞书,今天会发消息了。
但模型参数没有变化,推理能力也没有突然升级。
真正发生的是:
它所处的世界变大了。
可以这么理解:
LLM
拥有认知能力
Agent
拥有目标和决策循环
MCP
把更多外部世界接到 Agent 身边所以 MCP 扩展的不是 Intelligence Space,而更像是:
Reachable World
可触达世界Skill 教 Agent “怎么做”。
MCP 则让 Agent “够得着”。
这也是为什么 Anthropic 在产品语境里经常把 MCP Server 理解成 Connector:它首先解决的是连接问题。
没有 MCP 时,每个系统都在说自己的方言#
假设 Mira 想接这些系统:
GitHub
飞书
企业微信
PostgreSQL
Google Drive
本地文件系统
浏览器没有统一协议时,很容易变成:
GitHubAdapter
FeishuAdapter
WeComAdapter
DatabaseAdapter
DriveAdapter
BrowserAdapter每一套又分别处理:
认证
连接
能力定义
参数格式
错误处理
生命周期这并不是不能做。
传统软件几十年都是这么集成 API 的。
真正的变化在于:Agent 时代,使用这些能力的“调用者”不再完全是程序员预先写死的代码。
它变成了一个在运行时做决定的模型。
传统 API 更像:
开发者提前知道 endpoint
↓
程序提前写好调用逻辑
↓
运行时执行而 Agent 更希望:
运行时发现能力
↓
理解能力描述
↓
根据当前 Goal 决定是否调用这就是 MCP 特别重要的一步:Runtime Capability Discovery,运行时能力发现。
Host、Client、Server:别被三个名词吓到#
MCP 的三个角色其实很好理解。
Host:这栋房子是谁的#
Mira、Claude Desktop、IDE Agent 这类完整 AI 应用,是 Host。
Host 拥有:
LLM
Agent Loop
Context
Permissions
UI
Skills
Tools所以 Mira 是 Host,不是 MCP Server。
Client:插座#
Host 内部会有 MCP Client。
它负责:
建立连接
初始化
能力发现
发送协议请求
接收结果
维护连接状态可以把它理解成 Mira 身上的 MCP 插座。
Server:插进来的设备#
例如:
GitHub MCP Server
Filesystem MCP Server
Feishu MCP Server
Database MCP ServerServer 负责告诉 Client:
我有哪些能力
参数是什么
怎么调用
结果是什么完整关系就是:
Mira Host
└── MCP Client
├── GitHub MCP Server
├── Feishu MCP Server
└── Database MCP Server官方 MCP 架构同样采用 Host - Client - Server 模型:Host 会为每个 Server 建立对应 Client,由 Client 维护与 Server 的连接。
MCP Server 连上以后,第一件事不是干活#
一个新员工进公司,不会一进门就直接操作生产数据库。
一个设备插上电脑,也不是立刻开始乱发数据。
MCP 建立连接以后,会先有初始化和能力协商。
大概是:
Client:你好,我是 Mira,我支持这些协议能力。
Server:你好,我是某某 Server,我支持这些能力。
双方:协议版本和能力范围确认。
↓
Ready然后才进入 Discovery:
你有什么 Tool?
你有什么 Resource?
你有什么 Prompt?于是 Host 才真正知道:
原来我现在多了这些能力。
这和 Skill Discovery 很像,但发现的东西不同。
Skill Discovery
发现“我会哪些做事方法”
MCP Discovery
发现“外部世界现在提供哪些能力”Tool、Resource、Prompt,不是一回事#
很多人把 MCP 直接等同于“MCP Tools”。
其实 Server 可以提供的核心原语不只有 Tool。
最直觉的理解是:
Tool
= 做事情
Resource
= 给你东西看
Prompt
= 给你可复用的交互模板例如:
Tool
create_issue()
send_message()
query_database()
Resource
repo://project/README.md
db://schema/users
Prompt
review_pull_request
summarize_databaseTool 往往意味着一次动作,可能有副作用。
Resource 更像一个可读取的信息对象。
Prompt 则是服务端提供的可复用交互模板。
它们都可以通过 MCP 被 Host 发现,但语义并不相同。
LLM 其实没有“直接调用 MCP”#
这也是一个很容易说错的地方。
用户说:
看一下 GitHub 仓库里的 package.json。
模型可能决定调用:
get_file_content(repo, path)但真正执行链其实是:
LLM
提出 Tool Call
↓
Host
负责执行决策
↓
MCP Client
负责协议通信
↓
MCP Server
访问 GitHub
↓
结果返回 Host
↓
进入 Agent Context所以更准确地说:
LLM 产生调用意图,Host 执行,MCP Client 负责说协议,MCP Server 负责碰外部世界。
这个边界非常重要。
不要让 Planner 去负责重连、刷新 Token、重启子进程、维护 Session。
那些是 Runtime 的脏活。
Agent 管决策,Runtime 管现实。
stdio:MCP Server 可能只是你电脑上的一个小进程#
“Server”这个词很容易让人想到云服务器。
其实本地 MCP Server 完全可能只是一个 CLI 子进程。
配置可能长这样:
{
"command": "npx",
"args": ["-y", "some-mcp-server"]
}Host 启动它以后:
Mira.exe
└── node.exe
└── MCP Server双方通过 stdin / stdout 交换协议消息。
可以把它想象成:
Host:你会什么?
Server:我会这些。
Host:执行这个。
Server:结果给你。只不过这些话按照 MCP 的数据层协议组织,使用 JSON-RPC 2.0 消息格式。
当前官方 MCP 架构支持的标准传输包括本地常见的 stdio,以及远程常见的 Streamable HTTP。
Streamable HTTP:Server 也可以在远方#
如果 MCP Server 在云上,就不能由 Host 直接 spawn 本地子进程了。
这时候关系更像:
Mira
↓
MCP Client
↓
HTTP
↓
Remote MCP Server上层 Agent 不一定需要关心这个 Tool 到底来自本地 stdio,还是远程 HTTP。
因为 Transport 应该被 MCP Client 层屏蔽。
MCP Client
/ \
stdio Streamable HTTP
↓ ↓
Local Server Remote Server这就是协议层真正舒服的地方:
上层使用能力,下层负责能力到底住在哪里。
一个 MCP Server 不是一个 Tool#
这个区别也很关键。
飞书 MCP 并不是:
Feishu = 一个 Tool而更像:
Feishu MCP Connection
↓
发现一组能力
├── search_docs
├── read_doc
├── create_doc
├── send_message
└── list_records所以一个 MCP Server 更像“一个能力入口”。
连接以后,Server 暴露的是一组 Tools、Resources、Prompts。
这也意味着:
MCP Connection 和最终暴露给 Agent 的 Tool,不是同一个层次。
巴别塔统一了语言,为什么还需要 Skill?#
到这里会出现一个非常自然的问题。
大家终于能交流了,那是不是 Agent 就什么都会了?
不是。
想象一个新员工现在已经拿到了:
GitHub 权限
飞书权限
数据库权限
文件系统权限你对他说:
帮我做本周项目周报,然后发给团队。
他还是得问:
先查什么?
统计哪个时间范围?
风险怎么定义?
周报格式是什么?
发哪个群?
发之前要不要复核?MCP 解决的是:
能不能够到Skill 解决的是:
到了以后怎么做所以我们最后形成了一个特别好记的比喻:
MCP 给 Agent 接上世界,Skill 教 Agent 怎么在这个世界里办事。
例如:
Feishu MCP
提供 read_doc / send_message / create_doc
Weekly Report Skill
规定收集什么数据、如何判断风险、怎么组织周报、什么时候发送连接器和操作指南不是竞争关系。
它们是上下两层。
MCP 最大的工程价值,是把“连接”变成可替换的边界#
真正好的架构不是 Skill 写死:
必须调用 feishu_send_message长期看,更理想的是表达:
我需要 messaging.send 能力然后 Runtime 去解析:
messaging.send
↓
Feishu MCP
或
WeCom MCP这就是 Capability Abstraction。
Skill 依赖的是语义能力。
Runtime 决定具体实现来自 MCP、本地 Native Tool,还是别的 Provider。
当然,V1 完全没必要一开始就做得这么抽象。
但这个方向很重要,因为它告诉我们:
MCP 的价值不只是“多接几个工具”,而是把外部世界的连接方式从业务流程里剥离出来。
面试里怎么讲 MCP#
有人问:
你怎么理解 MCP?
背一句“Model Context Protocol 是开放协议”当然没错。
但更有判断力的说法可以是:
我把 MCP 理解成 Agent 世界解决巴别塔问题的一种协议。传统外部系统各有自己的 API 方言,而 Agent 需要在运行时发现并调用能力。MCP 标准化了能力发现、描述和调用的边界,所以它扩展的不是模型智力,而是 Agent 的可触达世界。
然后再补技术:
Host / Client / Server
initialize + capability negotiation
Tools / Resources / Prompts
stdio / Streamable HTTP先讲为什么,再讲怎么实现。
一个概念能被自己讲明白,才算真的进了脑子。
参考阅读#
- Model Context Protocol 官方文档:Architecture Overview
- Anthropic Engineering:Equipping agents for the real world with Agent Skills
- Datawhale Hello-Agents:Extra05 Agent Skills 与 MCP 对比解读
