Skip to main content
Glama
compute-finance

@compute-finance/mcp

@compute-finance/mcp

npm version npm downloads license

Live AI compute pricing oracle — real-time LLM model prices across nine vendors (Anthropic, OpenAI, Google, DeepSeek, xAI and four more) via the Compute Finance Oracle.

A stdio MCP server. Works in any MCP client. Includes optional Claude Code skills for session cost analysis.

Quick start

npx @compute-finance/mcp setup

This single command:

  1. Registers the MCP server at user scope (claude mcp add)

  2. Installs Claude Code skills (/cf-session-management, /cf-session-consumption, /cf-active-sessions)

  3. Installs the cost hook — a UserPromptSubmit hook that injects session cost into Claude's context so every response can show how much you've spent

Restart Claude Code after setup.

Or register manually without skills/hook:

claude mcp add --scope user compute-finance -- npx @compute-finance/mcp

Cursor / VS Code / Any MCP client

Add to your MCP config (.cursor/mcp.json, VS Code settings, etc.):

{
  "mcpServers": {
    "compute-finance": {
      "command": "npx",
      "args": ["@compute-finance/mcp"]
    }
  }
}

From source

git clone https://github.com/compute-finance/mcp.git
cd mcp
npm install && npm run build
npx . setup

Related MCP server: ohmytoken

Tools

22 tools across five layers — no API key required. All tools are read-only.

Data (live oracle)

Tool

Description

data_get_basket

Every model in the current SCU index, with provider, family (e.g. openai.gpt, anthropic.claude), base_* and billed_* USD prices per million tokens, per-component cache pricing (read, write-5m, write-1h), a reasoning output price and the long-context price ladder

data_get_price

Price for a single model (e.g. anthropic/claude-opus-4.8) — index members and catalog-only entries on identical terms, with the same per-component cache and reasoning prices and the long-context price ladder

data_get_scu

Current Standard Compute Unit — value plus a methodology-versioned breakdown listing every family representative

data_get_breakdown

Per-family blended-cost breakdown alone — methodology-versioned discriminated union with one entry per family representative

data_get_cpi

Full Compute Price Index as last attested on-chain — scuUsd, revisionVersion, the raw and marked-up prices that revision published

data_get_reconstitutions

Historical index changes — model swaps, SCU before/after

data_get_methodology

Methodology changelog — every version with its formula summary and spec link, plus the version in force

data_get_history

SCU index time series over a date range — per-revision, daily, or weekly granularity; daily/weekly buckets carry the last revision's value forward across empty buckets

data_get_model_price_history

Per-model input/output USD price time series for any oracle-tracked model — same granularity semantics as data_get_history, with catchup gaps surfaced in unavailableRevisions

data_get_catalog

Every model with a recorded price, index members and non-index entries alike — indexMember flag, current price with its provenance pair, cache and reasoning components, and the raw upstream contextTiers / maxInputTokens

data_get_model_price_at

Per-model input/output USD price effective at a timestamp — manifest source when the model represented its family in the revision active then, catalog otherwise

data_get_baseline

Frozen SCU denominator behind computeIndex — the SCU of the first confirmed revision, set once and never recomputed

data_get_scu_at

SCU value active at a timestamp via step function — no interpolation, null before the genesis revision

data_get_model_availability

Which models can serve right now — every catalogue model with a routable flag, the model auto points at, and the computedAt / ttlSeconds the answer is good for

Models are identified by their canonical vendor-prefixed id — anthropic/claude-opus-4.8, openai/gpt-5.5, qwen/qwen-3.5-flash. Every tool taking a model also accepts the bare name (gpt-5.5) and answers with the canonical id. The vendor slug is not always the provider key (alibabaqwen, xaix-ai, moonshotmoonshotai), so reuse an id the API returned rather than assembling one. data_get_scu, data_get_breakdown and data_get_reconstitutions are the exception: they pass the attested manifest through verbatim and so report bare model keys, because a / is not a legal manifest key.

Cache pricing comes from the Compute Finance Oracle. Session and consumption reports show effective (cache-aware) cost when the oracle has published the relevant cache components; otherwise they show nominal cost (input rate applied to every input variant) and label effective as unavailable for that model.

Alongside cache, the oracle publishes a reasoning output pricereasoning.reasoningOutput, on the same base as every other component; the whole reasoning block is null for a model with no usable reasoning price. It is catalogue data. Session and consumption reports do not bill it: Claude Code transcripts count thinking blocks rather than reasoning tokens, and those tokens are already inside output_tokens.

Every price is reported on two bases: base_* is the provider list price, identical for every model the oracle tracks, and billed_* is what compute.finance charges — base × (1 + routing_fee_rate). Compare models on base_*, budget on billed_*. The rate ships once per response and billed_* is null when the oracle does not publish it. Session and consumption reports are on the base basis throughout.

Every current-price answer comes from one place: the live catalogue the exchange bills against. Index membership decides which models data_get_basket and compute_compare list, never what a model costs, so two models the catalogue prices alike quote alike. data_get_cpi is the exception by design — it serves the prices the latest on-chain revision attested, which change only when an operator publishes the next one and may therefore lag the catalogue. Read it as attestation history, not as a quote.

Some models get pricier past a context length. data_get_basket and data_get_price publish that as context_tiers, a ladder ascending by from_input_tokens and always at least one rung: the first starts at 0 and restates the flat rate, so a model priced the same at every size has exactly one rung and nothing has to branch on whether a model happens to be tiered. Rungs carry base_* and billed_* like every other price; only the flat rate enters the SCU index. compute_estimate and compute_compare pick the rung from the whole input side of the request — prompt plus cache reads plus cache writes, all charged at the full input rate there since neither tool applies a cache discount — over half-open ranges, so an input landing exactly on a threshold takes that rung, and both return the chosen rung as applied_context_tier so the rate behind the number is visible. data_get_catalog passes the oracle document through unchanged, so there contextTiers is absent rather than one-rung on a flat model.

The ladder comes from the catalog endpoint, and the two kinds of tool part ways whenever it cannot answer for a model — the read failed, or it succeeded and the model was not in it, which is upstream drift rather than a flat price. data_get_basket and data_get_price still serve their prices and set context_tiers to null — an unknown ladder, never a one-rung stand-in for a ladder nobody read. compute_estimate and compute_compare error instead: a cost quoted at the flat rate would understate exactly the long context the ladder exists to price.

max_input_tokens is the largest input a model accepts, null when the model declares no window of its own — not unbounded: the request-body ceiling still applies, there is just no per-model limit. Above a declared window the oracle refuses the request outright, so compute_estimate and compute_compare set exceeds_max_input_tokens. They still quote the cost: these tools are read-only and an agent sizing a context needs the number before it reshapes the request, but the flag says plainly that the request as supplied would be rejected.

Prices also carry a provenance mark saying how far the number has been checked: verified — an operator recorded a vendor source for it; inferred — derived from a sibling number or a vendor default, with no source recorded; promotional — a discounted list price that is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor. Every cache and reasoning component carries its own mark wherever it appears, and so does every base price: data_get_catalog marks currentPrice.provenance for every model, index member or not, while data_get_basket, data_get_price and compute_estimate carry the same pair as base_price_provenance. A rung follows the same rule: the first repeats the base price's mark, and a higher rung is always a catalogue number, marked in both directions with the single mark the vendor quotes it under. Session and consumption reports print each cache multiplier with its mark; when the oracle publishes no cache pricing for a model they say so and print no marks.

A price says what a model costs, never whether it can serve. data_get_model_availability answers that second question: the public pool's routability list — every catalogue model under its canonical id with a routable flag, plus the model auto points at. Call it before settling on a model, so one that cannot serve is ruled out before the request instead of by a 503 after it. The signal is advisory: true as of computedAt and only for ttlSeconds after it, capacity moves on its own, and a model reported routable can still fail the send — the caller still handles the error on the request itself. The answer is the exchange's own, served verbatim with no liveness computed here, so it cannot disagree with the router that has to honour it; it is cached for exactly the ttlSeconds published with it, and not at all when that figure is missing or unusable, rather than for the window every other read uses.

Compute

Tool

Description

compute_estimate

Nominal USD cost for a model given input/output token counts — base_usd_cost, routing_fee_usd, billed_usd_cost, quoted at the rung the input size selects

compute_compare

Rank every model in the current SCU index by cost for a workload, grouped by family — the same three cost figures per row, each on that model's own rung

Render (Claude Code skills)

Tool

Description

render_session_report

Pre-formatted session cost report — used by /cf-session-management

render_consumption_report

Pre-formatted per-inference breakdown — used by /cf-session-consumption

render_active_sessions

Overview of recent sessions across projects — used by /cf-active-sessions

Reports surface three orthogonal counts: prompts (what you typed), inferences (assistant replies — tool-loop sessions produce several per prompt), and tool calls (tool_use blocks). The triplet is identical across all three reports for the same session.

Analysis

Tool

Description

analyze_session

Raw JSON session analysis (for custom UI, not skills)

analyze_inferences

Raw JSON per-inference breakdown (for custom UI, not skills)

The analyze_session counterfactual quotes each model's base rate and never a long-context rung. A rung is picked per request, and a session's summed input is not one giant request — a hundred 5k-token calls are not a single 500k-token one — so pricing the total on a higher rung would overcharge. Expect those rows to sit below compute_compare for a model that gets pricier past a context length.

History

Tool

Description

telemetry_get_history

Aggregate stats across logged sessions — cumulative cost, per-profile medians, insights

Cost hook

The setup command installs a UserPromptSubmit hook into ~/.claude/settings.json. Every time you send a message, the hook reads the current session transcript, prices it against the live oracle, and injects a cost summary into Claude's context via additionalContext. Claude then appends a 💰 Compute.Finance · … line at the end of its response.

Guards — the hook fires only when all three conditions are met:

  • Session cost exceeds $1

  • Session has at least 5 user prompts

  • At least 10 minutes since the last fire (per session)

On any failure (oracle down, transcript missing, parse error) the hook exits silently — it never blocks your prompt.

Manual installation

If setup can't write to settings.json, add the hook manually:

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "npx @compute-finance/mcp hook-prompt"
          }
        ]
      }
    ]
  }
}

Uninstall

Remove the UserPromptSubmit entry from ~/.claude/settings.json.

Privacy

All data stays on your machine. The only network calls are unauthenticated GETs to api.compute.finance — the oracle endpoints under /v1/oracle/* and the OpenAPI document at /openapi.json, read once at startup to document oracle response shapes. Session logs (~/.compute-finance/sessions.jsonl, ~/.compute-finance/inferences.jsonl) are never uploaded.

Available Tools

22 tools
analyze_inferencesA
Idempotent

Raw JSON per-inference breakdown — token counts, tool usage, effective/nominal cost, cache hit ratio, duration per inference. One row per assistant reply. inferences[].effective_usd is null when the oracle has not published cache pricing for the model; nominal_usd stays populated as an upper-bound. Source: local Claude Code transcript + Oracle API. For pre-formatted output use render_consumption_report. Omit session_id for the most recent session.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNo
session_idNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral details beyond annotations: effective_usd is null when cache pricing is unavailable, nominal_usd acts as an upper-bound, and one row corresponds to one assistant reply. It does not contradict annotations, and while it omits rate limits or error behavior, the null-value semantics add meaningful context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with each clause serving a purpose: output type, data fields, null semantics, source, alternative tool, and a usage tip. No wasted words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately summarizes the return shape (per-inference fields and row semantics). It also covers the null-cost edge case and sourcing, though cwd remains undocumented and pagination/limits are not addressed, keeping it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage and two optional parameters, the description gives partial guidance by explaining that omitting session_id targets the most recent session. However, cwd is not explained at all, leaving a gap in parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Raw JSON per-inference breakdown' and enumerates specific data fields (token counts, tool usage, cost, cache hit ratio, duration), making the tool's purpose unmistakable. It also distinguishes itself from render_consumption_report by explicitly naming the pre-formatted alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly suggests when to use this raw JSON tool versus the pre-formatted render_consumption_report, and gives a practical usage hint about omitting session_id for the most recent session. It does not broadly enumerate all alternatives, but the key alternative is named and the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_sessionA
Idempotent

Raw JSON session analysis — token totals, effective/nominal cost with cache breakdown, counterfactual across every model in the current SCU index, profile classification. current_model_cost is on the base (provider list) basis, stated in current_model_cost_basis; counterfactual_nominal rows carry base_usd_cost and billed_usd_cost, so the session and the counterfactual are directly comparable on base. Counterfactual rows quote each model's base rate and never a long-context rung: a rung is picked per request, and a session's summed input is not one giant request, so pricing the total on a higher rung would overcharge — expect these rows to sit below compute_compare for a model that gets pricier past a context length. usage.prompts counts user messages, usage.inferences counts assistant replies, usage.tool_calls counts tool_use blocks. current_model_cost.effective_usd is null when the oracle has not published cache pricing for the model; nominal_usd stays populated as an upper-bound. Source: local Claude Code transcript + Oracle API. For pre-formatted output use render_session_report. Omit session_id for the most recent session.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNo
session_idNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, so no contradiction. The description adds substantial behavioral detail beyond annotations: the basis of current_model_cost, the direct comparability of base_usd_cost and billed_usd_cost, the counterfactual rung policy, the semantics of usage.prompts/inferences/tool_calls, and the null behavior of effective_usd when cache pricing is unavailable. This is rich transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and primary alternative are front-loaded in the first sentence. The remaining sentences are dense but each addresses a real ambiguity: cost basis, counterfactual pricing, usage counters, null behavior, source, and invocation shortcut. It could be restructured with bullets, but no sentence is purely filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining return semantics, and it does: it names the key fields, explains counterfactual row pricing, defines usage counters, and notes null behavior. It misses cwd semantics and profile classification details, but these are not blockers for invoking the tool since both parameters are optional.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and cwd has no description at all. The only parameter behavior described is session_id, which is optional and omitted for the most recent session. The description does not explain what cwd means, how session_id is formatted, or how the two interact, so it fails to compensate for the absent schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Raw JSON session analysis' and enumerates the outputs: token totals, effective/nominal cost with cache breakdown, counterfactual across every model, and profile classification. It clearly differentiates itself from the sibling render_session_report by noting this is raw JSON while that is pre-formatted output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes to an alternative: 'For pre-formatted output use render_session_report.' It also gives invocation guidance: 'Omit session_id for the most recent session.' It does not fully distinguish when to use compute_compare or analyze_inferences instead, but the raw-versus-formatted distinction is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compute_compareA
Read-onlyIdempotent

Rank every model in the current SCU index by nominal cost for a workload. Source: Oracle API (/v1/oracle/catalog). Cache reads and cache writes belong inside input_tokens and are charged at the full input rate here; no cache discount is applied. Each row carries base_usd_cost (provider list price), routing_fee_usd and billed_usd_cost (what compute.finance charges); ranking is by base_usd_cost, and since the routing fee is one global rate the order is identical on either basis. Every row is priced at the rung input_tokens selects on that model's own ladder, returned whole as applied_context_tier, so a model that gets pricier past a threshold ranks where it truly lands at this size; for every rung read context_tiers on data_get_basket. Rows also carry max_input_tokens and exceeds_max_input_tokens — a row flagged true is still priced and still ranked, but that model would refuse the request. A long-context price ladder ascends by from_input_tokens and always has at least one rung: the first starts at 0 and restates the model's flat rate, so a model priced the same at every input size has exactly one rung and needs no special case. The rung is chosen by the whole input side of a request — prompt plus cache reads plus cache writes — over half-open ranges, so an input landing exactly on from_input_tokens takes that rung. Rung rates carry base_*/billed_* like every other price; only the flat rate enters the SCU index. Each rung carries the same {input, output} provenance pair as elsewhere: the first repeats the base price's mark; a higher rung is a catalogue number and takes on both directions the single mark the vendor quotes it under. max_input_tokens is the largest input the model accepts. It is null when the model declares no window of its own — not unbounded: the request-body ceiling still applies, there is just no per-model limit. Above a declared window the request is refused before it reaches the provider. A catalogue that cannot be read, or that does not list the model, errors this tool instead of quoting, because a cost silently computed at the flat rate would understate the long context the ladder exists to price. Returns the sorted list plus a grouping by family (e.g. openai.gpt, anthropic.claude). Covers index members only — for any other tracked model use compute_estimate, whose numbers are on the same basis. Use to answer 'which model is cheapest?' or 'how much would this cost on a different model?'.

ParametersJSON Schema
NameRequiredDescriptionDefault
input_tokensYesWhole input side of the request — prompt plus cache reads plus cache writes. Cache tokens are charged at the full input rate here, but they also count toward the size that picks the rung, so leaving them out quotes a rung too low.
output_tokensYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, but the description goes far beyond them: it discloses that cache tokens are charged at full input rate, explains rung selection with over-half-open ranges, defines null max_input_tokens behavior, and states that an unreadable catalog errors the tool rather than quietly underestimating. This is rich behavioral context that the annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence carries domain-critical information about pricing ladders, cache handling, and error behavior. It is front-loaded with the core purpose and then systematically covers edge cases. A slight structural improvement (e.g., paragraphs or bullets) would help, but no sentence is fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no output schema, the description covers the return shape ('sorted list plus a grouping by family'), parameter behavior, error semantics, and coverage boundaries. It even explains the no-special-case single-rung situation. There is no missing piece an agent needs to invoke the tool correctly, except for a trivial clarification of output_tokens' role in cost, which the name covers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input script covers input_tokens in depth: it is the whole input side, cache tokens count toward rung selection, and leaving them out quotes a rung too low. This meaningfully extends the schema description. However, output_tokens receives no explanation in the tool description beyond its name and example, so the 50% schema coverage gap is only partially compensated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Rank every model in the current SCU index by nominal cost for a workload.' It also names the primary use cases ('which model is cheapest?') and explicitly contrasts with the sibling compute_estimate ('Covers index members only — for any other tracked model use compute_estimate'), so an agent can disambiguate without inspecting other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance and routes elsewhere: 'Use to answer...' and 'for any other tracked model use compute_estimate.' It also states the data source (Oracle API) and what index membership means, leaving no ambiguity about scope or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compute_estimateA
Read-onlyIdempotent

Nominal USD cost for any oracle-tracked model given input/output token counts — index members and catalog-only models on identical terms. Cache reads and cache writes belong inside input_tokens and are charged at the full input rate here; no cache discount is applied. Returns base_usd_cost (provider list price), routing_fee_usd and billed_usd_cost (what compute.finance charges), plus the routing_fee_rate they derive from. Compare models on base_usd_cost; budget on billed_usd_cost. A provenance mark says how far a number has been checked: 'verified' — an operator recorded a vendor source; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price expected to end. Every value bills exactly as shown: the mark rates trust in the number, not the amount charged, and holds as of the operator's last pass rather than a live vendor check. base_price_provenance marks the input and output prices this cost is built from, populated for every tracked model. The cost is quoted at the rung input_tokens selects on the model's ladder, returned whole as applied_context_tier so the rate behind the number is visible; for every rung read context_tiers on data_get_price. A long-context price ladder ascends by from_input_tokens and always has at least one rung: the first starts at 0 and restates the model's flat rate, so a model priced the same at every input size has exactly one rung and needs no special case. The rung is chosen by the whole input side of a request — prompt plus cache reads plus cache writes — over half-open ranges, so an input landing exactly on from_input_tokens takes that rung. Rung rates carry base_*/billed_* like every other price; only the flat rate enters the SCU index. Each rung carries the same {input, output} provenance pair as elsewhere: the first repeats the base price's mark; a higher rung is a catalogue number and takes on both directions the single mark the vendor quotes it under. max_input_tokens is the largest input the model accepts. It is null when the model declares no window of its own — not unbounded: the request-body ceiling still applies, there is just no per-model limit. Above a declared window the request is refused before it reaches the provider. A catalogue that cannot be read, or that does not list the model, errors this tool instead of quoting, because a cost silently computed at the flat rate would understate the long context the ladder exists to price. exceeds_max_input_tokens is true when input_tokens is above max_input_tokens: the cost is still quoted, because a refused request is worth pricing before you reshape it, but the request as supplied would be rejected. price_source ('oracle-basket' | 'oracle-catalog') names the serving endpoint only and does not change the pricing basis, so two models with the same provider price return the same cost. Reasoning tokens are billed inside output_tokens, so this estimate adds no separate reasoning leg; read the model's reasoning price from data_get_price. Errors with 'Model not tracked by oracle' for unknown keys. Source: Oracle API (/v1/oracle/resolve + /v1/oracle/catalog). For a cost with the cache discount applied, use analyze_session on a real transcript. Models are identified by their canonical vendor-prefixed id ('anthropic/claude-sonnet-4.6', 'openai/gpt-5.5'); the bare name ('gpt-5.5') resolves to the same model, and the response echoes the canonical id. The vendor slug is not always provider.key (alibaba → qwen, xai → x-ai, moonshot → moonshotai), so pass an id the API returned rather than assembling one.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesCanonical vendor-prefixed model id (e.g. 'anthropic/claude-sonnet-4.6'); the bare name also resolves.
input_tokensYesWhole input side of the request — prompt plus cache reads plus cache writes. Cache tokens are charged at the full input rate here, but they also count toward the size that picks the rung, so leaving them out quotes a rung too low.
output_tokensYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only, idempotent, non-destructive; the description adds substantial context: provenance meanings, cache tokens charged at full rate and no discount, rung selection semantics, max_input_tokens behavior with refusal-before-provider, error on unreadable catalogue, and that prices hold as of operator's last pass rather than live. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loads the core purpose and then systematically covers edge cases. Some elaboration (e.g., the full ladder explanation) could be tightened, but every sentence contributes to correct invocation. Verbosity is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully explains return fields (base_usd_cost, routing_fee_usd, billed_usd_cost, routing_fee_rate, provenance, applied_context_tier, exceeds_max_input_tokens, price_source) and error behavior. It also covers reasoning tokens, cache handling, and closed alternatives, leaving no obvious gap for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 67% schema coverage, the description adds critical meaning: input_tokens includes cache reads/writes and affects rung selection; output_tokens includes reasoning tokens (no separate leg); model accepts bare names and warns about vendor slug mismatches. This goes well beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource: 'Nominal USD cost for any oracle-tracked model given input/output token counts'. It distinguishes itself from siblings like data_get_price (price lookup) and analyze_session (applies cache discount), and explicitly states 'Compare models on base_usd_cost; budget on billed_usd_cost'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names alternatives and conditions: 'For a cost with the cache discount applied, use analyze_session on a real transcript' and 'read the model's reasoning price from data_get_price'. Also gives practical advice on model id construction ('pass an id the API returned rather than assembling one').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_baselineA
Read-onlyIdempotent

Frozen SCU denominator for the inverse computeIndex purchasing-power view: the SCU of the first confirmed revision (methodologyVersion 1), captured set-once and never changes. Source: Oracle API (/v1/oracle/baseline). The published computeIndex on /v1/oracle/scu, /v1/oracle/latest and each /v1/oracle/history point equals (baseline.scuUsd / point.scuUsd) × 100 — 100 at genesis, rises as compute gets cheaper. Returns null until the first revision is confirmed.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"date":{"type":"string"},"scuUsd":{"type":"number"},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true}},"required":["date","scuUsd","methodologyVersion"]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses key behavioral traits: the value is captured set-once and never changes, it returns null until the first revision is confirmed, and it includes the exact formula relating baseline to published computeIndex values. This is rich, non-obvious context that annotations alone would not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is longer than typical, every sentence earns its place: definition, immutability, source, formula, null behavior, and return schema. It is information-dense but well-structured, with no filler or redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description includes the complete Oracle response schema, explains the null state, provides the calculation formula, and covers the lifecycle ('set-once'). Despite having no formal output schema, the description fully compensates and leaves no material ambiguity about the tool's behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool accepts no parameters, which is the baseline 4 case. There are no parameter semantics to clarify, and the description adds full clarity by explaining what the baseline represents and how it is sourced.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely identifies the tool as the frozen SCU denominator (baseline) for the computeIndex inverse purchasing-power view, using methodologyVersion 1 and set-once semantics. This clearly distinguishes it from sibling tools like data_get_scu or data_get_scu_at, which return current or point-in-time values.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context on when this tool is relevant—as the immutable baseline in the computeIndex formula—and notes the null-before-first-revision behavior. It does not explicitly name alternatives or state when not to use it, but the description makes the specialized role evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_basketA
Read-onlyIdempotent

Every model in the current SCU index — provider, family (e.g. openai.gpt, anthropic.claude, google.gemini, xai.grok), base_* USD prices per million tokens (the provider list price), billed_* prices (what compute.finance charges), per-component cache pricing (cachedInput, cacheWrite5m, cacheWrite1h) and a reasoning block carrying reasoningOutput (the whole block is null when the model has no reasoning price), all priced on the same base. routing_fee_rate ships once at the top level; billed_* is null when the oracle does not publish it. Compare models on base_*; budget on billed_*. A provenance mark says how far a number has been checked: 'verified' — an operator recorded a vendor source; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price expected to end. Every value bills exactly as shown: the mark rates trust in the number, not the amount charged, and holds as of the operator's last pass rather than a live vendor check. base_price_provenance carries one mark for base_input and one for base_output, and every cache and reasoning component carries its own. context_tiers carries each model's long-context price ladder. A long-context price ladder ascends by from_input_tokens and always has at least one rung: the first starts at 0 and restates the model's flat rate, so a model priced the same at every input size has exactly one rung and needs no special case. The rung is chosen by the whole input side of a request — prompt plus cache reads plus cache writes — over half-open ranges, so an input landing exactly on from_input_tokens takes that rung. Rung rates carry base_*/billed_* like every other price; only the flat rate enters the SCU index. Each rung carries the same {input, output} provenance pair as elsewhere: the first repeats the base price's mark; a higher rung is a catalogue number and takes on both directions the single mark the vendor quotes it under. max_input_tokens is the largest input the model accepts. It is null when the model declares no window of its own — not unbounded: the request-body ceiling still applies, there is just no per-model limit. Above a declared window the request is refused before it reaches the provider. context_tiers is null — never a one-rung ladder — when the catalogue cannot be read or does not list the model, so an unknown ladder is never served as a flat price; max_input_tokens is null alongside it. Prices are the live catalogue figures the exchange bills, identical to what data_get_price serves for the same model: index membership decides which models are listed here, never what they cost. For the prices a published index revision attested on-chain — which may lag the catalogue — use data_get_cpi. Source: Oracle API (/v1/oracle/catalog). For a single model, use data_get_price instead.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds substantial behavioral context: provenance marks and their meaning, null semantics for billed_*, context_tiers, max_input_tokens, and the fact that prices are live catalogue figures identical to data_get_price. It also clarifies that 'above a declared window the request is refused before it reaches the provider.' No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries essential information about the complex return structure. It is well-organized: it starts with the main content (models and pricing), then explains provenance, context tiers, null semantics, and finally alternatives. No fluff; it is dense and purposeful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool returns a complex data structure with no output schema and no parameters, the description must carry the full burden of explaining the output. It covers all fields, null behaviors, provenance semantics, context tier ladder rules, and comparison guidance. Nothing an agent needs to interpret the response is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The input schema is empty, and the description doesn't need to elaborate on parameters. However, it does not add any parameter-specific meaning (there are none), so the baseline score stands. It could arguably be a 5, but since there is nothing to explain, 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states precisely what the tool returns: every model in the current SCU index with pricing, provenance, context tiers, and related metadata. It distinguishes itself from siblings by explicitly naming data_get_price (single model) and data_get_cpi (on-chain attested), making the scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use this tool versus alternatives: 'For a single model, use data_get_price instead' and 'For the prices a published index revision attested on-chain ... use data_get_cpi.' It also advises 'Compare models on base_*; budget on billed_*.' This leaves no ambiguity about selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_breakdownA
Read-onlyIdempotent

Per-family blended-cost breakdown of the SCU — methodology-versioned discriminated union (keyed by methodologyVersion) with one entry per family representative (family, modelKey, inputPriceUsdPerMillion, outputPriceUsdPerMillion, blendedCostUsd). modelKey is the bare manifest key ('claude-opus-4.8'), not the canonical vendor-prefixed id — strip the vendor prefix off a catalog modelKey before joining on it. Source: Oracle API (/v1/oracle/scu.breakdown). Use to attribute SCU contributions to specific model families. For the full SCU response with reference workload, use data_get_scu instead.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"scuUsd":{"type":"number"},"computeIndex":{"type":"number","nullable":true},"referenceWorkload":{"type":"object","properties":{"inputTokens":{"type":"number"},"outputTokens":{"type":"number"}}},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"breakdown":{"oneOf":[{"type":"object","properties":{"methodologyVersion":{"type":"number","minimum":1,"maximum":1},"familyRepresentatives":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string"},"modelKey":{"type":"string"},"inputPriceUsdPerMillion":{"type":"number"},"outputPriceUsdPerMillion":{"type":"number"},"blendedCostUsd":{"type":"number"}},"required":["family","modelKey","inputPriceUsdPerMillion","outputPriceUsdPerMillion","blendedCostUsd"]}}},"required":["methodologyVersion","familyRepresentatives"]}]},"updatedAt":{"type":"string"}},"required":["scuUsd","computeIndex","referenceWorkload","methodologyVersion","breakdown","updatedAt"]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds real value beyond this: the modelKey format caveat (bare manifest key, must strip vendor prefix before joining), the data source endpoint (/v1/oracle/scu.breakdown), and the discriminated-union keyed-by-methodologyVersion structure. No contradiction with annotations; it enriches them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first clause and the modelKey warning, source, usage, and sibling alternative each earn their place. It is dense and includes a large inline Oracle response schema that bulks the description considerably, but no sentence is wasted and the technical warnings are genuinely necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema available, the description must convey the return contract, and it does — enumerating every field, the union keying, the modelKey normalization rule, and the source. For a 0-parameter read-only tool this is complete enough for an agent to invoke and interpret correctly. The embedded schema further bolsters completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description does the heavy lifting of explaining the return shape — the union keyed by methodologyVersion and the five fields per family representative — which is the semantically meaningful content here. It compensates fully for the absence of parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) plus a precise resource: the per-family blended-cost breakdown of the SCU, a methodology-versioned discriminated union. It names the distinguishing content (one entry per family representative with five explicit fields) and explicitly differentiates from the sibling data_get_scu, so an agent can tell the two apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit use case ('attribute SCU contributions to specific model families') and an explicit when-not/alternative ('For the full SCU response with reference workload, use data_get_scu instead'). This routes the agent decisively between the two SCU tools, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_catalogA
Read-onlyIdempotent

Full catalog of tracked models — every model with a recorded price, including non-index entries. Source: Oracle API (/v1/oracle/catalog). Each entry carries modelKey (the canonical vendor-prefixed id, e.g. 'anthropic/claude-opus-4.8'), displayName, provider, family, indexMember flag (true if current family representative in the latest confirmed revision), currentPrice with input/output USD per million tokens and an observedAt timestamp, and per-component cache/reasoning blocks (reasoning is null when the model has no reasoning price). A provenance mark says how far a number has been checked: 'verified' — an operator recorded a vendor source; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price expected to end. Every value bills exactly as shown: the mark rates trust in the number, not the amount charged, and holds as of the operator's last pass rather than a live vendor check. currentPrice.provenance carries one mark per price for every model, index member or not, because these are catalogue rows rather than manifest figures; every cache and reasoning component carries its own. This tool passes the oracle document through unchanged, so its long-context fields keep the upstream shape: contextTiers is an ascending array of rungs above the flat rate, absent entirely on a model priced the same at every input size, and each rung carries one provenance mark covering both its directions; maxInputTokens is absent on a model that declares no window of its own — not unbounded: the request-body ceiling still applies, there is just no per-model limit. For the same ladder normalised so a flat model needs no special case, use data_get_price or compute_estimate. For basket-only display, use data_get_basket instead.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"models":{"type":"array","items":{"type":"object","properties":{"modelKey":{"type":"string"},"displayName":{"type":"string"},"provider":{"type":"object","properties":{"key":{"type":"string","enum":["openai","anthropic","google","xai","moonshot","alibaba","deepseek","minimax","xiaomi"],"x-enumNames":["OpenAI","Anthropic","Google","XAI","Moonshot","Alibaba","DeepSeek","MiniMax","Xiaomi"]},"name":{"type":"string"}},"required":["key","name"]},"family":{"type":"string","nullable":true},"indexMember":{"description":"Whether this model is the current family representative in the latest confirmed SCU revision.","type":"boolean"},"releasedAt":{"type":"string","format":"date-time","nullable":true},"maxInputTokens":{"description":"Largest input, in tokens, this model accepts. A request estimated above it is refused with 422 before it reaches the provider. Absent means the model declares no window of its own and only the request-body ceiling applies.","type":"integer","minimum":0,"exclusiveMinimum":true},"currentPrice":{"type":"object","properties":{"inputPriceUsdPerMillion":{"type":"number"},"outputPriceUsdPerMillion":{"type":"number"},"provenance":{"type":"object","properties":{"input":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"output":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]}},"required":["input","output"]},"observedAt":{"type":"string","format":"date-time"}},"required":["inputPriceUsdPerMillion","outputPriceUsdPerMillion","provenance","observedAt"]},"contextTiers":{"description":"Long-context price ladder, ascending by fromInputTokens, present only on models that carry one. currentPrice is the flat rate below the first threshold and is the only price the SCU manifest attests; a request above a threshold is billed at that tier instead. Absent means the model costs the same at every input size.","type":"array","items":{"type":"object","properties":{"fromInputTokens":{"description":"Lowest input size, in tokens, priced at this tier. The tier is selected from the whole input side of a request — prompt plus cache reads plus cache writes — and the range is half-open, so an input landing exactly here takes this tier rather than the one below.","type":"integer","minimum":0,"exclusiveMinimum":true},"inputPriceUsdPerMillion":{"type":"number"},"outputPriceUsdPerMillion":{"type":"number"},"provenance":{"description":"One mark for the band: a tier is quoted by the vendor as a single line, so its input and output share it. A band may be marked differently from the model's flat price.","type":"string","enum":["verified","inferred","promotional"]}},"required":["fromInputTokens","inputPriceUsdPerMillion","outputPriceUsdPerMillion","provenance"]}},"cache":{"type":"object","properties":{"cachedInput":{"type":"object","properties":{"usdPerMillion":{"type":"number","nullable":true},"ratioOfInput":{"type":"number","nullable":true},"source":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"provenance":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"createdAt":{"type":"string","nullable":true}},"required":["usdPerMillion","ratioOfInput","source","sourceUrl","provenance","createdAt"],"nullable":true},"cacheWrite5m":{"type":"object","properties":{"usdPerMillion":{"type":"number","nullable":true},"ratioOfInput":{"type":"number","nullable":true},"source":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"provenance":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"createdAt":{"type":"string","nullable":true}},"required":["usdPerMillion","ratioOfInput","source","sourceUrl","provenance","createdAt"],"nullable":true},"cacheWrite1h":{"type":"object","properties":{"usdPerMillion":{"type":"number","nullable":true},"ratioOfInput":{"type":"number","nullable":true},"source":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"provenance":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"createdAt":{"type":"string","nullable":true}},"required":["usdPerMillion","ratioOfInput","source","sourceUrl","provenance","createdAt"],"nullable":true},"read_multiplier":{"type":"number","nullable":true},"write_multiplier_5m":{"type":"number","nullable":true},"write_multiplier_1h":{"type":"number","nullable":true}},"required":["cachedInput","cacheWrite5m","cacheWrite1h","read_multiplier","write_multiplier_5m","write_multiplier_1h"],"nullable":true},"reasoning":{"type":"object","properties":{"reasoningOutput":{"type":"object","properties":{"usdPerMillion":{"type":"number","nullable":true},"ratioOfInput":{"type":"number","nullable":true},"source":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"provenance":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"createdAt":{"type":"string","nullable":true}},"required":["usdPerMillion","ratioOfInput","source","sourceUrl","provenance","createdAt"],"nullable":true}},"required":["reasoningOutput"],"nullable":true}},"required":["modelKey","displayName","provider","family","indexMember","releasedAt","currentPrice","cache","reasoning"]}},"truncated":{"type":"boolean"},"generatedAt":{"type":"string","format":"date-time"}},"required":["models","truncated","generatedAt"]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, and the description adds substantial behavioral context: provenance marks are trust ratings, not charge modifiers; values bill exactly as shown and hold as of the operator's last pass rather than a live vendor check; the document is passed through unchanged; missing maxInputTokens means no per-model limit but the request-body ceiling still applies. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is long, it is dense and front-loaded: the first sentence states the purpose, the next gives the source, then field semantics, provenance rules, behavior, and alternatives. Every clause earns its place, and the embedded response schema is justified by the lack of a separate output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only catalog tool, the description is remarkably complete: it explains scope, source, per-field semantics, provenance meanings, absence semantics for contextTiers and maxInputTokens, billable behavior, and sibling routing. The embedded OpenAPI-derived schema further covers the return structure. Nothing necessary for correct invocation appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so parameter semantics are not applicable. The description appropriately spends its effort explaining the output shape and field meanings instead. Baseline 4 for a no-parameter tool is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Full catalog of tracked models — every model with a recorded price, including non-index entries.' It names the upstream source (Oracle API /v1/oracle/catalog), and later distinguishes itself from data_get_price, compute_estimate, and data_get_basket, so an agent can tell it apart from siblings without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is explicit: this returns the full catalog, including non-index entries, and it passes the oracle document through unchanged. It also names alternatives with conditions: use data_get_price or compute_estimate for the same ladder normalized for flat models, and use data_get_basket for basket-only display. This is clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_cpiA
Read-onlyIdempotent

Full Compute Price Index — raw oracle response with the canonical vendor-prefixed model id, provider, family, raw and marked-up prices, scuUsd, revisionVersion, last-updated timestamp. The prices are the figures the latest published revision attested on-chain: they change only when an operator publishes a new revision, so they may lag the live catalogue and must not be quoted as what a model costs now — for that use data_get_price or data_get_basket. Source: Oracle API. Use this for the complete index data as attested. For the per-family blended-cost breakdown, use data_get_breakdown.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"models":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"displayName":{"type":"string"},"provider":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"}},"required":["key","name"]},"family":{"description":"Provider product line (e.g. 'openai.gpt'). One family per basket slot; the latest released model in the family is the representative.","type":"string"},"weiPricePerMillion":{"type":"object","properties":{"input":{"type":"number"},"output":{"type":"number"}},"required":["input","output"]},"usdPricePerMillion":{"type":"object","properties":{"input":{"type":"number"},"output":{"type":"number"}},"required":["input","output"]},"markedUpWeiPricePerMillion":{"type":"object","properties":{"input":{"type":"number"},"output":{"type":"number"}},"required":["input","output"]},"markedUpUsdPricePerMillion":{"type":"object","properties":{"input":{"type":"number"},"output":{"type":"number"}},"required":["input","output"]},"releasedAt":{"type":"string","format":"date-time","nullable":true},"cache":{"type":"object","properties":{"cachedInput":{"type":"object","properties":{"usdPerMillion":{"type":"number","nullable":true},"ratioOfInput":{"type":"number","nullable":true},"source":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"provenance":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"createdAt":{"type":"string","nullable":true}},"required":["usdPerMillion","ratioOfInput","source","sourceUrl","provenance","createdAt"],"nullable":true},"cacheWrite5m":{"type":"object","properties":{"usdPerMillion":{"type":"number","nullable":true},"ratioOfInput":{"type":"number","nullable":true},"source":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"provenance":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"createdAt":{"type":"string","nullable":true}},"required":["usdPerMillion","ratioOfInput","source","sourceUrl","provenance","createdAt"],"nullable":true},"cacheWrite1h":{"type":"object","properties":{"usdPerMillion":{"type":"number","nullable":true},"ratioOfInput":{"type":"number","nullable":true},"source":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"provenance":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"createdAt":{"type":"string","nullable":true}},"required":["usdPerMillion","ratioOfInput","source","sourceUrl","provenance","createdAt"],"nullable":true},"read_multiplier":{"type":"number","nullable":true},"write_multiplier_5m":{"type":"number","nullable":true},"write_multiplier_1h":{"type":"number","nullable":true}},"required":["cachedInput","cacheWrite5m","cacheWrite1h","read_multiplier","write_multiplier_5m","write_multiplier_1h"],"nullable":true},"reasoning":{"type":"object","properties":{"reasoningOutput":{"type":"object","properties":{"usdPerMillion":{"type":"number","nullable":true},"ratioOfInput":{"type":"number","nullable":true},"source":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"provenance":{"description":"How far this number has been checked. 'verified' — an operator recorded a vendor source for this number; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price that bills exactly as shown and is expected to end. Every value bills as shown; the mark says how much to trust it, not what it costs. Marks are set by hand and hold as of the operator's last pass, not as a live check against the vendor: a number that went on promotion and has not been re-marked still reads as it was.","type":"string","enum":["verified","inferred","promotional"]},"createdAt":{"type":"string","nullable":true}},"required":["usdPerMillion","ratioOfInput","source","sourceUrl","provenance","createdAt"],"nullable":true}},"required":["reasoningOutput"],"nullable":true}},"required":["id","displayName","provider","family","weiPricePerMillion","usdPricePerMillion","markedUpWeiPricePerMillion","markedUpUsdPricePerMillion","releasedAt","cache","reasoning"]}},"scuUsd":{"type":"number"},"routingFeeRate":{"type":"number"},"revisionVersion":{"type":"number","nullable":true},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true,"nullable":true},"lastUpdated":{"type":"string"}},"required":["models","scuUsd","routingFeeRate","revisionVersion","methodologyVersion","lastUpdated"]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering safety and mutability. The description goes beyond these by disclosing that the data is raw, on-chain attested, and may lag the live catalogue ('they change only when an operator publishes a new revision'). This is valuable behavioral context not captured in annotations. Minor omission: no explicit note on absence of pagination or size limits, but the schema covers structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The prose portion is concise and front-loaded with the key purpose and caveatsavingly, but the description appends a massive auto-derived JSON schema (several hundred lines) directly in the description text. While there is no separate output schema, this bloats the description and makes it unwieldy. The prose sentences each earn their place, but the overall size violates conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only tool, the description is exceptionally complete. It explains the resource, the exact use case, the staleness caveat, the source, and includes the full response schema (since no output schema exists separately). An agent has everything needed to decide when to call it and how to interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, and the rule gives a baseline of 4. The description adds no parameter-specific meaning because there are none to describe. The attached output schema inside the description doesn't affect parameter semantics. Given that schema description coverage is 100% (vacuously), the baseline holds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise resource ('Full Compute Price Index — raw oracle response') and lists exactly what it contains (canonical model id, provider, family, raw and marked-up prices, scuUsd, revisionVersion, last-updated). It explicitly distinguishes itself from data_get_price, data_get_basket, and data_get_breakdown by naming them and the conditions for their use. The verb is implicit in the tool name but the resource and scope are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use guidance: 'must not be quoted as what a model costs now — for that use data_get_price or data_get_basket' and 'For the per-family blended-cost breakdown, use data_get_breakdown.' It also states the provenance ('the figures the latest published revision attested on-chain') and 'Use this for the complete index data as attested.' This is a textbook example of routing the agent to the right alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_historyA
Read-onlyIdempotent

SCU index time series — date-range history of Standard Compute Unit values with optional bucketing granularity. Source: Oracle API (/v1/oracle/history). Each point carries scuUsd, methodologyVersion, revisionVersion, metadataHash, and computeIndex when populated. per-revision emits one point per revision; daily and weekly buckets carry the last revision's value forward across empty buckets (step-function close). Defaults to per-revision over the full range. For a single point at a specific timestamp, fetch the individual revision via data_get_cpi.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"granularity":{"type":"string","enum":["per-revision","daily","weekly"]},"count":{"type":"integer","minimum":0,"exclusiveMinimum":false},"truncated":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"scuUsd":{"type":"number"},"computeIndex":{"type":"number","nullable":true},"revisionVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"metadataHash":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}},"required":["date","scuUsd","computeIndex","revisionVersion","methodologyVersion","metadataHash"]}}},"required":["from","to","granularity","count","truncated","data"]}

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoISO 8601 end of range (inclusive). Defaults to now.
fromNoISO 8601 start of range (inclusive). Defaults to genesis.
limitNoMax points (cap 10000). Oldest are dropped first when capped; the response sets truncated: true.
granularityNoBucketing granularity. per-revision emits one point per revision; daily/weekly buckets carry the last revision's value forward across empty buckets (step-function close). Defaults to per-revision.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses non-obvious behavior: per-revision emission, daily/weekly step-function carry-forward, fields that may be null, and truncation semantics via the response schema. No behavior is hidden or contradicted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary sentence is front-loaded, followed by focused bucketing behavior, an alternative tool pointer, and the response schema. The embedded JSON is verbose but justified because there is no separate output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only history tool with no required parameters, the description covers source, defaults, field semantics, bucketing behavior, the single-point alternative, and the full response structure. Combined with rich annotations, this is complete enough for correct invocation and result interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all 4 parameters with 100% coverage, so the baseline is 3. The description adds only a compact default statement ('per-revision over the full range') and mostly repeats the granularity behavior already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'SCU index time series — date-range history of Standard Compute Unit values'. It also names the source endpoint and differentiates from data_get_cpi for single-point fetches, making sibling selection straightforward.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly establishes when to use the tool: date-range history with optional bucketing, defaulting to the full range. It explicitly points to data_get_cpi for a single point at a specific timestamp, though it does not contrast against other similar history/price siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_methodologyA
Read-onlyIdempotent

Methodology changelog — every registered methodology version with its formula summary, family rule, reference workload, and spec reference, plus activeVersion (the version in force now). Source: Oracle API. Use to interpret SCU values and to pin integrations to a methodology version.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"activeVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"entries":{"type":"array","items":{"type":"object","properties":{"version":{"type":"integer","minimum":0,"exclusiveMinimum":true},"title":{"type":"string"},"meanType":{"type":"string"},"weighting":{"type":"string"},"familyRule":{"type":"object","properties":{"oneFamilyOneSlot":{"type":"boolean"},"familyKeyScheme":{"type":"string"},"representativeSelection":{"type":"string"}},"required":["oneFamilyOneSlot","familyKeyScheme","representativeSelection"]},"referenceWorkload":{"type":"object","properties":{"inputTokens":{"type":"integer","minimum":0,"exclusiveMinimum":true},"outputTokens":{"type":"integer","minimum":0,"exclusiveMinimum":true}},"required":["inputTokens","outputTokens"]},"cacheReasoningInIndex":{"type":"boolean"},"formulaSummary":{"type":"string"},"rationale":{"type":"string"},"specUrl":{"type":"string","nullable":true}},"required":["version","title","meanType","weighting","familyRule","referenceWorkload","cacheReasoningInIndex","formulaSummary","rationale","specUrl"]}}},"required":["activeVersion","entries"]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses the source (Oracle API), that it returns a list of all versions plus an activeVersion pointer, and includes the full response schema. This richly documents what the agent can expect from the response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core description is concise and front-loaded, but the embedded JSON response schema adds significant length. It is useful and well-organized, but the overall description is longer than necessary for a no-parameter read tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a completely specified tool: no input parameters, a fully detailed response schema in the description, clear purpose and use case, and annotations covering safety. The description leaves no gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline of 4 applies. The description does not need to add parameter semantics, and there are no parameters to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a 'Methodology changelog' that returns every registered methodology version with specific fields (formula summary, family rule, reference workload, spec reference) and the activeVersion. This is a specific verb+resource and clearly distinguishes it from sibling tools like data_get_scu or data_get_basket.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'Use to interpret SCU values and to pin integrations to a methodology version.' This gives clear context but does not mention alternatives or exclusions, so it falls short of a full 5 per the rubric.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_model_availabilityA
Read-onlyIdempotent

Which models can serve a request right now — call it before choosing a model, so a model that cannot serve is ruled out before the request instead of after a 503. Source: Compute Finance API (/v1/models/availability). Carries computedAt (when the exchange computed this answer), ttlSeconds (how long it considers the answer fresh), models — an array of every catalogue model as id, the canonical vendor-prefixed id ('anthropic/claude-opus-4.8', 'openai/gpt-5.5'), plus a routable boolean — and auto, carrying the id the auto alias points at in this snapshot. The signal is advisory: it is true as of computedAt and only for ttlSeconds after it, capacity moves on its own, and a model reported routable can still fail the send — handle the error on the request itself rather than reading this answer as a guarantee. The answer is the exchange's own, served verbatim with no liveness computed here, so it cannot disagree with what the router does. It covers the public pool and takes no arguments. Says nothing about price: use data_get_catalog or data_get_basket for what the routable models cost and compute_estimate for the cost of the one you settle on.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description goes further by disclosing the advisory nature, TTL freshness window, and that a routable model can still fail at send time—explicitly advising error handling on the request. It also states the answer is the exchange's own, served verbatim, adding behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though the description is moderately long, every sentence earns its place. It front-loads the core purpose, then layers source, structure, caveats, and alternatives in a logical progression. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully documents the response shape (computedAt, ttlSeconds, models with id and routable, auto alias) and semantics. It also covers the advisory limits and points to pricing alternatives. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty schema, which is fully covered. The description explicitly confirms it 'takes no arguments,' adding a trivial but helpful confirmation. With 0 params, baseline is 4, and the description meets it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise statement: 'Which models can serve a request right now' and explicitly ties it to a decision point ('call it before choosing a model'). It names the resource (Compute Finance API /v1/models/availability) and clearly differentiates from siblings by noting it 'says nothing about price' and routing to data_get_catalog/basket and compute_estimate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance ('call it before choosing a model'), explains the benefit (rule out unservable models before a 503), and names specific alternatives for cost-related queries. This is a textbook example of routing the agent to the correct tool based on need.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_model_price_atA
Read-onlyIdempotent

Per-model input/output USD price effective at a specific timestamp. Source: Oracle API (/v1/oracle/models/{model}/price-at). Response is a discriminated union by source: 'manifest' when the model is the family representative in the revision active at that date (cross-links revisionVersion, methodologyVersion, metadataHash, family for verification), or 'catalog' when only catalog pricing exists (step-function fallback). The model is named by its canonical vendor-prefixed id ('anthropic/claude-opus-4.8'); the bare name ('claude-opus-4.8') names the same model. modelKey echoes the canonical id; manifestKey carries the bare key the attested manifest is keyed by and ships with every 'manifest' response. observedAt reflects when the price was recorded. Returns an error for malformed or future dates, untracked models, or dates preceding all available data.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"modelKey":{"type":"string"},"manifestKey":{"type":"string"},"date":{"type":"string","format":"date-time"},"inputPriceUsdPerMillion":{"type":"number"},"outputPriceUsdPerMillion":{"type":"number"},"observedAt":{"type":"string","format":"date-time"},"source":{"type":"string","enum":["manifest","catalog"]},"revisionVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"metadataHash":{"type":"string","pattern":"^0x[0-9a-f]{64}$"},"family":{"type":"string","nullable":true}},"required":["modelKey","date","inputPriceUsdPerMillion","outputPriceUsdPerMillion","observedAt","source","family"]}

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesISO 8601 timestamp (e.g. '2026-06-15T12:00:00Z'). Must not be in the future.
modelYesCanonical vendor-prefixed model id (e.g. 'openai/gpt-5.5'); the bare name also resolves. Returns the price effective at the requested timestamp.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive, but the description goes well beyond that: it discloses the discriminated union ('manifest' vs 'catalog'), the modelKey/manifestKey distinction, the observedAt timing semantics, and specific error conditions (malformed/future dates, untracked models, pre-data dates). No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: purpose, source, response union, naming, field semantics, errors, and schema. Every sentence contributes value, and the embedded response schema is justified because no separate output schema exists. It is longer than minimal but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two parameters and a discriminated-union response, the description covers all necessary calling contract aspects: response shape via schema, union variants, naming aliases, error behavior, and field semantics. Nothing essential for correctly invoking this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both parameters already described and exemplified. The description adds no new input semantics beyond what the schema provides; extra details like modelKey/manifestKey pertain to the response, not the parameters. A baseline of 3 is appropriate because the schema carries the full parameter burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Per-model input/output USD price effective at a specific timestamp,' naming a specific resource and query type. It also clarifies canonical vs. bare model naming, making the tool's behavior unambiguous. The 'at' specificity distinguishes it from history/availability siblings even without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied: use when a single point-in-time price is needed. However, the description never explicitly names alternatives or states when not to use this tool versus siblings like data_get_model_price_history or data_get_model_availability. Without such exclusions, an agent must infer the decision from names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_model_price_historyA
Read-onlyIdempotent

Per-model input/output USD price time series — date-range history for any oracle-tracked model. Source: Oracle API (/v1/oracle/models/{model}/price-history). Each point carries input/output USD per million tokens, a source ('manifest' | 'catalog'), plus revisionVersion, methodologyVersion and metadataHash on attested points. Catchup revisions whose manifest is unavailable are surfaced in unavailableRevisions. Same granularity (per-revision/daily/weekly) and limit semantics as data_get_history. The model is named by its canonical vendor-prefixed id ('anthropic/claude-opus-4.8'); the bare name ('claude-opus-4.8') names the same model. modelKey echoes the canonical id; manifestKey carries the bare key the attested manifest is keyed by and ships whenever at least one point has source 'manifest'. Errors only when the model has neither an attested appearance nor a catalog price.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"granularity":{"type":"string","enum":["per-revision","daily","weekly"]},"count":{"type":"integer","minimum":0,"exclusiveMinimum":false},"truncated":{"type":"boolean"},"modelKey":{"type":"string"},"manifestKey":{"type":"string"},"family":{"type":"string","nullable":true},"unavailableRevisions":{"type":"array","items":{"type":"integer","minimum":0,"exclusiveMinimum":true}},"data":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"inputPriceUsdPerMillion":{"type":"number"},"outputPriceUsdPerMillion":{"type":"number"},"source":{"type":"string","enum":["manifest","catalog"]},"revisionVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"metadataHash":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}},"required":["date","inputPriceUsdPerMillion","outputPriceUsdPerMillion","source"]}}},"required":["from","to","granularity","count","truncated","modelKey","family","unavailableRevisions","data"]}

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoISO 8601 end of range (inclusive). Defaults to now.
fromNoISO 8601 start of range (inclusive). Defaults to genesis.
limitNoMax points (cap 10000). Oldest are dropped first when capped.
modelYesCanonical vendor-prefixed model id (e.g. 'openai/gpt-5.5'); the bare name also resolves.
granularityNoBucketing granularity. per-revision emits one point per revision the model appeared in; daily/weekly carry forward. Defaults to per-revision.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, but the description adds significant behavioral context beyond them: the source endpoint, per-point field semantics and source enum, unavailableRevisions behavior, model naming resolution ('the bare name names the same model'), modelKey/manifestKey shipping conditions, and the exact error condition. This is far richer than the annotations alone and contains no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and each subsequent sentence adds factual value: source, point structure, naming, key semantics, and error conditions. The embedded OpenAPI response schema adds length, but it is justified because the tool has no output_schema field. It is dense rather than padded, though slightly long for a strictly minimal definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only history tool backed by rich annotations, this description is remarkably complete: it covers the source, response fields, granularity/limit semantics, naming resolution, unavailableRevisions behavior, error conditions, and the full response shape via the embedded schema. Nothing an agent needs to invoke it correctly is missing, and the absence of an output schema is compensated by the embedded response JSON.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that the bare model name resolves to the same model as the canonical vendor-prefixed id, and by clarifying modelKey/manifestKey semantics. It also references granularity and limit behavior tied to data_get_history, which supplements the schema's parameter descriptions without redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Per-model input/output USD price time series — date-range history for any oracle-tracked model.' This clearly states what the tool does and its scope. The emphasis on 'date-range history' differentiates it from point-in-time siblings like data_get_model_price_at and data_get_price, so it is not a tautology and stands apart from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the phrase 'date-range history for any oracle-tracked model' and cross-referenced semantics ('Same granularity ... and limit semantics as data_get_history'). However, there is no explicit statement of when to use this tool versus alternatives such as data_get_model_price_at or data_get_price, nor any exclusion criteria. An agent must infer the routing rather than being told it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_priceA
Read-onlyIdempotent

Price for a single oracle-tracked model — index members and catalog-only entries on identical terms. Returns base_input/base_output USD per million tokens (the provider list price), routing_fee_rate, and billed_* = base × (1 + routing_fee_rate) — what compute.finance charges. Per-component cache pricing (cachedInput, cacheWrite5m, cacheWrite1h) and the reasoning block carrying reasoningOutput (the whole block is null when the model has no reasoning price) are on the base basis. Every price is the live catalogue figure the exchange bills, so two models with the same provider price return the same numbers regardless of index membership. A provenance mark says how far a number has been checked: 'verified' — an operator recorded a vendor source; 'inferred' — derived from a sibling number or a vendor default, with no source recorded; 'promotional' — a discounted list price expected to end. Every value bills exactly as shown: the mark rates trust in the number, not the amount charged, and holds as of the operator's last pass rather than a live vendor check. base_price_provenance carries one mark for base_input and one for base_output, populated for every tracked model. Every cache and reasoning component carries its own mark. context_tiers carries the model's long-context price ladder. A long-context price ladder ascends by from_input_tokens and always has at least one rung: the first starts at 0 and restates the model's flat rate, so a model priced the same at every input size has exactly one rung and needs no special case. The rung is chosen by the whole input side of a request — prompt plus cache reads plus cache writes — over half-open ranges, so an input landing exactly on from_input_tokens takes that rung. Rung rates carry base_*/billed_* like every other price; only the flat rate enters the SCU index. Each rung carries the same {input, output} provenance pair as elsewhere: the first repeats the base price's mark; a higher rung is a catalogue number and takes on both directions the single mark the vendor quotes it under. max_input_tokens is the largest input the model accepts. It is null when the model declares no window of its own — not unbounded: the request-body ceiling still applies, there is just no per-model limit. Above a declared window the request is refused before it reaches the provider. context_tiers is null — never a one-rung ladder — when the catalogue cannot be read or does not list the model, so an unknown ladder is never served as a flat price; max_input_tokens is null alongside it. price_source ('oracle-basket' | 'oracle-catalog') names the serving endpoint only and does not change the pricing basis. Errors with 'Model not tracked by oracle' for unknown keys. Source: Oracle API (/v1/oracle/resolve + /v1/oracle/catalog). Models are identified by their canonical vendor-prefixed id ('anthropic/claude-opus-4.8', 'openai/gpt-5.5'); the bare name ('gpt-5.5') resolves to the same model, and the response echoes the canonical id. The vendor slug is not always provider.key (alibaba → qwen, xai → x-ai, moonshot → moonshotai), so pass an id the API returned rather than assembling one.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesCanonical vendor-prefixed model id (e.g. 'anthropic/claude-sonnet-4.6'); the bare name also resolves.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the readOnlyHint/idempotentHint annotations, disclosing how billed_* is computed, how provenance marks work, what null max_input_tokens means, how context_tiers ladders are chosen, and what happens for unknown models ('Model not tracked by oracle'). It also explains that price_source names the serving endpoint only and does not change pricing basis, which prevents a likely misinterpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section carries needed information, and the most important facts about what price is returned are front-loaded. It is one dense paragraph rather than broken into headed sections, which slightly hurts scannability, but there is no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the full burden of explaining return values; it covers base prices, billed_* calculation, cache/reasoning components, provenance, context_tiers, max_input_tokens, price_source, error behavior, and id resolution. For a complex pricing tool, this is an unusually complete description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning beyond the schema: bare names resolve, ids are canonical vendor-prefixed, and vendor slugs do not always match provider keys (alibaba → qwen, xai → x-ai). This materially helps an agent pass the right model identifier.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Price for a single oracle-tracked model', naming exactly what is returned and distinguishing this from multi-model or historical siblings. It clearly states the pricing basis and the key output components, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes clear this is for a single model's current oracle-tracked price, and distinguishes index members from catalog-only entries. It does not explicitly name sibling tools like data_get_model_price_history or data_get_basket, so exclusion guidance is implied rather than explicit, but the context is strong enough for an agent to select it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_reconstitutionsB
Read-onlyIdempotent

Historical index changes — each entry carries publishedAt, revisionVersion, methodologyVersion, scuBefore/scuAfter, a summary and the attesting txHash, plus a typed changes[] list (MODEL_ADDED, MODEL_REMOVED, PRICE_CHANGE, WORKLOAD_CHANGE). changes[].modelKey is the bare manifest key ('claude-opus-4.8'), not the canonical vendor-prefixed id — strip the vendor prefix off a catalog modelKey before joining on it. Source: Oracle API. Sorted most recent first. Use the optional limit parameter to cap results.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"revisionVersion":{"type":"integer"},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"previousVersion":{"type":"integer","nullable":true},"publishedAt":{"type":"string"},"summary":{"type":"string"},"scuBefore":{"type":"number","nullable":true},"scuAfter":{"type":"number"},"changes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"modelKey":{"type":"string"},"description":{"type":"string"},"before":{"type":"object","additionalProperties":{}},"after":{"type":"object","additionalProperties":{}}},"required":["type","description"]}},"txHash":{"type":"string","nullable":true}},"required":["id","revisionVersion","methodologyVersion","previousVersion","publishedAt","summary","scuBefore","scuAfter","changes","txHash"]}}},"required":["entries"]}

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax events to return (most recent first). Defaults to all.

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds useful behavior beyond that: results are sorted most recent first, changes[].modelKey uses a bare manifest key requiring prefix stripping before joining, and the source is the Oracle API. This is valuable context beyond the annotations, though it does not address rate limits or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is specific and useful, and the caveat about modelKey is important. However, the description includes a large auto-derived Oracle response schema JSON that adds significant bulk, making the whole definition somewhat verbose, even if it may be useful in the absence of a structured output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description supplies the full response shape, ordering, the modelKey join caveat, the source, and the optional limit parameter. With annotations covering read-only and idempotent behavior, this is nearly complete for a read-only list tool; missing only explicit sibling comparison and possible pagination details beyond a simple limit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Since schema description coverage is 100% with the limit parameter already documented, the baseline is 3. The description reinforces limit semantics with 'Use the optional limit parameter to cap results' and adds sorting context, but it does not provide substantial new parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool as returning 'Historical index changes' and enumerates the per-entry fields and typed changes[] list, so an agent can tell what data is returned. It stops short of an explicit verb like 'Retrieves,' but the name plus detailed field list make the purpose clear and distinguish it from the sibling data_get_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to choose this tool instead of alternatives like data_get_history or data_get_model_price_history. The description only explains the optional limit parameter and the sort order; it does not give selection context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_scuA
Read-onlyIdempotent

Current Standard Compute Unit (SCU) — value plus the methodology-versioned breakdown discriminated union listing every family representative with USD-per-million-token prices and blended cost. Also carries computeIndex: the inverse purchasing-power view (baseline / scuUsd) × 100, anchored at 100 at the first confirmed revision. The response carries methodologyVersion; see data_get_methodology for the formula in force. breakdown.familyRepresentatives[].modelKey is the bare manifest key ('claude-opus-4.8'), not the canonical vendor-prefixed id — strip the vendor prefix off a catalog modelKey before joining on it. For the breakdown alone, use data_get_breakdown; for the baseline denominator, use data_get_baseline. Source: Oracle API.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"scuUsd":{"type":"number"},"computeIndex":{"type":"number","nullable":true},"referenceWorkload":{"type":"object","properties":{"inputTokens":{"type":"number"},"outputTokens":{"type":"number"}}},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"breakdown":{"oneOf":[{"type":"object","properties":{"methodologyVersion":{"type":"number","minimum":1,"maximum":1},"familyRepresentatives":{"type":"array","items":{"type":"object","properties":{"family":{"type":"string"},"modelKey":{"type":"string"},"inputPriceUsdPerMillion":{"type":"number"},"outputPriceUsdPerMillion":{"type":"number"},"blendedCostUsd":{"type":"number"}},"required":["family","modelKey","inputPriceUsdPerMillion","outputPriceUsdPerMillion","blendedCostUsd"]}}},"required":["methodologyVersion","familyRepresentatives"]}]},"updatedAt":{"type":"string"}},"required":["scuUsd","computeIndex","referenceWorkload","methodologyVersion","breakdown","updatedAt"]}

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral context: the discriminated-union breakdown shape, the computeIndex definition (inverse purchasing-power view anchored at 100), the critical caveat that breakdown.familyRepresentatives[].modelKey is a bare manifest key needing vendor-prefix stripping before joining, and the data source. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then structured detail about the breakdown union, computeIndex, methodologyVersion, the modelKey caveat, and sibling routing. Every sentence earns its place; the description is thorough without bloat, and the most important discriminator (alternatives) is near the end but clearly flagged.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, idempotent, parameterless tool, the description covers everything an agent needs: the full response semantics (including the tricky modelKey nuance), how to interpret computeIndex, where to get the formula, and how to get just the breakdown or baseline. Even without a formal output schema, the description makes the call unambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters (schema has no properties), so there is nothing to document beyond what the schema provides. The description focuses on output semantics instead, which is appropriate given the 0-parameter signature.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (Standard Compute Unit) and lists the key fields (value, breakdown, computeIndex, methodologyVersion). Explicitly names the sibling tools it is not (data_get_breakdown, data_get_baseline) and tells the agent exactly when to use them instead, making differentiation unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit routing: 'For the breakdown alone, use data_get_breakdown; for the baseline denominator, use data_get_baseline.' Also points to data_get_methodology for the formula. This covers when-to-use and when-not-to-use with named alternatives, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

data_get_scu_atA
Read-onlyIdempotent

SCU value active at a specific timestamp via step function — no interpolation. Source: Oracle API (/v1/oracle/scu-at). Resolves the latest confirmed revision with publishedAt ≤ date and returns its scuUsd, scuUsd18, computeIndex, revisionVersion, methodologyVersion, publishedAt, and metadataHash. Monotonicity is non-strict — when two confirmed revisions share publishedAt the highest revisionVersion wins. computeIndex is derived as (baseline.scuUsd / scuUsd) × 100, the same formula as data_get_scu and each data_get_history point. Returns null when the date precedes the genesis revision; errors on malformed or future dates. Use data_get_history for a bucketed series; use data_get_scu_at for a single-point lookup.

Oracle response schema (auto-derived from OpenAPI at startup): {"type":"object","properties":{"at":{"type":"string","format":"date-time"},"scuUsd":{"type":"number"},"scuUsd18":{"type":"string"},"computeIndex":{"type":"number","nullable":true},"revisionVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"methodologyVersion":{"type":"integer","minimum":0,"exclusiveMinimum":true},"publishedAt":{"type":"string","format":"date-time"},"metadataHash":{"type":"string","pattern":"^0x[0-9a-f]{64}$"}},"required":["at","scuUsd","scuUsd18","computeIndex","revisionVersion","methodologyVersion","publishedAt","metadataHash"]}

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesISO 8601 timestamp (e.g. '2026-06-15T12:00:00Z'). Must not be in the future. Returns null when the timestamp precedes the genesis revision.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive. The description adds critical behavioral details: non-strict monotonicity with highest revisionVersion tie-breaking, computeIndex derivation formula, null for pre-genesis timestamps, and error conditions. This goes well beyond annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long, but the core purpose and usage guidance are front-loaded. The inline Oracle schema is verbose yet provides valuable return-shape context. Each sentence contributes meaningful information, though the schema block could be considered slightly redundant given it's auto-derived.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter lookup tool, the description is exceptionally complete. It explains the output fields, edge cases (null, errors), the computeIndex formula, and routes to alternative tools. The inline output schema eliminates any ambiguity about return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description for 'date' already covers format, future restriction, and null behavior. The description reinforces these points but does not introduce additional parameter semantics beyond the schema. With 100% schema coverage, baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('SCU value active at a specific timestamp via step function') and explicitly differentiates itself from siblings like data_get_history and data_get_scu. It also notes 'no interpolation,' which clarifies the exact retrieval semantics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides direct guidance: 'Use data_get_history for a bucketed series; use data_get_scu_at for a single-point lookup.' It also explains edge cases (returns null for pre-genesis dates, errors on malformed/future dates), leaving no ambiguity about when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_active_sessionsA
Idempotent

Pre-formatted table of recent Claude Code sessions across all projects — per-session Prompts · Inferences · Tool calls, tokens, and effective/nominal cost. Source: local Claude Code transcripts + Oracle API. Print the text field verbatim. Defaults to last 24h, top 10.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoLimit to sessions from this working directory.
hoursNoLook-back window in hours (default 24).
limitNoMax rows (default 10).

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate no strong side effects (readOnlyHint false, destructiveHint false, idempotentHint true). The description adds valuable behavioral context: data source (local transcripts + Oracle API), defaults (24h, top 10), and an explicit instruction to print the `text` field verbatim. This goes beyond annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the core purpose, then provides source, output handling, and defaults. Every sentence carries distinct information, with no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 optional parameters and no output schema, the description adequately covers purpose, data source, output handling, and defaults. Minor gaps exist: it does not explain what 'effective/nominal cost' means or whether any prerequisites are needed, but these are not critical for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for all three parameters. The description additionally clarifies that `hours` defaults to 24 and `limit` defaults to 10, and that `cwd` limits to a working directory, enriching the schema's explicit definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the tool renders a pre-formatted table of recent Claude Code sessions with detailed metrics (Prompts, Inferences, Tool calls, tokens, costs). However, it does not explicitly differentiate from the sibling tool 'render_session_report', which could serve a similar purpose, so it lacks full sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for display (print text verbatim) and notes default look-back and limit, but it does not explicitly state when to use this tool over alternatives like 'render_session_report' or whether it complements 'analyze_session'. No exclusions or alternative recommendations are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_consumption_reportA
Idempotent

Pre-formatted per-inference breakdown for cf-session-consumption skill. Source: local Claude Code transcript + Oracle API. Bar chart, tool aggregates, mechanical facts; one row per assistant reply (Innn). Header carries the canonical Prompts · Inferences · Tool calls triplet — same numbers as render_session_report and render_active_sessions. Print the text field verbatim. Pass full=true to show every inference instead of top-10/last-5.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNo
fullNoIf true, show every inference (no top-10/last-5 truncation). Default false.
session_idNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the data source (local Claude Code transcript + Oracle API), output structure (rows per reply, canonical triplet), and truncation behavior (top-10/last-5 unless full=true). It also instructs to print the `text` field verbatim. Annotations already provide idempotency and destructive hints; the description adds useful behavioral context beyond that. There is no direct contradiction with readOnlyHint=false, though the description's implied read-only nature could be clearer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with three sentences packing purpose, output details, and usage instruction. It is front-loaded with the tool's identity and avoids fluff. Minor issue: 'Bar chart, tool aggregates, mechanical facts' is a cryptic list that could be clearer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a rendering tool with no output schema, the description explains the output format (bar chart, rows per reply, header triplet), the `text` field, and the full parameter behavior. It also notes consistency with sibling reports. The only gap is the lack of clarity on cwd and session_id parameters, but overall the description gives sufficient context to invoke the tool and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, with full described in the schema and the description also clarifying its effect (show every inference vs. truncation). However, cwd and session_id have no schema description and are not mentioned in the description, leaving their purpose unexplained. The description does not compensate for the low coverage on these two parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a pre-formatted per-inference breakdown report for cf-session-consumption, with output specifics (bar chart, tool aggregates, one row per assistant reply). It does not start with a direct verb like 'Renders' but the name and content make the purpose clear. It distinguishes from siblings by noting the canonical triplet matches render_session_report and render_active_sessions, but doesn't fully explain how it differs from those.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context (per-inference breakdown, source data) and gives parameter-level guidance for full=true, but does not explicitly state when to choose this tool over its siblings or when not to use it. With 20 sibling tools, explicit guidance would be valuable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_session_reportA
Idempotent

Pre-formatted session cost report for cf-session-management skill. Source: local Claude Code transcript + Oracle API. Reads the transcript, prices it, logs to history, returns a text string. Header carries the canonical Prompts · Inferences · Tool calls triplet (user prompts, assistant replies, tool_use blocks — three distinct counters). Print verbatim — do not reformat or interpret. Omit session_id for the most recent session.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNo
session_idNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, it discloses 'logs to history' as a side effect and 'returns a text string' as output shape. The 'print verbatim — do not reformat' instruction is extra behavioral guidance without contradicting the idempotentHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six short, front-loaded sentences each carry useful information: purpose, source, behavior, output format, print instruction, parameter nuance. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given only two optional string parameters and no output schema, the description adequately covers return type and core semantics. A minor gap is not explaining cwd or showing a sample report format, but overall enough for invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds meaning for session_id ('omit... for most recent session'). The cwd parameter remains unexplained, so parameter understanding is only partially improved.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly identifies a 'pre-formatted session cost report' with explicit actions: reads transcript, prices it, logs, and returns text. Distinguishes from siblings via output format and report scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description frames when it applies ('for cf-session-management skill', source, output use) and gives specific print verbatim and most-recent-session nuances. Does not explicitly name alternatives, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

telemetry_get_historyA
Read-onlyIdempotent

Aggregate stats across logged sessions (deduped, last-wins). Source: local ~/.compute-finance/ storage. Sample size, cumulative effective vs nominal cost, per-profile medians, insights (cache dominance). Insights require at least 5 sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description goes further by disclosing dedup/last-wins semantics, the local data source, and the minimum-session requirement for insights. These are meaningful behavioral details beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then covers source, computed metrics, and an important threshold. Each sentence contributes necessary information without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only tool, the description is complete: it states the data source, aggregation behavior, output content, and the prerequisite for insights. Annotations cover side-effect safety, and no output schema exists, so the described metrics and threshold provide the necessary context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description still adds value by enumerating the computed statistics and the condition for insights, which helps an agent understand what the result will contain even though no input configuration exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Aggregate stats across logged sessions') and defines the resource scope ('logged sessions', 'local ~/.compute-finance/ storage'). It also lists concrete outputs (sample size, effective vs nominal cost, per-profile medians, insights), making the tool's purpose clear and distinguishable from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool by mentioning 'logged sessions' and local storage, and it adds a threshold condition ('Insights require at least 5 sessions'). However, it does not explicitly contrast with sibling tools like render_session_report, compute_compare, or analyze_inferences, leaving some ambiguity about when this telemetry tool is preferred over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.11.0
    • Changedcompute_compare1 field changed
      • addedInput schema / properties / input_tokens / description
        Added value: +"Whole input side of the request — prompt plus cache reads plus cache writes. Cache tokens are charged at the full input rate here, but they also count toward the size that picks the rung, so leaving them out quotes a rung too low."
    • Changedcompute_estimate3 fields changed
      • addedInput schema / properties / input_tokens / description
        Added value: +"Whole input side of the request — prompt plus cache reads plus cache writes. Cache tokens are charged at the full input rate here, but they also count toward the size that picks the rung, so leaving them out quotes a rung too low."
      • addedInput schema / properties / model / description
        Added value: +"Canonical vendor-prefixed model id (e.g. 'anthropic/claude-sonnet-4.6'); the bare name also resolves."
      • changedInput schema / properties / model / examples
        Previous value: -[
        -  "claude-sonnet-4.6"
        -]New value: +[
        +  "anthropic/claude-sonnet-4.6"
        +]
    • Changeddata_get_history4 fields changed
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "ISO 8601 start of range (inclusive). Defaults to genesis.",
        +  "examples": [
        +    "2026-04-01T00:00:00Z"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / granularity
        Added value: +{
        +  "description": "Bucketing granularity. per-revision emits one point per revision; daily/weekly buckets carry the last revision's value forward across empty buckets (step-function close). Defaults to per-revision.",
        +  "enum": [
        +    "per-revision",
        +    "daily",
        +    "weekly"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max points (cap 10000). Oldest are dropped first when capped; the response sets truncated: true.",
        +  "type": "number"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "ISO 8601 end of range (inclusive). Defaults to now.",
        +  "examples": [
        +    "2026-06-01T00:00:00Z"
        +  ],
        +  "type": "string"
        +}
    • Addeddata_get_model_availability
    • Changeddata_get_model_price_at3 fields changed
      • addedInput schema / properties / date
        Added value: +{
        +  "description": "ISO 8601 timestamp (e.g. '2026-06-15T12:00:00Z'). Must not be in the future.",
        +  "examples": [
        +    "2026-06-15T12:00:00Z"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / model
        Added value: +{
        +  "description": "Canonical vendor-prefixed model id (e.g. 'openai/gpt-5.5'); the bare name also resolves. Returns the price effective at the requested timestamp.",
        +  "examples": [
        +    "openai/gpt-5.5"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "model",
        +  "date"
        +]
    • Changeddata_get_model_price_history7 fields changed
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "ISO 8601 start of range (inclusive). Defaults to genesis.",
        +  "examples": [
        +    "2026-04-01T00:00:00Z"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / granularity
        Added value: +{
        +  "description": "Bucketing granularity. per-revision emits one point per revision the model appeared in; daily/weekly carry forward. Defaults to per-revision.",
        +  "enum": [
        +    "per-revision",
        +    "daily",
        +    "weekly"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max points (cap 10000). Oldest are dropped first when capped.",
        +  "type": "number"
        +}
      • changedInput schema / properties / model / description
        Previous value: -"Model pricing key (e.g. 'gpt-5.5')."New value: +"Canonical vendor-prefixed model id (e.g. 'openai/gpt-5.5'); the bare name also resolves."
      • changedInput schema / properties / model / examples
        Previous value: -[
        -  "gpt-5.5"
        -]New value: +[
        +  "openai/gpt-5.5"
        +]
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "ISO 8601 end of range (inclusive). Defaults to now.",
        +  "examples": [
        +    "2026-06-01T00:00:00Z"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "model"
        +]
    • Changeddata_get_price3 fields changed
      • changedInput schema / properties / model / description
        Previous value: -"Model name"New value: +"Canonical vendor-prefixed model id (e.g. 'anthropic/claude-sonnet-4.6'); the bare name also resolves."
      • changedInput schema / properties / model / examples
        Previous value: -[
        -  "claude-sonnet-4.6"
        -]New value: +[
        +  "anthropic/claude-sonnet-4.6"
        +]
      • addedInput schema / required
        Added value: +[
        +  "model"
        +]
    • Changeddata_get_scu_at2 fields changed
      • addedInput schema / properties / date
        Added value: +{
        +  "description": "ISO 8601 timestamp (e.g. '2026-06-15T12:00:00Z'). Must not be in the future. Returns null when the timestamp precedes the genesis revision.",
        +  "examples": [
        +    "2026-06-15T12:00:00Z"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "date"
        +]
  2. 21 tool updatesv0.7.0
    • First observedanalyze_inferences
    • First observedanalyze_session
    • First observedcompute_compare
    • First observedcompute_estimate
    • First observeddata_get_baseline
    • First observeddata_get_basket
    • First observeddata_get_breakdown
    • First observeddata_get_catalog
    • First observeddata_get_cpi
    • First observeddata_get_history
    • First observeddata_get_methodology
    • First observeddata_get_model_price_at
    • First observeddata_get_model_price_history
    • First observeddata_get_price
    • First observeddata_get_reconstitutions
    • First observeddata_get_scu
    • First observeddata_get_scu_at
    • First observedrender_active_sessions
    • First observedrender_consumption_report
    • First observedrender_session_report
    • First observedtelemetry_get_history

TDQS

A4/5.0

Scored across 22 tools

Disambiguation3/5

There are several clusters of closely related tools (data_get_basket/data_get_catalog/data_get_cpi, data_get_scu/data_get_breakdown, analyze_session/analyze_inferences/render_session_report) whose boundaries require careful reading. The descriptions are thorough and cross-reference each other, which mitigates the overlap, but an agent could still misselect between current catalogue prices and attested index data, or between raw session analysis and pre-formatted reports.

Naming Consistency5/5

Tool names follow a highly predictable pattern: data_get_* for oracle data, compute_* for calculations, analyze_* for raw JSON analytics, and render_* for pre-formatted output. This prefix-plus-verb_noun convention makes the purpose of each tool clear at a glance, with only minor exceptions like telemetry_get_history.

Tool Count3/5

At 22 tools, the server sits in the heavy range for an MCP server. Many tools are thin wrappers around individual oracle endpoints (e.g., data_get_scu vs data_get_breakdown vs data_get_cpi), so some consolidation or a more narrow surface would improve scoping.

Completeness5/5

For a read-only oracle and cost-analytics server, coverage is comprehensive: current and historical prices, SCU index components, methodology and reconstitutions, model availability, workload estimation, and session-level cost analysis with both raw and formatted outputs. No obvious dead ends or missing lifecycle operations for the stated purpose.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides real-time AI model pricing, cost estimation, and budget management tools to help agents understand and optimize their spending. It enables agents to compare costs across multiple providers and select the most cost-effective models for specific tasks.
    1
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI cost calculation, comparison, and optimization across major providers like Anthropic, OpenAI, Google, Meta, and Mistral. Supports cost estimation, budget-aware model finding, and token estimation through a simple API and MCP integration.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to fetch live, dated prices for LLM models and cloud compute instances across providers, compare and recommend models, and estimate monthly costs based on workload-specific token shapes and constraints.
    MIT