MCP 协议入门:为什么 AI Agent 需要一个统一的工具调用标准

30秒结论

  • 解决什么问题:每个 AI 应用各自定义工具调用方式(OpenAI function calling、Anthropic tool use、LangChain tool 层),碎片化严重。MCP 提供一个统一标准。
  • 核心方法:架构三角 Host → Client → Server,三大核心原语 Tools/Resources/Prompts,基于 JSON-RPC 2.0、传输无关。
  • 关键结论:MCP 不是 function calling 的替代品——它是一层更高的协议抽象。如果你理解 LSP 如何统一了编辑器生态,你就理解了 MCP 的价值。
  • 读完能做什么:理解 MCP 的架构原理,能区分 MCP 和原生 function calling,为下一篇动手写代码打好理论基础。

2025 年,AI Agent 的开发者面临一个尴尬的现实:

你想让 Claude Desktop 连接 GitHub、Slack 和 Postgres 数据库。做法是什么?为每个服务单独写集成代码——GitHub 用 REST API、Slack 用 WebSocket、Postgres 用数据库驱动。每个工具的认证方式不同、数据格式不同、错误处理不同。

更糟的是,如果换个 AI 应用(比如从 Claude Desktop 换到 Cursor),所有的集成代码要重新写一遍

这不是某个开发者的疏忽。这是整个 AI 工具调用生态的系统性碎片化

而 MCP(Model Context Protocol),正是为了解决这个问题而诞生的。

用 LSP 类比,秒懂 MCP 的价值

在理解 MCP 之前,先看一个你已经受益的类似标准:LSP(Language Server Protocol)

1980 ~ 2015 年,代码编辑器的世界是这样的:每个编辑器都要为每种语言单独实现代码补全、跳转定义、错误诊断。VS Code 写一套 Python 插件,Vim 写一套,Sublime 再写一套。N 个编辑器 × M 种语言 = N×M 套实现。

2016 年,微软发布 LSP。核心思想很简单:一种语言只需要写一个 Language Server,所有编辑器通过统一协议对接它。

维度 LSP(编辑器生态) MCP(AI 工具生态)
解决的问题 每个编辑器各自实现语言支持 每个 AI 应用各自实现工具集成
核心思想 一种语言一个 Server,所有编辑器共用 一个工具一个 Server,所有 AI 应用共用
协议角色 Editor(客户端)↔ Language Server Host/Client ↔ MCP Server
标准化成果 N+M 替代了 N×M 一次编写,任意 AI 应用接入

LSP 彻底改变了编辑器生态。今天你写 Python 时享受的智能补全,背后是同一个 Pyright Server——不管你在 VS Code、Vim 还是 Zed 里写代码。

MCP 在 AI 工具调用领域做的是同样的事。有了 MCP,GitHub 工具只需要写一个 MCP Server,Claude Desktop、Cursor、Continue、Zed——任何实现了 MCP Client 的 AI 应用都能即插即用。

架构三角:Host → Client → Server

MCP 的架构由三个角色组成——理解这个三角形,就理解了 MCP 的全部结构:

Host(宿主应用)

Host 是最终用户看到的 AI 应用。比如 Claude Desktop、Cursor IDE、一个自建的聊天界面。Host 负责:

Host 不直接和 MCP Server 通信。它通过内置的 Client 完成所有协议操作。

Client(协议客户端)

Client 是嵌入在 Host 内部的 MCP 协议实现层。它负责:

Client 是 MCP 架构中最关键的桥梁——它同时连接 LLM 和外部工具,对两者进行协议翻译。

Server(工具提供者)

Server 是实际执行工具的程序。一个 MCP Server 暴露一组能力:

一个 Server 可以同时提供这三类能力,也可以只提供其中一部分。

一个最小化调用流程

用文字描述 MCP 的一次完整调用链路:

用户在 Host 中提问:"帮我查 GitHub 上 MCP 相关的最新 Issue"

  ┌─────────────── Host(Claude Desktop)───────────────┐
  │                                                      │
  │  ① 用户输入                                  ⑧ 展示结果 │
  │     ↓                                                ↑ │
  │  ┌──────────────── Client ────────────────────┐     │ │
  │  │                                              │     │ │
  │  │  ② tools/list ────────────────→  MCP Server │     │ │
  │  │     ← [search_issues, create_issue, ...]     │     │ │
  │  │                                              │     │ │
  │  │  ③ LLM 看到可用工具,决定调用 search_issues   │     │ │
  │  │                                              │     │ │
  │  │  ④ tools/call ─────────────────→  MCP Server │     │ │
  │  │     {"name":"search_issues",                  │     │ │
  │  │      "arguments":{"query":"MCP","limit":5}}   │     │ │
  │  │                                              │     │ │
  │  │  ⑤ ← 返回 Issue 列表 JSON                      │     │ │
  │  │                                              │     │ │
  │  │  ⑥ LLM 收到结果,生成自然语言回答               │     │ │
  │  └──────────────────────────────────────────────┘     │ │
  │                                                      │ │
  └──────────────────────────────────────────────────────┘

关键点:LLM 不知道 MCP Server 的存在,也不直接和 Server 通信。LLM 只看到工具的名称、描述和参数 schema——它决定"调用哪个工具、传什么参数"。实际的协议通信由 Client 完成。

这个分层设计是 MCP 最优雅的地方:模型和协议解耦。换一个 LLM 提供商,Client 不变、Server 不变——只需要 Host 换一个模型 API 调用。

三大核心原语速览

MCP 定义了三类核心能力,分别服务于不同的调用场景:

原语 控制方 一句话描述 典型场景
Tools 模型控制 LLM 主动调用的可执行函数 查天气、发 Slack 消息、执行 SQL 查询、创建 GitHub Issue
Resources 应用控制 应用层读取的结构化上下文数据 读取项目文件、获取数据库 schema、加载知识库文档
Prompts 用户控制 预定义的提示词模板,快速启动对话 "总结这个代码库"、"帮我审查这段 PR"、"生成 API 文档"

为什么要区分这三者?因为不同场景的调用权限不同。Tool 是 LLM 自动决定调用的——需要慎重暴露(防止模型误操作删除文件)。Resource 是应用层主动读取的——不需要 LLM 参与决策。Prompt 是用户手动选择的——给用户快捷入口。这个分类让 MCP Server 可以精确控制"什么角色在什么情况下能做什么"。

所有原语都通过 JSON-RPC 2.0 传输,支持两种传输方式:

MCP vs 原生 Function Calling:关键区别

这是开发者最容易混淆的地方。我们用一个清晰的对比来说清楚:

维度 原生 Function Calling MCP
抽象层级 模型能力(模型理解并输出函数调用) 协议层标准(工具如何被发现、描述、调用、传输)
工具发现 硬编码:每次 API 调用时手动传入工具列表 动态发现:Client 向 Server 发送 tools/list 自动获取
跨模型兼容 每个厂商定义不同(OpenAI 格式 ≠ Anthropic 格式) 统一的工具描述 schema,Client 负责适配不同模型
传输方式 绑定在模型 API 调用的请求/响应中 传输无关:stdio、HTTP+SSE,可本地可远程
工具复用 每个应用单独集成 一次编写 MCP Server,所有 Client 即插即用
上下文注入 仅 tool call/result 两阶段 Resources 提供额外的上下文注入通道(不经过 LLM 决策)

一句话总结:Function calling 定义的是"模型怎么输出工具调用",MCP 定义的是"工具怎么被管理和连接"。两者不是竞争关系——MCP 的 Client 层最终会把 MCP 工具描述翻译成对应模型需要的 function calling 格式。MCP 是更上层的抽象。

一个具体场景:有 MCP 和没有 MCP 的区别

假设你要让 Claude Desktop 同时连接三个外部工具:GitHub(查看 Issue)、Slack(发送消息)、Postgres(查询数据库)。

没有 MCP 时

三套代码,三套认证逻辑,三套错误处理。哪天想加第 4 个工具(比如 Jira)——再写一套。而且换到 Cursor IDE 时,所有集成代码全部重写

有 MCP 时

Claude Desktop 作为 Host,通过内置 Client 自动发现三个 Server 暴露的所有工具。LLM 看到统一的工具列表,按需调用。加第 4 个工具?再启动一个 MCP Server 即可。换到 Cursor IDE?三个 Server 不用改,Cursor 内置的 Client 直接连。

这就是标准化协议的力量。跟 USB 统一了外设接口一个道理——你不需要为每个鼠标写驱动。

MCP 是谁做的?

发起方:Anthropic 于 2024 年 11 月开源发布 MCP。

当前托管:2025 年移交 Linux Foundation 托管,成为正式的开源标准项目。

许可协议:Apache 2.0,完全开放,无厂商锁定。

值得强调的是:MCP 不是 Anthropic 的私有协议。移交 Linux Foundation 意味着:

如果你担心"用了 MCP 是不是就被 Anthropic 锁定了"——不用担心。MCP 的定位和 Kubernetes、Node.js 一样:开放标准,多厂商实现。

常见误区:「MCP 就是 Function Calling 2.0」

这是最高频的误解。再次强调:

Function calling 是模型的能力。模型说"我理解了这个工具,我想调用它,参数是这个"。

MCP 是协议层标准。它规定"工具怎么被发现、怎么描述自己、调用请求长什么样、结果怎么返回、走什么传输通道"。

类比理解:

一个人会说英语(function calling),但如果每个人写信的格式不同,跨组织沟通仍然混乱。MCP 制定了统一的"信封格式"——发件人、收件人、主题、正文各放哪里——让任何会说英语的人都能高效沟通。

动手之前:你需要知道的基础概念

在本系列下一篇开始写代码之前,确保你已经内化了这几个概念:

  1. MCP 的架构三角:Host(用户界面)→ Client(协议桥梁)→ Server(工具执行)。三层各司其职。
  2. 三大原语的区别:Tools(模型调用)、Resources(应用读取)、Prompts(用户选择)。分清谁控制谁。
  3. MCP ≠ Function Calling:MCP 是协议层,function calling 是模型能力。MCP Client 负责把 MCP 工具翻译成模型理解的 function calling 格式。
  4. 传输无关:stdio 用于本地,Streamable HTTP 用于远程。写 Server 时不需要关心传输细节。

如果对 AI Agent 本身还不够熟悉,建议先阅读:

本系列路线图

MCP 协议系列共 6 篇文章,从概念到生产落地:

  1. ← 你在这里:MCP 协议入门 — 概念、架构、对比
  2. 构建你的第一个 MCP Server — 50 行 Python 实现天气查询工具
  3. 深入 MCP 三大原语 — Tools/Resources/Prompts 完整实战
  4. MCP 传输层详解 — stdio vs Streamable HTTP,何时用哪个
  5. MCP 高级特性 — 让 Server 反向调用 LLM、请求用户输入、支持异步长任务
  6. MCP 生产部署 — OAuth 2.1 认证、Gateway 代理、审计追踪与 Registry 发布

📖 下一篇:构建你的第一个 MCP Server — 用 50 行 Python 代码实现天气查询工具

常见问题

Q: MCP 协议到底是什么?

A: MCP(Model Context Protocol)是一个开放标准协议,定义了 AI 应用如何与外部工具和数据源交互。它基于 JSON-RPC 2.0,规定了工具发现、调用、资源读取和提示词模板的统一方式。可以把它理解为 AI 工具调用领域的 LSP(Language Server Protocol)。

Q: MCP 和 function calling 是一回事吗?

A: 不是。Function calling 是模型的能力——模型能理解工具描述并输出结构化的调用指令。MCP 是协议层标准——规定工具如何被发现、描述、调用和传输。两者在不同抽象层。MCP 可以替代各家厂商各自定义的 function calling 接口,提供跨模型、跨应用的统一工具调用方式。

Q: MCP 是 Anthropic 专用的吗?OpenAI 的模型能用吗?

A: MCP 不是 Anthropic 专用的。虽然由 Anthropic 发起,但已于 2025 年移交 Linux Foundation 托管,采用 Apache 2.0 开源许可。任何模型(OpenAI、DeepSeek、Llama 等)都可以通过实现 MCP Client 来调用 MCP Server。MCP 是开放标准,不是厂商锁定。

Q: 我需要学什么才能开始用 MCP?

A: 只需要基础的 Python 或 TypeScript 编程能力。MCP 基于 JSON-RPC 2.0,如果你会写 HTTP API 或 stdio 通信,就能上手。本系列下一篇会用不到 50 行 Python 带你写第一个 MCP Server,从零到跑通只需 10 分钟。