Got solid feedback from the community on the initial release and shipped a few improvements.
The core idea hasn't changed: wrap any MCP server (stdio, HTTP, SSE) without touching it, intercept every JSON-RPC message, and store traces in SQLite, Postgres, or MySQL.
What's new:
All attributes now follow a consistent mcp.* namespace (mcp.tool.name, mcp.transport, mcp.server.name/version, etc.). mcp.request.id is recorded on every span so request/response pairs can be joined deterministically across backends.
Latency is now split into mcp.latency.proxy_to_server_ms and mcp.latency.proxy_overhead_ms — useful for telling apart slow tools from proxy overhead.
Body capture is now explicit. Default is redacted. Opt into hash (sha256 + size, safe for production) or full (raw JSON, local dev only). Each field carries a redaction_profile marker so you always know what was active when a span was recorded.
If your agent passes conversationId, turnId, or agentRunId in the JSON-RPC _meta field, heimdall picks them up automatically as gen_ai.* attributes. Env var fallbacks (MCP_CONVERSATION_ID, etc.) are also supported.
OTLP export is now properly first-class via BatchSpanProcessor — spans go to your database and Jaeger/Tempo/Grafana simultaneously.
No responses yet.