DBU Waste Finder
Reads a Databricks workspace's system tables (billing, compute, lakeflow, query, storage) to explain where DBUs are spent and identify waste. Provides tools such as cost_summary, top_cost_drivers, and find_waste to surface costly jobs, clusters and SQL warehouses, missing auto-termination, idle/oversized compute, idle warehouses, failed serverless jobs, and Delta tables needing OPTIMIZE/VACUUM; propose_fix returns suggested fixes as a review-only diff for an Asset Bundle without applying them.
DBU Waste Finder
A free, read-only Databricks notebook that shows where your DBUs go and which resources look wasteful, using only Databricks system tables. One notebook, no install; the notebook sends nothing out of your workspace.
This repo contains two things:
notebook/– the free notebook (below).mcp/– an MCP server so Claude/Cursor can answer "why did our bill jump?" from your system tables and propose fixes as a diff to your Asset Bundle (read-only, never applied). Seemcp/README.md.
Landing page: https://markatdataandbeyond.github.io/dbu-waste-finder/
What it checks
Check | Source tables |
Cost by product and top 20 cost drivers (jobs, warehouses, clusters) at list price |
|
Jobs running on all-purpose compute, with the list-price difference to job compute (ratio from the cluster's own billed SKU and cloud in |
|
All-purpose clusters with auto-termination off (0/NULL) or above 60 min, incl. clusters deleted inside the window |
|
Idle or oversized clusters (avg CPU < 10 % and memory < 30 %) |
|
SQL warehouses with auto-stop off (0) or above 60 min, incl. warehouses deleted inside the window ( |
|
Idle SQL warehouses: uptime ( |
|
Serverless jobs: DBUs and cost per job, runs, failed runs; waste = failed-run share ( |
|
Delta tables needing |
|
Measured waste and 30-day projection | see How the projection works below |
If a SKU has no row in system.billing.list_prices (e.g. GENIE_FREE_USAGE), USD totals are the sum of the priced part,
flagged incomplete (usd_complete = false), and the unpriced SKUs/items are listed (unpriced_skus, unpriced() in the notebook,
unpriced_items in find_waste). DBUs are always shown.
Related MCP server: Azure FinOps Elite
Use
Import
notebook/dbu_waste_finder.pyinto your workspace (File → Import).Attach to any compute (serverless works) as a user with
USE CATALOGonsystemandUSE SCHEMA+SELECTonsystem.billing,system.compute,system.lakeflow,system.query(grant snippet inmcp/README.md).Adjust thresholds in the first cell, Run all. Checks whose schema isn't enabled are skipped.
How the projection works
measured_saving_usd/measured_waste_dbu: the waste the checks found inside the analysis window (USD = priced items only).observation_days: how much data the window actually covers — from the earliest record inside the lookback window insystem.billing.usage(usage_start_time) orsystem.compute.warehouse_events(event_time) until now, capped at the lookback. A workspace created yesterday has ~1 observed day even with a 30-day lookback.projected_30d_usd/projected_30d_dbu= measured ÷observation_days× 30, only whenobservation_days≥ 3. Below 3 days (or unknown) they are null andprojection_withheldsays why, e.g."need >=3 days, have 0.23".low_confidence: true(plus a note) whenobservation_days< 7 (3–7 days: projection shown but flagged). Exactly 7 is not flagged.This is an extrapolation of past waste at list price, not a promise of what you will get back.
Demo output (example data)
The snippet below is example / fixture data, not a live workspace. It was produced by running the MCP tools
(cost_summary, top_cost_drivers, find_waste, propose_fix) against the same mock system-table rows the
unit tests use.
cost_summary(days=15)
total_list_cost_usd: 1000.00 (JOBS 700 + ALL_PURPOSE 300; usd_complete=false, GENIE_FREE_USAGE unpriced)
daily: 2026-10-01 → $33.30
top_cost_drivers(days=15)
job etl-nightly $500.00
cluster c-shared-01 $300.00
warehouse wh-sql-01 $120.00
find_waste(days=15)
measured_saving_usd: 203.15 measured_waste_dbu: 4.5
observation_days: 15.0 projected_30d_usd: 406.30
jobs_on_all_purpose: c-shared-01 (2 jobs, est. $165 if moved to job compute)
missing_autotermination: c-adhoc-02 (auto_termination_minutes=0)
idle_or_oversized: c-idle-03 (CPU 4 %, mem 12 %, est. $35)
idle_warehouse: wh-sql-01 (98.4 % idle, 4.0 DBU → $2.80)
delta_needs_optimize: main.bronze.events (500 files, ~4 MiB avg)
delta_needs_vacuum: main.bronze.events (40 days since vacuum, ~3 GiB reclaimable)
delta_overfrequent_optimize: main.silver.orders (14 OPTIMIZE runs / 7 days)
propose_fix(issue="delta_optimize", resource_key="main.bronze.events")
-- Proposal only; review before running. DBU Waste Finder never executes this.
OPTIMIZE main.bronze.events;Privacy
Notebook: runs inside your workspace, read-only; nothing leaves the workspace.
MCP server: the MCP server runs on your machine, not in the workspace. It reads system tables with your token and returns the results to your AI client (Claude, Cursor, …) and thereby to that AI provider: job/cluster/warehouse names and ids, DBUs, list-price amounts and owners' email addresses (
missing_autoterminationreturnsowned_by). Use a read-only service principal and only connect it to an AI client you may share that metadata with. Nothing is sent to Data and Beyond.
Caveats
Costs use
pricing.effective_list.default(list price), not your contracted discount.For idle/oversized clusters, 50 % of their cost is counted as waste (an assumption; tune
IDLE_SAVING_SHARE). Checks can overlap.Idle-warehouse DBU/h per size (2X-Small 4 … 4X-Large 528) is the published Databricks SQL rate, an assumption; real billed DBUs are in
system.billing.usage.system.billing.usagelags by hours;system.computeandsystem.queryusually land sooner, so warehouse checks can show results before cost does.usage_metadata.job_idis not populated for jobs on all-purpose compute (per Databricks docs), so those are detected viajob_task_run_timeline.compute_ids.system.billingis account-wide, butsystem.computeandsystem.lakeflowonly cover workspaces in the current region. Cluster usage billed in workspaces that this region can't see is listed undercluster_region_gapwith a warning. Run the checks once per region.
Sources (fetched 2026-10-26)
Billable usage: https://docs.databricks.com/aws/en/admin/system-tables/billing
Pricing: https://docs.databricks.com/aws/en/admin/system-tables/pricing
Compute: https://docs.databricks.com/aws/en/admin/system-tables/compute
Jobs: https://docs.databricks.com/aws/en/admin/system-tables/jobs
Test locally
From the repo root (Python ≥ 3.10):
python3 -m venv .venv && .venv/bin/pip install -r requirements-test.txt -e ./mcp && .venv/bin/pytest -qRuns the notebook test (every query parsed as Databricks SQL with sqlglot and executed on mock system tables in DuckDB), the MCP server tests (mocked query results) and landing-page checks. No workspace needed.
Validation status
Run live against a Databricks trial workspace (AWS, serverless-only) on 2026-10-26: all queries execute;
idle_warehousefound the test warehouse (77 min up, 2 busy min);warehouse_long_autostopfound it after deletion; cost tools return DBUs and a partial USD total for priced SKUs ($6.89 at ~16:40Z) withusd_complete: falseand the one unpriced SKU listed (GENIE_FREE_USAGE, 0.326 DBU).Not yet validated live: the classic-cluster checks (jobs on all-purpose, auto-termination, idle clusters) — the trial workspace cannot run classic clusters.
Idle-warehouse USD verified live ~16:40Z: billed SKU PREMIUM_SERVERLESS_SQL_COMPUTE_US_WEST_OREGON at $0.70/DBU → 5.0 idle DBU = $3.50 (billing: 3.88 DBU for 13:00–14:00Z, consistent with 4 DBU/h for 2X-Small).
serverless_jobsverified live 2026-10-26 ~16:40Z: test job 4 runs / 0 failed (=job_run_timeline), 0.215 DBU and $0.08 (=system.billing.usage0.21454 DBU × $0.35). Billing then covered 13:00–14:00Z only (runs at 13:15 and 13:45Z), so the DBUs of the 14:15/14:45Z runs are not yet confirmed.
Not affiliated with Databricks. "Databricks" is a trademark of Databricks, Inc. MIT licensed, © 2026 Data and Beyond ApS.
Available Tools
6 toolscost_review_reportA
One markdown cost-review report for the last days days (1..365) from cost_summary +
top_cost_drivers + find_waste: executive summary, top drivers, waste findings with estimated
list-price amounts, and proposed fixes. max_autotermination_minutes / warehouse_idle_pct /
max_rows are forwarded to find_waste. Read-only; proposals only — nothing is applied.
Returns {days, markdown, measured_saving_usd, projected_30d_usd}.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| max_rows | No | ||
| warehouse_idle_pct | No | ||
| max_autotermination_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses read-only semantics, that proposals are never applied, that three parameters are forwarded to find_waste, and the exact return keys. It omits the operational cost of fanning out to three underlying tools and any permission prerequisites.
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?
Front-loaded with the deliverable and window, then composition, then safety, then return shape. Dense but every clause carries information; 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?
No output schema, so it correctly inlines the return keys {days, markdown, measured_saving_usd, projected_30d_usd}. All four parameters are optional with defaults, lowering the cost of underspecification, but the forwarded parameters' meanings remain unexplained.
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 0%, so the description must compensate. It documents `days` (range 1..365) and says the other three are forwarded to find_waste, but never explains what max_rows limits or what the idle-percentage/autotermination thresholds mean operationally.
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 artifact (a markdown cost-review report), the window, and explicitly the three sibling tools it composes (cost_summary, top_cost_drivers, find_waste). An agent can tell immediately that this is the aggregated one-shot report versus the individual primitives.
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 composition statement plus 'Read-only; proposals only — nothing is applied' gives a clear usage context: use this when you want the combined report and aren't applying changes. It stops short of explicit exclusions (e.g. when to call cost_summary alone or whether to call propose_fix afterwards).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cost_summaryA
Orient on spend: total list-price cost, cost per product and per day for the last days days
(integer 1..365). Read-only; list price, not your discount. USD totals cover priced usage only —
when a SKU has no list price, usd_complete is false and unpriced_skus lists it. Use before
find_waste when you need the overall bill shape.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, yet the description carries the full behavioral burden: it declares read-only status, clarifies the pricing basis (list price, not discount), and explains the completeness caveat (usd_complete=false with unpriced_skus). That is exactly the context an agent needs to interpret partial results.
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?
Front-loaded with the purpose, then pricing caveats, then the usage routing — three sentences plus a directive, none of which are filler. Every clause adds decision-relevant information.
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 no output schema and no annotations, the description compensates fully by naming the returned fields (per-product, per-day, usd_complete, unpriced_skus) and the read-only/list-price semantics. An agent can interpret results without opening anything else.
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 0% and the sole `days` param has no schema description, but the description supplies its semantic range (integer 1..365) and ties it to the reporting window. It doesn't note the 30-day default, keeping it just under a 5.
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 ('Orient on spend') plus the exact resource dimensions returned: total list-price cost, cost per product, and per day. The closing clause ('overall bill shape') distinguishes it from the analytic siblings like find_waste and explain_cost_spike.
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?
Explicitly says 'Use before find_waste when you need the overall bill shape', giving a concrete placement in the workflow and an alternative it precedes. It doesn't exclude scenarios for the other four siblings (top_cost_drivers, cost_review_report), so it falls short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_cost_spikeA
Explain a one-day cost spike: which jobs/warehouses/clusters drove list-price cost on date
(YYYY-MM-DD UTC billing day = system.billing.usage.usage_date) vs the prior 7-day daily average.
Read-only. Use when the user asks "why did Tuesday cost more?" after cost_summary.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose "Read-only" plus the analytical method (single day vs prior 7-day daily average, list-price basis). It does not say what happens when fewer than 7 days of history exist, whether the result is truncated to top-N drivers, or anything about response shape.
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?
Three short sentences, each doing distinct work: scope, semantics, routing. The parenthetical date clarification is placed inline where it is needed and nothing is repeated from the name.
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?
For a single-parameter, read-only analytical tool with no output schema, this is nearly complete — scope, comparison baseline, and date semantics are all covered. The only gap is the shape/granularity of the returned attribution (e.g. ranked list vs full breakdown).
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 coverage is 0% and the schema only declares a bare string, so the description must compensate — and it does, pinning the format (YYYY-MM-DD), the timezone/billing-day semantics (UTC billing day), and the underlying field (system.billing.usage.usage_date).
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 and resource (explain a one-day cost spike) and immediately names the attribution dimensions (jobs/warehouses/clusters) plus the comparison basis (prior 7-day daily average). This is clearly distinct from cost_summary (aggregate) and top_cost_drivers (ranking) 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ("why did Tuesday cost more?") and an explicit sequencing rule — use after cost_summary — which routes the agent relative to a sibling. It stops short of stating when NOT to use it (e.g. multi-day trend questions that belong to cost_summary or cost_review_report).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_wasteA
Find wasted DBUs over the last days days (1..365). Read-only; never changes the workspace.
Returns measured_saving_usd / measured_waste_dbu, observation_days, projected_30d_usd/_dbu
(= measured / observation_days * 30; withheld below 3 days) and low_confidence (< 7 days).
Classic: jobs on all-purpose, clusters with auto-termination off or above
max_autotermination_minutes (default 60), idle/oversized clusters. Serverless: warehouses with
no/long auto-stop, idle warehouses (idle_pct ≥ warehouse_idle_pct, default 80), serverless jobs
incl. failed-run share. Delta: needs OPTIMIZE / VACUUM / over-frequent OPTIMIZE (proposals only).
At most max_rows rows per check (1..1000). USD is None when unknown; failed checks go under
errors with the table and the GRANT/fix — totals are never a fake $0.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| max_rows | No | ||
| warehouse_idle_pct | No | ||
| max_autotermination_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it declares read-only/'never changes the workspace', documents projection withholding below 3 days and low_confidence below 7 days, explains that USD is None when unknown, and specifies that failed checks surface under `errors` with the table and required GRANT rather than being silently counted as $0.
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?
Front-loads purpose and the read-only guarantee, then return semantics, then check families — a sensible order. It is dense and the check enumeration is long, but each clause carries scope or threshold information rather than 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?
No output schema exists, yet the description names the return fields (measured_saving_usd, measured_waste_dbu, observation_days, projected_30d_usd/_dbu, low_confidence, errors) and their caveats. For a read-only, zero-required-parameter analysis tool, an agent has everything needed to call and interpret it.
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 0%, so the description must compensate, and it does for all four parameters: `days` (1..365), `max_rows` (1..1000 per check), `warehouse_idle_pct` (idle_pct ≥ threshold, default 80), and `max_autotermination_minutes` (clusters off or above threshold, default 60). Ranges and comparison semantics are exactly what the bare integer schema lacks.
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 and resource ('Find wasted DBUs') with an explicit time scope, then enumerates the three check families (Classic, Serverless, Delta) it covers. That enumeration separates it cleanly from cost_summary and top_cost_drivers, which report spend rather than waste findings.
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 context is implied by the scope ('wasted DBUs', 'proposals only' for Delta), but the description never says when to pick this over cost_summary, top_cost_drivers, or cost_review_report, nor when to follow up with propose_fix. The agent must infer routing from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_fixA
Propose a fix as a unified diff (Asset Bundle YAML) or reviewable SQL — never applied.
issue: 'all_purpose_job' (move tasks off existing_cluster_id onto a job cluster),
'no_autotermination' (set resources.clusters..autotermination_minutes),
'warehouse_autostop' (set resources.sql_warehouses..auto_stop_mins, default 10),
or Delta (delta_optimize|delta_vacuum|delta_zorder|delta_predictive_optimization|
delta_overfrequent_optimize) which returns SQL (resource_key = catalog.schema.table;
for delta_zorder pass columns as comma-separated node_type_id; for delta_vacuum pass
retention hours as minutes, default 168 / min 7 days). Pass cluster_id from find_waste for
cluster fixes — a deleted cluster is refused. bundle_yaml may be empty for Delta issues.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | databricks.yml | |
| issue | Yes | ||
| minutes | No | ||
| cluster_id | No | ||
| bundle_yaml | Yes | ||
| num_workers | No | ||
| node_type_id | No | ||
| resource_key | Yes | ||
| spark_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers the key traits: output is a diff/SQL proposal, 'never applied' (non-mutating), and deleted clusters are refused. It omits permission/rate-limit details, but for a proposal-only tool the core safety profile is disclosed.
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 opening sentence front-loads purpose and the non-applied nature; the dense subsequent text earns its place by mapping issue values to behaviors and parameter quirks. It's information-dense rather than padded, though the nested parenthetical structure is heavy.
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?
The output is a proposal (diff/SQL) and an output schema exists, so return values needn't be explained. The description covers the tricky parameters and safety behavior, leaving only a few auxiliary params (path, num_workers, spark_version) 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?
At 0% schema coverage, the description compensates well: it explains the issue enum, tells that delta_zorder overloads node_type_id as column list, that delta_vacuum uses minutes (default 168/min 7 days), resource_key as catalog.schema.table, and that bundle_yaml may be empty. It leaves path, num_workers, and spark_version undocumented, so not fully complete.
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 and resource ('Propose a fix as a unified diff ... or reviewable SQL') plus a critical behavioral qualifier ('never applied'). This clearly distinguishes it from siblings like find_waste, cost_summary, and top_cost_drivers, which are analysis/reporting tools rather than fix generation.
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?
Enumerates issue types with their intent, tells the agent to pass cluster_id 'from find_waste' for cluster fixes, and notes a deleted cluster is refused. It establishes the routing from find_waste and the delta-issue path, but doesn't explicitly say when NOT to use it or name every alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_cost_driversA
Top 20 jobs, warehouses and clusters by list-price cost over the last days days (1..365).
Read-only; returns {rows, usd_complete, unpriced_skus}. Use to answer "what spent the most?"
before drilling into waste with find_waste. List price only — not applied discounts.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden, and it does: it declares read-only behavior, states the exact result shape (rows, usd_complete, unpriced_skus), and flags the list-price-vs-applied-discount caveat. The unpriced_skus/usd_complete flags are valuable partial-data disclosure; only auth/permission requirements are unaddressed.
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?
Three short sentences, front-loaded with the resource and window, then safety/return contract, then the routing hint. No filler and each sentence carries distinct information.
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?
For a one-parameter, no-output-schema analytics tool, everything an agent needs to call it correctly is present: scope, time window, read-only status, price basis, and the shape of the returned object including partial-pricing flags.
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 coverage is 0%, so the description must compensate, and it adds the key constraint the schema lacks: the valid range 1..365 for `days`. It omits how out-of-range values behave, but the default (30) is already in the schema, so the critical semantics are covered.
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 concrete resource (top 20 jobs, warehouses and clusters ranked by list-price cost) plus the time window, which is a specific ranking query rather than a generic summary. It distinguishes itself from find_waste but does not clarify how it differs from cost_summary or cost_review_report, which appear to cover adjacent ground.
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?
Gives an explicit use case ("answer 'what spent the most?'") and sequences it before find_waste ("before drilling into waste"). It provides clear context but no exclusion of when cost_summary or cost_review_report would be the better pick.
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.
6 tool updates
v0.1.0- First observed
cost_review_report - First observed
cost_summary - First observed
explain_cost_spike - First observed
find_waste - First observed
propose_fix - First observed
top_cost_drivers
TDQS
Scored across 6 tools
Each tool targets a distinct resource and question: cost_summary (bill shape), top_cost_drivers (top spenders), cost_review_report (composite deliverable), find_waste (waste detection), explain_cost_spike (single-day cause), and propose_fix (remediation output). Descriptions explicitly establish call ordering and dependency (e.g. use before find_waste, after cost_summary), so an agent can select confidently.
All names are snake_case and readable, but conventions mix noun phrases (cost_summary, top_cost_drivers, cost_review_report) with verb_noun phrases (find_waste, explain_cost_spike, propose_fix). The deviation is minor and does not impede understanding.
Six tools is well-scoped for a cost-review/waste-finder server, with each tool earning its place across orient, drill-down, report, explanation, and remediation. No redundant or trivial entries.
The surface covers orientation, drill-down, spike explanation, comprehensive reporting, and fix proposals, forming a coherent read-only workflow. Minor gaps remain, such as no direct entity-detail lookup (specific job/cluster metadata) or validation of proposed fixes, but agents can work around these.
Maintenance
Related MCP Connectors
LLM cost optimization gateway, repo token-waste auditor & model arbitrage MCP server.
LLM cost optimization gateway, repo token-waste auditor & model arbitrage MCP server.
Hosted MCP server for AWS cloud spend: service breakdowns, anomalies, savings and forecasts.
FinOps agent MCP: one allocated view of cloud, AI and data costs for your team. Starter $300/mo
Related MCP Servers
- AlicenseCqualityDmaintenanceA read-only MCP server that enables users to query Databricks SQL, browse metadata, and monitor Delta Lake tables. It also supports tracking Databricks Jobs, DLT Pipelines, and cluster metrics through natural language interfaces.254MIT
- AlicenseNot gradedqualityDmaintenanceProduction-grade MCP server for enterprise Azure cost optimization, enabling spend anomaly detection, multi-tenant auditing, budget validation, and compliance-aware recommendations.1MIT
- AlicenseAqualityAmaintenanceLocal-first FinOps MCP server. Ask about your AWS, Azure, GCP, and SaaS costs in plain English. Anomaly detection, rightsizing, idle-resource cleanup, and Jira/Linear ticketing. Credentials never leave your machine.1019Apache 2.0
- FlicenseNot gradedqualityDmaintenanceA governed MCP server exposing Databricks operations as tools for jobs orchestration, SQL execution, notebook creation, Unity Catalog governance, lineage, clusters, and DLT pipelines, with safety features like dry-run and audit logging.-