模型上下文协议(MCP)详解:它解决什么问题,又不能解决什么问题
从实践角度解释模型上下文协议(MCP):它标准化了什么,工具、资源和提示词如何协作,它与函数调用和 API 有何区别,以及它不能解决哪些问题。
本文目录
模型上下文协议(Model Context Protocol,MCP)解决的是互操作性问题。
它不会让智能体变得更聪明,不会决定哪些工具值得信任,也不会取代你的 API、权限模型或应用程序逻辑。
它所做的是标准化一种方式,让 AI 应用能够发现和使用外部工具、数据以及可复用的提示词。
这听起来只是一件小事。但在实践中,它很重要,因为如果没有这样的协议,AI 应用往往需要通过定制适配器来集成每一个外部系统。
没有共同协议,每个宿主应用都必须为每个工具提供方建立自己的集成契约。有了 MCP,服务器就能以标准化的形式提供能力,任何兼容的宿主应用都可以连接并使用这些能力。
可以这样理解:
MCP 是 AI 应用与外部能力之间的互操作层。
MCP 试图解决的问题
假设你正在构建一个智能体,需要访问:
- GitHub;
- 私有文档系统;
- 数据库;
- 内部计费 API;
- 浏览器;
- 本地开发环境。
你完全可以直接集成每个系统。
但这通常意味着要为以下方面编写定制代码:
- 连接初始化;
- 工具发现;
- 数据结构模式(schema);
- 身份认证;
- 传输机制;
- 错误处理;
- 能力元数据;
- 生命周期行为。
随后,另一个 AI 客户端需要使用相同的系统,又得重新实现一套集成逻辑。
MCP 在 AI 宿主应用和能力提供方之间建立了共同的契约。
提供方实现一个 MCP 服务器,宿主应用通过 MCP 客户端连接。之后,模型就可以发现该服务器提供的能力。
MCP 官方 SDK 文档将这一协议描述为一种开放标准,用于把 AI 应用连接到工具和数据所在的系统。服务器可以提供工具、资源和提示词,而兼容的宿主应用可以连接并使用它们。
最重要的三种基础能力
MCP 服务器可以提供多种能力,其中三个概念尤其有用。
工具(Tools)
工具是可以调用的操作。
例如:
get_order(order_id);create_ticket(...);search_repository(...);run_test_suite(...);calculate_quote(...)。
工具通常有名称、描述和结构化输入。宿主应用可以发现它,模型可以决定是否调用它,而服务器负责执行相应操作。
工具是 MCP 中与函数调用最接近的部分。
资源(Resources)
资源是客户端可以读取的数据或内容。
例如:
- 配置文件;
- 文档;
- 代码仓库中的产物;
- 知识记录;
- 生成的报告。
当应用需要获取上下文,却不希望把每次读取都建模为执行某项操作的函数时,资源就很有用。
提示词(Prompts)
提示词是服务器提供的可复用模板或交互模式。
它们可以封装特定领域的指令,使宿主应用不必分别重新实现相同的提示词逻辑。
这三种基础能力区分了三个不同的概念:执行操作、读取内容、复用交互模式。
MCP 不会取代函数调用
函数调用和 MCP 工作在不同的层次。
函数调用是一种机制:模型通过它选择一个函数,并提供结构化参数。
MCP 则标准化了外部能力如何在兼容客户端之间被发布、发现、连接和调用。
可以这样区分:
- 函数调用定义模型如何调用函数;
- MCP 为这些函数及相关能力的来源提供可复用的协议。
MCP 工具最终仍然可以通过宿主应用常规的工具调用机制呈现给模型。
例如,OpenAI 目前的 MCP 文档支持将模型连接到远程 MCP 服务器,也支持通过 MCP 隧道连接本地或私有服务器。API 会发现服务器提供的工具,并将它们提供给模型使用。
MCP 不会取代 REST API
MCP 服务器通常构建在现有 API 之上。
如果你的业务系统已经提供:
POST /refunds
你就不需要为了 MCP 重新构建支付系统。
你可以提供一个 MCP 工具,例如:
issue_refund(order_id, reason)
然后由服务器在内部调用现有 API。
REST API 仍然是服务的业务操作接口。MCP 则成为面向 AI 的互操作层。
这种区别很重要,因为现有 API 可能已经包含:
- 业务规则;
- 授权控制;
- 输入验证;
- 幂等性;
- 审计;
- 事务语义。
MCP 不应无谓地重复承担这些职责。
MCP 不会取代智能体框架
MCP 不会决定:
- 智能体应该追求什么目标;
- 应该先调用哪个工具;
- 智能体是否应该重试;
- 何时停止;
- 记忆机制如何运作;
- 何时需要审批;
- 多智能体之间如何协调。
这些都是编排层面的决策。
智能体框架可以使用 MCP 服务器来获取工具和上下文,但 MCP 本身并不是推理循环。
这是围绕该协议最常见的概念误区之一。
一个连接了十个 MCP 服务器的系统,并不会因此自动获得更强的智能体能力。它只是拥有十个提供标准化能力的服务方。
MCP 不会取代 RAG
RAG(检索增强生成)和 MCP 可以协同工作,但它们解决的问题不同。
RAG 要回答的是:
我应该检索哪些证据,并将它们放入模型的工作上下文?
MCP 要回答的是:
AI 应用如何以标准化方式连接外部能力提供方?
MCP 服务器可以提供由向量数据库支持的搜索工具或文档资源。
但这并不意味着 MCP 本身定义了文本分块、排序、向量嵌入、检索质量、引用逻辑或事实依据策略。
这些仍然是应用程序和检索系统需要负责的问题。
MCP 实际标准化了什么
协议的价值体现在它使哪些边界变得可预测。
MCP 为以下方面提供了共同约定:
- 能力发现;
- 结构化工具定义;
- 资源与提示词;
- 客户端与服务器通信;
- 传输方式;
- 授权模式;
- 错误处理和协议行为。
当前的官方 SDK 支持多种常用传输方式,包括本地 stdio 和 Streamable HTTP。
因此,在概念上相同的服务器可以应用于不同环境:由编程工具在本地使用,由托管的 AI 产品远程使用,或部署在企业基础设施内部。
这种可移植性是它主要的架构优势。
一个具体例子
设想一家公司拥有内部库存系统。
现有后端已经提供以下 API:
- 搜索商品;
- 查询库存;
- 创建库存预留;
- 释放库存预留。
公司无需将这些 API 分别集成到每一个 AI 应用中,而是可以创建一个 MCP 服务器。
这个服务器提供:
search_products(query);get_inventory(product_id);reserve_inventory(product_id, quantity);release_reservation(reservation_id)。
现在,兼容的 AI 宿主应用都可以通过同一协议发现这些能力。
MCP 服务器并不会因此成为库存数据库。
它也不会成为授权系统。
它不会决定智能体是否有权预留 10,000 件商品。
它只是为访问这些现有系统提供标准化接口。
安全边界仍然由你负责
标准化连接可以让集成变得更容易,也可能让不安全的集成变得更容易。
因此,信任模型非常重要。
OpenAI 目前的 MCP 指南明确警告:远程 MCP 服务器可能接收敏感数据,恶意服务器可能带来提示词注入和数据外泄风险。
重要的控制措施包括:
- 通过允许列表,仅开放智能体真正需要的工具;
- 对敏感操作要求审批;
- 将凭据保存在模型生成内容之外;
- 在适当情况下使用 OAuth 或同等的授权机制;
- 验证连接的每一个服务器;
- 限制发送给第三方服务器的数据;
- 为影响重大的操作保留审计日志。
MCP 为你提供了协议,但并不意味着每台服务器都自动值得信任。
工具描述会成为系统行为的一部分
模型会根据工具的名称、描述和 schema 决定调用什么,因此工具设计也成为智能体控制面的组成部分。
例如,下面这个设计欠佳的工具:
manage_account(input)
会带来歧义。
相比之下,多个职责明确、范围较小的工具通常更容易分析:
get_account_status(account_id);update_billing_address(account_id, address);cancel_subscription(account_id, reason)。
清晰的能力边界有助于改善:
- 工具选择;
- 权限设计;
- 可审计性;
- 评估;
- 人工审核。
MCP 标准化的是能力如何对外提供,但良好的工具设计仍然是工程责任。
当能力复用很重要时,MCP 最有价值
你很可能不需要为每一个内部函数都使用 MCP。
如果某个工具只属于一个应用,而且永远不会被其他客户端使用,直接进行函数调用可能更简单。
以下情况会让 MCP 更有价值:
- 多个 AI 客户端需要使用相同的能力;
- 能力需要在不同宿主应用之间移植;
- 组织希望建立可复用的集成边界;
- 本地与远程工具需要使用相似的接口;
- 外部开发者或团队需要使用同一套能力契约。
该协议减少了重复的集成工作。
但它并不能替代架构判断。
实用决策对照表
| 问题 | 直接使用工具/函数 | MCP |
|---|---|---|
| 单个应用、单项私有集成 | 通常更简单 | 可能没有必要 |
| 多个 AI 宿主应用使用相同工具 | 需要重复实现集成逻辑 | 非常适合 |
| 需要标准化的能力发现 | 需要定制实现 | 协议内置 |
| 已有 REST API | 直接调用 | MCP 服务器可以封装该 API |
| 本地开发者工具 | 需要定制进程集成 | stdio 很适合 |
| 远程共享能力 | 需要定制 HTTP 契约 | Streamable HTTP 很适合 |
| 仍然需要授权控制 | 是 | 是 |
| 是否包含智能体规划/编排 | 否 | 否 |
MCP 不能解决的问题
明确来说,MCP 不能解决以下问题:
1. 工具的正确性
即使故障工具符合标准协议,它仍然是有故障的工具。
2. 授权策略
你仍然需要决定哪些用户、智能体或组织可以执行哪些操作。
3. 提示词注入
外部内容仍然可能包含恶意指令或相互冲突的指令。
4. 智能体的可靠性
你仍然需要评估、追踪、重试机制、停止条件和故障处理。
5. 业务语义
该协议无法判断在你的业务领域中,退款、贷款审批或资源删除是否有效、合规或合理。
6. 数据质量
MCP 可以提供数据,但不会让过时或错误的数据因此变得可信。
7. 可观测性
你仍然需要应用层的日志、指标、追踪数据和审计记录。
设计原则
当你需要在 AI 应用与外部能力之间建立可复用的互操作边界时,就使用 MCP。
将业务逻辑、权限、作为事实依据的数据以及运行保障留在原本负责这些职责的系统中。
把 MCP 视为基础设施。
它本身不是智能。
不是治理机制。
也不能单独提供安全保障。
它不是智能体框架。
良好的 MCP 集成能够让各种能力更容易连接,同时保持其底层职责清晰明确。
这才是该协议真正的价值。