// Request{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}// Response{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"search_flights","description":"Search for available flights","inputSchema":{"type":"object","properties":{"origin":{"type":"string"},"destination":{"type":"string"},"date":{"type":"string","format":"date"}},"required":["origin","destination","date"]}}]}}
数据层:定义了基于 JSON-RPC 的客户端-服务器通信协议,包括生命周期管理和核心原语,如工具、资源、提示和通知。 服务器功能:使服务器能够提供核心功能,包括用于 AI 操作的工具、上下文数据资源以及来自客户端和与客户端交互的模板提示。通知以 JSON-RPC 2.0 通知消息的形式发送(无需响应),使 MCP 服务器能够向已连接的客户端提供实时更新。
引言
我们第一篇讲了MCP的基础概念、MCP解决的问题以及MCP的架构,我相信大家已经对MCP有了一定的了解,那么接下来让我们深入MCP具体是如何实现的,这一篇我们的重点放在通信协议和数据传输上,让我们一起来看看吧
如果你对前面的内容感兴趣,可以点击这里跳转
MCP (Model Context Protocol) 技术理解 - 第一篇
MCP的层级
MCP由两层组成:
从概念上讲,数据层是内层,而传输层是外层。
MCP的数据层
数据层实现了基于JSON-RPC 2.0交换协议,该协议定义了消息结构和语义。该层包括:
该协议支持实时通知,从而实现服务器和客户端之间的动态更新。例如,当服务器的可用工具发生变化时(当新功能上线或现有工具被修改时),服务器可以发送工具更新通知,告知已连接的客户端这些变化。通知以 JSON-RPC 2.0 通知消息的形式发送(无需响应),使 MCP 服务器能够向已连接的客户端提供实时更新。
简单来说,就和我们配置中心Nacos、Apollo通过订阅-推送机制实现配置热更新差不多
MCP的传输层
传输层管理客户端和服务器之间的通信通道和身份验证。它处理连接建立、消息帧构建以及MCP参与者之间的安全通信。MCP支持两种传输机制:
传输层将通信细节从协议层中抽象出来,从而实现所有传输机制都采用相同的 JSON-RPC 2.0 消息格式。
ok,这就覆盖到我们上一篇的知识了,为什么MCP可以统一数据格式和传输,同时可以预制模板,原因就在于传输层抽象成了统一的标准,无论是什么传输机制,大家只要按照这一标准来传输数据即可实现互通。
通信协议与数据传输在MCP里面是什么样子的
我们来一个图来展示通信协议与数据传输在MCP的充当的角色
展示一下数据格式,我们以STDIO (标准输入/输出)为例子
连接建立后,客户端可以通过发送
tools/list请求来发现可用的工具。此请求是 MCP 工具发现机制的基础——它允许客户端在尝试使用工具之前了解服务器上有哪些工具可用然后服务端就返回可调用的tools(包括名称、描述、数据格式等)给客户端
// Request { "jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {} } // Response { "jsonrpc": "2.0", "id": 1, "result": { "tools": [ { "name": "search_flights", "description": "Search for available flights", "inputSchema": { "type": "object", "properties": { "origin": {"type": "string"}, "destination": {"type": "string"}, "date": {"type": "string", "format": "date"} }, "required": ["origin", "destination", "date"] } } ] } }小结
在这一篇中,我们主要讲解了MCP它实现的通信协议和数据格式,这就给我们前面MCP如何实现的抽象和数据如何传输的问题解了惑。
下一篇我们讲讲MCP的三大核心原语、生命周期等问题