简介
什么是MCP?
MCP全称Model Context Protocol,模型上下文协议,它将AI模型和应用程序之间通信交互协议进行了统一,这让开发者只需要专注于应用程序的开发,而如何将开发的应用程序集成到AI模型中,MCP做了很好的规范和定义,应用程序只需简单集成MCP SDK即可优雅嵌入AI模型,非常方便
Cline是什么?
Cline是VC Code上的一款AI插件,在这里我们可以将其理解为一个支持MCP协议的客户端,同类型的客户端还有Cursor、Claude App等。因为Cline免费,所以下面笔者将以Cline作为实践的MCP客户端
MCP中的toots功能
MCP主要提供五种功能,分别是resources、prompts、tools 、toots和sampling,笔者将以使用更多的tools来实践和介绍
toots,是MCP服务中可以被LLM调用的函数,当然这需要用户同意使用MCP服务提供的tools后才会被调用,不过目前的MCP客户端都可以设置LLM决定调用哪些tools之后,不需要用户批准自动进行调用
使用Python编写最简MCP服务
使用Python 编写mcp服务要求已安装 Python 3.10 或更高版本
笔者这里用Windows电脑做的测试,首先打开Windows 命令控制台,执行
`powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`
这会为你安装uv,uv是python的一个高性能包管理工具,旨在替代传统的pip
下载好uv之后,需要重新打开一个控制台让uv的PATH生效。然后到一个目录创建服务工程
# 创建工程,进入工程目录
uv init weather
cd weather
# 创建 virtual environment 并激活它
uv venv
.venv\Scripts\activate
# 安装 dependencies
uv add mcp[cli] httpx
# 创建文件weather.py
完成上面的配置后,工程目录结构大致如下
编辑weather.py,代码如下
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather")
@mcp.tool()
def get_weather(location: str) -> str:
"""获取指定地点的天气预报。
参数:
location (str): 城市名,如 'New York'。
返回:
str: 天气信息。
"""
return f"{location} 的天气:温度 25°C,晴朗"
if __name__ == "__main__":
mcp.run(transport="sse")
这个mcp server非常简单,可以查询天气,但是笔者这里把天气信息进行了硬编码。代码部分到此为止,这里值得注意的是 mcp.run(transport='sse')
mcp客户端在使用mcp服务时,是需要和mcp服务进行通信的,其大致原理笔者将会在文末补充。进程间通信就需要一些通信手段,目前MCP主要采用的通信手段有两种,分别是stdio传输和SSE传输
stdio传输和SSE传输
当你的MCP服务是一个使用你的本地机器资源为你提供服务的应用时,你可以采用stdio的方式进行通信。采用stdio的通信方式不需要你启动服务本身,MCP客户端(例如Cline)会在合适的时机通过你配置的路径启动MCP服务,必要的参数通过命令行参数的方式提供给MCP服务,以此实现通信。当然,这种方式的MCP服务只能你本地机器可以使用
与之对应的是采用SSE进行通信的MCP服务。采用SEE方式的服务需要你手动运行服务,并再后台运行等待随时被调用,MCP客户端通过网络访问服务。这样的好处就是可以让你的服务给更多人使用
回到我们的Demo,mcp.run(transport='sse')
就表示我们的服务采用sse的方式和MCP客户端通信
run
因为我们采用SEE的方式和MCP服务通信,所以这里需要我们手动运行服务,执行命令uv run weather.py
有以上日志出现说明你的服务已经成功run起来,MCP客户端可以通过http://0.0.0.0:8000
和服务通信
服务搭建好了,我们去Cline客户端配置
Cline插件配置
我们选择Cline作为MCP客户端
在VS Code插件商店搜索下载Cline,这会让你的VS Code左侧多出一个Cline的按钮。点击进入cline的界面,笔者这里选择了OpenRouter的API,模型选择了deepseek/deepseek-char:free
,免费。需要注意的是选择了OpenRouter之后,需要先获取API Key才能选择模型,这里如何获取API Key各位可以通过其它文章设置,笔者这里不再赘述
配置好之后我们可以去chat页面聊天验证是否配置成功
有回答说明你配置成功,到这里我们还需要去配置MCP服务
进入MCP服务配置页面之后,选择Remote Servers
。填写Server Name和Server URL,完成后点击Add Server。这些操作实则会生成一个名为cline_mcp_settints.json
的文件,该文件定义了Cline插件可以使用的所有MCP服务,文件内容如下:
{
"mcpServers": {
"'weather": {
"disabled": true,
"timeout": 60,
"url":"http://192.168.136.207:8000/sse",
"transportType":"sse'
}
}
}
这个配置文件格式在Cursor中也是能够使用的
因为此时你的MCP服务正在后台运行,所以理论上Cline已经和你的服务成功建立连接了
如果没有错误,这里将显示绿点
我们再次回到chat界面进行聊天
笔者这里询问今天杭州的天气,可以看到Deepseek模型选择调用本地的MCP回答这个问题,Hangzhou 的天气:温度 25°C,晴朗
就是MCP服务返回的原始回答。最后的回答是杭州今天的天气:温度 25°C,晴朗
,这里Deepseek并没有更多的修饰我们的回答,某些上下文中,Deepseek会修饰MCP 服务返回的原始回答,让最终回答更符合我们提问时的上下文语境
好了,到这里我们的最简实践完成了,当然你的MCP服务可以比这里复杂得更多,总结一下,我们完成了
- 使用Python部署了一个MCP服务
- MCP服务使用SEE和MCP客户端通信
- MCP服务提供一个天气查询的tools
- 使用Cline作为MCP客户端,配置好LLM和MCP服务器之后,当提问天气相关的问题时,大模型将会使用MCP服务提供的tool
以上是我们实践的内容,那具体原理是什么呢?
MCP原理简介
在MCP客户端和服务端建立通信后,MCP服务会通过标准协议发送自己提供了哪些能力和对应的查询接口以及传参方式,笔者将其理解为能力集
有能力集之后,用户向LLM提问时,MCP客户端会按照一定的格式,把这些能力集和用户的提问一同发送给LLM,提示LLM有一些能力集可以扩展LLM的能力,同时告诉LLM这些能力集如何使用,如何传参
LLM收到这些打包的信息之后,分析用户的提问是否能够用上能力集,如果能够使用能力集中的tool,LLM会将tool所需的入参从用户的提问中提取出来,最后使用标准协议将数据返回给MCP客户端,返回的数据还包括使用哪个MCP Server?使用哪个tool?
MCP客户端收到LLM的指令后会去调用对应MCP Server提供的tool,MCP客户端从tool获取到答案之后,会再请求一次LLM,这次请求数据中会有用户的原始提问、MCP Server的调用过程以及返回结果,LLM收到请求后对数据进行整理,返回给MCP客户端最终的输出结果
上图是笔者理解的MCP工作的流程图。据此我们可以知道,MCP的通用性非常的强,几乎可以兼容市面上所有的LLM,因为MCP不需要LLM具有什么额外的能力,只要LLM能够看懂MCP Client给出的提示词就能融入到MCP框架中,这很巧妙
总结
MCP像USB-C接口一样,它定义了从数据源、客户端、服务到LLM之间,从通信到调用过程的一整套协议,让LLM能满足个性化的定制需求,同时也能享受像USB-C那样即插即用的便捷,非常值得大家去了解和学习
公众号名称:zl.rs