Latest updates, new providers, features, and fixes — one place for every release.
npx -y llm-pricing-mcp — STDIO access with no clone, no Pythonllm-pricing-mcp (npm/llm-pricing-mcp in this repo) — a zero-dependency Node.js bridge for MCP clients that only support command-based STDIO servers, not a direct remote/HTTP url configPOST /mcp endpoint and the JSON-RPC response is written back to stdout, so it has nothing to keep in sync as tools or pricing change server-side{"command": "npx", "args": ["-y", "llm-pricing-mcp"]} — no git clone, Python, or pip install neededtools/call never blocks other in-flight requests from completing firsturl config and running mcp/server.py locally — are unchanged; this is a third, lower-friction path for STDIO-only clients, not a replacementcheck_price_drift and get_data_quality now report these prices as confirmed againimport_session_usage tool backfills a session's usage after the fact — plus org-wide estimated-usage visibilityimport_session_usage accepts a batch of usage entries under one shared session_id in a single call — the retroactive counterpart to record_usage, for a session (e.g. a VS Code Copilot Chat session) that wasn't instrumented live. Each entry resolves its input/output tokens from an exact count when known, or estimates them from raw turn text using this server's existing token counterrecord_usage — never trusted from the callerrecord_usage: when a caller omits request_id, a deterministic one is derived so resubmitting an identical batch is safely a no-opanalyze_session_usage tool and GET /usage/session/{session_id} — no change to how either is invokedanalyze_session_usage / GET /usage/session/{session_id} and get_usage_summary / GET /usage/summary now also report has_estimated_usage and estimated_request_count, so both session-level and org-wide views surface how much of the reported usage is estimated vs. exactanalyze_session_usage and GET /usage/session/{session_id} could recommend switching to a materially lower-quality model purely because it's cheaper, showing a dollar savings figure with no indication that quality was being traded away — the equivalent recommend_model caveat never made it to this shared code pathquality_tradeoff caveat in the recommendation object whenever the recommended model's quality_score falls below ~75, using the identical threshold and message wording as recommend_model's existing caveat, so the two entry points can't driftquality_score is at or above the threshold — every other recommendation field is unchangedrecommend_model now flags classification uncertainty and quality-per-dollar tradeoffscaveats entry naming both the inferred category and the plausible higher-stakes alternative — a nudge to double-check with an explicit task_type rather than a silent misclassificationquality_score falls below ~75, the response now includes a separate caveats entry noting that ranking by quality-per-dollar can understate risk for tasks where a wrong answer is costly to discover and fix downstreamcaveats is omitted entirely when neither condition appliesrecommend_model only — analyze_session_usage, POST /router/recommend, and every other caller of the routing engine are unaffectedcompare_costs now suggests real model names when yours doesn't match exactlycompare_costs' model_names doesn't exactly match a catalogued model (e.g. "claude" or "claude sonnet"), that entry's response now includes a candidates list of real catalogued model names it likely refers to, capped to 8, instead of a bare "not found"candidates list — never a fabricated guesscompare_costs still never returns a computed cost for anything but an exact, case-insensitive match, and mixing an exact match with an unresolved name in one call resolves each independentlyoptimize_workload's allocation/monthly-cost/budget checks and the repo cost auditor's (scripts/audit_repo.py) per-call-site cost and cheaper-model recommendations — both are now fixed to match every other cost-calculating toolpredict_cost's "best value" pick now enriches its ranked candidates with real quality-benchmark data before scoring, the same way recommend_model and optimize_workload already do, so it resolves to an actual model instead of always coming back emptyanalyze_session_usage / GET /usage/session/{session_id} — turn one session's actual usage into a recommendationrecord_usage (and POST /usage / POST /usage/batch) now accept an optional session_id to tag a usage event, so a bounded burst of calls — a coding-agent run, a chat session, or any tagged workload — can be grouped and retrieved lateranalyze_session_usage and REST endpoint GET /usage/session/{session_id} read back one session's real recorded usage on demand: total input/output tokens, total actual cost, and a per-model breakdown if more than one model was usedrecommend_model / POST /router/recommend to produce a grounded recommendation — or confirm the current choice is already optimal — with the estimated dollar savings or increase versus that session's actual cost; the rationale cites the session's own request count, token volume, and blended cost profile, not generic boilerplatehas_data: false and no recommendation rather than fabricating one. Advisory only — never re-prices history or switches anythingget_cache_stats / GET /cache-stats — see whether the recommendation cache is actually workingget_cache_stats and REST endpoint GET /cache-stats report process-lifetime hit counts, miss counts, total lookups, and hit rate for the ~5-minute recommendation cache introduced in v1.67.0 — separately for recommend_model and POST /router/recommend, never combined into one figurecached field is unchangedrecommend_model (MCP tool) and POST /router/recommend now cache the routing decision for ~5 minutes, so an IDE re-asking on every keystroke pause — or an agent re-checking the best model for the same recurring task — gets the same answer back without recomputing the full routing pass each timecached field so a caller can tell whether a given recommendation was served from cache or freshly computed; cached and fresh responses have identical recommended/score/reason/alternatives for the same normalized inputsPOST /router/recommend/stream and /v1/chat/completions are unaffected and always compute freshrecommend_model — describe your use case in plain English, get a model recommendationrecommend_model takes a free-text description (e.g. "summarize long customer support tickets") and classifies it into a task type using the same keyword-based inference as predict_cost, then runs it through the routing engine already live at POST /router/recommendpredict_cost first if you want per-model cost estimates for an actual prompt, or optimize_workload if you have several distinct task types to route at oncescripts/audit_repo.py now also recommends the Batch API for call sites inside a loop or an offline-looking path (job/cron/pipeline/worker), typically ~50% cheaper for non-latency-sensitive callsscripts/audit_repo.py statically scans a Python codebase for LLM SDK call sites (OpenAI, Anthropic, Google, LangChain) and estimates the cost of each one using the same token counting and pricing math as predict_costpython scripts/audit_repo.py /path/to/your/repo; static estimates only, since call frequency can't be known from code alone — pair with GET /usage/summary once deployed for real numbersPOST /usage/alerts registers a webhook that fires when actual recorded spend (from POST /usage) crosses a USD threshold — per org, or across all orgsperiod_days while spend stays over threshold so it doesn't spamregister_budget_alert, list_budget_alerts, delete_budget_alertPOST /usage and POST /usage/batch record real token usage after an LLM call completes — cost is computed server-side from current pricing, never trusted from the callerGET /usage/summary reports total spend and breakdowns by model and provider, optionally filtered by orgrecord_usage, get_usage_summaryget_data_quality — one call for the whole catalogue's trust statusGET /data-quality endpoint and matching MCP tool report an aggregate accuracy summary: what percentage of models have a confirmed, fresh price, how many are currently withheld due to price drift, how many are newly discovered and not yet priced, and how many confirmed prices are over 90 days oldcheck_price_drift, which lists individual disputes — this is a single trust signal a customer can check without inspecting every model's provenance fields themselvesSTATIC_PRICING is corrected.check_price_drift now reports what's currently withheld and why, instead of reporting drift that's still quietly being servedservers key with an explicit type, not mcpServers). The tab now has separate steps for each..vscode/mcp.json or the user MCP config via the Command Palette, and enabling the tools in Copilot Chat's Agent mode./mcp-setup page — opens the client directly via its MCP deep-link scheme, pre-filled with the hosted remote endpoint, no copy-paste requiredprice-drift label instead of failing outright when it's missingmcp/server_azure.py (non-functional since v1.21.0; it imported a module that was never committed) is gone, and the version-literal guard now scans every file under mcp/ and src/ instead of a hand-maintained listgit read-tree–based script replaces the manual promotion recipe that could silently resurrect a deleted file, covered by 12 tests against isolated reposprice_confirmed, returning $0.00 marked as confirmed rather than unpricedPricingMetrics construction sites reduced to 18 behind one shared builder, 611 fewer lines; verified byte-identical output against a 228-record snapshot taken before the refactorcheck_price_drift now reports zero against the corrected cataloguedata/model_prices_snapshot.json) keeps this working offline or if the upstream registry is unreachablecheck_price_drift MCP tool flags curated prices that have drifted more than 5% from the registry — for human review, never auto-appliedprice_as_of and price_confirmed on every model; a computed price_is_stale flag trips at 90 days old or if a price was never datedoptimize_workload MCP tool — allocates each task in a workload mix to its cheapest qualifying model, then spends any remaining budget upgrading the highest quality-per-dollar allocations firstsrc/__init__.py). Clients were previously being told 1.1.0 in serverInfo while the app itself was several minor versions aheadpredict_cost MCP tool — counts tokens with tiktoken, infers the task type, estimates output length from empirical input/output ratios, and ranks every model cheapest-first with cache savings and a best-value pickpredict_cost and get_ide_pricing were registered as MCP tools but unreachable from /chat and ask_agent — both are now wired into the ReAct agent (15 → 17 agent-bound tools)Cache-Control: public, max-age=300 on GET /pricing so repeated reads don't all hit the databaseHUGGINGFACE_API_KEY is setGET /pricing — filter by supports_vision, supports_function_calling, supports_json_mode, batch_available, is_reasoning_modelsupports_vision, supports_function_calling, supports_json_mode, batch_available, is_reasoning_modelGET /pricing/use-cases API response includes all capability fieldsSALESFORCE_API_KEY, PROMPTQL_API_KEY, SNOWFLAKE_API_KEY, ORACLE_API_KEYBasePricingProvider._fetch_live_model_ids() — queries each provider's /v1/models API on a 6-hour cache; no extra requests on every call_apply_live_filter() — removes models absent from the live list; exact + prefix matching handles versioned aliases (e.g. gpt-4o ↔ gpt-4o-2024-11-20)[OpenAI] Removed 2 deprecated model(s): [...]XAI_API_KEY, DEEPSEEK_API_KEY, CEREBRAS_API_KEY, NVIDIA_API_KEY, REPLICATE_API_KEY/docs (Swagger UI) and /redoc — now matches the site design system instead of default white background/api-docs/api-docs embeds SwaggerUIBundle and Redoc.init directly (no iframe) to prevent double nav barsdocs/PERPLEXITY_INTEGRATION.md — step-by-step guide for Perplexity desktop MCP config (macOS + Windows), all 15 tools with curl examplesmain()POST /billing/signup)MCP_API_KEY; fully backward-compatibleSTRIPE_SECRET_KEY; free signup always worksllm-pricing-api.fly.dev; shared-cpu-1x, 512 MB, persistent 1 GB volume; ~$3.40/moX-Api-Key-Tier: free|pro|enterprise; token-bucket limits 30/120/600 req/min; GET /rate-limits/tiersrouting_id UUID on every recommendation; POST /router/feedback; acceptance_rate in savings statsPOST /router/recommend/stream SSE endpoint with 10-event sequencePOST /router/recommend; scores models by task type, cost, quality; returns ranked recommendationsquality_score (0-100) + quality_value_score on every model; Hugging Face leaderboard fallback (24 h cache)GET /telemetry/savings + X-Organization-Id headerPOST /v1/chat/completions; routing recommendation in OpenAI response format