一个开放标准,把 AI 模型和外部数据、服务连接起来,让大语言模型能以一致、安全的方式发起结构化的 API 调用。
Model Context Protocol(MCP)是一个开放标准,它在 AI 模型和外部数据、服务之间架起桥梁,让大语言模型(LLM)能够以一种一致、安全的方式发起结构化的 API 调用。
本文将介绍 MCP、解释它为什么对连接 AI 系统有价值、把它和现有方案(如 ChatGPT 插件、手写 API 集成)做对比,并深入讲它最近新增的基于 OAuth 的认证支持。文中还会看一点代码,看看 MCP 实际是怎么运转的。
MCP 充当 AI 工具与外部服务之间的通用适配器(universal adapter),免去为每个工具或 API 单独写集成代码的麻烦。就像 USB-C 统一了各种设备之间的连接方式一样,MCP 为 AI 模型提供了一套统一的方法,去调用外部函数、获取数据、或使用预定义的提示词。
它的核心是:用一个接口,连接许多不同的系统(one interface that connects to many different systems)。
MCP 本质上是 AI 应用与外部工具/数据源之间的一个通用适配器。它定义了一套公共协议(构建在 JSON-RPC 2.0 之上),让 AI 助手能以结构化的方式去调用函数、拉取数据、或使用来自外部服务的预定义提示词。
过去每个 LLM 应用都得为每一个 API 或数据库写定制代码;有了 MCP,所有交互都用同一套标准化的「语言」来进行。MCP 这一层让 AI 应用能安全地访问、并与外部数据源和工具交互,充当 LLM 与各类数据库、应用或 API 之间的桥梁,无需大量定制编码就能实现无缝集成。
如果已经存在一个针对 Google Drive 或某个 SQL 数据库的 MCP 服务器,那么任何兼容 MCP 的 AI 应用都能连上去,立刻获得相应能力——无需自己重写一遍。
MCP 用一套客户端-服务器架构来实现上述能力。AI 驱动的应用(比如聊天机器人、IDE 助手或智能体)充当 host(宿主),并运行一个 MCP client(客户端)组件;而每一个外部集成则作为一个 MCP server(服务器)来运行。
服务器通过 MCP 协议对外暴露各种能力(比如函数、数据资源、或提示词模板),客户端连接到它来使用这些能力。
这种分离意味着 AI 模型不会直接和 API 通信;相反,它要经过 MCP 客户端/服务器之间的握手(handshake),由这套握手来给信息交换定结构。
在传统做法里,把一个 AI 模型连到外部数据或动作上既繁琐又零散。开发者往往得为每个想让模型用的 API 或数据库写一次性的集成代码,还要分别处理各自不同的认证、数据格式和错误处理。MCP 通过标准化这些交互改变了局面。主要好处包括:
有了 MCP,你可以接入新能力,而不必每个都从零定制编码。如果已经有一个针对某服务(比如 Google Drive 或 SQL 数据库)的 MCP 服务器,任何兼容 MCP 的 AI 应用都能连上它、立刻获得那项能力。这对自动化是个巨大的胜利——AI 智能体可以按需拉取文档、查询数据库、调用 API,只要加上对应的服务器即可。这就像有一个现成的「插件」库,而且它们都说同一种语言。MCP 服务器是一种轻量级程序,通过标准化协议暴露特定能力,充当(例如 Cursor)与各种外部工具或数据源之间的中介。
MCP 让 AI 表现得更自主。智能体不再受限于自身内置的知识,而能主动去检索信息、在多步骤工作流里执行动作。
一个成熟的智能体可能用 MCP 先从 CRM 收集数据,再通过通讯工具发一封邮件,然后在数据库里记一条记录——全部在一条顺畅的链路里完成。
通过支持流畅、有上下文感知的多步交互,MCP 帮 AI 智能体更接近真正的「自主任务执行」。正如有观察者所说:MCP 通过给 AI 提供对真实世界工具和数据的标准化访问,把它从一个孤立的「大脑」变成了一个多才多艺的「行动者」。
因为 MCP 充当通用接口,开发者就避免了维护一堆各自独立的集成所带来的碎片化。一旦应用支持了 MCP,它就能通过单一机制连接到任意数量的服务。这大幅减少了每次想让 AI 用一个新 API 时所需的手动配置。团队可以专注于更高层的逻辑,而不是第 10 次重新发明连接代码。正如 Anthropic 所说,MCP 用一个更简单、更可靠的单一协议取代了碎片化的集成。
MCP 在各个工具之间强制统一了请求/响应格式。这意味着你的 AI 应用不必为服务 A 处理一种 HTTP 响应、又为服务 B 处理另一种 XML……模型的输出(函数调用)和工具返回的结果,都以一种统一的 JSON 结构传递。这种一致性让调试和扩展都更容易,也让你的集成逻辑「面向未来」——即便你换了底层的模型厂商,MCP 对工具的接口依然不变。
和简单的 API 调用不同,MCP 支持在模型和工具之间维持上下文与持续的对话。MCP 服务器除了工具(Tools)之外,还能提供 Prompts(针对特定任务的预定义提示词模板)和 Resources(像文档这样的数据上下文)。
这意味着 AI 不仅能「调一个 API」,还能摄入参考数据、或按服务器引导走完复杂的工作流。该协议被设计成支持丰富的交互,而不只是一次性的查询。这在编程助手(AI 可能通过 MCP 与开发环境反复迭代)或需要和多个数据源来回交互的复杂决策任务里尤其有用。
简而言之,MCP 给增强 LLM 带来了一种可扩展、即插即用的方式。它让 AI 系统安全地接入它们所需的「实时」数据和动作,而不必每个开发者都重新造轮子。早期采用者已经为 Google Drive、Slack、GitHub、数据库等工具构建了服务器——展示了 AI 智能体如何用 MCP 与企业内容仓库、DevOps 工具和其他真实系统协作。
MCP 遵循一个清晰的客户端-服务器架构:
所有交互都通过标准化的 JSON-RPC 消息进行,维持一种安全、结构化的信息交换。
例如,要列出可用的工具,MCP 客户端会发出这样一个请求:
// 请求:列出工具
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
服务器会回复一个结构化的 JSON,列出这些工具(每个都带有名称、描述、和输入 schema)。比如,一个服务器可能对外宣告一个 get_weather 工具,并描述它需要哪些输入:
// 响应:工具清单
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{ "name": "get_weather",
"description": "Retrieves weather data.",
"schema": { "location": "string" } }
]
}
之后,当 LLM 决定要用某个工具时,客户端会发起一次调用来执行它。MCP 服务器执行该函数,并以结构化的 JSON 响应返回结果。宿主应用里的 MCP 客户端随后可以把这个结果喂回到模型的上下文或回复中。
实践中,宿主应用居中调度整个过程:它把 LLM 的意图(常常来自模型的函数调用输出)翻译成一个 MCP 请求,再把服务器返回的结构化结果传回给 LLM。这种双向交换是安全且受控的——模型只能调用服务器暴露出来的那些特定工具,而所有进出的数据都走既定的协议。
搭建和部署 MCP 服务器,是利用 MCP 做 AI 集成时的关键一步。MCP 服务器充当 AI 模型与外部数据源/工具之间的中介,实现无缝的通信与数据交换。
MCP 的一大亮点是服务器开发上的灵活性:开发者可以使用任何能向 stdout 打印、或能提供一个 HTTP 端点的编程语言,从而自由选择自己偏好的语言和技术栈。
搭建 MCP 服务器时,架构和设计很重要。MCP 遵循客户端-服务器架构,一个宿主应用可以连接多个服务器。这种架构带来可扩展性和灵活性,让开发者能设计出处理各种任务和功能的 MCP 服务器,比如数据处理、工具集成、或 AI 模型管理。
MCP 服务器可以部署在多种环境里,包括本地开发环境、云平台、或本地自建(on-premises)基础设施。例如,Cloudflare 提供了一个稳健的平台来构建和部署远程 MCP 服务器,让管理和扩展 MCP 部署更容易。这种灵活性确保 MCP 服务器可以按不同应用和环境的具体需求来量身定制——无论是用于开发的本地搭建,还是用于生产的云端方案。
通过聚焦于良好的架构设计、并利用 MCP 的灵活性,开发者可以创建出强大、可扩展的 MCP 服务器,增强 AI 模型的能力,让它们与外部数据源和工具无缝交互。
MCP 客户端和工具是整个 MCP 生态里的核心组件。
客户端是连接到 MCP 服务器、以访问外部数据源或工具的应用。这些客户端可以用各种编程语言和框架来构建,比如 Python、JavaScript 或 Java,给开发者按需挑选最合适工具的灵活性。
工具则是向 MCP 客户端提供特定能力或功能的软件组件。它们可以和 MCP 服务器集成,以启用数据处理、AI 模型管理、或工具集成等功能。
MCP 工具的例子包括 Claude Desktop(提供与 AI 模型交互的聊天界面)和 Cursor(提供用于扩展 AI 能力的插件系统)。
开发者也可以构建自定义的 MCP 客户端和工具,来满足特定的用例或需求。这种灵活性让 MCP 生态里有了创新和实验的空间——无论是一个专门做数据分析的工具,还是一个集成多个 MCP 服务器的客户端应用,可能性都非常广。借助 MCP 客户端和工具,开发者能创建出稳健、多用途的应用,充分发挥 AI 模型的潜力,让它们无缝地与各种外部数据源和工具交互。
| MCP | 自定义集成 | ChatGPT 插件 | LangChain 等框架 | |
|---|---|---|---|---|
| 接入速度 | ✅ 快,即插即用 | ❌ 慢,需定制代码 | ⚠️ 中等,专有 | ⚠️ 中等,需定制代码 |
| 认证方式 | ✅ OAuth 标准 | ❌ 手动管理 API Key | ⚠️ 插件各自的 OAuth | ❌ 因实现而异 |
| 交互类型 | ✅ 持续、上下文丰富 | ❌ 临时性交互 | ❌ 单次性交互 | ⚠️ 上下文受限 |
| 开放标准 | ✅ 是 | ❌ 否 | ❌ 否 | ⚠️ 取决于框架 |
最常见的传统做法,是为每个服务写定制代码,并把凭证(API key 或 token)交给 LLM 去用那些集成。比如,你写一个 Python 函数去查某个 API,让 LLM 有能力调用这个函数,然后在后端手动处理那个 API key。这种做法劳动密集、难以扩展——每个新数据源都要新代码,每个环境都得安全地管理 API key,常常导致系统很脆弱,因为每个集成都是独一无二的。
相比之下,MCP 把这些交互集中化、标准化了:AI 智能体只需要处理 MCP 协议,任何 MCP 服务器(对应任何服务)都能即插即用地工作。新增服务器完全不需要改客户端的代码。而且 MCP 为认证提供了正式结构(后文会讲),让「把 API key 交给 AI」不再是临时拼凑,而是通过一个安全协议来完成。
2023 年,OpenAI 为 ChatGPT 推出了插件系统,允许模型调用由 OpenAPI 规范定义的外部 API。这是迈向「标准化工具使用」的早期一步,但有局限:每个插件本质上是它自己的小型集成(有自己的 API schema 和认证),需要逐个构建/托管;而且只有特定平台(比如 ChatGPT 或 Bing Chat)能用这些插件,因为它是个专有方案。插件大多还是单次调用——模型调一个 API、拿到信息,没有持久连接或持续交换。
可以把 ChatGPT 插件想象成一个封闭工具箱里的专用工具,而 MCP 则是一个开放标准的工具包,任何开发者或 AI 平台都能使用。
MCP 的不同之处在于它是开放且通用的(不绑定单一厂商或界面),并且支持丰富的双向交互和持续上下文。MCP 标准化的认证(尤其是 OAuth)也意味着,它能以比 ChatGPT「逐插件 OAuth 流程」更统一的方式,处理对用户数据的安全访问。总结:ChatGPT 插件展示了「为 LLM 标准化 API 访问」的价值,但 MCP 把它推得更远——做成了开放协议,并让 AI 与服务之间能进行持久的「对话」。
在 MCP 之前,很多开发者用 LangChain 这类框架给模型配工具。在这类设置里,你定义一组工具函数(带描述)和智能体的提示逻辑,让 LLM 能决定去用它们。这能用,但每个工具背后仍需定制实现——LangChain 最终在它的库里维护了数百个工具集成。本质上,LangChain 提供的是一个面向开发者的标准(一个 Python 类接口),用来把工具集成进智能体的代码库,但没有给模型在运行时动态发现新工具的能力。
MCP 和这些框架是互补的,它把标准化的位置转移到了「面向模型(model-facing)」。有了 MCP,智能体可以发现并使用任何 MCP 服务器提供的工具,哪怕智能体的代码事先没有显式包含那个工具。事实上,LangChain 已经增加了支持,可以把 MCP 服务器当作又一个工具来源——意味着用 LangChain 构建的智能体能轻松调用 MCP 工具,借力日益增长的 MCP 服务器生态。
区别在于,MCP 把接口正式化为一套协议(JSON-RPC、带元数据等),让它更容易插进不同环境,而不仅是 Python 框架。类似地,OpenAI 原生的函数调用(function calling)功能可以看作处理一次函数调用的格式(模型输出一个 JSON 函数调用),而 MCP 处理的是这次调用的执行(以标准化方式)。两者常常协同工作:LLM 产出一个结构化调用,MCP 客户端/服务器执行它并返回结果,合起来就实现了无缝的工具使用。
说到底,MCP 不是第一个尝试把 LLM 和外部 API 连起来的方案——但它从过去那些做法(插件、工具库等)中吸取经验,把解决方案统一了起来。它提供了一个开放、模型无关(model-agnostic)的协议,简化了集成和认证。尤其在安全和认证方面,MCP 的设计(带 OAuth 支持)避免了「逐插件 key」的拼凑、也避免把原始 API key 直接交给模型;认证可以作为协议的一部分,以一致、标准化的流程来处理——这相比现状是一大进步。
让我们一步步走一遍典型的 MCP 交互,把它的运作方式坐实,并看一点代码。设想我们有一个 AI 助手,想用一个提供了一组工具的 MCP 服务器(比方说,一个假想的「Neon」数据库服务)。高层流程如下:
宿主应用(AI 助手)初始化一个 MCP 客户端,并与服务器建立连接。取决于服务器位置,这可能是通过本地进程(stdio),也可能是远程 HTTP 流(SSE)。底层上,客户端会发一个 initialize 消息,去握手协商协议版本和能力。
客户端接着查询服务器提供了什么。如前所示,它可能发送 {"method": "tools/list"},拿回一份工具定义列表。助手可以用它来告知 LLM(例如把工具列表放进系统提示,或通过模型的函数 schema,取决于实现)。用 SDK 的话,这可能就是一行代码:
const tools = await mcpClient.request(
{ method: 'tools/list' },
ListToolsResultSchema
);
它返回一个结构化的工具列表。每个工具条目都有名称、描述、和输入的 JSON schema,这样 AI 就知道自己能做什么。
当用户问的事情需要外部动作时,LLM(常通过提示工程或函数调用能力)判断应该用某个特定工具。例如用户问:「AAPL 股票最新价格是多少?」 LLM 意识到它应该调 get_current_stock_price(company="AAPL", format="USD")。宿主应用捕获这个意图(例如 OpenAI 的函数调用 API 会以 JSON 返回一个函数名和参数)。
客户端此时向服务器发一个 tools/call 请求,带上选定的工具名和参数。用 SDK 看起来像这样:
const result = await mcpClient.request({
method: 'tools/call',
params: { name: toolName, arguments: toolArgs }
}, CallToolResultSchema);
这会让服务器在它那一侧执行该工具的处理逻辑。服务器可能在调一个外部 API、执行一次数据库查询、或这个工具封装的任何逻辑。结果(可能是个简单值,也可能是复杂的 JSON 对象)会在 MCP 响应的 result 字段里送回。
MCP 客户端收到工具的输出。现在宿主应用可以把它整合回 AI 的回复里。在许多智能体设置中,模式是把结果注入对话、让模型继续。例如助手随后给出:「AAPL 的当前股价是 $173.22(USD)。」 如果用的是自动循环,结果可以喂给模型(也许作为一条系统消息附加进对话,比如「get_current_stock_price 的结果:……」),模型就能带着这条信息继续回答用户。
下面是一个用 Anthropic 的 Claude(原生支持工具使用)调用工具、并在对话里用上结果的简化示意:
// 1. 把用户提示连同可用工具上下文发给 LLM const response = await anthropicClient.complete({ prompt: "User: Can you list my projects?\nAssistant: ", model: "claude-3.5", tools: tools // 来自 MCP 服务器的工具列表 }); for (const msg of response.messages) { if (msg.type === 'tool_use') { // 2. LLM 决定使用一个工具 const { name, args } = msg; // 3. 通过 MCP 调用该工具 const toolRes = await mcpClient.request({ method: 'tools/call', params: { name, arguments: args } }); // 4. 注入工具结果,恢复 LLM await anthropicClient.send({ role: 'system', content: `Tool result: ${toolRes.result}` }); } else { // 5. 处理普通的 LLM 回复(工具结果应已整合) console.log("Assistant:", msg.content); } }
现实中,框架会替你处理掉很多这类工作,但上面的伪代码勾勒了 MCP 如何嵌进这个循环。
MCP 提供的是工具执行的标准化调用/响应层,AI 智能体代码可以挂接上去。无论你用的是 OpenAI、Anthropic 还是别的 LLM,MCP 都保持不变——它是模型意图与外部动作之间的「胶水」。
用上 MCP,开发者就得到一条清晰、结构化的流水线来扩展 AI 能力。代码更易维护(因为你到处调的是通用的 mcpClient.request,而不是各处服务专属的代码),AI 也更强大(因为它能接入任何 MCP 连接的服务)。调试也更容易——你可以监控 JSON-RPC 消息,精确看到请求了什么、返回了什么,而不必从模型生成的文本里去揣摩线索。
当 MCP 最初出现时(2024 年末),它提供了用于工具与数据交换的核心协议,但缺少一套标准化的认证机制来连接远程服务器。
实践中,早期的 MCP 演示和实现往往要求把 MCP 服务器跑在本地或可信环境里,那里认证不是大问题(因为 AI 和服务器跑在同一台机器上)。例如,开发者可以在自己的 localhost 上跑一个 Google Drive 的 MCP 服务器、配一个预先拿到的 token,然后让 AI 应用指向它。但要在互联网上、或与第三方服务一起用 MCP,在没有正式认证流程时就很麻烦。
许多最初的 MCP 服务器假定用户会在启动时手动把凭证或 API key 提供给服务器。举例来说,Anthropic 的快速上手指南就建议:通过配置或命令行提供你自己的凭证(API key、token)来运行预构建的服务器。这意味着服务器本身能拿到你的 key,而 MCP 客户端只是信任那个服务器。这在个人或单用户场景下能用,但对多用户应用或云托管的智能体来说扩展性很差。
当时没有一个标准握手,能让 AI 智能体说出「嘿,我被授权代表用户 X 访问这个服务,这是我的凭证」。本质上,早期 MCP 客户端除了带外手段(out-of-band,比如预先共享一个 token、或干脆不带认证地运行)之外,无法向 MCP 服务器认证自己。
这是个显著的局限——MCP 被设计成开放、基于互联网的,但没有认证标准,安全的远程使用就被掣肘了。
认证标准的缺失意味着 MCP 客户端无法自行安全地连接到任意服务器。你要么把 client ID / API key 硬编码进客户端(在分布式应用里并不理想),要么就不带认证地运行、并假定只有被授权的用户才能触达服务器(通常靠把它保持在本地)。显然,要让 MCP 发挥全部潜力(例如以安全方式把 AI 智能体连到一个云托管的数据源),需要一个更好的办法。好消息是,社区认识到了这点,并着手把基于 OAuth 的认证内建进 MCP。
为了解决最初的认证局限、并增强安全连接,MCP 采纳了 OAuth 2.0——一个被广泛认可且稳健的认证标准。OAuth 2.0 提供了一个安全、可扩展的框架,让 MCP 客户端能安全地与远程服务器、云托管资源、和多用户环境交互。把 OAuth 2.0 整合进 MCP 的关键组件和好处包括:
MCP 支持动态客户端注册,允许客户端自动向 OAuth 服务器注册。这免去了手动配置客户端或硬编码凭证的需要,大幅简化了开发者的部署。
MCP 利用标准化的元数据 URL(遵循 OAuth 的发现协议),让客户端能自动发现 OAuth 端点。这降低了配置开销,让 MCP 部署更容易、更灵活。
客户端安全地获取精确贴合用户权限和访问范围(scope)的 OAuth token。这确保客户端只访问用户明确许可的资源,在多用户和云环境中改善了安全性与合规性。
OAuth 2.0 的设计天然支持多个并发用户和服务,正好补上了 MCP 一个重要的早期短板。应用现在可以无缝地为大量用户同时处理授权流程——这对大规模云端采用至关重要。
调试和排错是使用 MCP 服务器与客户端时的关键环节。MCP 提供了多种工具和技术来做调试排错,确保开发者能高效地定位并解决问题。这个过程里的一个关键工具是 MCP Inspector——一个面向 MCP 服务器的交互式调试工具。
MCP Inspector 让开发者能测试和检查 MCP 服务器,定位并解决 MCP 服务器集成中的问题。这个工具提供了 MCP 客户端与服务器之间交互的详细视图,让你更容易锁定问题、理解背后的根因。此外,MCP 还提供了一份全面的调试指南,列出常见问题及解决方案,帮助开发者快速排查和解决问题。
调试 MCP 服务器时,要把系统的架构和设计纳入考量。开发者应该识别出导致问题的具体组件或模块,并用 MCP Inspector 这类工具来诊断和解决。通过对调试采取系统化的方法、并善用现成工具,开发者能确保自己的 MCP 集成稳健可靠。
MCP 在各行各业和不同领域都有多种真实应用。它的主要用例之一是在 AI 集成中——MCP 让 AI 模型与外部数据源/工具之间实现无缝的通信和数据交换。MCP 可用于多种应用,比如:
MCP 的灵活性和适应性,让它成为想在应用中利用 AI 和机器学习的开发者与组织眼中一个有吸引力的方案。通过为 AI 模型提供一个标准化接口去与数据源和工具交互,MCP 让 AI 生态里有了创新和实验的空间。这种标准化的方式不仅简化了集成过程,也确保 AI 模型能拿到它们所需的数据和工具,以发挥最佳表现。
总而言之,MCP 为 AI 应用打开了一片广阔天地,让开发者能创建更集成、更自主、更可扩展的解决方案。无论是用 AI 聊天机器人增强客户服务,还是在工业场景里自动化复杂工作流,MCP 都提供了把这些创新变为现实所需的工具和框架。
MCP 是 AI 开发中一个令人兴奋的进展,因为它让开发者能安全、高效地把我们日益智能的语言模型,连接到此前难以连接的、庞大的软件与数据世界。通过引入一个公共协议,MCP 让我们能构建更集成、更自主、更易扩展的 AI 系统。我们不必再为每个新工具写一次性插件、或给模型一堆脆弱的指令,而是拥有一个连贯的框架,让 AI 智能体能在适当的监督与安全下,即时地发现并使用工具。
虽然这个协议仍在演进(认证是最近才加上的,标准化的服务器发现等更多特性也在路上),但很清楚:MCP——或类似它的东西——将在下一代 AI 应用里扮演关键角色。对开发者来说,现在正是熟悉 MCP 概念的好时机。无论你是在给聊天机器人注入公司专属知识,还是在构建一个自动化工作流的 AI 智能体,MCP 都能通过帮你处理工具集成的「管道工程」,省下时间和麻烦。而且因为它是个由不断壮大的社区(以及 Anthropic 这样的公司)支持的开放标准,它很可能成为未来 AI 基础设施中的一块基石。
总之,MCP 让我们走向一个这样的世界:AI 助手不再是各自为政的「孤独天才」,而是装备齐全的「工程师和助手」——能与众多系统对接、遵循流程、按需获取或创建信息,全部通过一个统一、安全的接口完成。这是一个有力的愿景,而随着 MCP 的到来,它正在迅速成为现实。
在 Stytch,我们专注于轻松解决远程 MCP 服务器的认证问题,让客户能轻松为自己的应用搭起 MCP 服务器,允许终端用户向 MCP 客户端提供有权限的访问。(原文出处:Stytch — Connected Apps for MCP servers)