MCP的logging和progress功能具体是如何实现的?
摘要:除了基础的Prompt、Resource和Tool概念,FastMCP还提供了以下功能:Sampling、Elicitation、Logging、Progress、Proxy、Middleware、Composition和Authentic
前言
截至目前(2025年9月19日),除了基础的Prompt、Resource和Tool概念,FastMCP还提供了以下功能:Sampling、Elicitation、Roots、Logging、Progress、Proxy、Middleware、Composition和Authentication等功能
Sampling,采样,在server端调用client的llm,实现功能解耦
Elicition,征询,实现人工介入
Roots,Client告知Server可访问的资源
Logging,将Server日志发送给Client
Progress,Server端将进度发送给Client
Proxy,代理其它MCP Server
Middleware,拦截MCP通信中的请求和响应
Composition,Server端将多个servers组合成一个server对外提供
Authentication,Client和Server之间安全认证
其中Sampling和Elicitation在我的实际开发中用到的比较多,所以我在前面章节中单独拎出来介绍了。FastMCP官方文档也说了Authentication还在迅速迭代中,虽然已经有了相关文档,但本文暂时就不涉及了,等这个功能稳定了再具体细说。剩下的功能会在本文中一次性全部介绍完,篇幅较长,可以根据章节名跳转到自己需要关注的内容。本文大部分参考自官方文档。
Roots
Roots 是客户端向服务器告知其可访问资源的一种机制。服务器可利用此信息调整行为或提供更相关的响应。
静态Roots
from fastmcp import Client
client = Client(
"my_mcp_server.py",
roots=["/path/to/root1", "/path/to/root2"]
)
动态Roots
from fastmcp import Client
from fastmcp.client.roots import RequestContext
async def roots_callback(context: RequestContext) -> list[str]:
print(f"Server requested roots (Request ID: {context.request_id})")
return ["/path/to/root1", "/path/to/root2"]
client = Client(
"my_mcp_server.py",
roots=roots_callback
)
Logging
Logging,从服务器向 MCP 客户端发送消息。FastMCP提供了一个logger(fastmcp.utilities.logging.get_logger()),也可以用python标准库的logging。
服务器日志功能允许 MCP 工具向客户端发送调试(debug)、信息(info)、警告(warning)和错误(error)级别的消息。这有助于用户了解函数执行过程,在开发和运行阶段辅助调试。一般用于以下场景:
调试:发送详细的执行信息,帮助诊断问题
进度可见性:让用户了解工具当前正在执行的操作
错误报告:向客户端传达问题及其上下文
审计追踪:为合规或分析目的生成工具执行记录
与标准 Python 日志不同,MCP 服务器 Logging 会直接将消息发送至客户端,使其在客户端界面或日志中可见。
Server 示例
在任意tool函数中使用Context提供的日志方法:
from fastmcp import FastMCP, Context
mcp = FastMCP("custom")
@mcp.tool
async def analyze_data(data: list[float], ctx: Context) -> dict:
"""通过全面日志记录分析数值数据。
