日志
社区译文;来源: MCP 80041ab0
弃用:自协议版本
2026-07-28 起,日志功能已弃用
(SEP-2577
)。
根据功能生命周期政策(英文)
,该功能在本次修订发布后至少十二个月内
仍保留在规范中,之后才有资格被移除。新实现 SHOULD NOT 采用该功能;现有实现 SHOULD
迁移为:使用 stdio 传输时将日志写入 stderr,或使用
OpenTelemetry(英文)
实现结构化可观测性。参见
弃用功能注册表(英文)
。模型上下文协议(MCP)为服务器提供了一种向客户端发送结构化日志消息的标准方式。客户端通过每个请求的
_meta 控制日志详细程度;服务器发送包含严重性级别、可选记录器名称和任意可 JSON 序列化数据的通知。
用户交互模型
实现可以自由地通过任何符合自身需求的界面模式公开日志;协议本身不强制规定任何特定的用户交互模型。
能力
发送日志消息通知的服务器 MUST 声明 logging 能力:
{
"capabilities": {
"logging": {}
}
}日志级别
协议遵循 RFC 5424 规定的标准 syslog 严重性级别:
| 级别 | 说明 | 使用场景示例 |
|---|---|---|
| debug | 详细调试信息 | 函数进入/退出点 |
| info | 一般信息消息 | 操作进度更新 |
| notice | 正常但重要的事件 | 配置变更 |
| warning | 警告条件 | 使用弃用功能 |
| error | 错误条件 | 操作失败 |
| critical | 严重条件 | 系统组件故障 |
| alert | 必须立即采取行动 | 检测到数据损坏 |
| emergency | 系统不可用 | 系统完全故障 |
请求日志消息
每个请求的日志级别
要接收特定请求的日志消息,请包含 io.modelcontextprotocol/logLevel 于该请求的
_meta 中。如果请求未包含此字段,服务器 MUST NOT
发送 notifications/message。
该字段存在时,服务器 MAY 在该请求的响应流上、最终响应之前,发送严重性等于或高于所请求级别的
notifications/message 通知。notifications/message 的作用域限定于请求:
服务器 MUST NOT 在 subscriptions/listen
流上发送该通知,也不得在携带设置日志级别之请求响应的流以外的任何流上发送。
协议消息
日志消息通知
服务器使用 notifications/message 通知发送日志消息:
{
"jsonrpc": "2.0",
"method": "notifications/message",
"params": {
"level": "error",
"logger": "database",
"data": {
"error": "Connection failed",
"details": {
"host": "localhost",
"port": 5432
}
}
}
}错误处理
如果请求携带的 io.modelcontextprotocol/logLevel 值在 _meta 中不是可识别的
日志级别
,服务器 SHOULD 使用标准 JSON-RPC 错误拒绝该请求:
- 无效的日志级别:
-32602(参数无效) - 内部错误:
-32603(内部错误)
实现注意事项
服务器 SHOULD:
- 对日志消息进行速率限制
- 在数据字段中包含相关上下文
- 使用一致的记录器名称
- 移除敏感信息
客户端 MAY:
- 在 UI 中展示日志消息
- 实现日志筛选/搜索
- 直观展示严重性
- 持久化日志消息
安全
日志消息 MUST NOT 包含:
- 凭据或 secret
- 个人身份信息
- 可能帮助攻击者的内部系统详细信息
实现 SHOULD:
- 对消息进行速率限制
- 验证所有数据字段
- 控制日志访问
- 监控敏感内容