模型控制协议 (MCP) 是一种通信协议,旨在促进 LLM 驱动的应用程序与其支持服务之间的交互。本文档解释了 mcp-go 库中实现的 MCP 协议的基本组成部分、消息结构和通信模式。有关资源(Resources)、提示(Prompts)和工具(Tools)实现的具体信息,请参阅相应的页面:资源、提示和工具。
来源: mcp/types.go1-3
MCP 协议遵循基于 JSON-RPC 2.0 的架构,旨在促进客户端和服务器之间的标准化通信。它提供了一种结构化的方式来管理 LLM 驱动的应用程序中的资源、执行提示和调用工具。
该协议是版本化的,最新版本在代码中指定为 LATEST_PROTOCOL_VERSION。
MCP 协议以 JSON-RPC 2.0 为基础,采用标准化消息类型处理请求、响应、通知和错误。
每种消息类型在协议中都有特定的用途
| 消息类型 | 目的 |
|---|---|
JSONRPCRequest | 由客户端或服务器发送以请求操作,需要响应 |
JSONRPCResponse | 作为对请求的回复发送,包含操作结果 |
JSONRPCError | 当请求失败时发送,包含错误详情 |
JSONRPCNotification | 异步发送,不需要响应 |
协议为不同的操作定义了特定的方法
在客户端和服务器能够有效使用 MCP 进行通信之前,它们必须经过初始化过程,以协商能力和协议版本。
在初始化过程中,客户端和服务器会交换有关其能力的信息
MCP 协议围绕几个核心组件构建
资源是客户端可以从服务器读取的数据片段。这些数据可以包括文件、数据库记录或任何其他形式的数据。协议提供了列出可用资源、获取资源模板以及读取特定资源的方法。
提示是用于生成 LLM 文本输入的模板。协议允许客户端列出可用的提示,并检索已填充参数的特定提示。
工具是服务器可以代表客户端执行的功能。协议提供了列出可用工具以及调用带参数的特定工具的方法。
MCP 协议支持多种通信模式
最基本的模式是请求-响应,即客户端发送请求,服务器作出响应。
通知是单向消息,不需要响应。它们可用于资源更新或日志记录等事件。
对于长时间运行的操作,协议支持进度通知。
来源: mcp/types.go360-375 mcp/utils.go128-150
该协议还支持取消进行中的请求。
MCP 中的错误处理遵循 JSON-RPC 2.0 规范,并使用标准化错误代码
| 错误代码 | 姓名 | 描述 |
|---|---|---|
| -32700 | PARSE_ERROR | 收到无效 JSON |
| -32600 | INVALID_REQUEST | 发送的 JSON 不是有效的请求对象 |
| -32601 | METHOD_NOT_FOUND | 方法不存在/不可用 |
| -32602 | INVALID_PARAMS | 无效方法参数 |
| -32603 | INTERNAL_ERROR | 内部 JSON-RPC 错误 |
MCP 协议旨在可扩展。客户端和服务器功能都包含一个 experimental 字段,可包含自定义扩展。
来源: mcp/types.go304-342 mcp/types.go90-101 mcp/types.go111-171
协议包含多项实用功能,以增强通信
对于可能返回大型列表的方法(例如列出资源或工具),协议支持基于游标的分页。
协议还支持具有不同严重级别的服务器到客户端日志记录。
mcp-go 仓库提供了 MCP 协议的 Go 语言实现,并附带用于创建和处理各种消息类型的实用函数。这些实用工具通过为常见操作提供类型安全的方法,使使用该协议变得更加容易。
来源: mcp/utils.go8-57 mcp/utils.go207-373
模型控制协议为 LLM 驱动的应用程序与其支持服务之间的通信提供了结构化框架。通过其标准化的消息格式和方法,它实现了以下功能:
该协议旨在可扩展,允许未来的增长和定制,同时保持一致的基础结构。
来源: mcp/types.go1-3