前言
2025年上半年要说什么AI概念最火热,那当属MCP了,MCP全称 Model Context Protocol,即模型上下文协议 ,是由 Anthropic 开源的一种协议,用于使 AI 模型能够无缝对接外部资料。它就像是 AI 领域的 “万能钥匙”,专门用来解决 AI 模型与外部工具连接的难题,让 AI Agent 能够发挥更大的价值。本文将详细介绍MCP的一些基础概念,以及如何使用FastMcp框架快速的开发部署MCP服务,以及AI Agent如何创建MCP Client使用工具。
一、MCP介绍
1.为何诞生MCP
LLM应用需要与外部世界连接,以访问数据源或使用工具
如访问本地文件、访问数据库结构、调用第三方API服务等都需要大量的适配工作,MCP的做法是增加了一个中间层:LLM应用通过统一的MCP协议连接中间层(称为MCP Server),而这个中间层会处理与外部资源的对接,如下图 MCP 如同 USB-C 接口般通过统一协议实现 LLM 与外部能力的高效互联。
MCP的具体意义体现在:
- LLM应用的简化:不用适配各种私有协议,只需要知道怎么连接MCP server
- LLM应用的快速扩展:随时“插拔”新的MCP Server即可,一个不够就再来一个
- 快速适应变化:若一个外部资源的接口发生变化,只需要对它的MCP Server做修改,所有的LLM应用就可以无缝适应
- 新的AI能力共享生态:通过MCP Server的共享,新的LLM应用可以快速获得各种工具,形成了一种新的合作体系,提高整体效用
2.MCP基础协议介绍
2.1 消息协议:JSON-RPC 2.0
在MCP中规定了唯一的标准消息格式,就是JSON-RPC 2.0
JSON-RPC 2.0是一种轻量级的、用于远程过程调用(RPC)的消息交换协议,使用JSON作为数据格式
注意: 它不是一个底层通信协议,只是一个应用层的消息格式标准
这种消息协议的好处,语言无关(还有语言不支持JSON吗)、简单易用(结构简单,天然可读,易于调试)、轻量灵活(可以适配各种传输方式)
2.2 传输协议:STDIO模式、基于SSE的Remote模式、Streamable HTTP模式
2.2.1 STDIO模式
STDIO(Standard Input/Output)是一种基于标准输入(stdin)和标准输出(stdout)的本地通信方式
MCP Client启动一个子进程(MCP Server)并通过stdin和stdout交换JSON-RPC消息来实现通信
其基本通信过程如下:
2.2.2 基于SSE的Remote模式(MCP标准2025-03-26版之前)
SSE(服务器发送事件)是一种基于HTTP协议的单向通信技术,允许Server主动实时向Client推送消息,Client只需建立一次连接即可持续接收消息.它的特点是:
单向(仅Server→Client)
基于HTTP协议,一般借助一次HTTP Get请求建立连接
适合实时消息推送场景(如进度更新、实时数据流等)
由于SSE是一种单向通信的模式,所以它需要配合HTTP Post来实现Client与Server的双向通信
严格的说,这是一种HTTP Post(Client->Server)+HTTP SSE(Server->Client)的伪双工通信模式
这种传输模式下:
一个HTTP Post通道,用于Client发送请求。比如调用MCP Server中的Tools并传递参数。注意,此时Server会立即返回
一个HTTP SSE通道,用于Server推送数据,比如返回调用结果或更新进度
两个通道通过session_id来关联,而请求与响应则通过消息中的id来对应
其基本通信过程如下:
简单总结:通过HTTP Post发送请求,但通过SSE的长连接异步获得Server的响应结果
2.2.3 Streamable-HTTP模式(MCP标准2025-03-26版)
在MCP新标准(2025-03-26版)中,MCP引入了新的Streamable-HTTP远程传输机制来代替之前的HTTP+SSE的远程传输模式,STDIO的本地模式不变
该新标准还在OAuth2.1的授权框架 、JSON-RPC批处理 、增强工具注解等方面进行增加和调整
且在2025.05.08号发布的MCP SDK 1.8.0版本中正式支持了Streamable HTTP
HTTP+SSE这种方式存在问题有:
需要维护两个独立的连接端点
有较高的连接可靠性要求。一旦SSE连接断开,Client无法自动恢复,需要重新建立新连接,导致上下文丢失
Server必须为每个Client维持一个高可用长连接,对可用性和伸缩性提出挑战
强制所有Server向Client的消息都经由SSE单向推送,缺乏灵活性,基于此官方已标注废弃SSE方式
其主要变化部分的基本通信过程如下:
这里的主要变化包括:
- Server只需一个统一的HTTP端点(/messages)用于通信
- Client可以完全无状态的方式与Server进行交互,即Restful HTTP Post方式
- 必要时Client也可以在单次请求中获得SSE方式响应,如:一个需要进度通知的长时间运行的任务,可以借助SSE不断推送进度
- Client也可以通过HTTP Get请求来打开一个长连接的SSE流,这种方式与当前的HTTP+SSE模式类似
- 增强的Session管理。Server会在初始化时返回Mcp-Session-Id,后续Client在每次请求中需要携带该MCP-Session-Id。这个Mcp-Session-Id作用是用来关联一次会话的多次交互;Server可以用Session-Id来终止会话,要求Client开启新会话;Client也可以用HTTP Delete请求来终止会话
Streamable HTTP在旧方案的基础上,提升了传输层的灵活性与健壮性:
允许无状态的Server存在,不依赖长连接。有更好的部署灵活性与扩展能力
对Server中间件的兼容性更好,只需要支持HTTP即可,无需做SSE处理
允许根据自身需要开启SSE响应或长连接,保留了现有规范SSE模式的优势
3.MCP组成
MCP 采用经典高效的客户端-服务器架构,通过标准化协议实现 LLM 与外部资源的高效互联,其通常包含三个部分:
- MCP Host:能够通过 MCP 集成外部能力的主体。Host 通常承担最终用户交互界面的角色,其既可以是独立的 LLM Desktop,也可以是基于 LLM 构建的生产力工具(如 IDE)。它代表的是需求方,是 MCP Client 的运行时环境,负责协调用户、LLM 与外部资源之间的交互。
- MCP Client:Host 内部负责与 MCP Server 交互的组件。Client 由 Host 创建并与 Server 建立一对一的有状态会话,会将 Host 的请求转换为符合 MCP 标准的消息发送给 Server,再将 Server 的响应解析为 Host 可以理解的格式。
- MCP Server:LLM 需要的外部能力的具象化。这里指的能力可以是读取本地磁盘文件,写入本地数据库,查询天气/股票价格等等,但 Server 不是能力/资源本身,Server 是通过统一的标准协议将能力对外暴露的代理。

显然 MCP Server 是为 LLM 赋能的关键,Server 本身对外暴露的能力又分为三种: - Resources:可供加工的数据。一般是静态或者半动态的原始数据,这些数据可以直接被 LLM 理解并放在上下文中用于推理。比如是日志或配置等基础信息,类似于一个只读的文件或者数据库。
- Tools:执行一个具体的任务。当 LLM 将用户需求拆分为多个具体的子步骤时,可以通过调用 Tools 实现其中的一步或者多步。可以是写入数据库,可以是基于敏感信息进行计算然后输出脱敏信息,也可以是调用另外一个没有提供 MCP 接口的系统。通常一个 Server 中的 Tools 通常具有相关性,它们在一起描述了一个服务拥有的所有能力。
- Prompts:可复用的 LLM 提示模板。通常 LLM 在处理不同任务时会使用预定义的 Prompt 模板进行引导,但当处理一些私域场景时可能需要一些特化逻辑,比如输入/输出格式或上下文片段等,这些逻辑可以固化为 Prompts 保存在 MCP Server 中。

用做饭来比喻的话,Resources 是各种未处理/预处理的食材,Tools 定义了 “菜刀”,而 Prompts 定义了偏好。当我向一个基于 LLM 扮演厨师的 Agent 提出想吃 “凉拌黄瓜” 时,Agent 基于 LLM 理解了做饭的流程,通过 Prompts 知道了成品一定要放香菜,通过 Resources 得到了老家产的黄瓜,调用了多次 Tools 切出黄瓜块。需要指出的是,与 MCP Server 的哪些资源/能力进行交互是 LLM 自己判断并选择的,因此对资源/能力的描述要准确无误。如果提供了 “黄瓜牌西红柿”,也是有可能得到 “凉拌西红柿” 的。
二、FastMcp框架快速搭建MCP Server
1.快速入门
1.1 安装依赖
如果用uv开发python项目那么先拉取fastmcp依赖包
1 | 初始化uv项目 |
1.2 mcp tools
main.py中添加如下代码可以实现一个加法运算的mcp工具
以mcp工具为例,在方法上添加@mcp.tool装饰器即可标记方法为mcp工具
类似的mcp资源和提示词对应的装饰器为@mcp.resource和@mcp.prompt
1 | from fastmcp import FastMCP |
1.3 启动mcp server
1 | uv run main.py |
启动日志
1 | [06/20/25 19:17:30] INFO Starting MCP server 'calculate' with transport server.py:1219 'streamable-http' on http://0.0.0.0:9002/calculate |
更多配置教程可参考FastMcp官网
2.调试MCP服务工具
常规调试mcp服务可直接用AI客户端这里我推荐使用较容易的Cherry Studio(需要配置支持工具调用的LLM来查看结果)
如果你是用vscode来开发的mcp服务我推荐使用OpenMCP (无需配置LLM可以直接调试参数看结果)
2.1 Cherry Stdio 多模型AI客户端
2.1.1配置mcp
如图打开Cherry StdioMCP服务配置添加之前启动的MCP服务配置
保存成功后会提示服务更新成功,如图点击工具可以查看我们的方法信息
2.1.2新增AI对话调试mcp
新增AI对话,确保刚刚配置的mcp服务已勾选启用
如图对话测试mcp,可以看到成功调用了mcp服务返回结果
2.2 OpenMCP vscode插件
2.2.1 配置mcp
点击左侧插件图标,添加一个mcp连接:
- 根据提示选择type,这里选STREAMABLE_HTTP
- 根据提示填写url,这里填写http:127.0.0.1:9002/calculate
- 根据提示填写token,无需填写(mcp服务端没有配置token校验)
添加MCP连接工作区会新增一个刚刚添加的mcp连接配置2.2.2 打开mcp调试
如图打开刚刚配置mcp连接,由于我们的mcp服务只配置了工具,那么就只打开工具图标进行调试
如图打开工具模块后,左侧是工具列表,右侧显示了工具入参和调试按钮可以直接调试mcp服务
OpenMCP同时也支持配置LLM来调试mcp,这里就不做过多讲解了。三、LangChain框架快速创建MCP Client
下面是ai agent创建MCP客户端连接使用工具的示例代码1
2
3
4
5
6
7
8
9
10
11
12
13
14from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
client = MultiServerMCPClient(
{
"math": {
"transport": "streamable_http",
"url": "http:127.0.0.1:9002/calculate"
},
}
)
tools = await client.get_tools()
agent = create_react_agent("openai:gpt-4.1", tools)
math_response = await agent.ainvoke({"messages": "what's (3 + 5)?"})参考文章
1.学习 MCP 最好的时机是 7 个月前,其次是现在
2.FastMcp官网
3.langchain-mcp-adapters项目github
- 本文作者: yinshuang
- 本文链接: https://yinshuang007.github.io/2025/06/21/FastMcp框架快速搭建MCP服务/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!