Skip to main content
Glama

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). See mcp/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

system.billing.usage + system.billing.list_prices

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 list_prices; on a shared cluster only the share of billed time used by job runs counts, the full figure is shown as est_saving_upper_bound_usd)

system.lakeflow.job_task_run_timeline (compute_ids), system.compute.clusters

All-purpose clusters with auto-termination off (0/NULL) or above 60 min, incl. clusters deleted inside the window

system.compute.clusters (latest SCD row)

Idle or oversized clusters (avg CPU < 10 % and memory < 30 %)

system.compute.node_timeline

SQL warehouses with auto-stop off (0) or above 60 min, incl. warehouses deleted inside the window (warehouse_long_autostop)

system.compute.warehouses (latest SCD row)

Idle SQL warehouses: uptime (cluster_count × time between events) vs minutes with a query running; flagged at ≥ 80 % idle and ≥ 30 min up, waste in DBUs from size × list price of the warehouse's billed SKU (USD NULL until its usage is in billing) (idle_warehouse)

system.compute.warehouse_events, system.query.history, system.compute.warehouses

Serverless jobs: DBUs and cost per job, runs, failed runs; waste = failed-run share (serverless_jobs)

system.billing.usage (SKU contains SERVERLESS), system.lakeflow.job_run_timeline

Delta tables needing OPTIMIZE (many small files), VACUUM (stale/missing), or over-frequent manual OPTIMIZE (proposals only; never executed)

system.storage.predictive_optimization_operations_history, system.query.history

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

  1. Import notebook/dbu_waste_finder.py into your workspace (File → Import).

  2. Attach to any compute (serverless works) as a user with USE CATALOG on system and USE SCHEMA + SELECT on system.billing, system.compute, system.lakeflow, system.query (grant snippet in mcp/README.md).

  3. 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 in system.billing.usage (usage_start_time) or system.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 when observation_days ≥ 3. Below 3 days (or unknown) they are null and projection_withheld says why, e.g. "need >=3 days, have 0.23".

  • low_confidence: true (plus a note) when observation_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_autotermination returns owned_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.usage lags by hours; system.compute and system.query usually land sooner, so warehouse checks can show results before cost does.

  • usage_metadata.job_id is not populated for jobs on all-purpose compute (per Databricks docs), so those are detected via job_task_run_timeline.compute_ids.

  • system.billing is account-wide, but system.compute and system.lakeflow only cover workspaces in the current region. Cluster usage billed in workspaces that this region can't see is listed under cluster_region_gap with a warning. Run the checks once per region.

Sources (fetched 2026-10-26)

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 -q

Runs 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_warehouse found the test warehouse (77 min up, 2 busy min); warehouse_long_autostop found it after deletion; cost tools return DBUs and a partial USD total for priced SKUs ($6.89 at ~16:40Z) with usd_complete: false and 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_jobs verified live 2026-10-26 ~16:40Z: test job 4 runs / 0 failed (= job_run_timeline), 0.215 DBU and $0.08 (= system.billing.usage 0.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 tools
cost_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}.

NameRequiredDescriptionDefault
daysNo
max_rowsNo
warehouse_idle_pctNo
max_autotermination_minutesNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
daysNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dateYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
daysNo
max_rowsNo
warehouse_idle_pctNo
max_autotermination_minutesNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
pathNodatabricks.yml
issueYes
minutesNo
cluster_idNo
bundle_yamlYes
num_workersNo
node_type_idNo
resource_keyYes
spark_versionNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
daysNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.1.0
    • First observedcost_review_report
    • First observedcost_summary
    • First observedexplain_cost_spike
    • First observedfind_waste
    • First observedpropose_fix
    • First observedtop_cost_drivers

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    A 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.
    25
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Production-grade MCP server for enterprise Azure cost optimization, enabling spend anomaly detection, multi-tenant auditing, budget validation, and compliance-aware recommendations.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Local-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.
    10
    19
    Apache 2.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    -