模型上下文协议:开发者入门

120 阅读8分钟

爆!AI Agent集成新范式!一文读懂Anthropic力推的模型上下文协议 (MCP)。它通过JSON-RPC over HTTP,简化LLM与外部工具、数据源交互。支持LangChainOpenAI Agent SDK等,解锁Agent新姿势!

译自:Model Context Protocol: A Primer for the Developers

作者:Janakiram MSV

模型上下文协议 (MCP) 正逐渐成为将外部资源集成到自主工作流中的黄金标准。虽然开发者可以使用特定于大型语言模型 (LLM) 的机制来集成工具,但 MCP 正迅速成为集成的 REST 等效项。

本系列向 Python 开发者介绍 MCP 的基本原理及其架构。我将从 MCP 的动机和高级架构开始,然后详细介绍服务器和客户端的实践实现。

什么是模型上下文协议?

Anthropic 于 2024 年 11 月宣布的 MCP 是一种开放标准,旨在简化 AI 模型与外部工具、数据源和资源交互的方式。

Anthropic 将 MCP 引入作为 LLM 的通用工具连接器。它将其比作 USB-C 标准化硬件连接的方式,允许开发者通过单个协议将任何工具或数据源与其 AI 应用程序集成。通过采用与语言无关的方法并为 Python、TypeScript、Java、Kotlin 和 C# 提供 SDK,MCP 消除了对自定义的一次性集成的需求。

MCP 通过两个主要组件运行:服务器,用于公开工具、资源和提示;客户端,用于将 AI 模型连接到这些服务器。通信通过 HTTP 上的 JSON-RPC 处理,支持同步和异步工作流。安全性是不可或缺的,通过显式权限和本地优先设计确保隐私。MCP 已经得到主要 AI 平台的支持,并促进了快速的生态系统增长,使其成为构建强大的、具有上下文感知能力的 AI Agent 的基础技术。

LangChainOpenAI Agent SDKGoogle Agent Developer KitMicrosoft Copilot Studio 是原生支持 MCP 的一些框架和平台。

深入了解 MCP 服务器和 MCP 客户端

自主工作流需要两个基本要素才能自主运行:最新的数据和对现有系统的访问。数据作为上下文提供给 LLM,以提供事实信息,这有助于 LLM 做出决策。一旦做出采取行动的决定,它们就需要对系统的编程访问,这些系统通常作为 API 公开,并作为工具提供。 有趣的是,MCP 服务器和客户端可以在没有任何 LLM 依赖项的情况下运行。当客户端与 LLM 集成时,它构成了自主工作流的基础。

在 MCP 架构中,服务器抽象了对数据和工具的访问。例如,数据库可以作为资源成为 MCP 服务器的一部分。客户端具有对此资源的只读访问权限以获取数据。资源还支持参数以应用过滤器或限制与客户端共享的数据。例如,员工工资单信息是资源的理想选择。

此外,MCP 服务器还公开了工具,使客户端能够执行超出获取数据的操作。虽然资源支持只读访问,但工具支持调用操作数据或采取行动的 API。例如,调用 Stripe API 以完成支付交易是工具的绝佳选择。

除了资源和工具之外,MCP 服务器还可以充当预定义提示的中心。客户端可以检索这些提示并将它们发送到 LLM。这实现了一致且标准的提示存储库。

可以查询 MCP 服务器以检索它们公开的资源、工具和提示的列表。这充当基本的发现机制。总而言之,MCP 服务器可以向客户端公开资源、工具和提示。客户端做什么取决于开发者的想象力。

MCP 客户端位于宿主应用程序、聊天机器人或 Agent 中。宿主应用程序的典型示例是 Claude DesktopCursor AI。开发者可以使用与一个或多个 MCP 服务器交互的多个客户端创建一个自主应用程序。 我们可以创建一个不与 LLM 通信的 MCP 客户端。但是,该客户端可以成为 LLM 访问 MCP 服务器的强大管道。

在典型的工作流程中,主机应用程序(例如,聊天机器人或代理)连接到 MCP 服务器,检索可用的资源和工具,并以预期的格式将其传递给 LLM。

基于提示,LLM 可能会返回到主机以访问资源或通过 MCP 客户端调用工具。大多数代理框架(例如 OpenAI Agents SDK 和 Google ADK)通过使 LLM 和主机应用程序之间的往返过程透明化来抽象此功能。

MCP 服务器和 MCP 客户端之间的通信

MCP 架构最关键的方面是通信协议。MCP 服务器支持两种传输协议:STDIOSSE

第一种选择很简单,对许多开发人员来说是显而易见的。想象一下,通过传递几个参数来调用命令行工具,并将输出复制并粘贴到聊天机器人窗口中作为提示的一部分。

当使用 STDIO 作为传输协议时,MCP 客户端直接调用 MCP 服务器并传递所需的参数。然后,它捕获从服务器输出的内容(写入到控制台),并将其传递给主机应用程序。

在这种情况下,客户端和服务器共享同一个进程。服务器将简单地执行命令并立即退出。每次客户端调用服务器时,都会重复此过程。从本质上讲,客户端和服务器在进程内运行,不涉及任何远程调用或 RPC。当客户端和服务器位于同一台机器上,并且由于长时间运行的进程而没有延迟时,这种方式效果最佳。最重要的是,当使用 STDIO 传输时,MCP 服务器和客户端共享 1:1 连接。

MCP 支持的第二种传输协议是服务器发送事件 (SSE)。它使服务器能够通过单个、长期的 HTTP 连接将实时更新推送到客户端。一旦客户端启动连接,服务器就会在事件发生时流式传输数据,从而无需重复轮询。这种方法对于诸如实时新闻提要或通知之类的应用程序特别有效,在这些应用程序中,更新主要从服务器流向客户端。

与 REST 相比,SSE 提供了更低的延迟和更高的效率,因为 REST 需要客户端重复轮询服务器以获取新数据,从而增加了开销和延迟。SSE 还提供自动重新连接,并且可以与大多数防火墙无缝协作,从而使其在实时场景中更加强大。

MCP 使用 SSE 而不是 WebSockets 进行远程通信,主要是因为 SSE 为只需要服务器到客户端流式传输的场景提供了更简单、更强大的解决方案。SSE 通过标准 HTTP 运行,从而更易于与防火墙和受限网络配合使用。它还允许服务器将实时更新推送到客户端,而无需管理全双工 WebSocket 连接的复杂性。

在 MCP 中,客户端到服务器的通信通过 HTTP POST 请求处理,而 SSE 处理从服务器到客户端的流式更新,这与 AI 工具和资源通知的典型交互模式相匹配。与双向且通常更复杂的 WebSocket 协议相比,这种方法减少了开销,简化了实现,并提高了与现有基础架构的兼容性。

虽然 SSE 是通信技术,但 JSON-RPC 是 MCP 使用的有线协议。JSON-RPC 是一种轻量级、无状态协议,专为远程过程调用而设计,非常适合 AI 工作流程中所需的快速、动态交换。

在 MCP 中,每个交互(例如,调用工具、获取数据或列出可用功能)都编码为 JSON-RPC 消息,其中包括方法名称、参数和用于跟踪响应的标识符。这种方法允许 MCP 客户端和服务器无缝通信,而不管其底层实现语言如何,并确保所有请求、响应和通知都遵循可预测的、可互操作的格式。通过构建在 JSON-RPC 之上,MCP 简化了集成,支持错误处理,并允许开发人员创建灵活的、可组合的代理工作流程,这些工作流程可以与各种外部工具和资源进行交互。

与 STDIO 传输协议不同,SSE 可以支持由单个 MCP 服务器同时服务的多个客户端。当 MCP 服务器远程托管在平台即服务 (PaaS) 和无服务器运行时等环境中时,这非常有用。