Are you TokenMaxxing hard enough? Find out in less than a minute →

Capability matrix

What Claude Code, Codex, the Python/TS SDK, and generic OTLP agents each support in TokenJam.

TokenJam takes telemetry from four kinds of source: Claude Code, OpenAI Codex, the Python / TypeScript SDK, and any OTLP-compliant agent wired straight to the ingest endpoint. They are not equivalent. Each source exposes a different set of hooks upstream (or none), so each one lights up a different slice of the product.

This page is the honest per-capability breakdown. Rows are capabilities, columns are sources, cells say what you actually get.

Onboarding entry points

SourceCommand
Claude Codetj onboard --claude-code
Codex CLItj onboard --codex
Python SDKtj onboard, then @watch() + patch_*() in your code
Generic OTLPNone. Point your exporter at tj serve’s /api/v1/spans

What each source supports

CapabilityClaude CodeCodex CLIPython / TS SDKGeneric OTLP
Live captureYes. OTLP log events convert to spansYes. Same converter, dedicated Codex event parsersYes. In-process @watch() + patch_*() spansYes. POST /api/v1/spans with any GenAI-semconv payload
Historical backfillYes. tj backfill claude-code reads ~/.claude/projects/*.jsonlNo adapter yetN/A. SDK telemetry is live-onlyPartial. tj backfill otlp --source-file replays an OTLP dump
Zero-token statuslineYes. tj statusline wired into ~/.claude/settings.jsonNo. Codex has no custom-command status line hookN/A. No TUI to wireN/A. Depends on the host agent’s own UI
Resume-brief hookYes. SessionStart hook re-injects prior contextNo. Codex has no hook system tj integrates withN/A. Use record_llm_call() / record_tool_call() manuallyN/A
Per-terminal identityYes. claude shell wrapper sets a distinct instance ID per terminalNo. Codex hardcodes one service name, so every terminal collapses into one tileYes. Caller sets agent_id per @watch()Partial. Only if the agent sets its own resource attributes
Dashboard (Lens web UI)YesYesYesYes
AnalyzersYesYesYesYes
In-loop MCP serverNo, by design. An in-loop MCP measured +36% quota overhead on CC subscription usersNo, by design. Same reasoningYes. This is the primary intended useYes, if the host agent supports MCP tool-calling

Reading the matrix

The dashboard and analyzers are source-agnostic. They read from the local DuckDB store, not from whichever path put the spans there. Once telemetry lands, tj optimize, tj cost, and the Lens web UI treat a backfilled Claude Code session and a live SDK span the same way.

The MCP server is deliberately off for coding agents. An in-request-path MCP server pays tool-definition overhead on every turn. A measured A/B put that at +36% model-weighted quota for Claude Code subscription users, so the coding-agent paths ship a zero-token statusline instead. The MCP still fits SDK and API integrations, where tj already sits in the request path. See MCP server.

Codex has two structural gaps: backfill and statusline. Codex writes local session transcripts, so a backfill adapter is buildable and just is not written yet. The statusline gap is upstream. Codex’s status line accepts a fixed list of built-in items and has no command-backed slot to inject an external line into, so tj stays fully out-of-band for Codex through OTel plus the tj CLI.

Get TokenJam updates