llmledger
llmledger
What happens to an LLM after it is added to a price catalogue? llmledger rebuilds the full change history of LiteLLM's model price file and estimates how likely a newly added model is to have its price changed, get a retirement date, or be removed, within 30 days to 2 years.
Live results, rebuilt every day: https://pouriaetab.github.io/llmledger/
Status: version 1.17. The data and the page refresh every day.
Paste a prompt on the live page to see the best value model for it, the top rated one and the cheapest rated one, with what each costs and the chance its price changes in the next 90 days. Everything else (compare, cost vs quality, every model, quality ratings, price history, method) is one click away. A view fits one screen when it can; when it has more, the page scrolls the normal way and nothing is cut. The Trends view replays two years of Arena's leaderboards and what top quality has cost.
Not financial or procurement advice. The numbers describe edits to a public catalogue, not what any model costs you. See DISCLAIMER.md.
What it does
Rebuilds the history. Reads every version of
model_prices_and_context_window.jsonthat LiteLLM'smainbranch went through, in order, using git.Writes a change log. Compares each version with the one before and records one row per change: a model added or removed, a price changed, a retirement date set (
data/events.csv).Estimates competing risks. Follows each newly added model until its first exit (a price change, a retirement announcement or removal) and estimates the chance of each with the Aalen-Johansen estimator and 95% bootstrap confidence intervals (
data/survival.csv).Publishes the results. Rebuilds the results page from LiteLLM's latest history every day (
site/index.html).Looks up any model. Search by name, maker or host, under LiteLLM's own names or grouped by model, to see each listing's chance of a price change in the next 90 days and year, its timeline and full outlook, and a side by side comparison of up to five models. The page also lists every change in the last 7 days and the most repriced models. Every table sorts, keeps its header in view and lets you move columns, and remembers all of it.
Flags corrections. Tags bulk clean ups (50 or more models removed on the same day), unit fixes (a price made 100 times larger or smaller), changes undone within 30 days and likely corrections (a price change in a model's first 7 days, from 0, or of 10 times or more), and shows the results with and without them.
Checks itself in SQL. Every run builds the table of models a second time in SQL (
survival.sql, run with SQLite) and stops before publishing if SQL and Python disagree on any model.Prices a prompt. Paste a prompt to see what it would cost on every listed model, cheapest first, next to each model's chance of a price change in the next 90 days. It covers text answers (with images, PDF pages, audio or video attached), and making images, video or speech. Filter by what a model must be able to do, and by maker, model, version and host. The prompt stays in your browser.
Finds the best value for a task. For 26 tasks, from coding, math and writing to 7 fields, 7 languages, images, documents and websites, it marks the cheapest model whose Arena rating cannot be told apart from the top model's.
Guesses the task of a prompt. From its words and attachments, in the browser, it guesses the task (coding, math, a field or a language) and picks the best value model for it. On 1,740 real Arena prompts kept apart from the ones used to write the rules, it picks one of the prompt's tasks 69.7% of the time (67.5 to 71.8%), against 45.4% for always guessing Everything (overall).
Checks licences every day. Before building, it reads the current licence of every outside source. If one is no longer open for business use, it stops using it (or stops publishing, for the core data) and opens a GitHub issue.
Compares models side by side. Columns that follow the prompt (the three answers, or a Claude or ChatGPT plan's top rated models) plus up to three of your own: Arena rating and rank, effort levels with a suggested level, prices, answer tokens and cost per task, or how fast each uses the plan. It names the pick and says, for each other model, how few answer tokens it would need to cost the same.
Works inside Claude. The plug-in in
mcp/(llmledger-mcp) answers the same questions inside Claude, Cursor or any app that speaks MCP, from the dailydata.json. See Use it inside Claude.Replays the leaderboards. The Trends view plays every past Arena leaderboard as a moving chart: the best closed model against the best open one (and how often people would pick the leader), the top 5 makers, and a price race: the top rated model's price, the cheapest of the top 10, and what a model as good as last year's #1 costs now, rebuilt from every price change in the catalogue. Next to it: the newest models with their best Arena rank, and the latest price changes and retirements.
Shows cost against quality. For your prompt, every rated model's cost against its Arena score, with the edge marked: the models no other model beats on both.
One page when it fits, otherwise it scrolls. The answers come first, the extras are tabs in one panel under them, shown at their full height, and a model's details open in a drawer. When a view has more than the window holds, the page scrolls the normal way: nothing is cut, squeezed into a box that scrolls inside, or shrunk to fit. About shows each part as a row that opens on a click.
Measures how many price changes are corrections. A labelled random sample of first price changes, with a written guide, shows how often the catalogue fixes its own entry instead of recording a real price change, and how well simple rules and a small model tell the two apart. See How many first price changes are corrections?
Checks every build before it goes live. A build that knows fewer models than the live page, lists a quarter fewer, or has older data is not published. When the data is 3 or more days old, the page and the plug-in say so, and a failed daily refresh opens an issue in this repository until a refresh passes again.
Works as an Agent Skill too. The folder
skills/llmledgergives AI agents the plug-in's answers through a small script, standard library only. Until it is used, the skill takes about 150 tokens of an agent's context, against well over 1,000 for the plug-in's tools. See Use it inside Claude.Lists models seen but not yet priced. New models on Arena that the catalogue has no price for, and how soon a model usually gets one after Arena first shows it, by maker (Price history, Not yet priced).
Shows where each change came from. Every change in a model's timeline links the LiteLLM change behind it, and the plug-in gives a model's prices on any past day with the change that set them. Estimates count cache reads and cache writes, and an answer from the offline copy says how old it is.
Learns how long your jobs take. The plug-in times a job (one call and the whole job, as a usual time and a slow day) from your own timed runs, kept on your computer, including promptfoo's results files; and promptfoo can check the plug-in's answers against the data. See docs/promptfoo.md.
Quotes a whole job from a sample. Run 20 of a job's tests in promptfoo, and the plug-in quotes the whole job on each model in it: time as a usual time and a slow day, cost at the cheapest listing next to the one used, the chance of a price change within 90 days, how often it was right with a 95% range, and what a wrong answer must cost for the dearer model to pay off.
Local or cloud? Pay a cloud model per call, or buy a computer and run an open model at home: the cost a month each way, the month the computer pays for itself, and whether it keeps up. The local model's speed comes from your own timed runs, electricity from the U.S. Energy Information Administration (public domain) or your own price, and the computer's price is yours.
Related MCP server: Model Price Watch
First results
A snapshot; the live page above has the current numbers.
5,256 models added after the catalogue's first recorded version (6 September 2023), followed until 13 October 2026. Each cell is the estimated share of models whose first exit was this one, with its 95% confidence interval.
Within | Price change | Retirement announced | Removed | None of these |
1 year | 14.7% (13.5 to 15.9) | 16.4% (15.2 to 17.7) | 16.3% (15.3 to 17.4) | 52.6% (50.9 to 54.3) |
2 years | 18.3% (16.9 to 19.7) | 29.5% (27.6 to 31.4) | 23.4% (21.7 to 25.0) | 28.8% (26.8 to 31.2) |
Each row adds up to 100% because the three exits compete: once a model is removed, its price can no longer change. Analysing each exit on its own would overstate all three.
Counting only input and output token prices, the one year price change estimate is 12.5%. Ignoring price changes in a model's first week, it is 12.0%. Many of the changes counted are corrections of the catalogue, not real price changes: see the next section. On the data of 18 October 2026, leaving out likely corrections as well as unit fixes and undone changes, it is 10.0% (9.1 to 11.1), against 14.6% (13.5 to 15.7) counting every change; that still counts some corrections.
Corrections and clean ups matter more for removals. The one year removal estimate above includes a clean up that removed about 500 OpenRouter rows on 9 October 2026. Leaving out bulk clean ups, unit fixes and reverted changes, it is 5.7% (5.0 to 6.5).
How many first price changes are corrections?
A stratified random sample of 200 models' first price changes (100 from a
model's first 7 days, 100 from later, out of 800) was labelled from the LiteLLM
commit behind each change: a correction when the catalogue's number had been
wrong, a repricing when the host changed its price, unclear when the evidence
cannot tell (33 rows). The guide, every label and its reason are in
docs/corrections; the numbers are in
src/llmledger/corrections_eval.json. Intervals are 95%, from a bootstrap of
whole LiteLLM commits, since one commit often changes many rows.
First price changes | Share that are corrections |
All | 59% (41 to 75) |
In a model's first 7 days | 86% (54 to 97) |
Later | 51% (34 to 71) |
How well simple rules find the corrections:
Rule | Precision | Recall |
The page's tags (unit fixes, reverted changes) | 93% (51 to 100) | 36% (5 to 59) |
Any first change in the first 7 days | 86% (54 to 97) | 30% (11 to 53) |
Either of the two | 87% (60 to 96) | 46% (19 to 66) |
First 7 days, or a change of 10 times or more | 92% (76 to 98) | 55% (30 to 73) |
A small model (cross-validated logistic regression) | 76% (57 to 89) | 78% (59 to 90) |
So about six in ten first price changes correct the catalogue rather than reprice the model, and corrections are common after the first week too. The tags miss most of them. Counting the unclear rows as repricings instead, the share is 46%; counting them as corrections, 70%.
Since version 1.12 the page tags the fourth rule as a likely correction and gives every estimate without those changes too. It does not find them all: of the first price changes it does not tag, about 40% (24 to 61) are still corrections, so even that estimate overstates how often a host really changes a price.
How it works
The full method is in docs/SPEC.md: definitions, numbered requirements, known limitations, and a traceability table linking each requirement to the test that verifies it. In short:
Subject: a model added after the catalogue's first version. Time zero is the moment it was added.
Exit: the first of a price change, a retirement date being set, or removal. When two happen in the same version, removal counts first, then retirement.
Censored: no exit by the end of the history.
Estimator: Aalen-Johansen cumulative incidence for each exit, reported only while at least 100 models are still being followed.
Uncertainty: 1,000 bootstrap resamples of the models with a fixed seed, so every run gives identical output.
Checked on simulated data: on 200 simulated datasets per setting, with exit rates chosen in advance, the largest bias is 0.0015 and the 95% intervals contain the true value in 91% to 98% of datasets.
Run it
Python 3.14.7 (pinned in .python-version; 3.12 or newer works), standard
library only, plus pyarrow (pinned in requirements.txt) to read Arena's past
leaderboards for the Trends view; without it the page is built without the
trend charts. One command downloads LiteLLM's history, rebuilds everything and
writes the results page:
PYTHONPATH=src python -m llmledger.pipeline # writes data/ and site/index.html
PYTHONPATH=src python -m llmledger.simulate # simulation check, about 2 minutesBefore it writes the page, the pipeline compares its data with the live page
and stops if the new build is a step back (fewer models, a quarter fewer
listed, or older data). Set LLMLEDGER_SKIP_LIVE_CHECK=1 to publish anyway,
for example after LiteLLM rewrites its history.
Tests (181 tests: known answer, simulation, naming, corrections, SQL, prompt cost,
Arena matching, task guess, model comparison, plug-in parity, trends, licences,
the check against the live page, the Agent Skill, models not yet priced, the
promptfoo answer keys, electricity prices, page and version checks; the prompt
cost, task guess, comparison, trends drawing and parity tests need Node.js and
are skipped without it; the plug-in has 32 more in mcp/tests),
with the exact versions pinned in requirements.txt:
python -m pip install -r requirements.txt
python -m pytestUse it inside Claude
The plug-in llmledger-mcp (in mcp/) gives Claude and other AI apps ten tools:
suggest a model and effort for a project, compare models, estimate a budget, find models,
a model's price history with its outlook, new models not priced yet, how long a job
takes (learned from runs you log), a quote for a whole job from a promptfoo sample, and
whether buying a computer to run an open model pays off. It runs on your computer and reads the daily
data.json; no keys, nothing to host.
claude mcp add llmledger -- uvx llmledger-mcpOther apps and details: mcp/README.md.
Or as an Agent Skill, which gives the same answers and stays out of the context until it is needed. In Claude Code:
/plugin marketplace add pouriaetab/llmledger
/plugin install llmledger@llmledgerFor other agents that read Agent Skills, copy the folder
skills/llmledger into the agent's skills folder (for
Claude Code without the commands above: ~/.claude/skills/), or run
npx skills add pouriaetab/llmledger. It needs Python 3.10 or newer and
nothing else; the data is downloaded once a day.
Cite
Use the "Cite this repository" button on GitHub, which reads CITATION.cff. Archived on Zenodo: 10.5281/zenodo.23330454 always points to the newest version; version 1.0.0 is 10.5281/zenodo.23330455.
Data source
The data is the git history of
model_prices_and_context_window.json
in BerriAI/litellm, used under its MIT
licence. The history is cloned to your own machine and is not redistributed
here. llmledger is independent and not affiliated with or endorsed by BerriAI.
Quality ratings on the Best value tab come from the Arena leaderboard dataset by LMArena, used under CC BY 4.0 and read once a day; the Trends view reads its full history of past leaderboards from the same dataset. The task guess is measured on prompts from Arena's human preference dataset, also CC BY 4.0. llmledger is not affiliated with or endorsed by LMArena.
Electricity prices for the plug-in's local or cloud answer come from the U.S. Energy Information Administration's Electric Power Monthly, Table 5.6.A (average price for homes, by state), a U.S. government work in the public domain, read once a day with its month in the credit line.
Layout
src/llmledger/ history.py, events.py, flags.py (corrections),
survival.py, survival.sql and sql.py (SQL check),
simulate.py,
outlook.py (one model's outlook), names.py (grouping),
catalog.py (page data), page.py, page.html, app.js,
cost.js (prompt cost), arena.py (quality ratings),
licences.py (daily licence check), route.js and
route_eval.py (task guess and how often it is right),
pick.js (compare side by side), export.py (data.json),
trends.py and trends.js (the Trends view, cost vs quality),
corrections.py (how many price changes are corrections),
unpriced.py (models seen on Arena, not yet priced),
guard.py (no step back from the live page),
table_protocol.js (results page), pipeline.py
tests/ known answer, simulation, naming, page and version tests
mcp/ the plug-in (llmledger-mcp): FastMCP server, tests, server.json
skills/llmledger/ the Agent Skill: SKILL.md and a script with a copy of the
plug-in's code (tools.py, logic.py, data.py, speed.py, forecast.py)
.claude-plugin/ the Claude Code marketplace entry for the skill
docs/SPEC.md definitions, requirements, limitations, traceability
docs/corrections/ labelling guide and the labelled sample (issue #7)
docs/promptfoo.md checking the plug-in with promptfoo, timing jobs from its runs,
and quoting a whole job from a sample
.github/workflows/ tests on every pull request; refresh rebuilds and
publishes the results page every day, and opens an
issue when it failsBuilt with an AI pair programmer (Claude); the specification, the statistical design and the conclusions were reviewed by the author.
MIT licence.
Available Tools
10 toolscompare_modelsCompare ModelsBRead-onlyIdempotent
Two to six models side by side for a kind of work: rating, prices, cost per task (or plan use), and which to pick, with the break-even share of answer tokens for each against the pick.
| Name | Required | Description | Default |
|---|---|---|---|
| pay | No | api: dollars; claude or chatgpt: how fast each uses that plan | api |
| task | No | The kind of work, as Arena rates it | overall |
| models | Yes | 2 to 6 model names, for example claude-opus-5.5, gpt-6.1-sol | |
| input_tokens | No | Prompt tokens per task | |
| answer_tokens | No | Answer tokens per model when they differ, by the names given | |
| output_tokens | No | Answer tokens per task, including hidden thinking |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false, so the agent knows this is a safe, repeatable, closed-world read. The description adds that the output includes a pick and per-model break-even token share, which is useful context, but discloses nothing about auth, rate limits, or computation constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single sentence with no wasted padding, and the core action is front-loaded. However, the phrasing 'for a kind of work' and the trailing 'with the break-even share of answer tokens for each against the pick' is syntactically tangled and slows comprehension for an agent scanning tool definitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-format explanation is unnecessary, and all six parameters are schema-documented. The remaining gap is routing: for a catalog with nine closely related model/cost tools, the description never positions this against its siblings, leaving the agent to guess when comparison is warranted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters, including the pay enum semantics and the answer_tokens override. The description only glancingly maps to parameters (plan use, break-even share of answer tokens); it adds no naming, format, or default guidance beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb-ish action (two to six models side by side) plus the resource (models for a kind of work) and enumerates the outputs: rating, prices, cost per task or plan use, a pick recommendation, and break-even answer-token share. That is specific enough to separate it from pure pricing tools like estimate_cost, though the sibling differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance. With siblings like estimate_cost, find_models, and suggest_for_project in the same catalog, the description never says when comparing multiple models is the right call versus costing or discovering a single one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_costEstimate CostARead-onlyIdempotent
What a workload costs on each model at its cheapest listing: per call, per day and per 30 days. With cached or cache write tokens, also the cost without the cache and the saving.
| Name | Required | Description | Default |
|---|---|---|---|
| models | Yes | 1 to 10 model names | |
| input_tokens | Yes | Prompt tokens per call | |
| cached_tokens | No | How many of the prompt tokens are read from the cache | |
| calls_per_day | No | Calls per day | |
| output_tokens | Yes | Answer tokens per call, including hidden thinking | |
| cache_write_tokens | No | How many of the prompt tokens are written to the cache |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld=false/idempotent, so the safety profile is covered. The description adds genuinely useful behavior beyond that: results use the cheapest listing rather than a specific price, are reported across three time horizons, and when cache tokens are supplied it also returns the no-cache cost and the savings. This is real added context, not a restatement of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The core output shape is front-loaded before the conditional cache behavior, and every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and all six parameters are fully documented in the schema. The description adds the caching nuance and the 'cheapest listing' basis, leaving only cross-tool routing unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes further by explaining the conditional effect of cached_tokens and cache_write_tokens on the output (cost without cache plus savings) and by implying the role of calls_per_day through the per-day/per-30-day horizons.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states precisely what is computed: the cost of a workload on each model at its cheapest listing, broken into per-call, per-day and per-30-day figures. The 'cheapest listing' qualifier and the token-cache clause make the scope unambiguous. It does not, however, explicitly differentiate itself from siblings such as estimate_time, price_history or compare_models.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the framing ('what a workload costs'), so an agent can infer this is the cost-estimation counterpart to estimate_time. There is no explicit when-to-use statement, no prerequisites, and no routing to or away from alternatives like price_history or compare_models.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_timeEstimate TimeARead-onlyIdempotent
How long one call and the whole job take, as a usual time and a slow day, learned from your own timed runs of that model called that way (log_run). Says so when there are no runs yet.
| Name | Required | Description | Default |
|---|---|---|---|
| way | No | How the model is called | api |
| calls | No | How many calls the job makes | |
| model | Yes | A model name, as the catalogue or Ollama names it | |
| thinking | No | Thinking turned on | |
| concurrency | No | Calls running at once | |
| input_tokens | Yes | Prompt tokens per call | |
| output_tokens | Yes | Answer tokens per call, including hidden thinking |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world), so the bar is lower. The description nonetheless adds real behavioral context: the estimate is learned from the caller's own timed runs via log_run, and it explicitly discloses the empty-case behavior ('Says so when there are no runs yet'). That empty-state disclosure is meaningful information not present in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core output shape and finishing with the dependency and the empty-case note. The clause 'of that model called that way' is slightly convoluted, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required. With 100% schema coverage and the description covering the data source, the output shape, and the no-data case, an agent has what it needs; only the explicit when-to-use routing against siblings is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents model, way, tokens, calls, concurrency, and thinking. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: it estimates how long one call and the whole job take, and it names the distinguishing output form (a usual time and a slow day). This separates it from estimate_cost and forecast_job by naming 'time' versus cost. It stops short of explicitly contrasting itself with forecast_job, so it is not a full 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the description names log_run as the data source, which tells an agent the estimate depends on prior timed runs. It does not say when to prefer this over estimate_cost, forecast_job, or local_or_cloud, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_modelsFind ModelsBRead-onlyIdempotent
The highest rated models for a kind of work that meet the limits, each at its cheapest listing, with prices per 1M tokens, Arena rating and prompt size. Unrated models follow, cheapest first.
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | The kind of work, as Arena rates it | overall |
| limit | No | ||
| maker | No | Only this maker, for example anthropic or openai | |
| needs | No | What the model must be able to do | |
| min_context | No | Smallest prompt size the model must take, in tokens | |
| max_output_price | No | Highest answer price, dollars per 1M tokens |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world), so the bar is lower. The description adds genuinely useful ordering semantics not in the annotations: results are ranked by rating, each model is pinned to its cheapest listing, and unrated models are appended cheapest-first — behavior an agent needs to interpret the result set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler, and the primary content (ranked models meeting limits) leads. The telegraphic style ('with prices per 1M tokens, Arena rating and prompt size') is dense but readable, though the sentence is somewhat clause-stacked.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to enumerate return fields, and it is adequate for a discovery tool whose six parameters are all optional and mostly documented. The gap is routing: for a tool sitting among nine siblings with overlapping model-selection purposes, the absence of any disambiguation leaves the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents task, maker, needs, min_context and max_output_price; only 'limit' lacks a description. The description adds only the loose phrase 'meet the limits', which does not clarify filtering semantics beyond what the schema fields already state, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes clear it returns a ranked list of models for a given kind of work, filtered by limits, with prices, Arena rating and prompt size — a distinct scope from siblings like compare_models or price_history. It never names an alternative to differentiate against, and the verb is implied rather than stated, but the resource and output shape are unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no routing to alternatives, despite nine siblings in the family, several of which (compare_models, suggest_for_project, not_yet_priced) overlap conceptually. The agent must infer from the name alone when this tool is the right call versus a comparison or estimation tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forecast_jobForecast JobBRead-onlyIdempotent
The whole job quoted from a promptfoo run of a sample of it. For each model in the sample: the time as a usual time and a slow day, the cost at its cheapest listing next to the one the sample used, the chance of a price change in 90 days, how often it was right (Wilson 95% range) and the break-even against the pick.
| Name | Required | Description | Default |
|---|---|---|---|
| way | No | How the models are called (default: read from each provider) | |
| items | Yes | How many tests the whole job has | |
| thinking | No | Thinking turned on | |
| concurrency | No | Calls running at once in the whole job (default: as the sample ran) | |
| promptfoo_results | Yes | Path of a promptfoo results file from a sample of the job (promptfoo eval --filter-sample 20 -o sample.json) | |
| wrong_answer_cost | No | Dollars a wrong answer costs you to catch and fix; the pick then counts it |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and idempotentHint=true, so the safety profile is covered. The description adds output content but discloses no behavior beyond that — no mention of file-reading requirements, that it is a pure computation, or any cost/time characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense sentence, but it leads with an ambiguous clause rather than the core action, and the bulk of the text enumerates return values that the output schema already supplies. Size is moderate, but the front-loading is poor.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return values need not be explained, so the description's output enumeration is largely redundant. Annotations and 100% param coverage carry the rest; the only real gap is the missing clarity on the tool's action and when to prefer it over siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (way, items, thinking, concurrency, promptfoo_results, wrong_answer_cost) is already documented in the schema. The description adds no parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase 'The whole job quoted from a promptfoo run of a sample of it' gestures at extrapolating a full job from a sampled run, but 'quoted' is an unclear verb and the purpose is buried under output-column language. It distinguishes itself weakly from siblings like estimate_cost/estimate_time but never states cleanly what action it performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention of a promptfoo sample file (with the --filter-sample example) hints that you must have a sample run first, which functions as a de facto precondition. There is no explicit when-to-use, when-not-to-use, or routing to any of the nine sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
local_or_cloudLocal Or CloudARead-onlyIdempotent
Pay a cloud model per call, or buy a computer and run an open model at home: the cost a month each way, the month buying pays off, and whether the computer keeps up. The local model's speed comes from your own timed runs (log_run); electricity from EIA or your price; the computer's price is yours.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | A US state, for EIA's average there, for example Texas | |
| watts | No | Power the computer draws while it answers, in watts | |
| months | No | How many months to compare over | |
| thinking | No | Thinking turned on for the local model | |
| local_way | No | How the local model is called | ollama |
| local_model | Yes | The open model you would run at home, as Ollama names it, for example llama3.1:8b | |
| cloud_models | Yes | 1 to 5 cloud models to compare with | |
| input_tokens | Yes | Prompt tokens per call | |
| cached_tokens | No | Prompt tokens read from the cloud model's cache | |
| output_tokens | Yes | Answer tokens per call, including hidden thinking | |
| hardware_price | Yes | What the computer costs you, in dollars | |
| calls_per_month | Yes | Calls a month | |
| electricity_price | No | Your electricity price, dollars per kWh (default: EIA's average for homes) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world), so the description is free to add provenance detail: local speed comes from your own timed runs logged via log_run, electricity from EIA or a supplied price, hardware price is yours. That is useful behavioral context about data dependencies. Minor tension: it cites EIA as a source while openWorldHint=false, though this may be a bundled dataset and is not a clear contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler; the core comparison is front-loaded. The second sentence packs three source notes efficiently, though it is slightly dense and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and all 13 parameters are documented in the schema. The description supplies enough context (comparison scope, data provenance) for an agent to invoke this correctly, leaving only sibling routing unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across 13 parameters, so the schema already carries parameter meaning (including Ollama naming and the local_way enum). The description adds only marginal parameter context, such as the dependency of local speed on logged runs. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete comparison: per-call cloud cost versus buying hardware and running an open model locally, and names the outputs (monthly cost each way, break-even month, whether the computer keeps up). It is clearly distinguishable from generic siblings like estimate_cost, though it never names compare_models or estimate_cost as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied – the agent can infer this is for local-vs-cloud decisions. The mention of log_run is framed as a data source for speed, not as an alternative tool or a precondition for calling this one. No explicit when-to-use vs compare_models/estimate_cost guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_runLog RunA
Keep a timed run, or every result of a promptfoo results file, in a file on this computer so estimate_time learns from it. Nothing is sent anywhere.
| Name | Required | Description | Default |
|---|---|---|---|
| way | No | How the model was called (default api; for a promptfoo file, read from each provider) | |
| task | No | The kind of work, if known | |
| model | No | The model that ran | |
| seconds | No | How long the call took | |
| thinking | No | Thinking was on (a promptfoo result that counts thinking tokens is marked on by itself) | |
| input_tokens | No | Prompt tokens of the call | |
| output_tokens | No | Answer tokens of the call, hidden thinking included | |
| promptfoo_results | No | Path of a promptfoo results file (promptfoo eval -o results.json): every result becomes a run |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-destructive, closed-world write. The description adds genuinely new behavioral context: the write is to a local file on this machine, nothing is transmitted externally, and the stored data is later consumed by estimate_time. It does not cover idempotency or duplicate-run behavior, which the false idempotentHint implies matters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loading the action and its effect, with the privacy guarantee last. Every clause carries information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter documentation, the description only needs to establish purpose, destination, and privacy, which it does. Minor omissions remain around duplicate handling and whether timing at least one of seconds/promptfoo_results must be supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with each of the 8 parameters documented, including the way/model/tokens/promptfoo_results fields, so the baseline is 3. The description only echoes the promptfoo results-file mode, adding no syntax, format, or default-behavior detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource: persist a timed run (or every result of a promptfoo results file) to a local file. It also names the consumer sibling (estimate_time), which helps orient the agent, though it does not contrast itself against other siblings such as estimate_cost or compare_models.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: call this after a model call, or when you have a promptfoo results file, to feed the timing estimator. There is no explicit when-not guidance or named alternative for capturing run data differently, so the agent must infer the trigger conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
not_yet_pricedNot Yet PricedBRead-onlyIdempotent
Models Arena rated recently that LiteLLM's catalogue does not price yet, and how soon the catalogue usually prices a model after Arena first shows it, by maker.
| Name | Required | Description | Default |
|---|---|---|---|
| maker | No | Only this maker, for example meta or ibm |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and closed-world behavior, lowering the disclosure burden. The description adds useful domain context about comparing Arena ratings against LiteLLM's catalogue and estimating pricing delay, but it does not cover operational details such as data freshness or update cadence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence with no obvious filler, front-loading the core resource definition. However, it reads as a noun phrase rather than a clear verb-led statement, which slightly reduces immediate comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, and the schema fully covers the sole parameter. The description sufficiently explains the tool's analytical purpose, though it leaves 'recently' and the exact aggregation of pricing delay unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one optional parameter with 100% schema description coverage, so the schema fully documents the maker filter. The description's phrase 'by maker' echoes the parameter's purpose without adding syntax or behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (recent Arena-rated models missing from LiteLLM pricing) and the computed metric (how soon pricing usually appears). It does not explicitly distinguish this from sibling tools such as find_models or price_history, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool returns but gives no explicit guidance on when to use it versus alternatives. It implies a use case through its purpose, but there are no when-to-use, when-not-to-use, or sibling-tool comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_historyPrice HistoryARead-onlyIdempotent
Every change to a model's listings since 2023 (prices, retirement dates) with the LiteLLM change behind each, and for listings that have not changed yet, the chance of a price change, a retirement date or removal in the next 90 days and year. With a date, each listing's prices that day.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | A day as YYYY-MM-DD: each listing's prices that day and the change that set them | |
| model | Yes | A model name, for example claude-opus-5.5, or one listing such as bedrock/anthropic.claude-opus-5-5 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, so the description's job is content disclosure and it does that well: it reveals that results mix observed changes with probabilistic 90-day and 1-year forecasts for unchanged listings, which is behavior an agent could not infer from the schema. It does not mention pagination or result limits, but the read-only profile is already covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is one dense sentence but front-loads the primary payload (changes since 2023) before the forecast clause and the date clause. No filler or marketing language, though the sentence is long enough that the '90 days and year' forecast clause reads as a run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't enumerate return fields, and it still conveys the two modes (history vs. dated snapshot) plus the forecast component. The main omission is guidance on choosing this tool versus siblings, which is a usage gap rather than a completeness-of-behavior gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters, including the YYYY-MM-DD format for date and the listing-name form for model. The description only restates the date behavior ('each listing's prices that day') without adding format or edge-case meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (a model's listing changes since 2023 plus forward-looking change/retirement probabilities) and what a date adds, so the agent knows this is a historical-plus-forecast lookup rather than a search or cost tool. It never names a sibling to contrast against, so differentiation from find_models or not_yet_priced is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use statement or condition selecting this tool over alternatives. The only conditional phrasing ('With a date...') explains the effect of a parameter, not when an agent should reach for this tool versus its nine siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_for_projectSuggest For ProjectBRead-onlyIdempotent
Reads a prompt, guesses its kind of work, and suggests a model and effort level: the best value (the cheapest whose rating the votes cannot tell apart from the top), the top rated and the cheapest rated.
| Name | Required | Description | Default |
|---|---|---|---|
| pay | No | api: dollars; claude or chatgpt: compare within that plan | api |
| answer | No | Typical answer length | medium |
| prompt | Yes | The project's starting prompt, or a description of the work |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and idempotentHint=true, so the safety profile is covered. The description adds useful semantic context by defining what the three outputs mean (best value = cheapest statistically indistinguishable from top), but discloses nothing about auth, rate limits, or freshness of the underlying ratings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that covers the core action, but the trailing clause ('the best value (the cheapest whose rating the votes cannot tell apart from the top), the top rated and the cheapest rated') is dense and awkwardly nested, requiring re-reading to parse the three tiers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering the safety profile, and 100% schema coverage, the description needn't explain return values or parameter formats. It adequately conveys the tool's purpose and the reasoning behind its recommendations, leaving only usage routing unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so pay, answer, and prompt are already documented with enums, defaults, and format hints. The description adds no parameter-level detail beyond what the schema provides, which is the baseline 3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (suggests a model and effort level) applied to a specific input (a prompt), and clarifies it guesses the kind of work first. It distinguishes itself from siblings like find_models and compare_models implicitly by being a recommendation rather than a lookup, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not guidance is given, and no alternatives are named despite a rich sibling set (find_models, compare_models, estimate_cost). The agent must infer that this is the right tool when it wants a recommendation rather than a listing or cost estimate.
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.
10 tool updates
v0.1.7- First observed
compare_models - First observed
estimate_cost - First observed
estimate_time - First observed
find_models - First observed
forecast_job - First observed
local_or_cloud - First observed
log_run - First observed
not_yet_priced - First observed
price_history - First observed
suggest_for_project
TDQS
Scored across 10 tools
Several tools overlap in purpose: find_models, compare_models, and suggest_for_project all recommend models; estimate_cost, forecast_job, and local_or_cloud all report costs from different angles; estimate_time and forecast_job both cover timing. Descriptions help clarify boundaries, but an agent could still misselect among them.
All names use snake_case, but conventions are mixed: most are verb_noun (find_models, estimate_cost), while others are noun phrases or adjectives (price_history, not_yet_priced, local_or_cloud). The set is readable but does not follow a predictable verb-first pattern.
With 10 tools, the set is well within the ideal 3-15 range for a specialized LLM pricing and forecasting server. Each tool addresses a distinct facet of the domain, and the count does not feel bloated or thin.
The surface covers model discovery, comparison, cost/time estimation, price history, predictive signals, project suggestions, run logging, job forecasting, and local-vs-cloud analysis. Minor gaps exist, such as direct model lookup by name or a full catalogue enumeration, but core workflows are covered.
Maintenance
Related MCP Connectors
Live LLM API price + status radar across 11 providers, with public per-model price HISTORY.
Live LLM API pricing: token prices, comparisons, cheapest-model lookups. No key required.
LLM API prices across 70+ providers: cheapest offer, comparisons, history and cost estimates.
Compare LLM API prices, search models and providers, and access reviewed benchmark results.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides live LLM pricing data from OpenRouter, enabling agents to search models, get pricing, estimate costs, and compare models.28 npmMIT
- AlicenseAqualityAmaintenanceLive LLM API pricing: current token prices, model comparisons, cheapest-model lookups, and The LLM Price Index for 150+ models across 20+ providers, re-verified daily. No API key required.41MIT
- AlicenseNot gradedqualityBmaintenanceEnables assistants to access up-to-date LLM pricing, context windows, and model identifiers, with tools to estimate costs, find cheapest models, and check scheduled price changes.27 npmMIT

OptimToken MCPofficial
AlicenseNot gradedqualityAmaintenanceEnables 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