下面我将从三个方面来讲解这个,第一是讲解2.9版本的更新,第二是讲解什么将手动解析底层JSON-RPC 消息,丢失 FastMCP 高层语义,第三是讲一讲,什么叫做中间件。不了解的兄弟们系好安全带,我们准备发车了!
from fastmcp import FastMCP
from fastmcp.server.middleware import Middleware, MiddlewareContext
class LoggingMiddleware(Middleware):
async def on_message(self, context: MiddlewareContext, call_next):
"""处理所有 MCP 消息的钩子"""
print(f"-> 接收消息: {context.method}")
result = await call_next(context) # 调用下一个处理器
print(f"<- 响应消息: {context.method}")
return result
mcp = FastMCP(name="My Server")
mcp.add_middleware(LoggingMiddleware())
from fastmcp import FastMCP, Context
from fastmcp.exceptions import ToolError
from fastmcp.server.middleware import Middleware, MiddlewareContext
class PrivateMiddleware(Middleware):
async def on_call_tool(self, context: MiddlewareContext, call_next):
"""专门处理工具调用的钩子"""
tool_name = context.message.name
tool = await context.fastmcp_context.fastmcp.get_tool(tool_name)
if "private" in tool.tags:
raise ToolError(f"禁止访问私有工具: {tool_name}")
return await call_next(context)
mcp = FastMCP(name="Private Server")
@mcp.tool(tags={"private"})
def super_secret_function():
return "这是秘密!"
mcp.add_middleware(PrivateMiddleware())
钩子函数 | 触发场景 | 典型用途 |
---|---|---|
on_message |
所有消息类型 | 通用日志、请求统计 |
on_request |
请求-响应模式消息 | 身份验证、参数校验 |
on_notification |
单向通知消息 | 异步任务记录 |
on_call_tool |
工具调用请求 | 权限控制、工具调用频率限制 |
on_access_resource |
资源访问请求 | 资源访问审计 |
FastMCP 2.9 预实现了常见场景的中间件模板:
fastmcp.server.middleware.logging
)
fastmcp.server.middleware.error_handling
)
fastmcp.server.middleware.rate_limiting
)
fastmcp.server.middleware.timing
)
json.loads()
解析结构化数据(如列表、字典)from fastmcp import FastMCP
import inspect
mcp = FastMCP()
@mcp.prompt
def analyze_users(
user_ids: list[int], # 自动从 JSON 字符串转换为整数列表
analysis_type: str,
) -> str:
"""生成用户分析提示"""
users = []
for user_id in user_ids:
user = db.get_user(user_id) # 假设的数据库查询
users.append(f"- {user_id}: {user.name}, {user.metrics}")
user_data = "\n".join(users)
return inspect.cleandoc(
f"""
分析这些用户的{analysis_type}洞察:
{user_data}
提供可操作的建议。
"""
)
# 客户端传入 JSON 字符串
await client.call_prompt("analyze_users", {
"user_ids": "[1, 2, 3]",
"analysis_type": "performance"
})
user_ids
自动转换为 list[int]
类型user_ids: array of integers
)# 使用 uv 包管理器
uv add fastmcp
# 或使用 pip
pip install fastmcp --upgrade
FastMCP 2.9 通过MCP 原生中间件与提示参数类型转换两大特性,实现了从"协议工具"到"应用框架"的关键跨越:
这些改进使 FastMCP 更适合构建复杂的 AI 代理系统,为企业级应用提供了坚实的技术基础。
这句话描述了 FastMCP 在引入原生中间件之前,使用传统中间件方案时面临的核心问题,需要从技术实现原理和开发体验两个层面理解:
{
"jsonrpc": "2.0",
"method": "call_tool",
"params": {"name": "Ford"},
"id": "1"
}
Tool
:可调用的功能函数(如 greet
工具)Resource
:可访问的资源(如数据库记录)Prompt
:LLM 提示模板call_tool
消息 → 识别为"调用某个工具"user_ids
参数 → 关联到具体工具的参数定义Tool
调用# 传统中间件中收到的消息
raw_message = '{"jsonrpc":"2.0","method":"call_tool","params":{"name":"Ford"},"id":"1"}'
# 开发者需手动解析
import json
message = json.loads(raw_message)
method = message.get("method")
params = message.get("params")
Tool
对象、参数类型校验)全部丢失,开发者需从头处理协议细节context.fastmcp_context.fastmcp.get_tool()
等高层接口method
字段到具体组件(如判断 method="call_tool"
才知道是工具调用)on_call_tool
钩子获取 Tool
对象,无需解析 JSON:# 原生中间件中直接操作 Tool 对象
tool = await context.fastmcp_context.fastmcp.get_tool(tool_name)
if "private" in tool.tags:
raise ToolError(...)
id
、jsonrpc
版本)Tool
、Resource
)设计,而非 JSON 消息MiddlewareContext
提供完整的 FastMCP 上下文,可直接访问组件元数据# 传统中间件(需手动解析)
class OldMiddleware:
async def __call__(self, scope, receive, send):
# 处理 scope 和 receive 中的原始数据
message = await receive()
raw_json = message.get("body", b"")
# ... 手动解析 JSON ...
# FastMCP 2.9 原生中间件(直接操作语义)
class NewMiddleware(Middleware):
async def on_call_tool(self, context, call_next):
# 直接获取工具名称和对象
tool_name = context.message.name
tool = await context.fastmcp_context.fastmcp.get_tool(tool_name)
# ... 处理工具逻辑 ...
维度 | 传统中间件方案 | FastMCP 2.9 原生中间件 |
---|---|---|
处理对象 | 原始 JSON-RPC 字符串 | FastMCP 高层组件(Tool、Resource 等) |
开发者工作 | 手动解析 JSON、映射语义 | 直接操作语义对象,利用上下文钩子 |
核心痛点 | 丢失 FastMCP 封装的高层抽象,开发成本高 | 保留语义抽象,聚焦业务逻辑 |
典型场景 | 权限控制需解析 JSON 再查工具标签 | 权限控制可直接访问 Tool.tags 属性 |
该问题的本质是"底层协议处理与高层应用逻辑的脱节",而 FastMCP 2.9 通过原生中间件实现了两者的无缝衔接,使开发者能够以更自然的方式处理跨切面需求。
中间件是位于操作系统、网络与应用程序之间的软件层,其核心作用是连接不同系统组件并提供通用服务,避免开发者重复实现底层交互逻辑。它如同“数字胶水”,通过抽象底层复杂性,让应用程序更专注于核心业务逻辑。
中间件技术自20世纪60年代末诞生以来,已成为现代软件架构的基础组件,尤其在云原生、微服务等场景中不可或缺。
中间件根据功能特性可分为9大典型类别,每类解决特定领域的技术问题:
功能:处理HTTP请求,托管静态/动态资源,支持反向代理与负载均衡
代表产品:
功能:管理数据库连接、分片、读写分离及故障转移
代表产品:
功能:实现分布式系统的异步通信,解耦应用组件
代表产品:
功能:缓存热点数据,减少数据库访问压力,提升响应速度
代表产品:
功能:运行应用程序的业务逻辑,提供事务管理、资源池等服务
代表产品:
功能:保证分布式系统中的数据一致性,处理跨服务事务
代表方案:
功能:保护应用与数据安全,提供认证、授权、加密等能力
代表产品:
功能:收集、存储、分析系统日志,支持问题定位与运维监控
代表产品:
功能:实时监控系统状态、资源使用与性能指标
代表产品:
在云原生与混合云环境中,中间件已从“可选组件”变为“基础架构核心”:
API(应用编程接口)与中间件紧密关联,但本质不同:
中间件的核心价值在于抽象复杂性、提升开发效率、增强系统可维护性。从早期的数据库连接池到如今的云原生服务网格,其演进始终围绕“让开发者更专注业务逻辑”这一目标。未来,随着AI、边缘计算等技术的发展,中间件将进一步向智能化、轻量化方向进化,成为支撑企业数字化转型的关键技术底座。