Skip to content
opentel-mcp

Changelog

Version history for opentel-mcp, current version v0.4.0, sourced from the project's real commit history and CHANGELOG.md — not reconstructed from memory.

v0.4.0Deep Failure FingerprintingJuly 24, 2026

  • Adds computeFingerprint() — a stable, 16-hex-character identity (SHA-256, truncated) for every thrown error and every tool-level failure (isError: true), so repeated occurrences of the same underlying bug group under one fingerprint. See Deep Failure Fingerprinting.
  • Five new mcp.failure.* span attributes: fingerprint, signature, category (8 values), origin, and error class.
  • METRIC_SAFE_ATTRIBUTES — a frozen array structurally limiting which fingerprint-derived values can reach a metric label to category and origin (24 combinations maximum), so nothing unbounded can leak into a metrics backend.
  • fingerprinting option (default true) on instrumentMcpServer().
  • computeFingerprint, toSpanAttributes, ATTRIBUTE_KEYS, METRIC_SAFE_ATTRIBUTES, and DEFAULT_CLASSIFIERS re-exported from the package root.

Known type-declaration gap in v0.4.0

The fingerprinting option is implemented and defaults to true in src/config.js and src/instrument.js, but isn't listed in the InstrumentOptions TypeScript interface in src/index.d.ts as of this version. It works at runtime; TypeScript consumers may see a type error passing { fingerprinting: false } anyway. Fixed in v0.5.0. See API Reference.

v0.3.0MetricsJuly 20, 2026

  • Four mcp.tool.* OpenTelemetry metrics instruments via @opentelemetry/api's Metrics API — no bundled SDK or exporter, same host-app-provides-the-SDK pattern tracing already used: mcp.tool.calls (counter, every call), mcp.tool.errors (counter, thrown/rejected handlers), mcp.tool.silent_failures (counter, isError: true), and mcp.tool.duration (histogram, ms). See Metrics.
  • mcp.tool.silent_failures fires from the same isError check that marks the span ERROR — extracted into one shared isToolResultError() helper so the detection logic isn't duplicated between traces and metrics.
  • enableMetrics option (default true) to opt out of metric emission without affecting tracing.
  • Metrics are a zero-overhead no-op until the host application registers a MeterProvider — default @opentelemetry/api behavior, not special-cased.
  • README: new Metrics section with an instrument table and a SigNoz OTLP/HTTP wiring example.

v0.2.0TypeScript declarations and semantic-convention alignmentJuly 13, 2026

  • Hand-written TypeScript declarations (.d.ts) so TypeScript consumers get accurate types without a build step.
  • Span attributes realigned to the MCP semantic conventions: mcp.tool.name renamed to gen_ai.tool.name, mcp.request.id renamed to jsonrpc.request.id, mcp.tool.error.type renamed to error.type, and span name changed to {mcp.method.name} {tool}, kind SERVER.
  • Fix: serviceName is no longer required when setupNodeSdk is false.
  • Build: workspace entries stripped from the published package.json manifest.
  • Docs: ESM-only requirement noted in the install section; ADR 004 documents the semantic-conventions alignment.

v0.1.0Initial releaseJuly 9, 2026

  • instrumentMcpServer() — supports both the low-level Server and high-level McpServer APIs from @modelcontextprotocol/sdk.
  • One OpenTelemetry span per tool invocation, marked ERROR on a thrown exception or on CallToolResult.isError: true — the silent-failure detection this package exists for from the first release. See Silent Failures.
  • Respects an existing global TracerProvider; optional zero-config setupNodeSdk dev mode, exporting to stderr so stdio-transport JSON-RPC isn't corrupted.
  • Privacy by design: argument counts captured, never argument values.
  • Cross-platform (Windows/macOS/Linux), pure JavaScript, zero native dependencies.
  • 25 tests, 3 ADRs, 2 working examples at initial release.

Where do I go from here?