| name | pricing-estimate |
| description | Look up Azure retail pricing for a service / SKU / region, compare options across regions or commitment types, estimate workload cost, and optionally retrieve negotiated prices via pricesheet download. WHEN: "how much will it cost", "estimate cost", "compare pricing", "cheapest option", "free tier", "price of", "compare regions", "DTU vs vCore", "negotiated prices", "pricesheet". INVOKES: get_retail_prices, list_dimensions, query_costs, start_pricesheet_download, get_pricesheet_status |
| license | MIT |
| metadata | {"version":"1.0.0"} |
Cost Estimation & Price Comparison
Look up Azure retail pricing for a service / SKU / region, compare options, estimate monthly cost, and optionally retrieve negotiated prices via pricesheet download.
To check what SKUs the user is allowed to deploy under Azure Policy before pricing them, hand off to the cost-guardrails skill first.
Step 1: Retail Price Lookup
Call get_retail_prices with the user's service, SKU, region, and (optionally) priceType (Consumption, Reservation, SavingsPlan).
For multi-option comparisons, call again with different parameters — regions (eastus vs westeurope), SKUs (Standard_D4s_v5 vs Standard_D4as_v5), or commitment types (Consumption vs Reservation vs SavingsPlan).
Need to discover what's available for a service? Call list_dimensions to see filterable options.
⚠️ Disambiguate the meter. get_retail_prices returns many meters per SKU/region — Linux vs Windows, Consumption vs Reservation (1yr/3yr) vs SavingsPlan, Spot/Low Priority, Dev/Test. Picking the wrong one can be 2–4× off.
- If multiple meters match, ask the user the minimum disambiguation needed (OS? term? Spot?) or show the candidates in a short table — don't pick one silently.
- Always include
productName, skuName, armSkuName, and type in the output so the user can verify the row.
Step 2: Current Spend Baseline (Optional)
If the user provides a scope, call query_costs with timeframe=MonthToDate, groupBy=ServiceName,MeterCategory to anchor estimates against what they actually pay today.
Step 3: Monthly Estimate
Combine unit price × estimated usage to project monthly cost. Show the formula explicitly — e.g., "$0.192/hr × 730 hr/month = $140.16/month" — so the user can see what was assumed.
Reservation and Savings Plan prices have different shapes — handle them separately.
- A
Reservation row's retailPrice is the purchase price for the whole term (what you pay to buy the reservation) — e.g. a 1-year D4s v5 at 1038, a 3-year at 1993 — even though unitOfMeasure reads 1 Hour. Don't multiply these by 730. To compare against a pay-as-you-go monthly figure, normalize the term total first: divide a 1-year price by 12 and a 3-year by 36.
- A
SavingsPlan row's retailPrice is the discounted meter rate — the per-hour price charged against matching usage to draw down your hourly savings-plan commitment. Like the pay-as-you-go rate it's already hourly (×730 for a monthly figure), not a term total.
Step 4: Pricesheet — Optional Negotiated Comparison
Retail prices may not match what the user actually pays under EA / MCA agreements. Offer:
Retail prices may not reflect your organization's negotiated rates. Want me to start a pricesheet download to compare? It's an async operation (typically 1–15 minutes) — I'll need your agreement type and billing scope.
If the user says yes:
- Confirm agreement type (
EA or MCA_BillingProfile) and billing scope (/providers/Microsoft.Billing/billingAccounts/{id} for EA, …/billingProfiles/{profileId} for MCA). For EA, also confirm the billing period (yyyyMM).
- Call
start_pricesheet_download → returns operationStatusUrl.
- Poll
get_pricesheet_status. While InProgress, wait retryAfterSeconds between checks. On Succeeded, present the downloadUrl (SAS link, valid ~1 hour).
The downloadUrl points to a ZIP of CSV files; the MCP server does not fetch it. To build a comparison, download and parse the ZIP yourself from the SAS URL, then offer a side-by-side retail vs negotiated table for the specific SKUs the user asked about.
Presentation
- Price table — Service, SKU, region, unit price, unit of measure, price type.
- Comparison matrix (if comparing) — Options side by side. Call out which is cheapest and under what assumption (region, term, agreement).
- Monthly estimate —
unit price × usage = $/month, with the assumed usage stated.
- Commitment savings (if commitment types were queried) — PAYG vs Reservation vs Savings Plan with the savings %. Put all three on the same period first (see Step 3): a Reservation is a term purchase price (÷12 or ÷36 for a monthly figure), while a Savings Plan is already an hourly meter rate (×730 for monthly, like PAYG).
- Free tier — If applicable, the free-tier limit and when charges start.
- Retail vs negotiated (if pricesheet was processed) — Side-by-side with savings %. Flag any SKUs where the negotiated rate is higher than retail (rare but possible with outdated agreements).
Prices shown are public retail (pay-as-you-go) unless the pricesheet was processed. Your actual rates may differ under an EA or MCA agreement.