介绍
这一项是关于缺乏审计的,相当于MCP的运行没有日志审计,事后无法定位和溯源,所以本篇我们演示一下如何给MCP去记录日志情况。
MCP日志记录
比较原始的方法就是在开发MCP服务的代码中,添加日志记录代码,比如通过logger去记录,但这种方式有几个弊端,一个是开发时会导致代码冗余,要想记录的详细,需要添加很多logger代码。另一个是这种日志即使保存下来后,也可能去查看或者定位。
这里采用langfuse平台来演示,langfuse是一个开源的LLMOps平台,即大模型应用可观测平台,它可以记录Agent完整会话中的每一步,比如大模型调用情况、工具调用情况、输入输出情况等等。
首先安装langfuse,这里通过docker安装,从github下载源码后,直接运行:
bash
docker compose up -d
它会自动拉取相关镜像并启动,启动后浏览器访问3000端口进入langfuce。
准备好langfuce后,我们还是通过CherryStudio来测试MCP,MCP服务代码如下,这是没有记录日志功能的代码:
bash
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Test")
@mcp.tool()
def helloworld(username: str) -> str:
"""根据传入的用户名来打印友好提示语"""
return f"你好,{username}"
if __name__ == "__main__":
mcp.run()
当我们想把MCP和langfuse打通,则需要在MCP代码中把langfuse加进去,对上面的代码进行修改,具体作用见注释:
bash
import os
from pathlib import Path
from dotenv import load_dotenv
from langfuse import get_client, observe
from mcp.server.fastmcp import FastMCP
# 加载.env文件,该文件配置了langfuse的key,有了key才能和langfuse交互
load_dotenv(Path(__file__).with_name(".env"))
mcp = FastMCP("Test")
@mcp.tool()
# 主要加的就是这行代码,加到函数上,其中name代表在langfuse中显示日志时,这个日志名称是什么,as_type是说这个函数是属于Agent调用工具类型,langfuse显示日志时会显示工具的图标,因为langfuse观测面板有多种观测对象,比如推理过程、代码执行等等,工具调用就是其中一种
@observe(
name="helloworld",
as_type="tool"
)
def helloworld(username: str) -> str:
"""根据传入的用户名来打印友好提示语"""
return f"你好,{username}"
if __name__ == "__main__":
mcp.run()
最后还少个.env文件,内容如下:
bash
LANGFUSE_PUBLIC_KEY=pk-lf-xxxxxxxxxxxxx
LANGFUSE_SECRET_KEY=sk-lf-xxxxxxxxxxxxx
LANGFUSE_BASE_URL=http://localhost:3000
其中key要去langfuse平台获取,回到langfuse,创建个项目,在该项目的设置-API KEYs下,点击创建key即可。
一切准备好后,回到Cherrystudio去调用工具进行测试:

此时在langfuse的tracing下可以看到日志记录:

总结
MCP记录日志还有很多方式,也有很多平台,不止局限于langfuse,可根据自己情况进行选择。
小枣信安:专注AI安全,包括但不限于大模型安全、智能体安全、机器人安全、AI赋能网络安全等,欢迎一起学习。