前言
最近刷视频、文章,频繁见到MCP这个词,发现对这个东西只是知道它叫做模型上下文协议,但是对于它定义了个什么东西,具体啥使用也不是很清楚,秉着来都来了总要带点什么回去的思想,在刷完视频、读完文章之后应该也要输出一篇文档来记录一下
一、什么是MCP
MCP (Model Context Protocol,模型上下文协议)定义了应用程序 和 AI 模型 之间交换上下文信息的方式,用一种相同的方式让各种数据源、工具和功能连接到AI模型工具上。其实也就是定义了一种标准,协议双方遵循该标准,同时模型侧对应的工具(像cline、cursor)只需要提供对该标准的支持,通过MCP就能够让模型工具外挂其他程序或者使用对应别的平台的功能

MCP通用架构
MCP 核心采用客户端-服务器架构,主机应用可以连接多个服务器:

- MCP Hosts: 如 Claude Desktop、IDE 或 AI 工具,希望通过 MCP 访问数据的程序
- MCP Clients: 维护与服务器一对一连接的协议客户端
- MCP Servers: 轻量级程序,通过标准的 Model Context Protocol 提供特定能力
- 本地数据源: MCP 服务器可安全访问的计算机文件、数据库和服务
- 远程服务: MCP 服务器可连接的互联网上的外部系统(如通过 APIs)
核心组件
协议层
- 处理消息的格式化、请求/响应的关联以及高级通信模式
传输层
- 传输层处理 clients 和 servers 之间的实际通信,MCP支持多种传输机制:
- Stdio 传输 (适合本地传输)
客户端将服务端作为子进程启动,服务端通过stdin、stdout进行消息接收和输出响应

- 通过http的SSE传输
与stdio相比,SSE传输中,服务端是作为一个独立进程运行,可以处理多个客户端连接。服务端必须提供SSE端点和http post 端点。当客户端连接时,服务端必须发送一个包含 URI 的 endpoint 事件,客户端使用该 URI 发送消息,所有后续客户端消息必须通过 HTTP POST 请求发送到此端点。服务端消息以 SSE 消息事件的形式发送,消息内容以 JSON 编码在事件数据中。

- 自定义传输
在客户端和服务端之间的通信,符合MCP定义的JSON-RPC消息格式以及生命周期要求即可
生命周期
- 初始化
- 消息交换
- 初始化后,支持以下模式:
- 请求-响应:客户端或服务器发送请求,另一方响应
- 通知:任一方发送单向消息
- 终止
- 任一方可以终止连接:
- 通过 close() 进行干净关闭
- 传输断开
- 错误条件
二、MCP有什么用
- 模型在没有依赖联网搜索以及使用其他的工具的情况下,能够做到的能力其实就取决于当时训练的数据集,像实时获取某些数据、对某个平台进行实时操作,这个是没法做到的。而有了MCP,我们就可以通过对应的平台提供的server、以及编码工具拥有的client做集成,让对应的编码工具能够进行对应的操作了,其主要的目的就是让AI模型能够快速使用其他工具,像获取当天的天气、拉取对应配置的git仓库代码、等等大模型原先不具备的功能。
其实说到增强模型能力,在没有MCP之前 大多使用的是Function Calling,它和MCP一样其实都是为了提高模型和外部的交互能力。但Funtion Calling平台依赖性比较强,不同的LLM平台对应的function call api实现存在差异,在切换不同模型时需要重写代码,相比之下MCP 就不限制特定的AI模型了,对此就会有很多现成的插件可以直接使用。

三、初步实践MCP
基于高德提供的mcp server + cursor 获取某地区的天气情况
- 先从高德开发者平台进行注册登录,并且创建对应的应用拿到对应应用的key
- 在cursor中进行添加。进入cursor之后,点击右上方齿轮,点击MCP,进入mcp设置。
json
{
"mcpServers": {
"amap-maps": {
"command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"],
"env": {
"AMAP_MAPS_API_KEY": "对应的key"
}
}
}
}
- 保存之后,看到如图所示,就可以开始使用了
- 可以看到当询问涉及到对应mcp功能的时候,cursor会帮我们进行对应的mcp调用
四、拓展
- SSE:基于 HTTP 的单向实时通信协议,服务器可主动向客户端推送数据(如日志、状态更新)。
- json-rpc 2.0
- 一种轻量级的远程过程调用(RPC)协议,基于 JSON 格式传输数据
- 核心作用
- 标准化通信:定义请求/响应的统一格式,确保模块间交互一致性。
- 支持多种操作:允许同步调用(等待结果)或异步通知(无返回)。
- 跨语言兼容:基于 JSON,易于不同语言模块集成(如 Python、C++、JavaScript)