.github/skills/azure-pricing/SKILL.md
Look up real-time Azure retail pricing for any service, SKU, or region using the Azure MCP pricing tool. Estimate deployment costs from Bicep, ARM, or Terraform templates, compare pricing across regions, price types (Consumption, Reservation, DevTest), and surface savings plan options. Use when asked about Azure costs, SKU prices, region comparisons, or template cost estimates.
npx skillsauth add thomast1906/github-copilot-agent-skills azure-pricingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Fetch live Azure retail pricing data via the Azure MCP Server pricing tool and turn it into actionable cost estimates, region comparisons, and deployment-level forecasts.
Standard_D4s_v5 cost in uksouth?"uksouth and westeurope"uksouth?"ms-azuretools.vscode-azure-github-copilot). No mcp.json configuration is required — the tool is registered automatically by the extension.Before invoking the pricing tool, always run
tool_search_tool_regexwith patternpricingto discover the exact tool name. Do not guess or hardcode the name.
| Parameter | Required | Description |
|-----------|----------|-------------|
| sku | Optional* | ARM SKU name (e.g. Standard_D4s_v5, Standard_E64-16ds_v4) |
| service | Optional* | Azure service name (e.g. Virtual Machines, Storage, SQL Database) |
| region | Optional* | Azure region slug (e.g. eastus, westeurope, westus2) |
| service-family | Optional* | Service family (e.g. Compute, Storage, Databases, Networking) |
| price-type | Optional* | Consumption, Reservation, or DevTestConsumption |
| include-savings-plan | Optional | true to include savings plan pricing (uses preview API; mainly applies to Linux VMs) |
| filter | Optional* | Raw OData filter expression for advanced queries |
| currency | Optional | Currency code. Skill default: GBP — always pass this explicitly. The underlying tool defaults to USD if omitted. Other common values: USD, EUR |
*At least one filter parameter is required per call.
Gotchas:
SavingsPlanis NOT a validprice-typevalue. To get savings plan rates useinclude-savings-plan: truealongside aConsumptionquery.- Prefer querying with a specific SKU rather than a broad service name alone — results will be more targeted and useful. Querying by service name without a SKU is valid when the user explicitly wants a full listing of available SKUs.
- SKU name spacing varies by service. The
skuparameter is format-sensitive. For App Service,P2v3returns no results butP2 v3(with a space) works. If theskuparameter returns empty, fall back to an ODatafilterwithskuName eq '...'to match exactly as the API stores it.- Reservation
retailPricevalues are lump-sum totals, not hourly rates. DespiteunitOfMeasure: "1 Hour", Reservation price rows return the total commitment cost (annual or 3-year). Divide by 8,760 (1-year) or 26,280 (3-year) to get an hourly equivalent for comparison.- SQL Database compute and storage are separate meters. You need two calls: one for compute (e.g.
4 vCoreunderSQL Database Single/Elastic Pool General Purpose - Compute Gen5) and one for storage (SQL Database Single/Elastic Pool General Purpose - Storage). A single query returns both if you don't filter byproductName.- SQL Database
skuNamein the API uses plain English, not ARM format. The ARM SKUGP_Gen5_4maps to APIskuName: "4 vCore"underproductNamecontainingGeneral Purpose - Compute Gen5. Filter by bothskuNameandproductNameto avoid Business Critical or DC-Series rows returning alongside General Purpose.- Spot pricing requires the
filterparameter, notprice-type. Spot is not aprice-typevalue — usefilter: "contains(meterName, 'Spot') and armSkuName eq '<sku>' and armRegionName eq '<region>'"withprice-type: Consumption. Live-tested: Standard_D4s_v5 inuksouthreturns Linux Spot at £0.0213/hr and Windows Spot at £0.039/hr (vs £0.164/hr and £0.300/hr standard — ~87% saving).isPrimaryMeterRegion eq truein OData filter: When using targetedsku+regionqueries, the MCP tool already returns only primary meter region rows. TheisPrimaryMeterRegion eq truefilter expression is useful when writing broad OData-only queries (without a locked region) that might otherwise return duplicate rows for the same SKU across meter variants.include-savings-plan: trueis incompatible with thefilterparameter. Wheninclude-savings-plan: trueis set alongside an ODatafilter, the tool returns empty results. To retrieve savings plan data, usesku+regionparameters only. ThesavingsPlanfield is a nested array ([{"term": "1 Year", "unitPrice": ...}, {"term": "3 Years", ...}]) present only on Linux compute rows — Windows VM rows never include savings plan data.DevTestConsumptionwaives the Windows OS license cost on VMs. Windows VMs queried withprice-type: DevTestConsumptionreturn at Linux-equivalent prices (e.g. Standard_D4s_v5 uksouth: £0.164/hr, same as Linux PAYG). The Windows license is free under Dev/Test subscriptions. Always flag this when estimating costs for Dev/Test Windows VMs.Reservationqueries always return both 1-year and 3-year rows together. There is noreservation-termparameter — it is silently ignored. To isolate a single term, combineprice-type: Reservationwithfilter: "reservationTerm eq '1 Year'"orfilter: "reservationTerm eq '3 Years'". Parameterstop,skip, andmeter-nameare also silently ignored by the MCP tool.- ⚠️ Azure OpenAI / AI services cannot be queried via this MCP tool. The Azure MCP pricing tool returns a 500 error for any query that resolves to the
AI + Machine Learningservice family — includingservice: "Foundry Models",service: "Azure OpenAI",service-family: "AI + Machine Learning", and OData filters matching those services. This is a known MCP tool limitation. For AI model pricing (GPT-4o, text-embedding, etc.), use the Azure Pricing Calculator or the Azure OpenAI pricing page directly.
Example prompts to tool:
{ "sku": "Standard_D4s_v5", "region": "uksouth", "currency": "GBP" }{ "sku": "Standard_D4s_v5", "region": "uksouth", "price-type": "Reservation", "currency": "GBP" }{ "sku": "Standard_D4s_v5", "region": "uksouth", "include-savings-plan": true, "currency": "GBP" }Note: Calling with
servicealone (e.g."service": "Virtual Machines") without askureturns all SKUs for that service — only do this if the user explicitly wants a full listing.
Pre-estimation: ask about usage patterns before querying — for consumption-based services, the cost varies wildly based on scale. Before calling the pricing tool, if the template contains any of the following, ask the user:
| Service | Ask about | |---------|----------| | Azure Functions | Expected invocations/month, average execution duration (ms), memory allocation (GB) | | Cosmos DB (serverless) | Expected RU consumption/month | | Container Apps | Expected request volume, scale-to-zero behaviour, vCPU/memory allocation | | Azure OpenAI | Note: AI service pricing is not queryable via this MCP tool — direct users to the Azure OpenAI pricing page |
For always-on services (VMs, App Service, SQL Database), proceed directly with the pricing query.
sku and/or service + region.monthly × 12).Common Terraform resource mappings (examples — not exhaustive):
azurerm_app_service_plan → sku_name (e.g. P1v3)azurerm_linux_virtual_machine / azurerm_windows_virtual_machine → size (e.g. Standard_D4s_v5)azurerm_mssql_database → sku_name (e.g. GP_Gen5_4)azurerm_storage_account → account_tier + account_replication_type (e.g. Standard_LRS)azurerm_cosmosdb_account → throughput settingsazurerm_kubernetes_cluster → default_node_pool.vm_size × node countazurerm_redis_cache → sku_name + family + capacityazurerm_servicebus_namespace → skuazurerm_api_management → sku_nameazurerm_container_app_environment + azurerm_container_app → workload_profile / cpu + memoryCommon Bicep/ARM resource mappings (examples — not exhaustive):
P1v3, P2v3)Standard_D4s_v5)GP_Gen5_4)Standard_LRS, Premium_ZRS)Developer, Premium)⚠️ Azure Hybrid Benefit (AHB): The retail pricing API returns pay-as-you-go rates and never reflects Azure Hybrid Benefit discounts. AHB can reduce costs by 40%+ for Windows VMs and SQL Server workloads. Always flag this when estimating costs for Windows or SQL resources, and direct users to the Azure Hybrid Benefit calculator for accurate figures.
Recommended region set for comparisons:
uksouth, ukwest, westeurope, northeurope, eastus, eastus2 etcConsumption pricing first.Reservation pricing for the same SKU/service (set price-type: Reservation).include-savings-plan: true on the Consumption call (savings plan pricing is surfaced as a nested array on each result — applies mainly to Linux VMs).Reminder:
SavingsPlanis not a validprice-type. Always useinclude-savings-plan: trueflag for savings plan rates.
Use the filter parameter for complex queries:
meterId eq 'abc-123'retailPrice le 0.10serviceName eq 'Storage' and skuName eq 'LRS' and armRegionName eq 'eastus'filter: "contains(meterName, 'Spot') and armSkuName eq 'Standard_D4s_v5' and armRegionName eq 'uksouth'" with price-type: Consumption — returns Linux and Windows Spot rows separatelyfilter: "serviceName eq 'Virtual Machines' and armRegionName eq 'uksouth' and isPrimaryMeterRegion eq true" — avoids duplicate rows when not using a specific SKUNote: Avoid OData filters that resolve to
serviceFamily eq 'AI + Machine Learning'— the MCP tool will return a 500 error. See AI services note in Gotchas above.
These are reference templates — adapt the format to context. A quick inline answer may need only a line or two; a full architecture document warrants the complete table format.
## Azure Pricing: [Service/SKU]
| Field | Value |
|-------|-------|
| Service | Virtual Machines |
| SKU | Standard_D4s_v5 |
| Region | UK South |
| Price Type | Consumption |
| Retail Price | [from tool]/hour |
| Monthly Est. | ~[from tool]/month (730 hrs) |
| Annual Est. | ~[from tool]/year |
| Currency | GBP |
**Spot:** [from tool]/hour ([x]% saving vs Consumption) — interrupt-tolerant workloads only
**Savings Plan (1-year):** [from tool]/hour ([x]% saving vs Consumption)
**1-Year Reservation:** [from tool]/hour ([x]% saving)
**3-Year Reservation:** [from tool]/hour ([x]% saving)
## Deployment Cost Estimate
**Template**: [filename or description]
**Region**: uksouth
**Currency**: GBP
| Resource | SKU / Tier | Monthly Cost | Annual Cost |
|----------|-----------|-------------|-------------|
| App Service Plan | P2v3 | £240.00 | £2,880.00 |
| Azure SQL Database | GP_Gen5_4 | £304.00 | £3,648.00 |
| Storage Account | Standard_LRS | £15.00 | £180.00 |
| Application Insights | Pay-as-you-go | ~£8.00 | ~£96.00 |
| **Total** | | **~£567/month** | **~£6,804/year** |
> Note: Estimates based on retail (pay-as-you-go) pricing. Reserved instances or savings plans can reduce this by 20-70%.
**Cost Reduction Opportunities:**
- Switch App Service Plan to 1-year reservation: save ~£72/month
- SQL Database 1-year reservation: save ~£122/month
- **Total potential savings with reservations: ~£194/month (34%) / ~£2,328/year**
## Region Price Comparison: Standard_D4s_v5 (Consumption)
| Region | Price/Hour | Monthly Est. | vs Cheapest |
|--------|-----------|-------------|-------------|
| UK South | £0.158 | £115 | baseline |
| UK West | £0.165 | £121 | +4% |
| North Europe | £0.166 | £121 | +5% |
| West Europe | £0.173 | £126 | +10% |
| East US | £0.158 | £115 | 0% |
| Australia East | £0.212 | £155 | +34% |
**Recommendation**: `uksouth` offers the lowest cost within the UK for this SKU.
| Scenario | Combine With |
|----------|-------------|
| Full architecture cost estimate | architecture-design skill |
| Identify expensive resources in existing deployments | cost-optimization skill |
| WAF cost pillar review | waf-assessment skill |
| IaC with cost-aware service selection | architecture-design + azure-pricing |
| Terraform cost estimation | Parse .tf files, call pricing tool per resource, aggregate in GBP |
The table below covers frequently used services — use the service name exactly as shown. For services not listed, try the exact Azure portal display name or use the filter parameter with an OData expression.
| Azure Service | service Parameter Value | Notes |
|---------------|--------------------------|-------|
| Virtual Machines | Virtual Machines | |
| App Service | Azure App Service | |
| Azure SQL Database | SQL Database | |
| Azure Cosmos DB | Azure Cosmos DB | |
| Azure Kubernetes Service | Azure Kubernetes Service | |
| Azure Functions | Azure Functions | |
| Storage (Blob/Queue/Table) | Storage | |
| Azure Cache for Redis | Redis Cache | API service name differs from portal display name |
| Service Bus | Service Bus | |
| Event Hubs | Event Hubs | |
| API Management | API Management | |
| Application Gateway | Application Gateway | |
| Azure Front Door | Azure Front Door | |
| Log Analytics | Log Analytics | |
| Application Insights | Application Insights | |
| Azure Container Apps | Azure Container Apps | ⚠️ Cannot use service parameter — tool returns 400 (no ARM SKU). Use filter: "serviceName eq 'Azure Container Apps' and armRegionName eq '<region>'" instead. Multi-unit pricing (vCPU/sec, GiB-sec, requests/1M) — always ask about usage before estimating |
| Azure OpenAI / Foundry Models | Foundry Models | ⚠️ Not queryable via MCP tool — AI + Machine Learning service family causes 500 error. Use Azure OpenAI pricing page directly |
| Price Type | When to Use |
|-----------|-------------|
| Consumption | Default pay-as-you-go; no commitment |
| Reservation | 1-year or 3-year committed use; 20-72% off |
| DevTestConsumption | Dev/Test subscriptions; discounted non-prod rates |
If the pricing tool returns no results:
skuName often differs from the ARM/portal/IaC name (e.g. P2v3 → P2 v3, GP_Gen5_4 → 4 vCore, C1 → C1 Cache Instance).filter parameter with an OData expression — this is more reliable than the sku parameter for services where the API skuName format differs from the portal/ARM name (e.g. App Service, SQL Database).skuName format is unknown, query without it first to see what skuName values are returned, then narrow.service-family alone (e.g. service-family: Compute, service-family: Databases) to discover what serviceName values exist in that family, then re-query with the correct name.If the pricing tool returns a 500 error:
serviceFamily eq 'AI + Machine Learning'. If so, this is a known MCP tool limitation — redirect the user to the Azure Pricing Calculator or Azure OpenAI pricing page.development
Assess Azure architectures against Well-Architected Framework (WAF) five pillars - Reliability, Security, Cost Optimization, Operational Excellence, and Performance Efficiency. Provide scores and recommendations.
devops
Safe Terraform provider upgrades with automatic resource migration, breaking change detection, and state management using moved blocks. Use when upgrading provider versions, handling removed resources, migrating deprecated syntax, or performing major version upgrades.
development
Comprehensive skills for creating, compiling, debugging, and managing GitHub Agentic Workflows (gh-aw) with best practices and common patterns
tools
Create and edit diagrams on a live Excalidraw canvas using the Excalidraw MCP server. Use when asked to draw, diagram, sketch, or visualise architectures, workflows, data flows, system designs, flowcharts, mind maps, or sequence diagrams. Trigger phrases include "create an excalidraw", "draw me a diagram", "make a flowchart", "visualise the system", "diagram this architecture", "export to PNG/SVG". Can export to PNG, SVG, .excalidraw file, or a shareable URL. Do NOT use for Draw.io or diagrams.net output (use drawio-mcp-diagramming instead).