MCP Server概念
MCP Server 是一个中间层服务器,它主要负责处理和管理 AI 模型的上下文信息,确保模型能够高效且准确地理解和响应用户请求。它作为应用程序和AI模型之间的桥梁,优化了信息的传递和处理过程。
根据MCP协议定义,Server可以提供三种类型的标准能力,Resources、Tools、Prompts,每个Server可同时提供者三种类型能力或其中一种。
- Resources:资源,类似于文件数据读取,可以是文件资源或是API响应返回的内容。比如
- Tools:工具,第三方服务、功能函数,通过此可控制LLM可调用哪些函数。
- Prompts:提示词,为用户预先定义好的完成特定任务的模板。
MCP通信方式
MCP(Model Context Protocol)是一种为了统一大规模模型和工具间通信而设计的协议,它定义了消息格式和通信方式。MCP 协议支持多种传输机制,其中包括 stdio、Server-Sent Events(SSE) 和 Streamable HTTP。
Stdio 传输(Standard Input/Output)
stdio 传输方式是最简单的通信方式,通常在本地工具之间进行消息传递时使用。它利用标准输入输出(stdin/stdout)作为数据传输通道,适用于本地进程间的交互。
- 工作方式:客户端和服务器通过标准输入输出流(
stdin/stdout)进行通信。客户端向服务器发送命令和数据,服务器执行并通过标准输出返回结果。 - 应用场景:适用于本地开发、命令行工具、调试环境,或者模型和工具服务在同一进程内运行的情况。
Server-Sent Events(SSE)
SSE 是基于 HTTP 协议的流式传输机制,它允许服务器通过 HTTP 单向推送事件到客户端。SSE 适用于客户端需要接收服务器推送的场景,通常用于实时数据更新。
- 工作方式:客户端通过
HTTP GET请求建立与服务器的连接,服务器以流式方式持续向客户端发送数据,客户端通过解析流数据来获取实时信息。 - 应用场景:适用于需要服务器主动推送数据的场景,如实时聊天、天气预报、新闻更新等。
Streamable HTTP
Streamable HTTP 是 MCP 协议中新引入的一种传输方式,它基于 HTTP 协议支持双向流式传输。与传统的 HTTP 请求响应模型不同,Streamable HTTP 允许服务器在一个长连接中实时向客户端推送数据,并且可以支持多个请求和响应的流式传输。
不过需要注意的是,MCP只提供了Streamable HTTP协议层的支持,也就是规范了MCP客户端在使用Streamable HTTP通信时的通信规则,而并没有提供相关的SDK客户端。开发者在开发Streamable HTTP机制下的客户端和服务器时,可以使用比如Python httpx库进行开发。
- 工作方式:客户端通过
HTTPPOST向服务器发送请求,并可以接收流式响应(如JSON-RPC响应或SSE流)。当请求数据较多或需要多次交互时,服务器可以通过长连接和分批推送的方式进行数据传输。 - 应用场景:适用于需要支持高并发、低延迟通信的分布式系统,尤其是跨服务或跨网络的应用。适合高并发的场景,如实时流媒体、在线游戏、金融交易系统等。
MCP Server实现流程
在本教程中将带领大家一起实现一个类似于MCP官网的天气查询MCP Server,但是与官网的MCP示例不同的是,官网的天气查询仅仅支持美国的州市,无法查询中国城市的天气情况。所以,在本教程中,使用的是openweather的免费接口,实现全世界各地的一个通用天气查询MCP服务。
业务功能实现
进入OpenWeather官网(https://openweathermap.org/),然后使用自己的信息注册一个账号。

接着我们需要申请一个API Keys,用于后期接口校验。点击My APIKeys。

默认的情况下,会自动给你生成一个API Keys,你可以直接使用默认生成的API Keys,或者自己重新创建一个API Keys。

虽然两者都可以,但是建议大家直接使用默认的
API Keys即可,因为创建新的API Keys后,需要等5分钟左右才能生效。默认的API Keys只需要3分钟左右即可使用。
复制自己的API Keys后,点击菜单栏上的API即可开始选择自己所需要的服务。
需要注意的是,OpenWeather有很多关于天气的服务,但是并不是所有服务都是免费的,你需要根据他的描述,选择自己所需要的服务即可,在这里我们直接选择Current Weather Data接口,该接口是免费的。点击其对应的API doc。

该接口也有很多种请求方式,我们选择两种。
通过经纬度,请求对应经纬度的当前天气情况。

通过城市名称,查询对应城市名称的当前天气情况。

无论是哪种请求方式,
API Key都是必填参数。
我们有了自己的API Key后,可以直接通过浏览器请求的方式,验证当前接口是否可用。直接在浏览器中输入url即可。
比如,我通过指定城市名称为wuhan,查询武汉对应的天气情况。
1 | https://api.openweathermap.org/data/2.5/weather?q=wuhan&appid={API key} |
注意:{API key}需要替换为你自己的。
有以下返回,说明接口是可用的。

如果返回以下内容,说明
API Key未生效,或者API Key错误。如果是检查了API Key确定没有填写错误,那么请等待几分钟后重试。
到这里,我们已经支持如何通过经纬度和地名获取天气了,接下来要做的就是将该服务封装未MCP Server。
MCP Server功能编写
在这里,我们首先测试stdio通信方式,采用才本地开启一个MCP Server的方式实现。
首先,使用uv工具,创建项目并安装相关依赖。这里我将项目放到D盘的根目录,在D盘下打开命令提示符。
1 | uv init weather_mcp_server -p 3.10 |

接着进入uv工程。
1 | cd weather_mcp_server |
然后输入以下命令,创建虚拟环境。
1 | uv venv |

激活虚拟环境
1 | .venv\Scripts\activate |

由于我电脑中默认会激活一个
conda的base虚拟环境,所以再激活uv工程的虚拟环境后,在路径前面出现了两个(),故我还需要执行以下命令,退出conda的base虚拟环境。
1 conda deactivate
安装依赖
1 | uv add mcp[cli] httpx |

依赖准备完成,接下来开始代码编写部分内容。
weather.py代码如下所示:
注:代码中的
{API KEY}部分,请替换为自己的API Key。
1 | from typing import Any |
在该代码中,我们一共定义了两个Tool:
get_weather_from_cityname_tool:通过城市名称获取天气情况。get_weather_from_latitude_longitude_tool:通过经纬度获取天气情况。
注意,由于
MCP协议需要使用到@mcp.tool标记工具函数,所以使用@mcp.tool标记的工具函数,对应的注释务必写清除,后续大模型能够识别这些工具、工具如何使用以及工具功能,全都是通过这些注释进行解读的。所以一个好的MCP Server,其对应的Tool描述也必须要非常的清除。
开启服务

接下来测试该服务是否可以正常使用。
由于Cursor对于Streamable HTTP协议目前还不支持,所以我们使用Cherry Studio来进行测试,大家可以自行下载。官网地址:https://www.cherry-ai.com/
下载登陆后,点击左下角的设置。

然后点击MCP服务器

接下来点击添加服务器,将我们刚才开启的MCP Server配置进去。

按照下图所示的内容填写。

然后点击右上角的保存。

如果没有问题的话,可以看到图示中显示的,服务器更新成功。如果有问题会出现报错。
为了测试MCP Server服务,还需要大家准备一个LLM,大家根据自己的情况在设置中进行配置即可,我这里选择的是Moonshot。

接下来回到聊天助手页面,创建一个聊天助手。在聊天输入框下方选择要使用的MCP Server。

到此,我们的准备工作和配置工作就做完了,接下来我们就可以向聊天助手询问天气,测试MCP Server了。
例如:我询问“武汉和北京天气怎么样?”

Streamable HTTP协议在访问MCP Server时是并发的,通过以下动图可以看出来,北京的天气是先请求成功的。


