“ 网络协议的本质是一种有固定格式的规则约束。”
最近在研究MCP协议,由于之前深入了解过网络协议这一块,比如说TCP/IP,HTTP等,所以对MCP协议就比较好奇,于是就深入了解了一下。
刚开始了解MCP协议的时候就很奇怪一件事情,不管是TCP/IP协议,还是HTTP协议,都会有一个固定的报文格式;但在MCP的官方文档中并没有看到这个报文格式。只是简单介绍了其几个核心组件——hosts,client和server等。
所以就很好奇,MCP协议没有一个固定的格式,那它服务端和客户端是怎么通讯的,数据怎么解析的。
MCP协议的深入了解
从本质上来说,网络协议就是一种规则,只不过这个规则有固定的格式;就类似于我们发快递,发邮件一样,需要有收件人姓名,地址,电话等;而TCP/IP和HTTP这种网络协议就是严格按照这种规则设计的。
但在MCP协议中,这种规则好像并不存在;所以这些问题只能从MCP的官方文档中寻找答案。
思考一个问题,MCP协议是怎么进行数据传输的,也就是说在智能体中使用MCP协议,那数据怎么从智能体传输到MCP服务端?它的数据格式是什么样的,客户端应该怎么封装请求数据,服务端应该怎么解析数据?
从官方文档中我们了解到,MCP协议是整体建立在JSON-RPC2.0的基础之上;JSON-RPC2.0是一种轻量级无状态的远程调用协议,简单来说就是一种数据格式。而MCP使用JSON-RPC2.0作为协议层进行通讯,传输层可以使用http,sse,Streamable http等流式协议,以及本地开发测试使用的stdio协议。
而且,用户可以根据自己的需求自定义传输层协议,只需要上层使用JSON-RPC2.0格式即可;也就是说MCP对传输层协议是无感的。

这样做的好处就是,MCP协议完全屏蔽了底层网络协议的复杂性,开发者只需要关注应用层的协议即可,需要说明的是这里的应用层和TCP/IP网络模型中的应用层不是一个概念,在TCP/IP网络模型中HTTP协议属于应用层协议。
看到这里大家可能有疑问了,你这也没讲MCP协议的格式是什么样啊,或者为什么MCP协议没有固定格式。
其实,这里就是MCP协议比较强大的一个地方,MCP协议并不像传统的网络协议那样,严格约束协议的格式规则,而是提供了很大的灵活性;在使用JSON-RPC2.0屏蔽底层协议的基础之上;开发者可以在JSON-RPC2.0的基础之上,去自定义自己的MCP报文格式,只不过需要开发者自己实现服务端和客户端的报文解析功能;而MCP官方已经封装了一套基于JSON-RPC2.0的数据报文格式。
对我们普通开发者来说,只需要直接拿过来用就行了,而不用关心其底层的实现原理。MCP官方通过schema的方式抽象出MCP协议的格式对象,这样在上层应用中就可以直接获取到结构化的数据。

# JSON RPC的请求格式
{
jsonrpc: "2.0";
id: string | number;
method: string;
params?: {
[key: string]: unknown;
};
}
# JSON-RPC的响应格式
{
jsonrpc: "2.0";
id: string | number;
result?: {
[key: string]: unknown;
}
error?: {
code: number;
message: string;
data?: unknown;
}
}
MCP官方文档地址
https://modelcontextprotocol.io/introduction
(文:AI探索时代)