引言:从"会说话"到"能办事"的鸿沟

过去两年,大语言模型的能力飞速跃升,从文本生成走向多模态理解,从单轮对话迈向多步推理。但一个根本性的问题始终悬而未决:模型再聪明,也只能"说",不能"做"。它可以告诉你 SQL 怎么写,但不会主动连上你的数据库;它可以解释 git rebase 的风险,但无法直接帮你在本地仓库执行回滚;它可以读完整个项目文档,但依然拿不到你电脑里那份最新的配置文件。

这种"知道"与"做到"之间的断层,正是 AI Agent 落地最大的拦路虎。2024 年 11 月,Anthropic 在一篇官方发布说明中,正式开源了 Model Context Protocol(以下简称 MCP),试图用一种开放协议,把模型和真实世界之间的桥梁标准化。本文从三个权威英文资料出发——Anthropic 官方发布说明、MCP 官方架构文档、以及 2025-06-18 版的 MCP 规范——讲清楚 MCP 到底是什么、它由哪些部分组成,以及一个开发者如何真正用上它。

一、MCP 是什么:为什么需要新协议

在 MCP 出现之前,让 AI 助手访问外部数据大致有三条路径:把数据塞进 prompt、写一个定制化的插件、或调用某个厂商私有的接口。每条路都有明显缺陷。第一种受限于上下文窗口,第二种形成 M×N 的集成噩梦——M 个模型对接 N 个工具,要写 M×N 套适配层,第三种把开发者锁死在单一生态里。

Anthropic 在 2024 年 11 月 25 日发布的 "Introducing the Model Context Protocol" 一文中明确指出:MCP 是一个开放标准,用于把 AI 助手连接到数据所在的系统——包括内容仓库、业务工具和开发环境。它的目标是帮助前沿模型产生更好、更相关的响应。换句话说,MCP 想做的不是"又一套 API",而是"USB-C 之于外设":一个统一的、即插即用的接口,让任何模型都能和任何数据源对话。

从协议分层看,MCP 处在应用层与传输层之间,对上向模型暴露统一的上下文语义,对下把 JSON-RPC 2.0 作为消息载体。这意味着 MCP 既不绑定具体的大模型,也不绑定具体的传输方式——你可以跑在 stdio 上做本地进程通信,也可以跑在 HTTP+SSE 或 Streamable HTTP 上做远程服务。这种解耦,正是 MCP 能快速被 OpenAI、Google、Replit、Codeium 等公司接纳的关键。

二、核心架构:Host、Client、Server 三件套

官方架构文档把 MCP 的角色划分为三类:MCP Hosts、MCP Clients、MCP Servers,以及它们共同操作的 Resources、Prompts、Tools 三类原语。

MCP Host 是用户日常打交道的应用,比如 Claude Desktop、Cursor 编辑器、某个 IDE 插件,或者一个你自己写的 Agent 框架。Host 负责管理用户的对话状态,决定何时发起 MCP 请求,以及如何把模型返回的"工具调用"翻译给用户看。

MCP Client 活在 Host 进程内部,与每一个 Server 维持一条一对一的连接。它的职责很纯粹:协议握手、能力协商、消息路由。规范明确要求,每个 Client 只与一个 Server 通信,多个 Server 就开多个 Client 实例——这是有意为之的隔离,避免一个 Server 崩溃拖垮所有外部连接。

MCP Server 才是真正"长出手脚"的地方。它是连接具体数据源或业务系统的轻量进程,可以暴露本地文件、关系数据库、Slack 频道、GitHub 仓库,甚至你自己的内部 CRM。Server 既可以本地启动(stdio 模式),也可以部署成远程服务(HTTP 模式),通过能力声明告诉 Client:"我能提供这些资源、能跑这些工具、能套这些提示词模板"。

三类原语则规定了 Server 能给模型什么:Resources 是只读的、结构化或非结构化的数据上下文,比如一份 README、一张表、一段日志;Tools 是模型可以主动调用的函数,通常带有副作用,比如发邮件、建工单、改配置;Prompts 是预置的提示词模板,通常带参数化插槽,用户可以一键触发,也可以由模型在合适的时机引用。规范里特别强调一点:Tools 是否被调用、最终产生什么效果,始终由模型自主决定——MCP 不强制任何执行路径。

三、协议工作流:从连接到调用的一次完整生命周期

把 MCP 的运行机制拆开看,大致有五个阶段:能力发现、协议握手、消息交换、通知推送、终止清理。

能力发现发生在连接建立初期。Client 向 Server 发送 initialize 请求,双方协商协议版本、客户端能力(如是否支持 roots、sampling、elicitation)和服务端能力(如提供哪些 Resources、Tools、Prompts)。握手完成后,Client 还会主动调用 notifications/initialized,宣告自己准备就绪;之后才是正常的消息交换。

在消息交换阶段,规范定义了请求-响应和单向通知两种模式。请求-响应要求 Server 在合理超时内返回结果或错误;通知则是单向的,不需要确认。Tools 的调用采用前者,资源变更、进度更新这类事件则走后者。所有消息体都是结构化的 JSON 对象,遵循 JSON Schema 校验,确保跨语言实现的兼容性。

通知推送是 MCP 区别于传统 RPC 的亮点之一。Server 可以主动告诉 Client:"我监听的某个目录有文件变动了"、"这个工单状态从 open 变成 closed 了"。配合订阅/取消订阅原语,Agent 不必反复轮询,就能在外部世界变化时拿到增量更新——这对长时运行的 Agent 至关重要。

最后是终止清理。规范要求任一方都能主动发起关闭,关闭前应尽量完成在途请求的清理,避免半连接状态泄漏资源。这一条看似琐碎,却是把 MCP 跑进生产环境时最容易踩坑的地方。

四、传输层与安全:stdio、HTTP+SSE、Streamable HTTP

传输层是 2025-06-18 版规范变化最大的部分。早期 MCP 主要依赖 stdio 模式:Host 启动 Server 子进程,通过标准输入输出交换 JSON-RPC 消息。这种方式部署简单、天然隔离,但无法跨机器,也难以做水平扩展。

为此规范引入了 HTTP+SSE 模式:Client 通过 HTTP POST 发请求,Server 通过 Server-Sent Events 流式回推响应和通知。适合远程工具调用、需要长连接监听的场景。再往后,2025-06-18 版进一步演进出 Streamable HTTP,统一了 HTTP 传输语义,允许 Server 在同一个端点上既支持普通 HTTP 响应,也支持流式输出,大幅简化了多租户部署和鉴权集成。

安全方面,规范明确把鉴权和授权从协议核心剥离,交由传输层处理。这意味着当 MCP 跑在 HTTP 上时,应当复用现有的 OAuth 2.0、JWT 或 mTLS 机制,而不是发明一套新的鉴权协议。同时规范要求 Server 不得在未授权情况下调用敏感操作,且任何工具调用都必须可追溯——这两个原则直接借鉴了 LSP(Language Server Protocol)多年积累的工程经验。

五、实战:搭一个本地 MCP Server

理论看完了,接下来动手。假设我们要让 Claude Desktop 能够读取本地一个 Markdown 笔记目录,并按用户要求新建笔记。只需写一个几十行的 MCP Server。

首先初始化项目并安装官方 SDK(以 Python 为例,TypeScript、Go、Java、Kotlin、C# 等都有官方实现):

uv init mcp-notes && cd mcp-notes
uv add "mcp[cli]"

接着在 server.py 中声明能力:

from mcp.server import Server
from mcp.types import Tool, TextContent

app = Server("notes")

@app.list_tools()
async def list_tools() -> list[Tool]:
    return [Tool(name="read_note", description="按文件名读取笔记", inputSchema={...}),
            Tool(name="write_note", description="写入或新建笔记", inputSchema={...})]

@app.call_tool()
async def call_tool(name, arguments): ...

然后在 Claude Desktop 的配置文件中登记这个 Server:

{
  "mcpServers": {
    "notes": {"command": "uv", "args": ["run","server.py"]}
  }
}

重启 Claude Desktop 后,模型就能在对话中看到 read_note 和 write_note 两个工具。用户说"帮我看看上周的产品周报里写了什么",模型会自动调用 read_note;用户说"基于这次讨论整理一份会议纪要放到 notes 目录",模型则调用 write_note。这正是 MCP 想要达成的体验:协议透明、能力可发现、执行可追溯。

六、生态与未来:从协议到事实标准

一个协议能不能成为事实标准,不只看设计,更看生态。MCP 起步虽然只有半年多,但增长曲线相当陡峭。Anthropic 的官方发布说明里就提到,Block、Apollo、Replit、Codeium、Sourcegraph 等公司已经在早期接入或开发对应的 MCP Server;社区里也出现了 MCP.so、Glama 等专门的 Server 目录站点,让发现与共享变得像装 npm 包一样简单。

更值得关注的是 2025-06-18 版规范引入的两项新能力:Sampling 和 Elicitation。Sampling 让 Server 可以在自己的逻辑里反向调用模型完成子任务,比如先让模型把用户的自然语言转成 SQL,再去查数据库;Elicitation 则允许 Server 在执行前向用户请求缺失参数或确认敏感操作。两者叠加,意味着 MCP 不再只是"单向数据通道",而是朝着"双向协作代理"演化。

对于企业来说,MCP 的真正价值在于可治理。当所有 Agent 与外部系统的交互都走同一条协议时,审计日志、权限控制、流量计量都能集中在一层实现,不必每个 Agent 各写一套。这也是为什么越来越多公司开始把 MCP 视为 Agent 时代的"基础设施层"——就像 HTTP 之于 Web、SQL 之于数据库一样。

结语:把"会说话"变成"能办事"

回到标题那句"让 AI Agent 真正长出手和脚":MCP 的精髓不在于发明了什么新模型或新算法,而在于用一套克制、清晰、可扩展的协议,把模型的能力与现实世界的工具对齐。它把"集成问题"从 M×N 简化成 M+N,把每次接入从"私有定制"变成"标准插拔"。

对于个人开发者,现在正是接入 MCP 的好时机:规范稳定、SDK 齐全、Server 目录丰富;对于企业架构师,则值得提前规划:把内部 API、数据库、文件系统有计划地封装成 MCP Server,让未来的 Agent 生态可以直接复用,不必每接入一个新模型都重新造一遍轮子。

从"会说话"到"能办事",中间差的从来不是模型参数,而是一条被广泛遵守的协议。MCP 正在试图成为那条协议。