mcpField
T
tracehub-mcp

tracehub-mcp

本地服务
github.com/mcpsmiths数据与分析02 周前更新

关于 tracehub-mcp

tracehub-mcp 是面向排查 LLM 和生成式 AI 应用的 MCP 服务,可查询多个可观测性后端中的 OpenTelemetry 追踪数据。它支持 8 种后端,并将 gen_ai.* 规范中的提示词、补全内容和令牌用量作为专门概念处理。

主要功能

  1. 01查询 8 种后端的追踪数据
  2. 02搜索 Span 并获取完整追踪
  3. 03发现服务并检查后端状态
  4. 04解析 gen_ai.* 追踪规范

适用场景

  1. 01查找成本高昂的模型调用
  2. 02排查追踪中的错误
  3. 03比较模型性能
  4. 04检查令牌用量

MCP 相关

向 MCP 客户端提供追踪查询和可观测性操作。可将其配置为连接支持的后端之一,包括 Jaeger、Tempo、Datadog 和 Sentry。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"mcpsmiths-tracehub": {
"command": "uvx",
"args": [
"tracehub-mcp"
],
"env": {
"BACKEND_TYPE": "<BACKEND_TYPE>",
"BACKEND_URL": "<BACKEND_URL>",
"BACKEND_API_KEY": "<BACKEND_API_KEY>",
"BACKEND_AWS_REGION": "<BACKEND_AWS_REGION>",
"BACKEND_NEWRELIC_ACCOUNT_ID": "<BACKEND_NEWRELIC_ACCOUNT_ID>",
"BACKEND_HONEYCOMB_DATASET": "<BACKEND_HONEYCOMB_DATASET>",
"BACKEND_APP_KEY": "<BACKEND_APP_KEY>",
"BACKEND_TEMPO_INSTANCE_ID": "<BACKEND_TEMPO_INSTANCE_ID>",
"BACKEND_SENTRY_ORG": "<BACKEND_SENTRY_ORG>",
"BACKEND_SENTRY_PROJECT": "<BACKEND_SENTRY_PROJECT>",
"BACKEND_ENVIRONMENTS": "<BACKEND_ENVIRONMENTS>",
"BACKEND_TIMEOUT": "<BACKEND_TIMEOUT>",
"BACKEND_MAX_RESPONSE_BYTES": "<BACKEND_MAX_RESPONSE_BYTES>",
"LOG_LEVEL": "<LOG_LEVEL>",
"MAX_TRACES_PER_QUERY": "<MAX_TRACES_PER_QUERY>",
"SLOW_REQUEST_THRESHOLD_MS": "<SLOW_REQUEST_THRESHOLD_MS>",
"QUERY_CACHE_TTL_SECONDS": "<QUERY_CACHE_TTL_SECONDS>",
"QUERY_CACHE_MAX_ENTRIES": "<QUERY_CACHE_MAX_ENTRIES>",
"OTEL_EXPORTER_OTLP_ENDPOINT": "<OTEL_EXPORTER_OTLP_ENDPOINT>",
"OTEL_SERVICE_NAME": "<OTEL_SERVICE_NAME>",
"MCP_INCLUDE_ARGS_IN_SPANS": "<MCP_INCLUDE_ARGS_IN_SPANS>"
}
}
}
}
启动命令uvx tracehub-mcp
需要配置的环境变量
BACKEND_TYPEWhich observability backend to query.
BACKEND_URLBackend API endpoint, e.g. http://localhost:16686 for Jaeger, https://api.datadoghq.com for Datadog, https://api.newrelic.com/graphql for New Relic, or https://api.honeycomb.io for Honeycomb. For the X-Ray backend this is decorative only (e.g. https://xray.us-east-1.amazonaws.com) - never dereferenced for a live request.
BACKEND_API_KEY密钥API key or auth token. Required for Traceloop, Datadog, Sentry, New Relic, and Honeycomb; not used by Jaeger, Tempo, or X-Ray. For New Relic this must be a User API key, not an Ingest or License key; for Honeycomb this must be a Configuration Key, not an Ingest or Management key.
BACKEND_AWS_REGIONAWS region, e.g. us-east-1. Required for the X-Ray backend only - X-Ray authenticates via boto3's standard AWS credential chain, not BACKEND_API_KEY.
BACKEND_NEWRELIC_ACCOUNT_IDNew Relic account ID, required for the New Relic backend only - NerdGraph queries are user-scoped, not account-scoped, so this identifies which account's data to read.
BACKEND_HONEYCOMB_DATASETHoneycomb dataset slug, required for the Honeycomb backend only - the Query Data API is dataset-scoped.
BACKEND_APP_KEY密钥Datadog Application key, required in addition to BACKEND_API_KEY for the Datadog backend only.
BACKEND_TEMPO_INSTANCE_IDGrafana Cloud stack/instance ID, used with BACKEND_API_KEY for Basic Auth (Tempo backend only, required for Grafana Cloud-hosted Tempo, not needed for self-hosted Tempo).
BACKEND_SENTRY_ORGSentry organization slug, required for the Sentry backend only.
BACKEND_SENTRY_PROJECTSentry project slug, optional for the Sentry backend - narrows queries to one project.
BACKEND_ENVIRONMENTSComma-separated environments for the Traceloop backend only.
BACKEND_TIMEOUTRequest timeout in seconds.
BACKEND_MAX_RESPONSE_BYTESCeiling on the decoded size of any single backend response, in bytes (1 to 1073741824). An oversized body is refused before it is buffered or parsed.
LOG_LEVELLogging level.
MAX_TRACES_PER_QUERYMaximum traces validated per query (1-1000).
SLOW_REQUEST_THRESHOLD_MSLogs a WARNING for any backend request slower than this, independent of LOG_LEVEL. Unset disables slow-request logging.
QUERY_CACHE_TTL_SECONDSCache backend query results for this many seconds with in-flight request coalescing; finite, > 0 and at most 86400 (one day). Unset disables the cache.
QUERY_CACHE_MAX_ENTRIESUpper bound on the number of cached query results held at once (1-100000); the least-recently-used entry is evicted first.
OTEL_EXPORTER_OTLP_ENDPOINTEnables opt-in OTel self-instrumentation of tool calls when set. Unset means zero overhead - no TracerProvider is configured and no middleware is registered.
OTEL_SERVICE_NAMEService name reported in self-instrumentation spans, only used when OTEL_EXPORTER_OTLP_ENDPOINT is set.
MCP_INCLUDE_ARGS_IN_SPANSInclude tool call arguments/results as OTel span attributes when self-instrumentation is enabled. Off by default since they may contain sensitive data.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypitracehub-mcp0.13.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

tracehub-mcp

CI codecov PyPI Python 3.11+ License mcpsmiths/tracehub-mcp MCP server M8ven Score

也列于官方 MCP 注册表,名称为 io.github.mcpsmiths/tracehub-mcp(注册表自身的 ?search= 端点可能会优先显示过时版本;此精确名称端点始终反映当前 isLatest 版本),也列于 mcprush。

tracehub-mcp MCP server – quality and maintenance score on Glama

让 AI 助手直接连接到你的可观测性后端。 tracehub-mcp 是一个 MCP(Model Context Protocol)服务,可让 Claude、Cursor、Windsurf、Gemini CLI 或任何 MCP 客户端查询 LLM/GenAI 应用的 OpenTelemetry 追踪数据并进行分析——找出高开销调用、调试错误、比较模型性能、跟踪令牌用量,而无需将追踪 JSON 复制粘贴到聊天窗口。

它原生支持 OpenTelemetry 的 gen_ai.* 语义约定,因此能将提示词、补全内容、令牌用量和结束原因作为一等概念理解,而不只是通用的 span 属性。

tracehub-mcp 最初是 traceloop/opentelemetry-mcp-server(Apache 2.0)的分支——完整的署名和分支历史见 NOTICE。它已发展为一个支持 8 种后端、经过安全加固的服务,由 mcpsmiths 独立维护;以下的与上游的差异介绍了此处新增的内容。


目录


快速开始

tracehub-mcp 已发布到 PyPI。无需安装——uvx 会一次性获取并运行它:

// claude_desktop_config.json
{
  "mcpServers": {
    "tracehub-mcp": {
      "command": "uvx",
      "args": ["tracehub-mcp"],
      "env": {
        "BACKEND_TYPE": "jaeger",
        "BACKEND_URL": "http://localhost:16686"
      }
    }
  }
}

也可以直接从 Claude Code 使用:

claude mcp add tracehub-mcp -e BACKEND_TYPE=jaeger -e BACKEND_URL=http://localhost:16686 -- uvx tracehub-mcp

就这么简单。 向助手提问:“显示过去一小时内出现错误的追踪记录。”

Cursor、Windsurf、VS Code 和 Gemini CLI 的设置方法见 MCP 客户端设置;pip/pipx/从源码安装等替代方式见安装。


支持的后端

  • Jaeger — 本地部署或可自托管,是最常见的开源追踪后端。无需身份验证(可通过 BACKEND_API_KEY 发送 Bearer 令牌;拒绝 BACKEND_URL 中嵌入的凭据)。
  • Grafana Tempo — 本地部署或 Grafana Cloud,支持原生 TraceQL 搜索。
  • Traceloop — 云端大模型可观测性平台,使用 API 密钥进行身份验证。
  • Datadog — 云端 APM,需要 API 密钥 和 Application 密钥。
  • Sentry — 云端或可自托管,需要身份验证令牌和组织别名。
  • AWS X-Ray — 通过 boto3 使用 SigV4 签名,需要 AWS 区域和标准 AWS 凭据(而非 API 密钥)。由于默认情况下,OTel Span 属性会写入未编入索引的 X-Ray Segment metadata(只有 annotations 可供查询),因此这里的原生服务端筛选能力比其他后端更有限 — 参见后端支持矩阵。
  • New Relic — NerdGraph GraphQL API,需要 User API 密钥(而非 Ingest/License 密钥)和账户 ID。构建时未使用实际账户进行验证 — 具体哪些假设未经验证,请参见下文的 New Relic 设置部分以及 backends/newrelic.py 中的模块文档字符串。
  • Honeycomb — Query Data API,需要 Configuration Key 和数据集别名。构建时未使用实际账户进行验证;研究发现,以编程方式调用 Query Data API(实际运行查询并获取结果的唯一方式)据文档说明仅限 Enterprise 套餐使用 — 参见下文的 Honeycomb 设置部分以及 backends/honeycomb.py 中的模块文档字符串。

这八种后端都实现了相同的 BaseBackend 接口,因此无论服务连接到哪种后端,每个 MCP 工具的工作方式都完全一致。各后端的设置方式请参见配置。


与上游的不同之处

上游的 opentelemetry-mcp-server 提供了 Jaeger、Tempo 和 Traceloop。tracehub-mcp 新增了 Datadog 和 Sentry 作为完整后端——不是薄封装,而是实现了每项工具的完整功能(搜索、Span 搜索、Trace 补全、服务发现、健康检查)。与此同时,所有五个后端——包括从上游继承的三个——都经过加固,达到一致的标准:

  • 云后端仅允许 HTTPS。 Datadog 和 Sentry 都拒绝使用纯 http:// URL 启动,因为它们的认证方式是 Bearer Token 或 API+App 密钥对,不应通过明文传输。
  • 安全转义,防止查询注入。 所有拼接到 Datadog Span 搜索查询或 Sentry Discover 查询中的值,都会经过转义并用精确匹配的引号括起;字段名称(因为它们来自 MCP 工具的 filters 参数,不那么明显地属于不可信输入)在拼接到查询字符串之前,会根据允许的模式进行验证,从而杜绝通过精心构造的字段名称进行结构性注入。
  • 所有使用游标分页的后端都限制分页范围(Datadog、Sentry)——搜索会在达到请求的 limit 或后端不再返回后续游标时停止,以先发生者为准,因此单次工具调用不会退化成无界抓取。
  • 重新验证精确 ID。 当后端搜索 API 可能返回相邻结果而非精确匹配时(尤其是 Datadog 从分组 Span 重建 Trace 的情况),返回前都会将每个结果与请求的精确 ID 重新核对。
  • 对于我们构建的后端,畸形响应不会生成虚构数据。 Datadog 和 Sentry 会直接拒绝 Span,而不是在缺少时间戳时用 now() 这类占位值替代,或在缺少 service_name/operation_name 时填入字面值 "unknown",因为虚构值会悄然破坏 Trace 排序、时长汇总,以及任何按服务或操作分组的工具。(从上游继承的三个后端——Jaeger、Tempo、Traceloop——早于这项规范,尚未进行改造;这是有意控制范围,而非疏忽,体现了本项目一贯的做法:未经完整回归测试,不触及共享或继承的代码。)

这一切都有 458 项测试通过(2 项跳过,零回归)、干净通过的 ruff check 和 mypy --strict,以及针对新后端的两轮对抗式 CodeRabbit 审查作为保障。


安装

tracehub-mcp 已发布到 PyPI。选择你当前工作流中使用的方式即可——它们效果相同。

选项 1:uvx(无需安装)
uvx tracehub-mcp --backend jaeger --url http://localhost:16686

上方的快速入门配置使用的就是这种方式——uv 会一次性获取软件包并运行 tracehub-mcp 入口点,各次运行之间不会在磁盘上留下任何内容。

选项 2:pip / pipx
pipx install tracehub-mcp
# or: pip install tracehub-mcp

tracehub-mcp --backend jaeger --url http://localhost:16686
选项 3:克隆并从源代码运行
git clone https://github.com/mcpsmiths/tracehub-mcp.git
cd tracehub-mcp
uv sync

uv run tracehub-mcp --backend jaeger --url http://localhost:16686

如果你要在本地开发、希望固定到特定提交,或希望安装开发工具(uv sync --group dev),请使用此方式。

选项 4:Docker
# The image's CMD binds 0.0.0.0 inside the container, so a caller token is
# mandatory: clients send it as `Authorization: Bearer $MCP_HTTP_BEARER_TOKEN`.
export MCP_HTTP_BEARER_TOKEN=$(openssl rand -hex 32)
docker run --rm -p 8000:8000 \
  -e BACKEND_TYPE=jaeger -e BACKEND_URL=http://host.docker.internal:16686 \
  -e MCP_HTTP_BEARER_TOKEN \
  -e MCP_ALLOWED_HOSTS=localhost \
  ghcr.io/mcpsmiths/tracehub-mcp:latest

在缓冲后端响应之前,会将其限制为 BACKEND_MAX_RESPONSE_BYTES(默认解码后为 64 MiB),但服务许多会话的容器仍可受益于 Docker 自带的防护措施:添加 --memory 1g --restart unless-stopped(或对应的 Compose 配置),这样即使进程耗尽内存,也会受到限制并自动恢复运行,无需运维人员介入。

默认运行 HTTP 传输(镜像的 CMD),并且必须设置 MCP_HTTP_BEARER_TOKEN 才能启动;也可以显式设置 -e MCP_ALLOW_UNAUTHENTICATED_HTTP=true 选择不进行身份验证,但这样一来,所有能够访问已发布端口的对端都能获得后端的完整读取权限。客户端通过 Authorization: Bearer <token> 连接到 http://localhost:8000/mcp;/health 和 /ready(镜像的 HEALTHCHECK)无需令牌。由于 CMD 绑定到 0.0.0.0,只有设置 MCP_ALLOWED_HOSTS 时,容器才会验证 Host 标头;务必将其设为客户端使用的主机名(上例中为 localhost,实际部署中则为公共名称);* 会关闭 Host 验证,且不能与其他名称混用(否则服务器将拒绝启动)。对于配置中使用 command/args 键值对直接指向 docker,而非本地二进制文件的 MCP 客户端(Cursor、Windsurf),也应使用这种配置形式——在 args 中传入相同的 -e MCP_HTTP_BEARER_TOKEN=...。

**前提条件:**Python 3.11+;选项 1 和 3 还需要 uv;选项 4 需要 Docker。


配置

配置可以通过环境变量、CLI 标志或两者共同提供。优先级:CLI 参数 > 环境变量 > 默认值。

# .env (see .env.example)
BACKEND_TYPE=jaeger
BACKEND_URL=http://localhost:16686
# Equivalent via CLI flags
tracehub-mcp --backend jaeger --url http://localhost:16686
所有配置选项
VariableTypeDefaultDescription
BACKEND_TYPEstringjaeger后端类型:jaeger、tempo、traceloop、datadog、sentry、xray、newrelic 或 honeycomb
BACKEND_URLURL-后端 API 端点(必需;对于 X-Ray 仅为装饰性占位符)。不得嵌入凭据:启动时会拒绝包含 user:password@host 的 URL,因为该 URL 会被记录、由 --print-config/doctor 打印,并可能在后端错误文本中回显;请改用 BACKEND_API_KEY(Bearer)或 BACKEND_TEMPO_INSTANCE_ID + BACKEND_API_KEY(Basic)
BACKEND_API_KEYstring-API 密钥/身份验证令牌(Traceloop、Datadog、Sentry、New Relic 和 Honeycomb 必需;X-Ray 不使用)
BACKEND_APP_KEYstring-应用密钥(仅适用于 Datadog,且需同时提供 BACKEND_API_KEY)
BACKEND_TEMPO_INSTANCE_IDstring-Grafana Cloud 堆栈/实例 ID(仅适用于 Tempo;启用 Basic Auth,且需同时提供 BACKEND_API_KEY)
BACKEND_SENTRY_ORGstring-组织标识(Sentry 必需)
BACKEND_SENTRY_PROJECTstring-项目标识(Sentry 可选;将查询范围缩小到一个项目)
BACKEND_AWS_REGIONstring-AWS 区域,例如 us-east-1(X-Ray 必需)
BACKEND_NEWRELIC_ACCOUNT_IDstring-New Relic 账户 ID(New Relic 必需;NerdGraph 查询按用户而非账户划分范围)
BACKEND_HONEYCOMB_DATASETstring-Honeycomb 数据集标识(Honeycomb 必需;Query Data API 按数据集划分范围)
BACKEND_ENVIRONMENTSstringprd逗号分隔的环境(仅适用于 Traceloop)
BACKEND_TIMEOUTfloat30请求超时秒数。在 Honeycomb 上,这也是查询在共享的每分钟 10 次 Create Query Result 配额中等待空闲名额的最长时间,超时后会失败并返回 HoneycombRateLimitedError;增大此值可允许更长等待时间。此外,还会据此计算一次逻辑后端请求的总截止时间——包括连接、每次重试及其等待时间、每次重定向跳转和整个响应正文读取——即 max(30 s, 4 x BACKEND_TIMEOUT);超过此时间后,调用会失败并返回 BackendDeadlineExceededError,因此后端即使缓慢地逐字节传输数据,也无法无限期占用工具调用
BACKEND_MAX_RESPONSE_BYTESinteger67108864 (64 MiB)任意单个后端响应的解码后大小上限(1 至 1 GiB)。httpx 会自动解压 gzip/deflate 响应正文,因此如果不设上限,后端(或重定向目标)选择的约 1 KB 线上响应正文可能膨胀为约 1 MB 堆内存,解析后又增至约 3 倍;而所有 MCP 会话和 /ready 共用同一个进程。若声明的 Content-Length 超过上限,会在读取正文前拒绝;若正文解码后超过上限,则会失败并返回 ResponseTooLargeError(不会重试)。如果合法的跟踪查询被拒绝,请增大此值;次要后端使用 SECONDARY_BACKEND_MAX_RESPONSE_BYTES。正文会在上限内增量解压,因此峰值内存(而不仅是缓冲区大小)受到限制;只接受 gzip/deflate(或不编码),读取正文前会拒绝 br、zstd、未知或串联的 Content-Encoding;请求会声明 Accept-Encoding: gzip, deflate,因此绝不会让后端有机会发送其他编码
SECONDARY_BACKEND_TYPE / SECONDARY_BACKEND_URL / ...string/URL未设置(选择启用)为 correlate_trace 配置第二个独立后端(跨后端关联);上方每个 BACKEND_* 变量都有对应的 SECONDARY_BACKEND_* 变量。仅支持环境变量,不提供 CLI 标志。未设置时,若调用 correlate_trace,会引发明确错误
LOG_LEVELstringINFO日志级别:DEBUG、INFO、WARNING、ERROR(--log-level)。httpx 每个请求的 HTTP Request: GET <url> 行仅在 DEBUG 级别输出(其中会打印完整请求 URL);服务器根 stderr 处理器写入的每条记录都会经过过滤器,在写入前移除 URL 中的 user:password@ 部分(fastmcp 和 uvicorn 自身的日志记录器使用各自的处理器,不受此过滤;工具错误会在 fastmcp 记录日志前进行脱敏)
MAX_TRACES_PER_QUERYinteger500服务器范围的上限(1-1000,--max-traces-per-query);限制每个后端查询的跟踪/跨度 limit,包括工具内部的超额获取(get_llm_expensive_traces/get_llm_slow_traces 最多对这么多个候选项排序,get_llm_model_stats 最多分析这么多条跟踪,correlate_trace 的回退查询对每个服务最多获取这么多个候选项),无论调用方的 Agent 请求多少。主后端和次要后端都会在后端边界强制执行此限制。后端仍可能请求多达此上限 5 倍的原始跨度(跨度搜索为 2 倍)以发现跟踪 ID,每次请求都受其自身分页上限限制
SLOW_REQUEST_THRESHOLD_MSfloat未设置任何后端请求慢于此值时都会记录一条 WARNING,不受 LOG_LEVEL 影响(--slow-request-threshold-ms)
MCP_TRANSPORT / MCP_HOST / MCP_PORTstring/intstdio/127.0.0.1/8000--transport/--host/--port 对应的环境变量。HTTP 默认绑定到 loopback;非 loopback 的 MCP_HOST(例如 0.0.0.0)必须设置 MCP_HTTP_BEARER_TOKEN 或 MCP_ALLOW_UNAUTHENTICATED_HTTP
MCP_HTTP_BEARER_TOKENstring未设置仅适用于 HTTP 传输。所有 /mcp 请求都必须提供的共享 Bearer 令牌,格式为 Authorization: Bearer <token>(至少 32 个字符,例如 openssl rand -hex 32)。当 MCP_HOST 不是 loopback 时必须设置,除非已设置 MCP_ALLOW_UNAUTHENTICATED_HTTP;/health 和 /ready 仍无需身份验证。虽然提供了 --http-bearer-token,但建议优先使用环境变量,因为每个本地用户都能通过 ps 查看 argv。空值(已设置变量但值为空,例如 .env 或 compose 行未提供值)会导致启动错误(退出码 2),而非视为“未设置”;该值必须是无空白字符的可打印 ASCII 字符,以便客户端能逐字节原样提供
MCP_ALLOW_UNAUTHENTICATED_HTTPboolfalse仅适用于 HTTP 传输。确认在非 loopback 主机上无令牌提供 /mcp:每个能访问该端口的网络对等方都能使用运维人员的后端凭据运行所有工具(--allow-unauthenticated-http)
MCP_ALLOWED_HOSTSstring未设置仅适用于 HTTP 传输。以逗号分隔的主机名/IP 字面值,可接受的 Host 标头除 loopback 名称和绑定地址外,还包括这些值;其他任何 Host 都会在任何路由运行前返回 421 Misdirected Request(防御 DNS 重绑定:被重绑定页面的 GET 请求会在 Host 中携带攻击者的名称,且不带 Origin)。loopback MCP_HOST 会自动验证 Host;网络绑定(0.0.0.0,即 Docker CMD)只有在此处列出其公共主机名后才会验证;* 会禁用 Host 验证,且必须单独使用——将 * 与主机名混合的列表,或包含非主机名/IP 字面值的条目,都会在启动时被拒绝(--allowed-hosts;主机名标签只能包含字母、数字和连字符,因此 Docker Compose 服务名 trace_hub 可通过——允许下划线)。Docker 镜像的默认 CMD 绑定到 0.0.0.0,因此对于每个能从宿主机以外访问的容器,都应设置此项。两侧都会对尾随点和 IPv6 字面值格式进行规范化;格式错误的 Host(IPv6 字面值右括号后除 :<port> 外还有其他文本)会返回 421
MCP_INCLUDE_ARGS_IN_SPANSboolfalse在下方启用自监控时,将工具调用参数/结果作为 OTel 跨度属性包含在内;默认关闭,因为其中可能包含敏感数据。导出前会对已知凭据格式(Bearer 令牌、api_key=/secret=/password= 等字段、AWS/GitHub/常见供应商密钥前缀)进行脱敏,但这只是模式匹配,并非万无一失;trace_id/span_id 及其他合法跟踪数据会有意保持原样(--include-args-in-spans)
OTEL_EXPORTER_OTLP_ENDPOINTURL未设置设置后启用工具调用的可选 OTel 自监控;未设置时开销为零(不配置 TracerProvider,不注册中间件)
OTEL_SERVICE_NAMEstringtracehub-mcp自监控跨度中报告的服务名称
OTEL_TRACES_SAMPLERstring未设置标准 OTel SDK 采样器覆盖项。未设置时,tracehub-mcp 会安装一个采样器,无论调用方的 traceparent 跟踪标志如何设置,都会记录自身跨度(SDK 默认行为会丢弃远程父跨度未采样的跨度);设置后则采用 SDK 自身的解析结果。在此采样器发布前的版本中,OTEL_TRACES_SAMPLER=always_on 是运维侧的缓解措施(仅修复抑制问题,不会改变调用方选择的跟踪标识)
MCP_TRUST_CLIENT_TRACE_CONTEXTboolstdio 为 true,HTTP 为 false启用自监控时,将调用方在请求的 params._meta 中提供的 W3C 跟踪上下文设为此服务自身跨度的父上下文。stdio 的调用方只有可信的父进程;通过 HTTP 时,任意对等方都可能选择此服务跨度及相关日志行归属的 trace_id、父跨度和 tracestate,因此默认关闭,除非你选择启用(--trust-client-trace-context)
QUERY_CACHE_TTL_SECONDSfloat未设置将后端查询结果(search_traces/search_spans/get_trace/list_services/get_service_operations)缓存这么多秒,并合并进行中的请求(未设置:禁用;--query-cache-ttl-seconds)。必须是有限值、大于 0 且不超过 86400(一天);更大或非有限值会导致启动错误。缓存结果保存在服务器进程内存中,由该进程的所有 MCP 会话共享
QUERY_CACHE_MAX_ENTRIESinteger1024同时持有的缓存查询结果数量上限(1-100000,--query-cache-max-entries),与 TTL 无关:添加新结果会超出上限时,淘汰最近最少使用的条目。如果调用的缓存键(其已验证的参数)超过 64 KiB(例如筛选值过大),该调用仍会正常处理,但不会缓存
RATE_LIMIT_MAX_REQUESTSinteger100仅适用于 HTTP 传输。每个 TCP 对等地址在每个 RATE_LIMIT_WINDOW_SECONDS 周期内允许的最大请求数(--rate-limit-max-requests;设为 0 可禁用)。位于反向代理后时,除非 FORWARDED_ALLOW_IPS 列出该代理,否则所有客户端共用代理的配额。负值会在启动时被拒绝(0 仍表示禁用)
FORWARDED_ALLOW_IPSstring未设置仅适用于 HTTP 传输。以逗号分隔的代理 IP/CIDR(或 *),这些代理的 X-Forwarded-For 可替代 TCP 对等地址作为速率限制键;uvicorn 也会识别同一变量。未设置时,即使来自 127.0.0.1,也绝不信任该标头(不会应用 uvicorn 自身隐式的默认值)。请将代理配置为覆盖或追加 X-Forwarded-For,而非透传客户端的标头(--forwarded-allow-ips)。* 会信任每一跳,因此任何客户端都可自行设置 X-Forwarded-For 并选择自己的速率限制键;请改为指定代理地址;非 IP 字面值或严格 CIDR 的条目会在启动时被拒绝
RATE_LIMIT_WINDOW_SECONDSfloat60仅适用于 HTTP 传输。RATE_LIMIT_MAX_REQUESTS 的固定窗口大小,单位为秒(--rate-limit-window-seconds)。必须是有限值且大于 0;0、负值、inf 或 nan 都会在启动时被拒绝
READINESS_CACHE_SECONDSfloat30仅适用于 HTTP 传输。GET /ready 会将其后端探测(health_check + list_services)的结果缓存这么多秒;失败的探测最多缓存 5 秒,以便尽快发现恢复情况;并发探测会共用一个正在进行的检查,因此任意数量的无需身份验证的就绪状态请求,每个窗口最多只会消耗一次后端探测(在 Honeycomb 上占用共享的每分钟 10 次查询配额中的一个名额;在 X-Ray 上最多会调用数百次 API)。若探测在 10 秒后仍未响应,则返回 503。因此,/ready 报告的状态可能最多滞后这么多秒;0 会禁用缓存,但保留超时和进行中请求共享机制(--readiness-cache-seconds)。探测失败时,503 正文只包含错误类别(backend unreachable、backend timeout、backend error <status>、backend unhealthy);每次新的探测只会将脱敏后的详情记录一次 WARNING,且绝不会返回给无需身份验证的调用方
SESSION_IDLE_TIMEOUT_SECONDSfloat1800仅适用于 HTTP 传输。关闭这么多秒内没有请求的 streamable-HTTP 会话(必须大于 0);之后其 ID 会返回 404,且符合规范的客户端会重新初始化。限制单个对等方占用共享的 10,000 个会话表项的时长(--session-idle-timeout-seconds)。已部署的容器可设置 fastmcp 自身的 FASTMCP_HTTP_SESSION_IDLE_TIMEOUT,作为无需改代码的临时措施
MCP_STATELESS_HTTPboolfalse仅适用于 HTTP 传输。对每个 /mcp 请求使用全新的传输,不跟踪会话,因此请求结束后不会保留任何对等方状态;代价是无法使用用于服务器发起通知的 GET SSE 流(--stateless-http)
SHUTDOWN_DRAIN_SECONDSfloat0.0仅适用于 HTTP 传输。关闭时,在 ASGI 关闭处理程序中等待这么多秒;此时 uvicorn 已完成对进行中连接的清理,然后才关闭共享的后端 HTTP 客户端(--shutdown-drain-seconds)
BACKEND_CLOSE_TIMEOUT_SECONDSfloat5.0仅适用于 HTTP 传输。如果共享的后端 HTTP 客户端未能在这么多秒内完成关闭,则在关闭期间放弃关闭它;uvicorn 不会为此等待设定自身超时(--backend-close-timeout-seconds)
GRACEFUL_SHUTDOWN_TIMEOUT_SECONDSinteger2仅适用于 HTTP 传输。uvicorn 自身对关闭时等待进行中的连接/任务完成的时限(仅支持整秒),超时后会取消这些连接/任务(--graceful-shutdown-timeout-seconds)
MCP_ACCESS_LOGbooleanfalse仅适用于 HTTP 传输。重新启用 uvicorn 的逐请求访问日志行(--access-log)。默认关闭,因为该日志行会包含完整请求目标,其中可能包括配置错误的客户端放在查询字符串中的令牌;启用后,每条访问日志行中的查询字符串、片段、矩阵参数(;,uvicorn 会将其记录为 %3B)以及百分号编码的 ?/# 都会被剥除,记录的路径会截断至 2 KiB;放在路径段中的令牌无法与路径区分,因此会被记录,切勿将令牌放在那里
每个与后端相关的 CLI 标志都有对应的环境变量(--backend/BACKEND_TYPE、--url/BACKEND_URL、--api-key/BACKEND_API_KEY、--app-key/BACKEND_APP_KEY、--tempo-instance-id/BACKEND_TEMPO_INSTANCE_ID、--sentry-org/BACKEND_SENTRY_ORG、--sentry-project/BACKEND_SENTRY_PROJECT、--aws-region/BACKEND_AWS_REGION、--environments/BACKEND_ENVIRONMENTS)。--disable-tools <name1,name2,...> / --enabled-tools <name1,name2,...>(仅限 CLI,没有对应的环境变量)可在信任度较低的部署中移除或允许列表中的工具——先应用 --enabled-tools,再在其保留的工具基础上应用 --disable-tools。--allowed-hosts、--forwarded-allow-ips、--rate-limit-max-requests 和 --rate-limit-window-seconds(以及对应的环境变量)会在服务启动时进行校验:如果某个值无法按其写法生效,程序会以代码 2 退出,并显示一条同时指出标志和环境变量名称的用法错误——对于 --allowed-hosts 和 --forwarded-allow-ips,错误条目会以有长度限制的 repr 回显;两个速率限制选项则由 click 自带的整数/浮点数范围校验,这些校验会按原样回显所写的值——其 --help 文本还会显示环境变量([env var: ...)。运行 tracehub-mcp --help 查看完整列表。

**已知的第三方出站网络依赖:**底层 FastMCP 框架每 12 小时会在打印启动横幅时检查 PyPI(https://pypi.org/pypi/fastmcp/json),查看是否有更新版本的 FastMCP——这是 FastMCP 自身的行为,与 tracehub-mcp 无关,也不同于上文所述的 OTel 自监测。无法访问网络时,此检查会静默失败。对于网络受限或隔离网络部署,可设置 FASTMCP_CHECK_FOR_UPDATES=off 禁用此检查;也可设置 FASTMCP_SHOW_SERVER_BANNER=false 完全隐藏横幅。

按后端配置
Jaeger
BACKEND_TYPE=jaeger
BACKEND_URL=http://localhost:16686

无需 API 密钥。search_traces 和 search_spans_tool 都要求提供 service_name 参数——Jaeger 的 API 针对按服务查询进行了优化,因此不支持跨所有服务查询。请先使用 list_services 查找服务名称。

Grafana Tempo
BACKEND_TYPE=tempo
BACKEND_URL=http://localhost:3200

本地/可自托管安装无需 API 密钥。搜索底层使用 TraceQL;service_name 为可选参数。

对于托管在 Grafana Cloud 上的 Tempo,还需将 BACKEND_TEMPO_INSTANCE_ID 设为堆栈的实例 ID,并将 BACKEND_API_KEY 设为具有 traces:read 权限范围的 Cloud Access Policy 令牌——Grafana Cloud 要求使用 Basic Auth(实例 ID 作为用户名,令牌作为密码),而非可自托管 Tempo 使用的 Bearer 令牌身份验证:

BACKEND_TYPE=tempo
BACKEND_URL=https://tempo-prod-XX-prod-XX-XXXX.grafana.net
BACKEND_TEMPO_INSTANCE_ID=your_stack_instance_id
BACKEND_API_KEY=your_cloud_access_policy_token
Traceloop
BACKEND_TYPE=traceloop
BACKEND_URL=https://api.traceloop.com
BACKEND_API_KEY=your_api_key_here

API 密钥中包含项目信息——后端始终使用项目 slug "default",Traceloop 会根据密钥本身解析实际的项目/环境。

Datadog
BACKEND_TYPE=datadog
# US site (default): https://api.datadoghq.com
# EU site:            https://api.datadoghq.eu
BACKEND_URL=https://api.datadoghq.com
BACKEND_API_KEY=your_api_key_here
BACKEND_APP_KEY=your_application_key_here

Datadog 要求同时提供 API 密钥和 Application 密钥——仅有一个密钥不足以查询 span/trace,尽管数据写入只需要 API 密钥。Trace 搜索使用 Datadog 的 span 搜索查询语法,而非 TraceQL 或 Jaeger 风格的标签参数;由于 Datadog 没有 trace 级别的查询端点,trace 会根据分组后的 span 重建。后端也会拒绝普通的 http:// URL——请参阅与上游版本的区别。

**故障排查:**Datadog API 返回 403 几乎总是表示缺少或无效的是 Application 密钥(而非 API 密钥)。如果你使用的是 EU 站点,请确认 BACKEND_URL 为 https://api.datadoghq.eu,而不是默认的美国站点地址。

Sentry
BACKEND_TYPE=sentry
# SaaS (may be region-specific, e.g. https://us.sentry.io):
BACKEND_URL=https://sentry.io
BACKEND_API_KEY=your_auth_token_here
BACKEND_SENTRY_ORG=your-org-slug
# Optional: narrow queries to one project
BACKEND_SENTRY_PROJECT=your-project-slug

Sentry 同时需要身份验证令牌 和 组织 slug——此后端调用的每个端点都限定在组织范围内。Trace 搜索使用 Sentry 的搜索语法调用 Discover/Explore Events API。与 Datadog 不同,Sentry 提供原生的 trace 查询端点,因此 get_trace 会直接调用该端点,而不是从 span 重建 trace——不过,search_traces 仍会先通过 span 搜索来发现候选 trace ID,因为 Sentry 的搜索功能本身以 span 为中心。与 Datadog 一样,此后端不接受普通的 http:// URL。

故障排查: Sentry API 返回 403/401,几乎总是意味着身份验证令牌缺失、无效或缺少必要的权限范围。组织范围端点返回 404,通常意味着组织 slug 错误。对于可自托管的安装,BACKEND_URL 应为安装实例自身的基础 URL,而不是 https://sentry.io。此后端依赖的部分 tracing 端点在 Sentry 端较新或仍属实验性功能,可能并非所有套餐或自托管版本都提供——具体信息请参阅 backends/sentry.py 中的模块文档字符串。

AWS X-Ray
BACKEND_TYPE=xray
# Decorative only - never dereferenced for a live request. Keep it
# consistent with BACKEND_AWS_REGION by convention.
BACKEND_URL=https://xray.us-east-1.amazonaws.com
BACKEND_AWS_REGION=us-east-1

与此处其他所有后端不同,X-Ray 通过 boto3/SigV4 查询,而不是使用 bearer 令牌——身份验证来自 boto3 的标准凭证链(环境变量、~/.aws/credentials、假定角色或实例/任务角色)。运行中的进程需要 xray:GetTraceSummaries、xray:BatchGetTraces,以及(可选,用于加快 list_services)xray:GetServiceGraph IAM 权限。所有 boto3 调用都在后端实例拥有的专用 8 线程池中运行,因此无论有多少会话或就绪探测到达,同时进行的 X-Ray API 调用最多为 8 个——这是固定上限,没有可调设置,因为提高上限只会增加每次突发请求的 X-Ray 费用。

过滤能力比其他后端更有限。 默认情况下,OpenTelemetry span 属性会转换为 X-Ray segment metadata,而不是 annotations——只有 annotations 会被索引,并可通过 X-Ray 的 FilterExpression 搜索语法查询。此后端只能原生下推服务名称、时长,以及根据 error/fault/throttle 得出的状态;其他所有字段(包括全部 gen_ai.* 属性)都会在获取完整 trace 后始终由客户端应用,除非你自己的 OTel/ADOT collector 配置明确将这些键提升为已索引的 annotations。

故障排查: GetServiceGraph 返回 AccessDeniedException 不会导致操作失败——list_services 会自动回退到采样近期 trace。GetTraceSummaries/BatchGetTraces 返回 AccessDeniedException 则会导致搜索/获取数据失败,并使 health_check/doctor 结果显示为不健康;请仔细检查上述 IAM 权限。

New Relic
BACKEND_TYPE=newrelic
# US datacenter (default): https://api.newrelic.com/graphql
# EU datacenter:            https://api.eu.newrelic.com/graphql
BACKEND_URL=https://api.newrelic.com/graphql
BACKEND_API_KEY=your_user_api_key_here
BACKEND_NEWRELIC_ACCOUNT_ID=1234567

New Relic 需要 User API 密钥(而非无法用于查询的 Ingest 或 License 密钥) 以及 account ID——User 密钥的作用范围是用户,而非账户,因此此处的每个 NerdGraph 查询都会明确指定要查询的账户。搜索使用 NRQL(SELECT * FROM Span WHERE ...);与 Sentry 一样,get_trace 使用 NerdGraph 原生的 distributedTracing.trace 查询,而不是从搜索结果重建 trace。

开发时未使用在线 New Relic 账户进行验证。 有两点需要通过真实账户确认:distributedTracing.trace 的 GraphQL 响应中 OTel span 属性的确切结构(目前假设为扁平、可直接通过键访问的对象),以及账户实际的 Span 数据保留期限(确认前采用保守的默认值 7 天)。在生产环境依赖此后端之前,请参阅 backends/newrelic.py 中的模块文档字符串,查看完整的未验证假设列表。

Honeycomb
BACKEND_TYPE=honeycomb
# US instance (default): https://api.honeycomb.io
# EU instance:            https://api.eu1.honeycomb.io
BACKEND_URL=https://api.honeycomb.io
BACKEND_API_KEY=your_configuration_key_here
BACKEND_HONEYCOMB_DATASET=your-dataset-slug
Honeycomb 需要一个具有“Manage Queries and Columns”和“Run Queries”权限的 **Configuration Key**(不是 Ingest 或 Management Key),**以及**一个数据集 slug——Query Data API 的作用域限定为数据集。搜索会运行 Honeycomb 的三步异步查询流程(创建查询规范、运行查询、轮询结果),而不是使用 NRQL/TraceQL 这类文本查询语言;由于文档中没有专用的单条 Trace 查询端点,`get_trace` 会通过 `trace.trace_id` 进行搜索。Honeycomb 将每个 Configuration Key 的 Create Query Result 限制为每分钟 10 次,因此服务会通过一个共享的凭据级预算来控制每次查询运行的节奏——使用相同 Key 构建的 `SECONDARY_BACKEND_*` Honeycomb 实例也会共享该预算,HTTP 传输上的 `GET /ready` 的 `list_services` 探测同样如此(按 `READINESS_CACHE_SECONDS` 缓存)。如果查询的可用时段无法在 `BACKEND_TIMEOUT` 内释放,查询会立即失败并返回 `HoneycombRateLimitedError`,而不是等待到超时之后;如需允许更长的等待时间,请提高 `BACKEND_TIMEOUT`。

Go/no-go 风险,不只是未经验证的细节。 此后端的研究发现,程序化 Query Data API(create-query-result + get-query-result)是实际运行查询并获取数据的唯一方式,且文档显示它仅适用于 Enterprise 计划;Free 和 Pro 账户可以通过 API 构建查询规范,但无法执行查询。如果返回 402/403,此后端会抛出明确的 HoneycombEnterpriseRequiredError,但我们从未通过实际测试确认非 Enterprise 账户会返回的具体状态码,而且此后端的开发完全没有使用实际账户(无论是否为 Enterprise 账户)。在生产环境依赖此后端之前,请参阅 backends/honeycomb.py 中的模块文档字符串,了解完整的未经验证假设列表——包括如何从以聚合为导向的 Honeycomb Query API 中提取原始的每条 Span 数据。

传输模式
# stdio (default) — local use, Claude Desktop, single process
uvx tracehub-mcp
tracehub-mcp                      # pipx/pip install
uv run tracehub-mcp               # from-source install

# HTTP — remote access, multiple clients, network deployment, sample applications
# Loopback (the default --host) needs no token: same-machine clients use http://127.0.0.1:8000/mcp
uvx tracehub-mcp --transport http --port 8000
# Every interface: a caller token is mandatory (or the explicit --allow-unauthenticated-http opt-out)
export MCP_HTTP_BEARER_TOKEN=$(openssl rand -hex 32)
uvx tracehub-mcp --transport http --host 0.0.0.0 --port 8000
tracehub-mcp --transport http --host 0.0.0.0 --port 8000              # pipx/pip install
uv run tracehub-mcp --transport http --host 0.0.0.0 --port 8000       # from-source install

使用 HTTP 传输时,客户端会连接到 http://<host>:<port>/mcp(可流式 HTTP,兼容各类 MCP 客户端);每当设置了 MCP_HTTP_BEARER_TOKEN,客户端都必须在每个请求中发送 Authorization: Bearer <token>——缺少令牌或令牌错误时会返回带有 WWW-Authenticate: Bearer 挑战的 401,且不会打开会话。uvicorn 的逐请求访问日志默认关闭(通过 --access-log / MCP_ACCESS_LOG=true 可重新启用;启用后会从每一行日志中剥离查询字符串、片段、矩阵参数(;,uvicorn 会将其记录为 %3B)和百分号编码的 ?/#,并将日志路径截断至 2 KiB;但放在路径段中的令牌仍会被记录):否则它会将完整请求目标写入服务器日志——包括配置错误的客户端放在查询字符串中的令牌——而日志中没有任何内容是必要的;请求级诊断信息来自服务器自身受限的 Host/Origin 拒绝日志和速率限制日志、慢请求 WARNING,以及启用时的 OTel Span。

绑定到回环地址时,也会自动验证 Host 标头(回环名称和绑定地址会通过,其他值会返回 421),从而防止 DNS 重绑定攻击:浏览器页面发出的、没有 Origin 的 GET 请求携带攻击者提供的 Host。如果同主机反向代理转发到 127.0.0.1 并保留了公网 Host(nginx 默认的 proxy_set_header Host $proxy_host 不会这样做),请在 --allowed-hosts/MCP_ALLOWED_HOSTS 中列出该名称。网络绑定也能获得同样的保护,前提是在 --allowed-hosts 中列出公网主机名;--allowed-hosts '*' 可关闭保护,且必须单独使用(启动时会拒绝将 * 与其他名称混用的列表)。

Fly.io: 一键命令 fly mcp launch 仅支持 stdio 传输服务器—— 无法部署此服务器的 --transport http 模式。在 Fly.io 上使用 HTTP 传输运行 tracehub-mcp, 需要改用手动配置 fly.toml 并执行 fly deploy。


诊断

将配置接入实际的 MCP 客户端前,请先验证:

tracehub-mcp doctor --backend jaeger --url http://localhost:16686
[OK] Configuration loaded and validated
[OK] Backend constructed: jaeger @ http://localhost:16686/
[OK] Health check: healthy
[OK] Connectivity probe (list_services): 2 service(s)

doctor 接受与主命令相同的 --backend/--url/等标志;如果任何步骤失败,它都会以非零状态码退出。与此不同,常规服务启动会延迟初始化后端,即使初始健康检查失败,也会有意继续运行。

如需查看完全解析后的配置(合并了环境变量和 CLI 覆盖项),但不启动服务:

tracehub-mcp --print-config --backend jaeger --url http://localhost:16686

密钥(--api-key/--app-key)会以 api_key_set/app_key_set 布尔值报告,不会显示实际值。


安全注意事项

此服务返回的跟踪和跨度数据——属性值、错误消息、操作名称——来自可观测性后端正在监控的应用,而非 tracehub-mcp 本身。因此,尽管是受信任的服务(本服务)将这些数据返回给 MCP 客户端,但从根本上说,这些数据与网页或文件一样,都属于不受信任的外部内容。

  • HTTP 传输会以你的后端凭据运行每个工具,因此请对调用方进行身份验证。 --transport http 默认绑定到环回地址(127.0.0.1)。若要在网络接口上提供服务(--host 0.0.0.0,Docker 镜像的 CMD),则必须设置 MCP_HTTP_BEARER_TOKEN(客户端发送 Authorization: Bearer <token>);除非传入 --allow-unauthenticated-http,以接受任何能够访问该端口的对端都能获得后端的完整读取权限,否则服务会拒绝启动。你也可以保持绑定到环回地址,并在专用网络上使用需要身份验证的反向代理。/health 和 /ready 始终无需令牌。
  • 后端凭据绝不能放在 BACKEND_URL 中。 含有 user:password@host 的 URL 会在启动时被拒绝,并提示受支持的替代方式(BACKEND_API_KEY,或用于 Basic 身份验证的 BACKEND_TEMPO_INSTANCE_ID + BACKEND_API_KEY),因为该 URL 会被记录日志、由 --print-config/doctor 打印,并原样嵌入后端错误文本,进而出现在 /ready 响应正文和工具错误中。作为纵深防御措施,进程对外传出的每个 URL 和后端错误字符串也都会移除任何用户信息部分;根日志处理程序则会从所有日志记录中将其脱敏,包括回溯信息。
  • 后端响应无法引导服务访问其他主机。 共享 HTTP 客户端发送的每个请求——包括后端自身通过 3xx Location 指定的每一跳重定向——都会被拒绝,除非其源站(方案、主机和端口)与配置的 BACKEND_URL 源站一致(即使重定向到后端自身主机的其他端口或方案也会被拒绝:请将 BACKEND_URL 配置为最终使用的方案和端口);如果解析结果是云实例元数据地址,也会被拒绝,无论其采用何种表示形式(169.254.169.254、十进制/十六进制/八进制 IPv4 形式、168.63.129.16、metadata.google.internal)。不支持将 API 调用重定向到其他主机名的后端或反向代理:请将最终主机配置为 BACKEND_URL。对于单个请求的所有跳转,客户端最多重试两次,累计最多遵循 10 s 的 Retry-After,最多跟随 5 次重定向,并会在任何情况下于 max(30 s, 4 x BACKEND_TIMEOUT) 时放弃,因此后端无法控制工具调用的耗时。
  • 将后端数据视为不受信任的输入。 使用 tracehub-mcp 中跟踪/跨度数据的 LLM 客户端,应像处理任何其他外部工具输出一样谨慎——跨度属性或错误消息是需要推理的应用数据,而不是要遵循的指令,无论其措辞如何。
  • 这是已知的 MCP 风险类别,并非 tracehub-mcp 特有。 OWASP 的 GenAI Security Project 在其《安全 MCP 服务开发实用指南》中对此有所介绍;Anthropic 自身的工程指导《我们如何遏制 Claude》也明确指出,即使工具本身可信,工具输出仍然是攻击面。
  • 实际影响: 如果你要查询处理不可信用户输入的应用(例如面向客户的聊天机器人)的跟踪数据,请注意,用户提供给该应用的对抗性内容可能会出现在此服务返回的跨度属性中,进而进入 LLM 客户端的上下文。

隐私政策

tracehub-mcp 是可自托管的软件,没有由维护者运营的服务或账户——它本身不会收集任何数据。完整政策请参阅 PRIVACY.md:软件会处理哪些数据、网络调用会发送到哪里,以及如何处理密钥和自监控。


MCP 客户端配置

以下每个示例都使用 uvx tracehub-mcp(无需安装)。如果你通过其他方式安装,请替换为 tracehub-mcp(通过 pip/pipx install 安装)或 uv run tracehub-mcp(从源码运行,使用 --directory /absolute/path/to/tracehub-mcp)——请参阅安装。

Claude Desktop

配置文件位置:

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows:%APPDATA%\Claude\claude_desktop_config.json

Jaeger(无需身份验证):

{
  "mcpServers": {
    "tracehub-mcp": {
      "command": "uvx",
      "args": ["tracehub-mcp"],
      "env": {
        "BACKEND_TYPE": "jaeger",
        "BACKEND_URL": "http://localhost:16686"
      }
    }
  }
}

Datadog(API 密钥 + App 密钥):

{
  "mcpServers": {
    "tracehub-mcp": {
      "command": "uvx",
      "args": ["tracehub-mcp"],
      "env": {
        "BACKEND_TYPE": "datadog",
        "BACKEND_URL": "https://api.datadoghq.com",
        "BACKEND_API_KEY": "your_api_key_here",
        "BACKEND_APP_KEY": "your_application_key_here"
      }
    }
  }
}

Sentry(身份验证令牌 + 组织 slug):

{
  "mcpServers": {
    "tracehub-mcp": {
      "command": "uvx",
      "args": ["tracehub-mcp"],
      "env": {
        "BACKEND_TYPE": "sentry",
        "BACKEND_URL": "https://sentry.io",
        "BACKEND_API_KEY": "your_auth_token_here",
        "BACKEND_SENTRY_ORG": "your-org-slug"
      }
    }
  }
}

如果你是从克隆的仓库运行,附带的包装脚本可让你在本地开发期间轻松切换后端:

{
  "mcpServers": {
    "tracehub-mcp": {
      "command": "/absolute/path/to/tracehub-mcp/start_locally.sh"
    }
  }
}

(脚本仅包含 Jaeger/Traceloop/Tempo 配置块,且默认启用 Jaeger——要切换,请注释掉当前启用的配置块,并取消注释所需的配置块;脚本中不包含 Datadog/Sentry,因此请手动添加它们的 export 行)。

Claude Code
claude mcp add tracehub-mcp -e BACKEND_TYPE=jaeger -e BACKEND_URL=http://localhost:16686 -- uvx tracehub-mcp

Datadog/Sentry 的配置方式相同——为每个后端所需的环境变量添加更多 -e KEY=value 标志(请参阅后端专属配置)。然后:

claude mcp list
claude "Show me traces with errors from the last hour"
Cursor

.cursor/mcp.json(项目级)或全局 Cursor MCP 配置:

{
  "mcpServers": {
    "tracehub-mcp": {
      "command": "uvx",
      "args": ["tracehub-mcp"],
      "env": {
        "BACKEND_TYPE": "jaeger",
        "BACKEND_URL": "http://localhost:16686"
      }
    }
  }
}
Windsurf

~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "tracehub-mcp": {
      "command": "uvx",
      "args": ["tracehub-mcp"],
      "env": {
        "BACKEND_TYPE": "jaeger",
        "BACKEND_URL": "http://localhost:16686"
      }
    }
  }
}
VS Code (GitHub Copilot)

工作区中的 .vscode/mcp.json——注意顶层键是 servers,而不是 mcpServers,stdio 服务无需 "type" 字段:

{
  "servers": {
    "tracehub-mcp": {
      "command": "uvx",
      "args": ["tracehub-mcp"],
      "env": {
        "BACKEND_TYPE": "jaeger",
        "BACKEND_URL": "http://localhost:16686"
      }
    }
  }
}
Gemini CLI

配置文件:~/.gemini/config.json,JSON 结构与上方的 Claude Desktop 相同。然后:

gemini "Analyze token usage for gpt-4 requests today"

工具参考

tracehub-mcp 提供 19 个 MCP 工具:

工具描述使用场景
search_traces使用简单参数或高级筛选条件搜索追踪记录查找特定请求或模式
search_spans_tool搜索单个跨度(不按追踪记录分组)查找 LLM 工具调用或特定操作
get_trace根据追踪 ID 获取完整的追踪详情深入分析单条追踪记录
triage_trace综合分析追踪记录,给出可能的根因诊断(关键路径、延迟排名、错误链)根据诊断采取行动,而不是重新从追踪记录转储中推导原因
correlate_trace在第二个独立配置的后端中查找对应的追踪记录跨两个后端关联追踪记录(例如 Datadog → Sentry)
get_llm_usage汇总令牌使用指标跟踪成本和使用趋势
list_services列出可用服务发现已进行检测的服务
find_errors查找包含错误的追踪记录快速调试故障
list_llm_models查找正在使用的模型及其使用统计数据跟踪模型采用情况和影子 AI
get_llm_model_stats获取单个模型的延迟、令牌百分位数和结束原因比较模型效率
get_llm_expensive_traces查找令牌使用量最高的追踪记录优化成本
get_llm_slow_traces按持续时间查找最慢的追踪记录调试延迟
list_llm_tools_tool查找 LLM 工具/函数调用(traceloop.span.kind == tool)跟踪 Agent 工具的使用情况
list_sessions按 gen_ai.conversation.id 对跨度分组了解多轮对话活动
get_session_stats获取单个对话 ID 的详细统计数据深入分析单次对话
compare_time_windows比较两个时间范围内的汇总使用情况“本周与上周”的比较
investigate_cost_spike比较近期时间窗口与基准窗口的成本,并按模型/服务排序“为什么我们的 LLM 账单突然飙升?”
investigate_error_spike比较近期时间窗口与基准窗口的错误率,并按服务/模型/错误类型排序“错误增加是真正的激增吗?”
get_prompt_version_stats按 gen_ai.prompt.name/.version 对跨度分组在推广提示词版本前进行比较
后端支持矩阵
功能JaegerTempoTraceloopDatadogSentryAWS X-RayNew RelicHoneycomb♦
搜索跟踪✓✓✓✓†✓‡✓†✓†✓†
搜索跨度✓*✓✓✓✓✓†✓✓
按 ID 获取跟踪✓✓✓✓†✓✓✓‡✓†
高级筛选器✓✓✓✓✓✓§✓✓
错误跟踪✓✓✓✓✓✓✓✓
所有 LLM 工具✓✓✓✓✓✓✓¶✓¶

* Jaeger 的跨度搜索需要 service_name 参数。
† Datadog、AWS X-Ray、New Relic 和 Honeycomb 没有跟踪级别的搜索 API(X-Ray 的 BatchGetTraces 按精确 ID 获取);它们通过搜索(跨度、X-Ray 跟踪摘要、NRQL Span 事件或 Honeycomb 分解组)并补全数据来重建跟踪,且每个结果都会再次与请求的精确 ID 核对。
‡ Sentry 和 New Relic 都有原生跟踪查询端点(Datadog 和 Honeycomb 则没有),因此 get_trace 会直接调用该端点;search_traces 仍会先通过跨度/NRQL 搜索来发现候选跟踪 ID,因为这两个后端的搜索界面本身都以跨度为中心。
§ AWS X-Ray 原生仅支持按服务名称、持续时间以及根据错误/故障/限流推导出的状态进行筛选——OTel 属性(包括所有 gen_ai.* 字段)默认会存入未编制索引的段元数据,而不是已编制索引的注释,因此始终由客户端处理,而不会下推到 FilterExpression。
¶ New Relic:search_spans 直接从 NRQL 文档详述的扁平行结构中读取 gen_ai.* 属性;search_traces/get_trace 还依赖一个未经验证的假设,即 NerdGraph 的 distributedTracing.trace 响应中 attributes 字段的结构符合预期。通过将原始搜索行的属性覆盖回补全后的结果来缓解此问题。Honeycomb:gen_ai.* 属性通过与其他所有字段相同的分解列技术提取(模块文档字符串第 2 点),这种提取方法同样未经验证。
♦ 上方 Honeycomb“搜索”/“按 ID 获取跟踪”整行勾选均依赖 Query Data API;该后端的相关研究发现,文档说明此 API 仅限 Enterprise 套餐使用——Free/Pro 账户可能无法使用这些功能。请参阅上方 Honeycomb 设置部分。

主要工具详情

search_traces

{
    "service_name": "my-app",
    "start_time": "2024-01-01T00:00:00Z",
    "end_time": "2024-01-01T23:59:59Z",
    "gen_ai_system": "openai",
    "gen_ai_request_model": "gpt-4",
    "min_duration_ms": 1000,
    "has_error": false,
    "limit": 50,
}

参数:service_name、operation_name、start_time/end_time(ISO 8601)、min_duration_ms/max_duration_ms、gen_ai_system、gen_ai_request_model、gen_ai_response_model、has_error、tags、filters(参见通用筛选系统)、limit(1–1000,默认值为 100)。返回包含 token 数量的跟踪摘要。

get_trace

{"trace_id": "abc123def456"}

返回完整的跟踪树:所有包含属性的跨度、为 LLM 跨度解析出的 OpenTelemetry gen_ai.* 数据、每个跨度的 token 使用量、错误信息,以及每个跨度的原始 events(例如 gen_ai.evaluation.result,或其他任何由检测工具发出的事件——不会限制为固定的一组名称)。

triage_trace

{"trace_id": "abc123def456", "detail_level": "summary"}

与其每次都返回原始跟踪数据,让 Agent 重新推导诊断结果,不如直接综合生成诊断:关键路径(即实际决定跟踪总延迟的“最后完成的子项”链)、按自身耗时排序的主要 span(扣除子项耗时后的延迟贡献),以及——当跟踪中包含错误时——错误链中最深层的错误 span,作为可能的根因(confidence: "high";若存在多个深度相同的错误链,导致责任归属不明确,则为 "medium")。若不存在错误,则回退为以自身耗时最高的 span 作为纯延迟诊断(confidence: "low")。结果具有确定性——不会调用 LLM——且适用于任何已配置的后端,因为它使用的是 get_trace 已获取的 span 数据。detail_level: "full" 还会在诊断结果由错误驱动时附上已判定根因的原始错误详情(消息/类型/堆栈跟踪)。无论跟踪深度如何,结果都有长度上限:在摘要模式下,error_chain 和 critical_path 各最多列出 25 个 span——开头 5 个和结尾 20 个 span,中间以一条明确的 [K intermediate span(s) elided] 条目省略,并在推理中注明实际深度;detail_level: "full" 则将上限提高到 1000 个。如果跟踪没有根 span(存在父级循环),则会如实报告这一情况,并将 confidence 设为 "low",而不是将其报告为深度问题。

correlate_trace

{"trace_id": "abc123def456"}

尝试在第二个独立配置的后端中查找对应的跟踪(例如,将 Datadog 跟踪与其下游 Sentry 错误关联起来)。首先尝试在次要后端中直接匹配 trace_id(confidence: "high");若失败,则回退到结合时间窗口和服务名称重合度的启发式搜索(confidence: "low")。它会按主跟踪中的每个服务名称各查询一次,因此也适用于 Jaeger 这类要求 search_traces 提供 service_name 的后端。最多搜索 span 数量最多的 10 个服务,避免单个跟踪触发数百次次要后端查询。每个匹配结果还会报告 root_cause_consistent:如果两个跟踪都没有错误可供比较,则为 null;否则为 true/false,表示两端是否对错误及其所属服务达成一致(复用 triage_trace 使用的同一错误链逻辑)。这是尽力而为的关联,并非保证成功的连接——结果始终包含固定的 limitations(时钟偏差、采样不匹配、跟踪可见性不完整,以及即使正常采用 W3C Trace Context 传播,跨供应商边界也无法保证 trace ID 连续性),以及每次调用产生的任何截断说明:启发式搜索窗口从主跟踪开始时间起最多为 24 h,无论主跟踪 span 所显示的时间跨度有多长,避免单个跟踪导致服务扫描次要后端中数年的数据;如果跳过了超过 10 个服务的部分,结果也会注明。需要通过 SECONDARY_BACKEND_TYPE/SECONDARY_BACKEND_URL 配置次要后端(参见配置表);否则会返回明确的错误。

get_llm_usage

{
    "start_time": "2024-01-01T00:00:00Z",
    "end_time": "2024-01-01T23:59:59Z",
    "service_name": "my-app",
    "gen_ai_system": "openai",
    "limit": 1000,
}

返回按模型和服务细分的提示词/补全/总 token 汇总,以及请求数量。

list_services — 无参数。返回已插桩的服务名称列表。

find_errors

{"start_time": "2024-01-15T14:00:00Z", "service_name": "my-app", "limit": 50}

返回错误消息、错误类型、截断后的堆栈跟踪,以及 LLM 专属错误信息。

list_llm_models / get_llm_model_stats / get_llm_expensive_traces / get_llm_slow_traces / list_llm_tools_tool / search_spans_tool / list_sessions / get_session_stats / compare_time_windows / investigate_cost_spike / investigate_error_spike / get_prompt_version_stats 均在 CLAUDE.md 中附有详细说明和完整示例——本 README 介绍所有工具通用的结构;有关 LLM 分析工具的确切参数和响应字段,请参阅更全面的参考文档 CLAUDE.md。


通用过滤系统

search_traces 和 search_spans_tool 除了(或替代)简单的命名参数外,还都接受 filters 列表,用于执行高级查询。每个过滤器如下:

{
  "field": "gen_ai.usage.total_tokens",
  "operator": "gt",
  "value": 5000,
  "value_type": "number"
}
  • field — 点分隔的属性名称,例如 gen_ai.usage.prompt_tokens、traceloop.span.kind、service.name(1–256 个字符)
  • operator — 见下表
  • value — 单个值(适用于大多数运算符),或 values — 列表(适用于 in、not_in、between;最多 100 个值)
  • value_type — "string"、"number" 或 "boolean"

限制与验证。 单次调用最多接受 50 个 filters 和 50 个 tags(两项限制独立计算,不共用额度),每个 in/not_in 过滤器最多接受 100 个 values,且 field 名称长度为 1–256 个字符,因此单个查询生成的后端子句数量始终有上限。操作数会在发送任何内容之前按声明的 value_type 进行规范化:"number" 下的 "5000" 等数字字符串会被接受并强制转换,而非数字字符串("abc")、非有限值或大到无法用双精度数表示的整数会被拒绝;"boolean" 接受 JSON 布尔值或字符串 "true"/"false";"string" 接受数字或布尔值,并将其转换为字符串。包含未知键的过滤器对象会被拒绝,而不会被静默忽略。超出限制或未通过验证时,会在发出任何后端请求之前返回工具错误。

类别运算符
字符串equals、not_equals、contains、not_contains、starts_with、ends_with、in、not_in
数字equals、not_equals、gt、lt、gte、lte、between、in、not_in
布尔值equals、not_equals
存在性exists、not_exists(无需提供值)

多个过滤器以 AND 逻辑组合。旧版简单参数(service_name、gen_ai_request_model 等)仍然有效,并会在内部转换为过滤器 — 可自由混用。

服务端采用 混合过滤策略:在后端支持的情况下,将过滤器转换为后端原生查询语言(Tempo 的 TraceQL、Datadog 的 span 搜索语法、Sentry 的 Discover 语法);对于后端无法原生表达的过滤条件,则在客户端应用。

后端原生过滤支持备注
Tempo(TraceQL)equals、not_equals、gt、lt、gte、lte、contains(正则表达式)、in(OR)、exists、not_exists—
Traceloopequals、not_equals、gt、lt、gte、lte—
Datadog通过 span 搜索语法支持大多数运算符将字段名拼接到查询中之前,会先根据允许列表进行验证
Sentry通过 Discover 搜索语法支持大多数运算符与 Datadog 一样使用字段名允许列表
Jaegerequals(仅通过标签)需要 service_name

示例 — 耗时较长的 OpenAI 轨迹:

{
  "filters": [
    { "field": "gen_ai.system", "operator": "equals", "value": "openai", "value_type": "string" },
    { "field": "gen_ai.usage.total_tokens", "operator": "gt", "value": 5000, "value_type": "number" }
  ]
}

完整的语义约定属性列表(gen_ai.* 与旧版 llm.* 的区别、不同提供方的令牌命名变体、完成原因取值以及令牌计算回退链),请参阅 CLAUDE.md。


查询示例

查找耗时较长的 OpenAI 操作

提问: “显示过去一小时内耗时超过 5 秒的 OpenAI 轨迹”

工具调用: search_traces

{
  "service_name": "my-app",
  "gen_ai_system": "openai",
  "min_duration_ms": 5000,
  "start_time": "2024-01-15T10:00:00Z",
  "limit": 20
}

响应:

{
  "traces": [
    {
      "trace_id": "abc123...",
      "service_name": "my-app",
      "operation_name": "chat.completions",
      "status": "OK",
      "duration_ms": 8250,
      "span_count": 3,
      "llm_span_count": 1,
      "total_tokens": 4523,
      "has_errors": false
    }
  ],
  "count": 1
}
按模型分析 Token 用量

提问: “今天每个模型用了多少 Token?”

工具调用: get_llm_usage

{
  "start_time": "2024-01-15T00:00:00Z",
  "end_time": "2024-01-15T23:59:59Z",
  "service_name": "my-app"
}

响应:

{
  "period": { "start_time": "2024-01-15T00:00:00Z", "end_time": "2024-01-15T23:59:59Z" },
  "filters": { "service_name": "my-app" },
  "summary": {
    "total_requests": 487,
    "total_prompt_tokens": 82140,
    "total_completion_tokens": 43290,
    "total_tokens": 125430
  },
  "by_model": {
    "gpt-4": { "requests": 156, "prompt_tokens": 58300, "completion_tokens": 26900, "total_tokens": 85200 },
    "gpt-3.5-turbo": { "requests": 331, "prompt_tokens": 23840, "completion_tokens": 16390, "total_tokens": 40230 }
  },
  "by_service": {
    "my-app": { "requests": 487, "prompt_tokens": 82140, "completion_tokens": 43290, "total_tokens": 125430 }
  }
}
查找有错误的跟踪记录

提问: “显示过去一小时内的所有错误”

工具调用: find_errors

{
  "start_time": "2024-01-15T14:00:00Z",
  "service_name": "my-app",
  "limit": 10
}

响应:

{
  "count": 1,
  "error_traces": [
    {
      "trace_id": "def456...",
      "service_name": "my-app",
      "operation_name": "chat.completions",
      "start_time": "2024-01-15T14:23:15Z",
      "duration_ms": 1200,
      "status": "ERROR",
      "span_count": 2,
      "llm_span_count": 1,
      "total_tokens": 310,
      "has_errors": true,
      "error_spans": [
        {
          "span_id": "span789...",
          "operation_name": "chat.completions",
          "service_name": "my-app",
          "status": "ERROR",
          "error_message": "RateLimitError: Too many requests",
          "error_type": "openai.error.RateLimitError",
          "is_llm_error": true,
          "llm_provider": "openai",
          "llm_model": "gpt-4"
        }
      ]
    }
  ]
}
比较模型性能

提问: “GPT-4 和 Claude 的性能差异是什么?”

工具调用 1: 对 gpt-4 调用 get_llm_model_stats

{ "model_name": "gpt-4", "start_time": "2024-01-15T00:00:00Z" }

工具调用 2: 对 claude-3-opus 调用 get_llm_model_stats

{ "model_name": "claude-3-opus-20240229", "start_time": "2024-01-15T00:00:00Z" }
调查 Token 用量过高的问题

提问: “今天哪些请求使用的 Token 最多?”

工具调用: get_llm_expensive_traces

{ "limit": 10, "start_time": "2024-01-15T00:00:00Z", "min_tokens": 5000 }

常见工作流

成本优化
  1. get_llm_expensive_traces — 找出 Token 用量最高的请求
  2. get_llm_usage — 查看哪些模型的成本最高
  3. 对特定的 trace_id 调用 get_trace — 检查确切的提示词/响应
性能调试
  1. get_llm_slow_traces — 找出延迟异常值
  2. find_errors — 检查失败模式
  3. get_llm_model_stats — 检查结束原因分布,排查截断问题
模型采用情况跟踪
  1. list_llm_models — 查看实际调用的所有模型
  2. 按模型调用 get_llm_model_stats — 比较性能
  3. 扫描 list_llm_models 的结果,查找意外出现的模型/服务(影子 AI)

开发

git clone https://github.com/mcpsmiths/tracehub-mcp.git
cd tracehub-mcp
uv sync --group dev   # pulls in pytest, mypy, ruff, etc. for local iteration

# Tests (458 passed, 2 skipped at time of writing)
uv run pytest

# With coverage
uv run pytest --cov=opentelemetry_mcp --cov-report=html

# Format, lint, type-check
uv run ruff format .
uv run ruff check .
uv run mypy src/

CI(.github/workflows/ci.yml)会在每次推送时运行 Ruff 和 mypy(严格模式),以及完整的 pytest 测试套件。

mcpb pack mcpb/ 会构建 Claude Desktop 安装包。mcpb/.mcpbignore 是一个拒绝列表(mcpb 不会读取 .gitignore):mcpb/ 下所有未被它或 mcpb 内置模式列出的文件,无论是否已跟踪,都会被打包——请从干净的工作树中打包(git status --short mcpb/ 不应有任何输出),并在发布安装包前检查打印出的文件数。


故障排除

后端连接问题:

curl http://localhost:16686/api/services   # Jaeger
curl http://localhost:3200/api/search/tags  # Tempo

身份验证错误: 确认已设置密钥 —

export BACKEND_API_KEY=your_key_here
# or: tracehub-mcp --api-key your_key_here

未找到跟踪记录:

  • 检查时间范围(使用最近的时间戳)
  • 使用 list_services 验证服务名称
  • 先尝试不带筛选条件进行搜索

Token 用量显示为零:

  • 确认跟踪记录包含 OpenTelemetry gen_ai.*(或旧版 llm.*)检测信息
  • 使用 get_trace 检查原始跨度属性

Datadog/Sentry 特定问题: 请参阅配置中各后端下的故障排除说明。


路线图

此前在此列为暂缓的两个想法现已上线:

  • 面向 Agent 的故障分诊——标记可能的根本原因,而不只是返回原始追踪数据的工具:请参阅上方工具参考中的 triage_trace。
  • 跨后端关联——查询第二个独立配置的后端,并将结果与其关联:请参阅上方的 correlate_trace。根据相关研究,这项功能以尽力而为的启发式关联方式上线(直接匹配 trace_id,或在无法匹配时回退到时间窗口/服务重叠),而非保证能够在架构层面进行联接——即使在正常的 W3C Trace Context 传播下,跨供应商边界的 trace-id 连续性也无法保证。

此后,New Relic 和 Honeycomb 已分别作为第 7 和第 8 个后端上线。两者的实现都完全基于研究和文档,未通过实际账号验证——在生产环境中依赖任一后端之前,请查看各自的设置章节,了解哪些内容尚未验证;其中 Honeycomb 尤其存在实际的 go/no-go 风险(其文档说明,程序化 Query Data API 仅供 Enterprise 计划使用)。目前没有其他正在研究的后端。(Grafana Cloud 从未在此列表中——它目前已通过 Tempo 的 Basic Auth 路径上线;请参阅上方的 Grafana Tempo。)

从上游较早的路线图继承而来、但重新排在上述事项之后,并非已取消的工作包括:专用的模型对比工具(目前的 get_llm_model_stats 和 compare_time_windows 分别支持按模型统计和时间窗口差异对比,但没有可直接比较两个指定模型差异的单一工具)、跨多个模板而非仅针对单个提示词进行版本间对比的更广泛提示词模式分析(get_prompt_version_stats 已支持后者)、用于常见查询的 MCP 资源,以及 SigNoz/ClickHouse 后端支持。内置定价表的成本计算和查询结果缓存层均已上线,并非待办事项:每个报告用量的工具(例如工具参考中的 investigate_cost_spike)都会返回一对 cost_usd/cost_usd_is_partial,其数据由内置的 litellm 定价表(src/opentelemetry_mcp/pricing/)提供支持;查询结果会通过 QUERY_CACHE_TTL_SECONDS 环境变量进行缓存,并合并正在进行的请求(请参阅上方的配置选项总表)。

本 README 其他部分记录的所有功能均已上线。


贡献

欢迎贡献。在提交 PR 之前,请确认:

  1. 所有测试均通过:uv run pytest
  2. 代码格式正确:uv run ruff format .
  3. 没有 lint 错误:uv run ruff check .
  4. 类型检查通过:uv run mypy src/

许可证

Apache License 2.0——请参阅 LICENSE。本项目是 traceloop/opentelemetry-mcp-server 的分支;完整的致谢信息和分支关系记录在 NOTICE 中。

支持

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。