本篇关于模型上下文协议(MCP)的概述,讨论了其范围和核心概念,并提供了示例来演示每个核心概念。
范围
MCP包括以下项目:
MCP规范:一份MCP规范,概述了客户端和服务器的实施要求。
MCP SDK:针对不同编程语言实现MCP的软件开发工具包(SDK)。
MCP开发工具:用于开发MCP服务器和客户端的工具,包括MCP Inspector
MCP Server的实现:MCP Server的参考实现。
⚠️MCP仅关注上下文交换的协议,并不规定人工智能应用如何使用大型语言模型(LLM)或管理所提供的上下文。
MCP的概念
1. 参与者
MCP遵循客户端-服务器架构,其中MCP主机(如Claude Code或Claude Desktop等AI应用)与一个或多个MCP服务器建立连接。MCP主机通过为每个MCP服务器创建一个MCP客户端来实现这一点。每个MCP客户端与其相应的MCP服务器保持一对一的专用连接。
MCP架构中的关键参与者:
- MCP Host: 协调和管理一个或多个MCP客户端的AI应用程序
- MCP Client: 一个用于维护与MCP服务器的连接,并从MCP服务器获取上下文信息供MCP主机使用的组件
- MCP Server: 一个为MCP客户端提供上下文的程序
示例: Visual Studio Code充当MCP主机。当Visual Studio Code与MCP服务器(如 Sentry MCP Server )建立连接时,Visual Studio Code运行时将实例化一个MCP客户端对象,该对象负责维护与Sentry MCP服务器的连接。当Visual Studio Code随后连接到另一个MCP服务器(如 Filesystem MCP Server )时,Visual Studio Code运行时将实例化另一个MCP客户端对象来维护此连接,从而保持MCP客户端与MCP服务器之间的一对一关系。
⚠️注意:MCP服务器指的是提供上下文数据的程序,而不管它运行在哪里。MCP服务器可以在本地或远程执行。例如,当Claude Desktop启动 Filesystem MCP Server 时,服务器在同一台机器上本地运行,因为它使用STDIO传输。这通常被称为“本地”MCP服务器。官方的 Sentry MCP Server 运行在Sentry平台上,并使用Streamable HTTP传输。这通常被称为“远程”MCP服务器。
2. 图层
MCP由两层组成:
- 数据层: 定义了基于JSON-RPC的客户端-服务器通信协议,包括生命周期管理以及核心原语,如工具、资源、提示词和通知。
- 传输层: 定义了实现客户端与服务器之间数据交换的通信机制和通道,包括特定于传输的连接建立、消息框架和授权。
从概念上讲,数据层是内层,而传输层是外层。
数据层
数据层实现了基于 JSON-RPC 2.0 的交换协议,该协议定义了消息结构和语义。包括:
- 生命周期管理: 处理客户端和服务器之间的连接初始化、能力协商和连接终止
- 服务器功能: 提供核心功能,包括AI工具、上下文资源以及客户端交互模板的提示词
- 客户端功能: 获取用户输入、调用大模型,并将消息记录到客户端
- 实用功能: 提供其他功能,如实时通知、长时间操作的进度跟踪
传输层
传输层管理客户端和服务器之间的通信信道和身份验证。它处理MCP参与者之间的连接建立、消息框架和安全通信。
MCP支持两种传输机制:
- Stdio传输: 使用标准输入/输出流在同一台机器上的本地进程之间进行直接进程通信,在没有网络开销的情况下提供最佳性能。
- Streamable HTTP传输: 客户端到服务器的消息使用HTTP POST,可以为服务器发送的事件使用流式传输功能。此传输支持远程服务器通信,并支持标准HTTP身份验证方法,包括持有者tokens、API keys和自定义headers。MCP建议使用OAuth来获取身份验证tokens。
传输层从协议层抽象出通信细节,使所有传输机制都能使用相同的JSON-RPC 2.0消息格式。
3. 数据层协议
MCP的一个核心部分是定义MCP客户端和MCP服务器之间的模式和语义。开发人员可能会发现数据层是MCP中最有趣的部分。它MCP的一部分,它定义了开发人员从MCP服务器到MCP客户端共享上下文的方式。
MCP使用JSON-RPC 2.0作为其底层RPC协议。客户端和服务器相互发送请求并相应地做出响应。当不需要响应时,可以使用通知。
生命周期管理
MCP是一种需要生命周期管理的有状态协议。生命周期管理的目的是协调客户端和服务器都支持的功能。
原语
MCP原语是MCP中最重要的概念。它们定义了客户端和服务器可以互相提供什么。这些原语指定了AI应用间上下文信息的类型以及可以执行的操作范围。
MCP定义了服务器可以公开的三个核心原语:
- 工具: 为AI应用提供可以调用的函数(例如:文件操作、API调用、数据库查询)
- 资源: 为AI应用提供上下文信息的数据源(例如:文件内容、数据库记录、API响应)
提示词:可重用的模板,有助于构建与大模型的交互(例如:系统提示词、少量示例)
每种基元类型都有相关的方法用于发现( */list )、检索( */get ),在某些情况下还有执行( tools/call )。MCP客户端使用 */list 方法来发现可用的原语。例如,客户端可以首先列出所有可用的工具( tools/list ),然后执行它们。这种设计允许列表是动态的。
作为一个具体的例子,考虑一个提供数据库上下文的MCP服务器。它可以公开用于查询数据库的工具、包含数据库模式的资源以及包含few-shot示例的******提示词。
MCP还定义了客户端可以公开的原语。这些原语允许MCP服务器的作者构建更丰富的交互。
- Sampling: 允许服务器从客户端的AI应用调用大模型。当服务器的作者想要访问大模型,但希望保持模型的独立性,并且不在其MCP服务器中采用大模型SDK时,可以使用 sampling/complete 方法向客户端的AI应用访问大模型。
- Elicitation: 允许服务器向用户请求额外信息。当服务器的作者想要从用户那里获取更多信息或要求确认某个操作时,可以使用 elicitation/request 方法向用户请求其他信息。
- Logging: 服务器能够向客户端发送日志消息,进行调试和监控。
除了服务器和客户端原语外,该协议还提供了跨领域的实用原语,以增强请求的执行方式:
Tasks (Experimental): 持久的执行包装器,支持MCP请求的延迟结果检索和状态跟踪(例如:昂贵的计算、工作流自动化、批处理、多步骤操作)
通知
MCP协议支持实时通知,以实现服务器和客户端之间的动态更新。例如:当服务器的可用工具发生变化时,假如新功能变得可用或现有工具被修改时,服务器可以发送工具更新通知,告知客户端这些变化。通知以JSON-RPC 2.0的形式发送(不期待响应),并使MCP服务器能够向客户端提供实时更新。
欢迎加入我的【ima知识库】 从零开始学MCP