← 返回 AI 主页

🔌 MCP 到底是什么?

Model Context Protocol —— 一句话:它是给大模型「接外设」的标准插头,不是又一种 Tool。从「为什么需要」讲到「它和 Agent 里的 Tool 到底啥区别」,再到真实应用场景,全程图解。

先把你最该钉死的一句话记住:MCP(Model Context Protocol,模型上下文协议)是 Anthropic 在 2024 年底推出的一个开放标准协议,用来规定「大模型应用」和「外部工具 / 数据」之间怎么发现、连接、互相调用。它定义的是通信规则,不是一个具体的工具,也不是一个 Agent 框架。

所以你纠结的「MCP 不就是 Tool 吗」——答案是:MCP 是「装工具的集装箱 + 标准货运协议」;Tool 是集装箱里那件具体的货。一个 MCP Server 里面装的就是一个个 Tool(外加 Resource/Prompt)。下面用图把这件事拆开。

在没有 MCP 之前,集成是个 M×N 地狱

每个 Agent 应用(Claude Desktop、Cursor、你自己的 Python 脚本…)想接每个外部系统(GitHub、数据库、文件系统、Slack…)都得各自写一套对接代码。N 个应用 × M 个系统 = N×M 份重复集成。换一个应用,全部重写。

❌ 没有 MCP:N×M 集成

9 份定制连接器
每换一个 App 全重来

✅ 有 MCP:N+M 集成

应用侧 + 服务端
各自只写一次

定制对接代码 标准协议连接

MCP 解决的三个核心痛点

🔌

标准接口

不再每家应用各写一套。工具方按协议实现一次 Server,任何兼容 MCP 的客户端都能即插即用——「写一次,处处可用」。

🧩

解耦进程

工具可以跑在独立进程甚至远程机器上,和跑模型的应用隔离。崩溃、升级、加权限互不影响,还能统一管凭证。

🔍

运行时发现

客户端启动时向 Server 问「你有哪些能力?」,动态拿到工具/数据的清单(schema),大模型才知道能调什么,不用写死在代码里。

MCP 是经典的 客户端 / 服务器(C/S)架构,外加一个「宿主(Host)」概念。三层角色分工明确,点下面的方块看各自职责。
HOST

宿主应用

真正跑大模型 + 编排逻辑的程序

例:Claude Desktop、Cursor、你自己写的 Agent
CLIENT

MCP 客户端

内嵌在 Host 里,与 Server 1:1 连线

负责握手、发 list / call 请求
SERVER

MCP 服务器

把外部系统包成标准能力暴露出来

例:GitHub Server、Postgres Server、文件系统 Server

宿主(Host)= 大模型所在的应用

Host 是「用户真正面对的那个 AI 应用」。它里面装着 LLM 和对话/编排逻辑,决定什么时候、要不要调用工具。一个 Host 可以同时连多个 MCP Server(每个 Server 一个 Client)。

  • Host 负责:加载系统提示、调 LLM、解析模型返回的「我要调工具」、把结果回填给模型。
  • 常见 Host:Claude Desktop、Cursor、Windsurf、Cline、各种自研 Agent 后端。

MCP 客户端(Client)= Host 内部的「接线员」

每个 MCP Server 对应 Host 里一个 Client,二者一对一建立持久连接。Client 把 Host 的意图翻译成 JSON-RPC 请求发给 Server,再把 Server 的回复翻译回 Host。

  • 发起 initialize 握手、协商能力(capabilities)。
  • 调用 tools/list 拿工具清单、tools/call 触发执行。
  • 客户端不是「另一个 LLM」,它只是传输 + 协议层。

MCP 服务器(Server)= 能力的「集装箱」

Server 是一个独立进程/服务,把某个外部系统(数据库、API、本地文件…)封装成协议标准的能力:Tools(可执行动作)、Resources(可读数据)、Prompts(提示模板)。

  • 它自己不跑模型,只负责「被调用时去真实系统干活」。
  • 可以本地启动(stdio 子进程),也可以远程(HTTP/SSE)。
  • 凭证(token、密码)留在 Server 端,Host 不碰——更安全。

两种传输方式(Transport)

协议本身和「怎么传」无关,底层靠 JSON-RPC 2.0 编码消息,再套一层传输。常见两种:

🖥️ stdio(标准输入输出)

Host 把 Server 当成本地子进程启动,双方通过 stdin/stdout 收发 JSON。适合本机工具(读文件、本地命令)。

# Host 启动本地 Server 子进程 spawn("mcp-server-filesystem") # 通过 stdin/stdout 交换 JSON-RPC {"method":"tools/call", ...}

🌐 Streamable HTTP / SSE

Server 跑在远程,Host 通过 HTTP(流式)连接。适合云端 SaaS、多人共享、需要鉴权的企业服务。

# 客户端通过 HTTP 端点连接远程 Server POST https://api.xxx.com/mcp # 服务端可经 SSE 把结果流式推回 event: message data: {"result": ...}
这是你最该看透的一节。先纠正一个根深蒂固的错觉:「MCP」和「Tool」不是同一层的东西,没法直接并列比较。

· Agent 里的 Tool:是一个代码层面的抽象——一个带 schema 的函数,供 LLM 调用。它描述的是「能力长什么样」。
· MCP:是一套跨进程的标准通信协议——它规定 Tool 怎么被「发现、序列化、远程调用、回传」。它描述的是「能力怎么传」。

所以正确的对比是:「把工具写死在 Agent 进程内」「把工具通过 MCP 协议放在独立 Server 暴露」。两者最终都给 LLM 一个可调用工具,MCP 只是额外加了标准化 + 解耦 + 跨客户端复用

两种「给 Agent 加工具」的方式对比图

① 硬编码工具(进程内)

工具函数和 Agent 代码在同一个进程、同一份代码里。

Agent 进程 ├─ LLM 推理 ├─ def search_web(q): ... # 写死 ├─ def send_mail(...): ... # 写死 └─ tools=[search_web,send_mail] # 手动注册

换一个 Agent → 工具代码得重写 / 复制。工具崩溃 → 整个进程崩。

② 通过 MCP 暴露工具(跨进程)

工具在独立 Server 进程,Agent 只管按协议连线调用。

Agent 进程 ──JSON-RPC──► MCP Server 进程 (Host+Client) ├─ tools/list → [{name, schema}] ├─ tools/call → 真去干活 └─ 连接 GitHub / DB / FS …

同一个 Server → 任何 MCP 客户端都能用。Server 挂了 → Agent 还能跑。

六维逐项对比

维度硬编码 Tool(进程内)MCP 暴露的 Tool
本质代码函数 + 手写 schema函数 + JSON-RPC 标准协议封装
运行位置与 Agent 同一进程独立进程 / 远程 Server
跨应用复用差,每套 Agent 各写各的好,写一次到处连
能力发现手动注册,编译期写死运行时 tools/list 动态获取
隔离 / 安全凭证混在主程序,崩了全崩Server 隔离,凭证集中管控
适合规模小脚本、一次性原型多工具、多客户端、生产级

🔧 交互演示:一个真实的 MCP 调用会话

点「开始连接」看 Host↔Server 之间到底 exchanged 了些什么——你会发现普通 Tool 根本没有这套握手与发现。

MCP 不只传「工具」。它定义了四类原语(Primitive),区别在于「谁来控制」——这是它比「只给 LLM 塞函数」想得更周全的地方。
模型控制 · Model-controlled

🛠 Tools

可被模型主动调用、通常有副作用的动作:查 API、发邮件、写文件、跑 SQL。模型看到 schema 后自己决定何时调用。

应用控制 · App-controlled

📄 Resources

只读的数据源,像「可以读的文件」:数据库某行、日志、文档。由应用决定何时塞进上下文,模型一般不主动「调」。

用户控制 · User-controlled

💡 Prompts

可复用的提示模板,用户主动选:例如「总结这段代码的 bug」「按模板写周报」。相当于预置工作流。

反向控制 · Server→Client

🔁 Sampling

最反直觉:Server 反过来请求让 LLM 干活(经 Client 中转)。让工具内部也能调用模型能力,实现「工具里套模型」。

一句话记:Tools 让模型动手,Resources 让模型读书,Prompts 让用户选流程,Sampling 让工具也能问模型。普通 Agent 的「Tool」只覆盖了第一种。

还有两个常被忽略的能力

📂

Roots(根目录)

Client 告诉 Server「你只允许访问这些路径 / 资源范围」,做最小权限约束。

Elicitation(信息征询)

Server 运行中可向用户反问缺的参数(如「要连哪个数据库?」),而不必预先全写死。

一次完整的 MCP 交互,本质是一次带握手的 JSON-RPC 会话。下面用步进动画走一遍「从连接到真正调工具」的全过程。
1

initialize · 握手

Client 连上 Server,交换协议版本与各自支持的 capabilities(谁支持 tools?谁支持 sampling?)。双方对齐「能聊什么」。

2

initialized · 就绪

Client 收到 Server 的 initialize 结果后,发一个 notifications/initialized 通知,握手完成,正式开始通信。

3

tools/list · 发现能力

Client 问「你有哪些工具?」Server 返回每个工具的 name + 输入 schema。模型之后看到的「可用工具列表」就来自这里。

4

LLM 决策

Host 把工具清单塞进模型上下文。模型根据用户问题,决定「我要调 send_mail,参数是…」,返回 tool_call。

5

tools/call · 真正执行

Client 把模型的 tool_call 转发给 Server;Server 去真实系统(邮件服务)执行,拿到结果。

6

结果回填 · 继续推理

Server 把执行结果经 Client 回传 Host,Host 把结果作为新消息喂给模型,模型据此生成最终回答。

MCP 不是实验室玩具。凡是「让 LLM 安全、标准化地连上真实世界数据 / 系统」的地方,都是它的用武之地。
📚

接入私有数据(RAG 替代 / 补充)

把公司文档、知识库、数据库做成 Resource Server,模型按需读取,不必把所有内容硬塞进 prompt,也不必每个应用各接一遍。

LLM ⇄ MCP ⇄ 内部 Wiki / DB

让模型真正「动手」

通过 Tools Server 让模型执行动作:发邮件、提单、查订单、调内部 API,且凭证集中在 Server 端。

LLM → tools/call → GitHub / Jira / CRM
💻

IDE / 编码 Agent

Cursor、Cline、Windsurf 等通过文件系统 / Git / 代码检索 MCP Server 直接读懂你的代码库,无需把仓库拷进对话。

编码 Agent ⇄ MCP ⇄ 本地代码仓库
🔁

一处编写,多处复用

一个 Postgres MCP Server 写好,Claude Desktop、Cursor、你的自研后端都能连——彻底消灭重复集成。

1 Server ⇄ N 个 Host 客户端
🏢

企业级统一网关

公司把内部系统封成受控 MCP Server,集中做鉴权、审计、最小权限(Roots),安全合规地给各种 AI 应用供货。

AI 应用 → 网关 ⇄ 内部系统
🖥️

桌面应用本地集成

Claude Desktop 通过本地 stdio Server 访问你的文件系统、日历,全程本机进程,数据不出电脑。

桌面 App ⇄ stdio ⇄ 本机文件系统
一句话收尾:MCP 是「大模型到外部世界的 USB-C 接口」——它不替代 Tool,而是把 Tool(和 Resource/Prompt)用一套标准协议序列化、发现、跨进程调用,从而解决「每个应用重复造轮子 + 工具绑死在代码里」的老大难。

核心速查

三个常见误解

「MCP 就是一种 Tool」

错。Tool 是能力,MCP 是搬运能力的协议。一个 MCP Server 里面装的才是 Tool。

「用了 MCP 模型就更聪明」

错。MCP 不改进推理,只决定模型「能不能、怎么」连上外面的数据和动作。

「不用 MCP 就不能调工具」

错。硬编码 Tool 一样能调;MCP 解决的是标准化、解耦、复用,不是「能不能」。

记忆口诀:「协议不替代工具,只是给工具上了标准集装箱;写一次 Server,连遍所有 Host;模型控 Tool、应用控 Resource、用户控 Prompt。」