$npx -y skills add thomast1906/github-copilot-agent-skills --skill azure-pricingLook 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 op
| 1 | # Azure Pricing Skill |
| 2 | |
| 3 | 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. |
| 4 | |
| 5 | ## When to Use |
| 6 | |
| 7 | - "How much does `Standard_D4s_v5` cost in `uksouth`?" |
| 8 | - "Estimate the cost of this Bicep/ARM/Terraform template" |
| 9 | - "Compare VM pricing between `uksouth` and `westeurope`" |
| 10 | - "Show me Reservation vs Consumption pricing for SQL Database" |
| 11 | - "What are the cheapest storage SKUs in `uksouth`?" |
| 12 | - "Include savings plan pricing for this compute tier" |
| 13 | - Any request for Azure pricing, cost estimates, or SKU comparisons |
| 14 | |
| 15 | ## Required Tooling |
| 16 | |
| 17 | - **MCP tool**: Azure pricing tool provided by the **Azure VS Code extension** (`ms-azuretools.vscode-azure-github-copilot`). No `mcp.json` configuration is required — the tool is registered automatically by the extension. |
| 18 | |
| 19 | > Before invoking the pricing tool, always run `tool_search_tool_regex` with pattern `pricing` to discover the exact tool name. Do **not** guess or hardcode the name. |
| 20 | |
| 21 | ## Tool Parameters |
| 22 | |
| 23 | | Parameter | Required | Description | |
| 24 | |-----------|----------|-------------| |
| 25 | | `sku` | Optional* | ARM SKU name (e.g. `Standard_D4s_v5`, `Standard_E64-16ds_v4`) | |
| 26 | | `service` | Optional* | Azure service name (e.g. `Virtual Machines`, `Storage`, `SQL Database`) | |
| 27 | | `region` | Optional* | Azure region slug (e.g. `eastus`, `westeurope`, `westus2`) | |
| 28 | | `service-family` | Optional* | Service family (e.g. `Compute`, `Storage`, `Databases`, `Networking`) | |
| 29 | | `price-type` | Optional* | `Consumption`, `Reservation`, or `DevTestConsumption` | |
| 30 | | `include-savings-plan` | Optional | `true` to include savings plan pricing (uses preview API; mainly applies to Linux VMs) | |
| 31 | | `filter` | Optional* | Raw OData filter expression for advanced queries | |
| 32 | | `currency` | Optional | Currency code. **Skill default: `GBP`** — always pass this explicitly. The underlying tool defaults to `USD` if omitted. Other common values: `USD`, `EUR` | |
| 33 | |
| 34 | > *At least one filter parameter is required per call. |
| 35 | |
| 36 | > **Gotchas:** |
| 37 | > - `SavingsPlan` is **NOT** a valid `price-type` value. To get savings plan rates use `include-savings-plan: true` alongside a `Consumption` query. |
| 38 | > - 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. |
| 39 | > - **SKU name spacing varies by service.** The `sku` parameter is format-sensitive. For App Service, `P2v3` returns no results but `P2 v3` (with a space) works. If the `sku` parameter returns empty, fall back to an OData `filter` with `skuName eq '...'` to match exactly as the API stores it. |
| 40 | > - **Reservation `retailPrice` values are lump-sum totals, not hourly rates.** Despite `unitOfMeasure: "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. |
| 41 | > - **SQL Database compute and storage are separate meters.** You need two calls: one for compute (e.g. `4 vCore` under `SQL 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 by `productName`. |
| 42 | > - **SQL Database `skuName` in the API uses plain English, not ARM format.** The ARM SKU `GP_Gen5_4` maps to API `skuName: "4 vCore"` under `productName` containing `General Purpose - Compute Gen5`. Filter by both `skuName` and `productName` to avoid Business Critical or DC-Series rows returning alongside General Purpose. |
| 43 | > - **Spot pricing requires the `filter` parameter, not `price-type`.** Spot is not a `price-type` value — use `filter: "contains(meterName, 'Spot') and armSkuName eq '<sku>' and armRegionName eq '<region>'"` with `price-type: Consumption`. Live-tested: Standard_D4s_v5 in `uksouth` returns Linux Spot at £0.0213/hr and Windows Spot at £0.039/hr (vs £0.164/hr and £0.300/hr standard — ~87% saving). |
| 44 | > - **`isPrimaryMeterRegion eq true` in OData filter:** When using targeted `sku` + `region` queries, the MCP tool already returns only primary meter region rows. The `isPrimaryMeterRegion eq true` filter 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. |
| 45 | > - **`include-savings-plan: true` is incompat |