SEP-414:记录 OpenTelemetry Trace Context 传播约定

SEP-414:记录 OpenTelemetry Trace Context 传播约定

社区译文;来源: MCP 29affa6b

本 SEP 已达到 Final 状态,并作为已接受设计的历史记录保留。 定稿后对协议所做的更改不会反映在此处。权威要求请参阅当前规范 及其变更日志。
字段值
SEP414
标题记录 OpenTelemetry Trace Context 传播约定
状态Final
类型标准跟踪
创建日期2025-04-25
作者Adrian Cole(@codefromthecrypt)
发起人Marcelo Trylesinski(@Kludex)
PR#414

摘要

本 SEP 记录 MCP 中 OpenTelemetry(OTel)trace context 的传播约定。

MCP 的 OTel 语义约定规定使用 _meta 作为 W3C Trace Context key 的载体。C# SDK 和其他实现已经采用这种做法。

本规范记录了 _meta 中 key 不遵循 DNS 前缀约定的例外。这使现有实现与新实现之间能够互操作,并为相关 SEP(例如 SEP-2028)奠定基础。

规范

本 SEP 在 MCP 规范中补充文档,说明:

  1. 通过 _meta 传播 OTel trace context 时,traceparent、tracestate 和 baggage key 遵循 W3C Trace Context 和 W3C Baggage 的值格式。

  2. 提供一个非规范性示例,展示 _meta 中的 trace context。

  3. 添加说明,阐明为何这是 _meta 中 key 使用 DNS 前缀规则的例外:为了与现有实现及 OpenTelemetry 语义约定保持兼容。

ACP 中的等效文档变更见 agentclientprotocol/agent-client-protocol#297。

非规范性示例

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_weather",
    "arguments": {
      "location": "New York"
    },
    "_meta": {
      "traceparent": "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"
    }
  }
}

理由

为什么要记录此约定?

此约定目前记录在其他位置,但尚未作为 MCP 规范的一部分。将其写入规范后,依赖此模式的 SEP 可以完成,MCP 组织内外的其他 SDK 也能采用它,例如 Logfire 和 ToolHive。

如果我们不记录这一共同关注点,可能会出现不同解释,例如将 traceparent 加上命名空间而写成 io.modelcontextprotocol.traceparent,这会破坏 trace 和日志关联。

相关 SEP

  • SEP-1788 - 关于 _meta 中保留 key;实现本 SEP 时应加入 traceparent、tracestate 和 baggage
  • SEP-2028 - 在本 SEP 基础上将 _meta 值转发到 HTTP header

向后兼容性

本 SEP 记录的是现有约定,因此向后兼容。

安全影响

_meta 中的 trace context 可能包含关联 ID。实现应遵循适合其环境的现有数据处理指导。

参考实现

采用此模式的现有实现: