[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-azure-amg-check-azure-spend":3,"mdc--uoluea-key":34,"related-org-azure-amg-check-azure-spend":1393,"related-repo-azure-amg-check-azure-spend":1574},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":24,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"amg-check-azure-spend","analyze monthly Azure subscription costs","Monthly Azure subscription cost analysis — lists all accessible subscriptions, lets the user choose which to analyze, then queries last billing month's cost breakdown by resource type, region, and service category for each subscription. Queries subscriptions sequentially with 1-minute waits between calls to avoid billing API rate limits (429). On first run, auto-discovers datasource UID.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"azure","Azure (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fazure.png","Azure",[13,15,18,21],{"name":11,"slug":8,"type":14},"tag",{"name":16,"slug":17,"type":14},"Reporting","reporting",{"name":19,"slug":20,"type":14},"Finance","finance",{"name":22,"slug":23,"type":14},"Cost Optimization","cost-optimization",2,"https:\u002F\u002Fgithub.com\u002FAzure\u002Famg-skills","2026-07-12T08:19:59.033036",null,[],{"repoUrl":25,"stars":24,"forks":24,"topics":30,"description":31},[],"Agent skills for Azure Managed Grafana","https:\u002F\u002Fgithub.com\u002FAzure\u002Famg-skills\u002Ftree\u002FHEAD\u002Fplugins\u002Famg-toolkit\u002Fskills\u002Famg-check-azure-spend","---\nname: amg-check-azure-spend\ndescription: Monthly Azure subscription cost analysis — lists all accessible subscriptions, lets the user choose which to analyze, then queries last billing month's cost breakdown by resource type, region, and service category for each subscription. Queries subscriptions sequentially with 1-minute waits between calls to avoid billing API rate limits (429). On first run, auto-discovers datasource UID.\nargument-hint: \"[subscription-id-1,subscription-id-2,...] (optional, comma-separated)\"\ndisable-model-invocation: true\neffort: max\nallowed-tools: mcp__amg__amgmcp_cost_analysis mcp__amg__amgmcp_query_azure_subscriptions mcp__amg__amgmcp_datasource_list Bash(sleep *) Glob Read Write Edit\n---\n\n## Runtime Context\n- Current UTC time: !`date -u +%Y-%m-%dT%H:%M:%SZ`\n- Config: !`cat memory\u002Famg-check-azure-spend\u002Fconfig.md 2>\u002Fdev\u002Fnull || echo \"NOT_CONFIGURED\"`\n- Arguments: subscription-ids=$ARGUMENTS\n\n# Azure Subscription Cost Analysis\n\nAnalyze Azure subscription costs for the **last full billing month** using `amgmcp_cost_analysis`. Queries each subscription individually with mandatory waits between calls to respect the billing API rate limit.\n\n## Critical Constraints\n\n- **No subagents for MCP.** The Agent tool cannot access MCP tools — all MCP calls must be made from the main context.\n- **Sequential queries only.** Query one subscription at a time. **Never** query multiple subscriptions in parallel.\n- **Mandatory 1-minute wait.** After each `amgmcp_cost_analysis` call, run `sleep 60` via Bash before the next call. This is non-negotiable — the billing API has a tight rate limit.\n- **Recommend 5 subscriptions per run.** The billing API has tight throttling — each subscription takes 1-3 minutes (wait time + potential 429 retries). Warn the user if they select more than 5 that the run will be slow, but allow it if they confirm.\n- **429 backoff.** If you receive a 429 (Too Many Requests), wait 2 minutes (`sleep 120`), then retry. If 429 persists, wait 5 minutes (`sleep 300`) and retry once more. If still failing, skip that subscription and note it in the report.\n\n## Progress Tracking\n\nUpdate checkboxes as you complete each phase:\n\n- [ ] Phase 1a: Datasource validated\n- [ ] Phase 1b: Subscriptions listed\n- [ ] Phase 1c: Subscriptions selected\n- [ ] Phase 2: Cost queries completed (0\u002FN)\n- [ ] Report presented\n- [ ] Report saved to `memory\u002Famg-check-azure-spend\u002Freport.md`\n\n## Configuration\n\n**If Config shows `NOT_CONFIGURED`**: Run [First-Run Setup](#first-run-setup) at the bottom of this file, then return here.\n\n**If Config is populated**: Extract the datasource UID from the pre-loaded Runtime Context above.\n\n- **Datasource UID**: from `## Azure Monitor Datasource` > `UID`\n\n## Time Range\n\nAlways use the **last full billing month** boundaries. Compute them from the \"Current UTC time\" in the Runtime Context above:\n- **startTime**: first day of the *previous* month at `00:00:00.000Z` (e.g., if current UTC time is `2026-04-16T...`, startTime = `2026-03-01T00:00:00.000Z`)\n- **endTime**: first day of the *current* month at `00:00:00.000Z` (e.g., if current UTC time is `2026-04-16T...`, endTime = `2026-04-01T00:00:00.000Z`)\n\nDo NOT use relative expressions like `now-30d` — billing months have variable lengths.\n\n---\n\n## Workflow\n\n### Phase 1a: Validate Datasource\n\nCall `amgmcp_datasource_list` (no parameters). Find entry with `type == \"grafana-azure-monitor-datasource\"`.\n\n- Matches configured UID -> proceed.\n- Different UID -> update `memory\u002Famg-check-azure-spend\u002Fconfig.md`, warn user, use new UID.\n- Not found -> abort with error.\n\n### Phase 1b: List All Subscriptions\n\nCall `amgmcp_query_azure_subscriptions` with the validated datasource UID.\n\nPresent the full list as a table:\n\n| # | Subscription Name | Subscription ID |\n|---|-------------------|-----------------|\n| 1 | ...               | ...             |\n\n### Phase 1c: Select Subscriptions\n\n**If `$ARGUMENTS` provides subscription IDs** (comma-separated): Use those directly. Validate they appear in the Phase 1b list.\n\n**If 5 or fewer subscriptions exist**: Use all of them.\n\n**If more than 5 subscriptions exist**: Present the list to the user and ask them to choose. Suggest a default selection of ~5 based on name (e.g., production subscriptions first). Example prompt:\n\n> *\"Found N subscriptions. I recommend selecting around 5 — the billing API has tight rate limits, so each subscription takes 1-3 minutes (mandatory waits + potential 429 retries). You can select more, but the run will be slow. Which subscription numbers would you like to analyze? (e.g., `1,3,5`) Or press Enter to use my suggested selection: [list].\"*\n\n**If the user selects more than 5**: Warn them about the expected duration (roughly 2-3 minutes per subscription due to mandatory waits and 429 backoffs), then proceed if they confirm.\n\n### Phase 2: Query Cost for Each Subscription\n\nFor each selected subscription, **one at a time**:\n\n1. Call `amgmcp_cost_analysis` with:\n   ```\n   azureMonitorDatasourceUid: {DATASOURCE_UID}\n   subscriptionId: {SUBSCRIPTION_ID}\n   startTime: {BILLING_MONTH_START}\n   endTime: {BILLING_MONTH_END}\n   ```\n\n2. Record the cost breakdown from the response:\n   - Total cost for the subscription\n   - Top cost drivers by resource type (MeterCategory)\n   - Cost by region\n   - Any notable cost spikes or anomalies\n\n3. **Wait 1 minute before the next query:**\n   ```bash\n   sleep 60\n   ```\n\n4. If you receive a **429 (Too Many Requests)**:\n   - Wait 2 minutes: `sleep 120`\n   - Retry the same subscription\n   - If 429 again, wait 5 minutes: `sleep 300` and retry once more\n   - If still 429, skip this subscription and note \"Rate-limited — skipped\" in the report\n\nRepeat for each subscription. Do NOT proceed to the next subscription without the 1-minute wait.\n\n---\n\n## Output Format\n\nPresent a cost report with these sections:\n\n### 1. Billing Period\n\nState the exact billing month analyzed (e.g., \"March 2026: 2026-03-01 to 2026-04-01\").\n\n### 2. Cost Summary Table\n\n| Subscription | Total Cost | Top Resource Type | Top Region | Status |\n|-------------|------------|-------------------|------------|--------|\n| sub-name-1  | $X,XXX.XX  | Virtual Machines  | East US    | OK     |\n| sub-name-2  | $X,XXX.XX  | Storage           | West US 2  | OK     |\n\n### 3. Per-Subscription Breakdown\n\nFor each subscription:\n- **Total cost** for the billing month\n- **Top 10 cost drivers** by MeterCategory (resource type) with amounts and percentages\n- **Cost by region** — table showing spend per Azure region\n- **Notable observations** — any unusually high costs, unexpected resource types, or potential optimization opportunities\n\n### 4. Cross-Subscription Comparison\n\n- Which subscription has the highest spend\n- Common cost drivers across subscriptions\n- Regional distribution of spend across all queried subscriptions\n\n### 5. Cost Optimization Suggestions\n\nBased on the data, flag:\n- Subscriptions with disproportionately high costs in a single category\n- Resource types that dominate spend (potential right-sizing candidates)\n- Regions with unexpectedly high costs\n\n---\n\n## Save Report\n\nAfter presenting findings, save the report to `memory\u002Famg-check-azure-spend\u002Freport.md`:\n\n1. Read the current file (if it exists).\n2. Overwrite with the full cost report from this run, including:\n   - Billing period and generation date\n   - Cost summary table across all queried subscriptions\n   - Per-subscription breakdowns (top services, regions, resource types)\n   - Cross-subscription comparison\n   - Cost optimization suggestions\n   - Any skipped subscriptions (rate-limited) noted with reason\n3. Update the \"Generated\" date header to today's date.\n\nThis file provides a baseline for future runs to compare month-over-month trends.\n\n---\n\n## Error Handling\n\nSee **[${CLAUDE_SKILL_DIR}\u002Freference\u002Ferror-handling.md](${CLAUDE_SKILL_DIR}\u002Freference\u002Ferror-handling.md)** for the full recovery table.\n\n---\n\n## First-Run Setup\n\nRun only when Config shows `NOT_CONFIGURED`. After completing, return to the [Workflow](#workflow) above.\n\n**1. Discover Datasource UID**: Call `amgmcp_datasource_list`. Filter `type == \"grafana-azure-monitor-datasource\"`. Prefer `uid == \"azure-monitor-oob\"` if multiple match. Abort if zero match.\n\n**2. Write config**: Write `memory\u002Famg-check-azure-spend\u002Fconfig.md`:\n```markdown\n# amg-check-azure-spend Configuration\n\nUser-specific values for the Azure spend analysis skill.\nThis file is auto-generated on first run and can be edited manually.\n\n## Azure Monitor Datasource\n- **UID**: {discovered_uid}\n- **Name**: {discovered_name}\n```\n\n**3. Confirm**: Show the resolved config and ask for confirmation before proceeding.\n",{"data":35,"body":40},{"name":4,"description":6,"argument-hint":36,"disable-model-invocation":37,"effort":38,"allowed-tools":39},"[subscription-id-1,subscription-id-2,...] (optional, comma-separated)",true,"max","mcp__amg__amgmcp_cost_analysis mcp__amg__amgmcp_query_azure_subscriptions mcp__amg__amgmcp_datasource_list Bash(sleep *) Glob Read Write Edit",{"type":41,"children":42},"root",[43,52,85,92,114,120,211,217,222,290,296,321,331,358,364,375,455,468,472,478,485,506,532,538,550,555,605,611,629,639,649,677,687,693,705,840,845,848,854,859,865,870,876,967,973,978,1020,1026,1044,1050,1055,1073,1076,1082,1093,1144,1149,1152,1158,1174,1177,1182,1201,1233,1249,1377,1387],{"type":44,"tag":45,"props":46,"children":48},"element","h2",{"id":47},"runtime-context",[49],{"type":50,"value":51},"text","Runtime Context",{"type":44,"tag":53,"props":54,"children":55},"ul",{},[56,69,80],{"type":44,"tag":57,"props":58,"children":59},"li",{},[60,62],{"type":50,"value":61},"Current UTC time: !",{"type":44,"tag":63,"props":64,"children":66},"code",{"className":65},[],[67],{"type":50,"value":68},"date -u +%Y-%m-%dT%H:%M:%SZ",{"type":44,"tag":57,"props":70,"children":71},{},[72,74],{"type":50,"value":73},"Config: !",{"type":44,"tag":63,"props":75,"children":77},{"className":76},[],[78],{"type":50,"value":79},"cat memory\u002Famg-check-azure-spend\u002Fconfig.md 2>\u002Fdev\u002Fnull || echo \"NOT_CONFIGURED\"",{"type":44,"tag":57,"props":81,"children":82},{},[83],{"type":50,"value":84},"Arguments: subscription-ids=$ARGUMENTS",{"type":44,"tag":86,"props":87,"children":89},"h1",{"id":88},"azure-subscription-cost-analysis",[90],{"type":50,"value":91},"Azure Subscription Cost Analysis",{"type":44,"tag":93,"props":94,"children":95},"p",{},[96,98,104,106,112],{"type":50,"value":97},"Analyze Azure subscription costs for the ",{"type":44,"tag":99,"props":100,"children":101},"strong",{},[102],{"type":50,"value":103},"last full billing month",{"type":50,"value":105}," using ",{"type":44,"tag":63,"props":107,"children":109},{"className":108},[],[110],{"type":50,"value":111},"amgmcp_cost_analysis",{"type":50,"value":113},". Queries each subscription individually with mandatory waits between calls to respect the billing API rate limit.",{"type":44,"tag":45,"props":115,"children":117},{"id":116},"critical-constraints",[118],{"type":50,"value":119},"Critical Constraints",{"type":44,"tag":53,"props":121,"children":122},{},[123,133,150,175,185],{"type":44,"tag":57,"props":124,"children":125},{},[126,131],{"type":44,"tag":99,"props":127,"children":128},{},[129],{"type":50,"value":130},"No subagents for MCP.",{"type":50,"value":132}," The Agent tool cannot access MCP tools — all MCP calls must be made from the main context.",{"type":44,"tag":57,"props":134,"children":135},{},[136,141,143,148],{"type":44,"tag":99,"props":137,"children":138},{},[139],{"type":50,"value":140},"Sequential queries only.",{"type":50,"value":142}," Query one subscription at a time. ",{"type":44,"tag":99,"props":144,"children":145},{},[146],{"type":50,"value":147},"Never",{"type":50,"value":149}," query multiple subscriptions in parallel.",{"type":44,"tag":57,"props":151,"children":152},{},[153,158,160,165,167,173],{"type":44,"tag":99,"props":154,"children":155},{},[156],{"type":50,"value":157},"Mandatory 1-minute wait.",{"type":50,"value":159}," After each ",{"type":44,"tag":63,"props":161,"children":163},{"className":162},[],[164],{"type":50,"value":111},{"type":50,"value":166}," call, run ",{"type":44,"tag":63,"props":168,"children":170},{"className":169},[],[171],{"type":50,"value":172},"sleep 60",{"type":50,"value":174}," via Bash before the next call. This is non-negotiable — the billing API has a tight rate limit.",{"type":44,"tag":57,"props":176,"children":177},{},[178,183],{"type":44,"tag":99,"props":179,"children":180},{},[181],{"type":50,"value":182},"Recommend 5 subscriptions per run.",{"type":50,"value":184}," The billing API has tight throttling — each subscription takes 1-3 minutes (wait time + potential 429 retries). Warn the user if they select more than 5 that the run will be slow, but allow it if they confirm.",{"type":44,"tag":57,"props":186,"children":187},{},[188,193,195,201,203,209],{"type":44,"tag":99,"props":189,"children":190},{},[191],{"type":50,"value":192},"429 backoff.",{"type":50,"value":194}," If you receive a 429 (Too Many Requests), wait 2 minutes (",{"type":44,"tag":63,"props":196,"children":198},{"className":197},[],[199],{"type":50,"value":200},"sleep 120",{"type":50,"value":202},"), then retry. If 429 persists, wait 5 minutes (",{"type":44,"tag":63,"props":204,"children":206},{"className":205},[],[207],{"type":50,"value":208},"sleep 300",{"type":50,"value":210},") and retry once more. If still failing, skip that subscription and note it in the report.",{"type":44,"tag":45,"props":212,"children":214},{"id":213},"progress-tracking",[215],{"type":50,"value":216},"Progress Tracking",{"type":44,"tag":93,"props":218,"children":219},{},[220],{"type":50,"value":221},"Update checkboxes as you complete each phase:",{"type":44,"tag":53,"props":223,"children":226},{"className":224},[225],"contains-task-list",[227,239,248,257,266,275],{"type":44,"tag":57,"props":228,"children":231},{"className":229},[230],"task-list-item",[232,237],{"type":44,"tag":233,"props":234,"children":236},"input",{"disabled":37,"type":235},"checkbox",[],{"type":50,"value":238}," Phase 1a: Datasource validated",{"type":44,"tag":57,"props":240,"children":242},{"className":241},[230],[243,246],{"type":44,"tag":233,"props":244,"children":245},{"disabled":37,"type":235},[],{"type":50,"value":247}," Phase 1b: Subscriptions listed",{"type":44,"tag":57,"props":249,"children":251},{"className":250},[230],[252,255],{"type":44,"tag":233,"props":253,"children":254},{"disabled":37,"type":235},[],{"type":50,"value":256}," Phase 1c: Subscriptions selected",{"type":44,"tag":57,"props":258,"children":260},{"className":259},[230],[261,264],{"type":44,"tag":233,"props":262,"children":263},{"disabled":37,"type":235},[],{"type":50,"value":265}," Phase 2: Cost queries completed (0\u002FN)",{"type":44,"tag":57,"props":267,"children":269},{"className":268},[230],[270,273],{"type":44,"tag":233,"props":271,"children":272},{"disabled":37,"type":235},[],{"type":50,"value":274}," Report presented",{"type":44,"tag":57,"props":276,"children":278},{"className":277},[230],[279,282,284],{"type":44,"tag":233,"props":280,"children":281},{"disabled":37,"type":235},[],{"type":50,"value":283}," Report saved to ",{"type":44,"tag":63,"props":285,"children":287},{"className":286},[],[288],{"type":50,"value":289},"memory\u002Famg-check-azure-spend\u002Freport.md",{"type":44,"tag":45,"props":291,"children":293},{"id":292},"configuration",[294],{"type":50,"value":295},"Configuration",{"type":44,"tag":93,"props":297,"children":298},{},[299,310,312,319],{"type":44,"tag":99,"props":300,"children":301},{},[302,304],{"type":50,"value":303},"If Config shows ",{"type":44,"tag":63,"props":305,"children":307},{"className":306},[],[308],{"type":50,"value":309},"NOT_CONFIGURED",{"type":50,"value":311},": Run ",{"type":44,"tag":313,"props":314,"children":316},"a",{"href":315},"#first-run-setup",[317],{"type":50,"value":318},"First-Run Setup",{"type":50,"value":320}," at the bottom of this file, then return here.",{"type":44,"tag":93,"props":322,"children":323},{},[324,329],{"type":44,"tag":99,"props":325,"children":326},{},[327],{"type":50,"value":328},"If Config is populated",{"type":50,"value":330},": Extract the datasource UID from the pre-loaded Runtime Context above.",{"type":44,"tag":53,"props":332,"children":333},{},[334],{"type":44,"tag":57,"props":335,"children":336},{},[337,342,344,350,352],{"type":44,"tag":99,"props":338,"children":339},{},[340],{"type":50,"value":341},"Datasource UID",{"type":50,"value":343},": from ",{"type":44,"tag":63,"props":345,"children":347},{"className":346},[],[348],{"type":50,"value":349},"## Azure Monitor Datasource",{"type":50,"value":351}," > ",{"type":44,"tag":63,"props":353,"children":355},{"className":354},[],[356],{"type":50,"value":357},"UID",{"type":44,"tag":45,"props":359,"children":361},{"id":360},"time-range",[362],{"type":50,"value":363},"Time Range",{"type":44,"tag":93,"props":365,"children":366},{},[367,369,373],{"type":50,"value":368},"Always use the ",{"type":44,"tag":99,"props":370,"children":371},{},[372],{"type":50,"value":103},{"type":50,"value":374}," boundaries. Compute them from the \"Current UTC time\" in the Runtime Context above:",{"type":44,"tag":53,"props":376,"children":377},{},[378,420],{"type":44,"tag":57,"props":379,"children":380},{},[381,386,388,394,396,402,404,410,412,418],{"type":44,"tag":99,"props":382,"children":383},{},[384],{"type":50,"value":385},"startTime",{"type":50,"value":387},": first day of the ",{"type":44,"tag":389,"props":390,"children":391},"em",{},[392],{"type":50,"value":393},"previous",{"type":50,"value":395}," month at ",{"type":44,"tag":63,"props":397,"children":399},{"className":398},[],[400],{"type":50,"value":401},"00:00:00.000Z",{"type":50,"value":403}," (e.g., if current UTC time is ",{"type":44,"tag":63,"props":405,"children":407},{"className":406},[],[408],{"type":50,"value":409},"2026-04-16T...",{"type":50,"value":411},", startTime = ",{"type":44,"tag":63,"props":413,"children":415},{"className":414},[],[416],{"type":50,"value":417},"2026-03-01T00:00:00.000Z",{"type":50,"value":419},")",{"type":44,"tag":57,"props":421,"children":422},{},[423,428,429,434,435,440,441,446,448,454],{"type":44,"tag":99,"props":424,"children":425},{},[426],{"type":50,"value":427},"endTime",{"type":50,"value":387},{"type":44,"tag":389,"props":430,"children":431},{},[432],{"type":50,"value":433},"current",{"type":50,"value":395},{"type":44,"tag":63,"props":436,"children":438},{"className":437},[],[439],{"type":50,"value":401},{"type":50,"value":403},{"type":44,"tag":63,"props":442,"children":444},{"className":443},[],[445],{"type":50,"value":409},{"type":50,"value":447},", endTime = ",{"type":44,"tag":63,"props":449,"children":451},{"className":450},[],[452],{"type":50,"value":453},"2026-04-01T00:00:00.000Z",{"type":50,"value":419},{"type":44,"tag":93,"props":456,"children":457},{},[458,460,466],{"type":50,"value":459},"Do NOT use relative expressions like ",{"type":44,"tag":63,"props":461,"children":463},{"className":462},[],[464],{"type":50,"value":465},"now-30d",{"type":50,"value":467}," — billing months have variable lengths.",{"type":44,"tag":469,"props":470,"children":471},"hr",{},[],{"type":44,"tag":45,"props":473,"children":475},{"id":474},"workflow",[476],{"type":50,"value":477},"Workflow",{"type":44,"tag":479,"props":480,"children":482},"h3",{"id":481},"phase-1a-validate-datasource",[483],{"type":50,"value":484},"Phase 1a: Validate Datasource",{"type":44,"tag":93,"props":486,"children":487},{},[488,490,496,498,504],{"type":50,"value":489},"Call ",{"type":44,"tag":63,"props":491,"children":493},{"className":492},[],[494],{"type":50,"value":495},"amgmcp_datasource_list",{"type":50,"value":497}," (no parameters). Find entry with ",{"type":44,"tag":63,"props":499,"children":501},{"className":500},[],[502],{"type":50,"value":503},"type == \"grafana-azure-monitor-datasource\"",{"type":50,"value":505},".",{"type":44,"tag":53,"props":507,"children":508},{},[509,514,527],{"type":44,"tag":57,"props":510,"children":511},{},[512],{"type":50,"value":513},"Matches configured UID -> proceed.",{"type":44,"tag":57,"props":515,"children":516},{},[517,519,525],{"type":50,"value":518},"Different UID -> update ",{"type":44,"tag":63,"props":520,"children":522},{"className":521},[],[523],{"type":50,"value":524},"memory\u002Famg-check-azure-spend\u002Fconfig.md",{"type":50,"value":526},", warn user, use new UID.",{"type":44,"tag":57,"props":528,"children":529},{},[530],{"type":50,"value":531},"Not found -> abort with error.",{"type":44,"tag":479,"props":533,"children":535},{"id":534},"phase-1b-list-all-subscriptions",[536],{"type":50,"value":537},"Phase 1b: List All Subscriptions",{"type":44,"tag":93,"props":539,"children":540},{},[541,542,548],{"type":50,"value":489},{"type":44,"tag":63,"props":543,"children":545},{"className":544},[],[546],{"type":50,"value":547},"amgmcp_query_azure_subscriptions",{"type":50,"value":549}," with the validated datasource UID.",{"type":44,"tag":93,"props":551,"children":552},{},[553],{"type":50,"value":554},"Present the full list as a table:",{"type":44,"tag":556,"props":557,"children":558},"table",{},[559,583],{"type":44,"tag":560,"props":561,"children":562},"thead",{},[563],{"type":44,"tag":564,"props":565,"children":566},"tr",{},[567,573,578],{"type":44,"tag":568,"props":569,"children":570},"th",{},[571],{"type":50,"value":572},"#",{"type":44,"tag":568,"props":574,"children":575},{},[576],{"type":50,"value":577},"Subscription Name",{"type":44,"tag":568,"props":579,"children":580},{},[581],{"type":50,"value":582},"Subscription ID",{"type":44,"tag":584,"props":585,"children":586},"tbody",{},[587],{"type":44,"tag":564,"props":588,"children":589},{},[590,596,601],{"type":44,"tag":591,"props":592,"children":593},"td",{},[594],{"type":50,"value":595},"1",{"type":44,"tag":591,"props":597,"children":598},{},[599],{"type":50,"value":600},"...",{"type":44,"tag":591,"props":602,"children":603},{},[604],{"type":50,"value":600},{"type":44,"tag":479,"props":606,"children":608},{"id":607},"phase-1c-select-subscriptions",[609],{"type":50,"value":610},"Phase 1c: Select Subscriptions",{"type":44,"tag":93,"props":612,"children":613},{},[614,627],{"type":44,"tag":99,"props":615,"children":616},{},[617,619,625],{"type":50,"value":618},"If ",{"type":44,"tag":63,"props":620,"children":622},{"className":621},[],[623],{"type":50,"value":624},"$ARGUMENTS",{"type":50,"value":626}," provides subscription IDs",{"type":50,"value":628}," (comma-separated): Use those directly. Validate they appear in the Phase 1b list.",{"type":44,"tag":93,"props":630,"children":631},{},[632,637],{"type":44,"tag":99,"props":633,"children":634},{},[635],{"type":50,"value":636},"If 5 or fewer subscriptions exist",{"type":50,"value":638},": Use all of them.",{"type":44,"tag":93,"props":640,"children":641},{},[642,647],{"type":44,"tag":99,"props":643,"children":644},{},[645],{"type":50,"value":646},"If more than 5 subscriptions exist",{"type":50,"value":648},": Present the list to the user and ask them to choose. Suggest a default selection of ~5 based on name (e.g., production subscriptions first). Example prompt:",{"type":44,"tag":650,"props":651,"children":652},"blockquote",{},[653],{"type":44,"tag":93,"props":654,"children":655},{},[656],{"type":44,"tag":389,"props":657,"children":658},{},[659,661,667,669,675],{"type":50,"value":660},"\"Found N subscriptions. I recommend selecting around 5 — the billing API has tight rate limits, so each subscription takes 1-3 minutes (mandatory waits + potential 429 retries). You can select more, but the run will be slow. Which subscription numbers would you like to analyze? (e.g., ",{"type":44,"tag":63,"props":662,"children":664},{"className":663},[],[665],{"type":50,"value":666},"1,3,5",{"type":50,"value":668},") Or press Enter to use my suggested selection: ",{"type":44,"tag":670,"props":671,"children":672},"span",{},[673],{"type":50,"value":674},"list",{"type":50,"value":676},".\"",{"type":44,"tag":93,"props":678,"children":679},{},[680,685],{"type":44,"tag":99,"props":681,"children":682},{},[683],{"type":50,"value":684},"If the user selects more than 5",{"type":50,"value":686},": Warn them about the expected duration (roughly 2-3 minutes per subscription due to mandatory waits and 429 backoffs), then proceed if they confirm.",{"type":44,"tag":479,"props":688,"children":690},{"id":689},"phase-2-query-cost-for-each-subscription",[691],{"type":50,"value":692},"Phase 2: Query Cost for Each Subscription",{"type":44,"tag":93,"props":694,"children":695},{},[696,698,703],{"type":50,"value":697},"For each selected subscription, ",{"type":44,"tag":99,"props":699,"children":700},{},[701],{"type":50,"value":702},"one at a time",{"type":50,"value":704},":",{"type":44,"tag":706,"props":707,"children":708},"ol",{},[709,732,760,794],{"type":44,"tag":57,"props":710,"children":711},{},[712,713,718,720],{"type":50,"value":489},{"type":44,"tag":63,"props":714,"children":716},{"className":715},[],[717],{"type":50,"value":111},{"type":50,"value":719}," with:",{"type":44,"tag":721,"props":722,"children":726},"pre",{"className":723,"code":725,"language":50},[724],"language-text","azureMonitorDatasourceUid: {DATASOURCE_UID}\nsubscriptionId: {SUBSCRIPTION_ID}\nstartTime: {BILLING_MONTH_START}\nendTime: {BILLING_MONTH_END}\n",[727],{"type":44,"tag":63,"props":728,"children":730},{"__ignoreMap":729},"",[731],{"type":50,"value":725},{"type":44,"tag":57,"props":733,"children":734},{},[735,737],{"type":50,"value":736},"Record the cost breakdown from the response:",{"type":44,"tag":53,"props":738,"children":739},{},[740,745,750,755],{"type":44,"tag":57,"props":741,"children":742},{},[743],{"type":50,"value":744},"Total cost for the subscription",{"type":44,"tag":57,"props":746,"children":747},{},[748],{"type":50,"value":749},"Top cost drivers by resource type (MeterCategory)",{"type":44,"tag":57,"props":751,"children":752},{},[753],{"type":50,"value":754},"Cost by region",{"type":44,"tag":57,"props":756,"children":757},{},[758],{"type":50,"value":759},"Any notable cost spikes or anomalies",{"type":44,"tag":57,"props":761,"children":762},{},[763,768],{"type":44,"tag":99,"props":764,"children":765},{},[766],{"type":50,"value":767},"Wait 1 minute before the next query:",{"type":44,"tag":721,"props":769,"children":773},{"className":770,"code":771,"language":772,"meta":729,"style":729},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sleep 60\n","bash",[774],{"type":44,"tag":63,"props":775,"children":776},{"__ignoreMap":729},[777],{"type":44,"tag":670,"props":778,"children":781},{"class":779,"line":780},"line",1,[782,788],{"type":44,"tag":670,"props":783,"children":785},{"style":784},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[786],{"type":50,"value":787},"sleep",{"type":44,"tag":670,"props":789,"children":791},{"style":790},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[792],{"type":50,"value":793}," 60\n",{"type":44,"tag":57,"props":795,"children":796},{},[797,799,804,805],{"type":50,"value":798},"If you receive a ",{"type":44,"tag":99,"props":800,"children":801},{},[802],{"type":50,"value":803},"429 (Too Many Requests)",{"type":50,"value":704},{"type":44,"tag":53,"props":806,"children":807},{},[808,818,823,835],{"type":44,"tag":57,"props":809,"children":810},{},[811,813],{"type":50,"value":812},"Wait 2 minutes: ",{"type":44,"tag":63,"props":814,"children":816},{"className":815},[],[817],{"type":50,"value":200},{"type":44,"tag":57,"props":819,"children":820},{},[821],{"type":50,"value":822},"Retry the same subscription",{"type":44,"tag":57,"props":824,"children":825},{},[826,828,833],{"type":50,"value":827},"If 429 again, wait 5 minutes: ",{"type":44,"tag":63,"props":829,"children":831},{"className":830},[],[832],{"type":50,"value":208},{"type":50,"value":834}," and retry once more",{"type":44,"tag":57,"props":836,"children":837},{},[838],{"type":50,"value":839},"If still 429, skip this subscription and note \"Rate-limited — skipped\" in the report",{"type":44,"tag":93,"props":841,"children":842},{},[843],{"type":50,"value":844},"Repeat for each subscription. Do NOT proceed to the next subscription without the 1-minute wait.",{"type":44,"tag":469,"props":846,"children":847},{},[],{"type":44,"tag":45,"props":849,"children":851},{"id":850},"output-format",[852],{"type":50,"value":853},"Output Format",{"type":44,"tag":93,"props":855,"children":856},{},[857],{"type":50,"value":858},"Present a cost report with these sections:",{"type":44,"tag":479,"props":860,"children":862},{"id":861},"_1-billing-period",[863],{"type":50,"value":864},"1. Billing Period",{"type":44,"tag":93,"props":866,"children":867},{},[868],{"type":50,"value":869},"State the exact billing month analyzed (e.g., \"March 2026: 2026-03-01 to 2026-04-01\").",{"type":44,"tag":479,"props":871,"children":873},{"id":872},"_2-cost-summary-table",[874],{"type":50,"value":875},"2. Cost Summary Table",{"type":44,"tag":556,"props":877,"children":878},{},[879,910],{"type":44,"tag":560,"props":880,"children":881},{},[882],{"type":44,"tag":564,"props":883,"children":884},{},[885,890,895,900,905],{"type":44,"tag":568,"props":886,"children":887},{},[888],{"type":50,"value":889},"Subscription",{"type":44,"tag":568,"props":891,"children":892},{},[893],{"type":50,"value":894},"Total Cost",{"type":44,"tag":568,"props":896,"children":897},{},[898],{"type":50,"value":899},"Top Resource Type",{"type":44,"tag":568,"props":901,"children":902},{},[903],{"type":50,"value":904},"Top Region",{"type":44,"tag":568,"props":906,"children":907},{},[908],{"type":50,"value":909},"Status",{"type":44,"tag":584,"props":911,"children":912},{},[913,941],{"type":44,"tag":564,"props":914,"children":915},{},[916,921,926,931,936],{"type":44,"tag":591,"props":917,"children":918},{},[919],{"type":50,"value":920},"sub-name-1",{"type":44,"tag":591,"props":922,"children":923},{},[924],{"type":50,"value":925},"$X,XXX.XX",{"type":44,"tag":591,"props":927,"children":928},{},[929],{"type":50,"value":930},"Virtual Machines",{"type":44,"tag":591,"props":932,"children":933},{},[934],{"type":50,"value":935},"East US",{"type":44,"tag":591,"props":937,"children":938},{},[939],{"type":50,"value":940},"OK",{"type":44,"tag":564,"props":942,"children":943},{},[944,949,953,958,963],{"type":44,"tag":591,"props":945,"children":946},{},[947],{"type":50,"value":948},"sub-name-2",{"type":44,"tag":591,"props":950,"children":951},{},[952],{"type":50,"value":925},{"type":44,"tag":591,"props":954,"children":955},{},[956],{"type":50,"value":957},"Storage",{"type":44,"tag":591,"props":959,"children":960},{},[961],{"type":50,"value":962},"West US 2",{"type":44,"tag":591,"props":964,"children":965},{},[966],{"type":50,"value":940},{"type":44,"tag":479,"props":968,"children":970},{"id":969},"_3-per-subscription-breakdown",[971],{"type":50,"value":972},"3. Per-Subscription Breakdown",{"type":44,"tag":93,"props":974,"children":975},{},[976],{"type":50,"value":977},"For each subscription:",{"type":44,"tag":53,"props":979,"children":980},{},[981,991,1001,1010],{"type":44,"tag":57,"props":982,"children":983},{},[984,989],{"type":44,"tag":99,"props":985,"children":986},{},[987],{"type":50,"value":988},"Total cost",{"type":50,"value":990}," for the billing month",{"type":44,"tag":57,"props":992,"children":993},{},[994,999],{"type":44,"tag":99,"props":995,"children":996},{},[997],{"type":50,"value":998},"Top 10 cost drivers",{"type":50,"value":1000}," by MeterCategory (resource type) with amounts and percentages",{"type":44,"tag":57,"props":1002,"children":1003},{},[1004,1008],{"type":44,"tag":99,"props":1005,"children":1006},{},[1007],{"type":50,"value":754},{"type":50,"value":1009}," — table showing spend per Azure region",{"type":44,"tag":57,"props":1011,"children":1012},{},[1013,1018],{"type":44,"tag":99,"props":1014,"children":1015},{},[1016],{"type":50,"value":1017},"Notable observations",{"type":50,"value":1019}," — any unusually high costs, unexpected resource types, or potential optimization opportunities",{"type":44,"tag":479,"props":1021,"children":1023},{"id":1022},"_4-cross-subscription-comparison",[1024],{"type":50,"value":1025},"4. Cross-Subscription Comparison",{"type":44,"tag":53,"props":1027,"children":1028},{},[1029,1034,1039],{"type":44,"tag":57,"props":1030,"children":1031},{},[1032],{"type":50,"value":1033},"Which subscription has the highest spend",{"type":44,"tag":57,"props":1035,"children":1036},{},[1037],{"type":50,"value":1038},"Common cost drivers across subscriptions",{"type":44,"tag":57,"props":1040,"children":1041},{},[1042],{"type":50,"value":1043},"Regional distribution of spend across all queried subscriptions",{"type":44,"tag":479,"props":1045,"children":1047},{"id":1046},"_5-cost-optimization-suggestions",[1048],{"type":50,"value":1049},"5. Cost Optimization Suggestions",{"type":44,"tag":93,"props":1051,"children":1052},{},[1053],{"type":50,"value":1054},"Based on the data, flag:",{"type":44,"tag":53,"props":1056,"children":1057},{},[1058,1063,1068],{"type":44,"tag":57,"props":1059,"children":1060},{},[1061],{"type":50,"value":1062},"Subscriptions with disproportionately high costs in a single category",{"type":44,"tag":57,"props":1064,"children":1065},{},[1066],{"type":50,"value":1067},"Resource types that dominate spend (potential right-sizing candidates)",{"type":44,"tag":57,"props":1069,"children":1070},{},[1071],{"type":50,"value":1072},"Regions with unexpectedly high costs",{"type":44,"tag":469,"props":1074,"children":1075},{},[],{"type":44,"tag":45,"props":1077,"children":1079},{"id":1078},"save-report",[1080],{"type":50,"value":1081},"Save Report",{"type":44,"tag":93,"props":1083,"children":1084},{},[1085,1087,1092],{"type":50,"value":1086},"After presenting findings, save the report to ",{"type":44,"tag":63,"props":1088,"children":1090},{"className":1089},[],[1091],{"type":50,"value":289},{"type":50,"value":704},{"type":44,"tag":706,"props":1094,"children":1095},{},[1096,1101,1139],{"type":44,"tag":57,"props":1097,"children":1098},{},[1099],{"type":50,"value":1100},"Read the current file (if it exists).",{"type":44,"tag":57,"props":1102,"children":1103},{},[1104,1106],{"type":50,"value":1105},"Overwrite with the full cost report from this run, including:\n",{"type":44,"tag":53,"props":1107,"children":1108},{},[1109,1114,1119,1124,1129,1134],{"type":44,"tag":57,"props":1110,"children":1111},{},[1112],{"type":50,"value":1113},"Billing period and generation date",{"type":44,"tag":57,"props":1115,"children":1116},{},[1117],{"type":50,"value":1118},"Cost summary table across all queried subscriptions",{"type":44,"tag":57,"props":1120,"children":1121},{},[1122],{"type":50,"value":1123},"Per-subscription breakdowns (top services, regions, resource types)",{"type":44,"tag":57,"props":1125,"children":1126},{},[1127],{"type":50,"value":1128},"Cross-subscription comparison",{"type":44,"tag":57,"props":1130,"children":1131},{},[1132],{"type":50,"value":1133},"Cost optimization suggestions",{"type":44,"tag":57,"props":1135,"children":1136},{},[1137],{"type":50,"value":1138},"Any skipped subscriptions (rate-limited) noted with reason",{"type":44,"tag":57,"props":1140,"children":1141},{},[1142],{"type":50,"value":1143},"Update the \"Generated\" date header to today's date.",{"type":44,"tag":93,"props":1145,"children":1146},{},[1147],{"type":50,"value":1148},"This file provides a baseline for future runs to compare month-over-month trends.",{"type":44,"tag":469,"props":1150,"children":1151},{},[],{"type":44,"tag":45,"props":1153,"children":1155},{"id":1154},"error-handling",[1156],{"type":50,"value":1157},"Error Handling",{"type":44,"tag":93,"props":1159,"children":1160},{},[1161,1163,1172],{"type":50,"value":1162},"See ",{"type":44,"tag":99,"props":1164,"children":1165},{},[1166],{"type":44,"tag":313,"props":1167,"children":1169},{"href":1168},"$%7BCLAUDE_SKILL_DIR%7D\u002Freference\u002Ferror-handling.md",[1170],{"type":50,"value":1171},"${CLAUDE_SKILL_DIR}\u002Freference\u002Ferror-handling.md",{"type":50,"value":1173}," for the full recovery table.",{"type":44,"tag":469,"props":1175,"children":1176},{},[],{"type":44,"tag":45,"props":1178,"children":1180},{"id":1179},"first-run-setup",[1181],{"type":50,"value":318},{"type":44,"tag":93,"props":1183,"children":1184},{},[1185,1187,1192,1194,1199],{"type":50,"value":1186},"Run only when Config shows ",{"type":44,"tag":63,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":50,"value":309},{"type":50,"value":1193},". After completing, return to the ",{"type":44,"tag":313,"props":1195,"children":1197},{"href":1196},"#workflow",[1198],{"type":50,"value":477},{"type":50,"value":1200}," above.",{"type":44,"tag":93,"props":1202,"children":1203},{},[1204,1209,1211,1216,1218,1223,1225,1231],{"type":44,"tag":99,"props":1205,"children":1206},{},[1207],{"type":50,"value":1208},"1. Discover Datasource UID",{"type":50,"value":1210},": Call ",{"type":44,"tag":63,"props":1212,"children":1214},{"className":1213},[],[1215],{"type":50,"value":495},{"type":50,"value":1217},". Filter ",{"type":44,"tag":63,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":50,"value":503},{"type":50,"value":1224},". Prefer ",{"type":44,"tag":63,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":50,"value":1230},"uid == \"azure-monitor-oob\"",{"type":50,"value":1232}," if multiple match. Abort if zero match.",{"type":44,"tag":93,"props":1234,"children":1235},{},[1236,1241,1243,1248],{"type":44,"tag":99,"props":1237,"children":1238},{},[1239],{"type":50,"value":1240},"2. Write config",{"type":50,"value":1242},": Write ",{"type":44,"tag":63,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":50,"value":524},{"type":50,"value":704},{"type":44,"tag":721,"props":1250,"children":1254},{"className":1251,"code":1252,"language":1253,"meta":729,"style":729},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# amg-check-azure-spend Configuration\n\nUser-specific values for the Azure spend analysis skill.\nThis file is auto-generated on first run and can be edited manually.\n\n## Azure Monitor Datasource\n- **UID**: {discovered_uid}\n- **Name**: {discovered_name}\n","markdown",[1255],{"type":44,"tag":63,"props":1256,"children":1257},{"__ignoreMap":729},[1258,1272,1280,1290,1299,1307,1321,1351],{"type":44,"tag":670,"props":1259,"children":1260},{"class":779,"line":780},[1261,1267],{"type":44,"tag":670,"props":1262,"children":1264},{"style":1263},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1265],{"type":50,"value":1266},"# ",{"type":44,"tag":670,"props":1268,"children":1269},{"style":784},[1270],{"type":50,"value":1271},"amg-check-azure-spend Configuration\n",{"type":44,"tag":670,"props":1273,"children":1274},{"class":779,"line":24},[1275],{"type":44,"tag":670,"props":1276,"children":1277},{"emptyLinePlaceholder":37},[1278],{"type":50,"value":1279},"\n",{"type":44,"tag":670,"props":1281,"children":1283},{"class":779,"line":1282},3,[1284],{"type":44,"tag":670,"props":1285,"children":1287},{"style":1286},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1288],{"type":50,"value":1289},"User-specific values for the Azure spend analysis skill.\n",{"type":44,"tag":670,"props":1291,"children":1293},{"class":779,"line":1292},4,[1294],{"type":44,"tag":670,"props":1295,"children":1296},{"style":1286},[1297],{"type":50,"value":1298},"This file is auto-generated on first run and can be edited manually.\n",{"type":44,"tag":670,"props":1300,"children":1302},{"class":779,"line":1301},5,[1303],{"type":44,"tag":670,"props":1304,"children":1305},{"emptyLinePlaceholder":37},[1306],{"type":50,"value":1279},{"type":44,"tag":670,"props":1308,"children":1310},{"class":779,"line":1309},6,[1311,1316],{"type":44,"tag":670,"props":1312,"children":1313},{"style":1263},[1314],{"type":50,"value":1315},"## ",{"type":44,"tag":670,"props":1317,"children":1318},{"style":784},[1319],{"type":50,"value":1320},"Azure Monitor Datasource\n",{"type":44,"tag":670,"props":1322,"children":1324},{"class":779,"line":1323},7,[1325,1330,1336,1341,1346],{"type":44,"tag":670,"props":1326,"children":1327},{"style":1263},[1328],{"type":50,"value":1329},"-",{"type":44,"tag":670,"props":1331,"children":1333},{"style":1332},"--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#89DDFF;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold",[1334],{"type":50,"value":1335}," **",{"type":44,"tag":670,"props":1337,"children":1339},{"style":1338},"--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#F07178;--shiki-default-font-weight:bold;--shiki-dark:#F07178;--shiki-dark-font-weight:bold",[1340],{"type":50,"value":357},{"type":44,"tag":670,"props":1342,"children":1343},{"style":1332},[1344],{"type":50,"value":1345},"**",{"type":44,"tag":670,"props":1347,"children":1348},{"style":1286},[1349],{"type":50,"value":1350},": {discovered_uid}\n",{"type":44,"tag":670,"props":1352,"children":1354},{"class":779,"line":1353},8,[1355,1359,1363,1368,1372],{"type":44,"tag":670,"props":1356,"children":1357},{"style":1263},[1358],{"type":50,"value":1329},{"type":44,"tag":670,"props":1360,"children":1361},{"style":1332},[1362],{"type":50,"value":1335},{"type":44,"tag":670,"props":1364,"children":1365},{"style":1338},[1366],{"type":50,"value":1367},"Name",{"type":44,"tag":670,"props":1369,"children":1370},{"style":1332},[1371],{"type":50,"value":1345},{"type":44,"tag":670,"props":1373,"children":1374},{"style":1286},[1375],{"type":50,"value":1376},": {discovered_name}\n",{"type":44,"tag":93,"props":1378,"children":1379},{},[1380,1385],{"type":44,"tag":99,"props":1381,"children":1382},{},[1383],{"type":50,"value":1384},"3. Confirm",{"type":50,"value":1386},": Show the resolved config and ask for confirmation before proceeding.",{"type":44,"tag":1388,"props":1389,"children":1390},"style",{},[1391],{"type":50,"value":1392},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1394,"total":1573},[1395,1414,1433,1452,1467,1482,1495,1510,1521,1535,1548,1561],{"slug":1396,"name":1396,"fn":1397,"description":1398,"org":1399,"tags":1400,"stars":1411,"repoUrl":1412,"updatedAt":1413},"azure-arg-external-evaluation-policy-author","author and test Azure Resource Graph policies","Use when the user wants to author, design, or test an Azure Policy that queries Azure Resource Graph (ARG) at request-time — i.e. a policy whose deny\u002Faudit decision depends on data from elsewhere in the subscription (sibling\u002Fparent resource state, RG-wide invariants, multi-hop relationships, etc.). Formally called Azure Policy External Evaluation; sometimes referred to colloquially as \"Invoke\". Drives an iterative KQL co-design loop against the user's real subscription via `az graph query`, then emits a policy definition, assignment, `.http` test flow, and an `EXPLANATION.md` companion. Read-only; never provisions anything.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1401,1402,1405,1408],{"name":11,"slug":8,"type":14},{"name":1403,"slug":1404,"type":14},"Compliance","compliance",{"name":1406,"slug":1407,"type":14},"Governance","governance",{"name":1409,"slug":1410,"type":14},"Policy","policy",1686,"https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-policy","2026-07-12T08:17:48.378432",{"slug":1415,"name":1415,"fn":1416,"description":1417,"org":1418,"tags":1419,"stars":1430,"repoUrl":1431,"updatedAt":1432},"azure-blueprints-migration","migrate Azure Blueprints to Template Specs","Use when a user needs to migrate off Azure Blueprints (definitions and\u002For assignments) to Template Specs and Deployment Stacks before the January 31, 2027 retirement. Covers inventory, export, conversion to Bicep, policy decoupling, Template Spec publishing, Deployment Stack deployment with deny-settings, validation, and cutover.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1420,1421,1424,1427],{"name":11,"slug":8,"type":14},{"name":1422,"slug":1423,"type":14},"Deployment","deployment",{"name":1425,"slug":1426,"type":14},"Infrastructure as Code","infrastructure-as-code",{"name":1428,"slug":1429,"type":14},"Migration","migration",260,"https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-blueprints","2026-07-12T08:17:49.646405",{"slug":1434,"name":1434,"fn":1435,"description":1436,"org":1437,"tags":1438,"stars":1449,"repoUrl":1450,"updatedAt":1451},"apiview-feedback-resolution","resolve APIView feedback on Azure SDKs","Analyze and resolve APIView review feedback on Azure SDK PRs. **UTILITY SKILL**. USE FOR: APIView comments, API review feedback, SDK API surface changes. DO NOT USE FOR: general code review, non-APIView feedback. INVOKES: azure-sdk-mcp:azsdk_apiview_get_comments, azure-sdk-mcp:azsdk_typespec_customized_code_update.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1439,1442,1443,1446],{"name":1440,"slug":1441,"type":14},"API Development","api-development",{"name":11,"slug":8,"type":14},{"name":1444,"slug":1445,"type":14},"Code Review","code-review",{"name":1447,"slug":1448,"type":14},"Documentation","documentation",133,"https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-tools","2026-07-12T08:17:43.350876",{"slug":1453,"name":1453,"fn":1454,"description":1455,"org":1456,"tags":1457,"stars":1449,"repoUrl":1450,"updatedAt":1466},"azsdk-common-live-and-recorded-tests","deploy resources and run Azure SDK tests","Deploy test resources and run Azure SDK tests in live, record, or playback mode. WHEN: \"run live tests\", \"run recorded tests\", \"deploy test resources\", \"record tests\", \"run tests in record mode\", \"clean up test resources\", \"run tests against live resources\". DO NOT USE FOR: writing new tests, authoring Bicep templates, playback-only test runs without resource deployment. INVOKES: azure-sdk-mcp:azsdk_package_run_tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1458,1459,1460,1463],{"name":11,"slug":8,"type":14},{"name":1422,"slug":1423,"type":14},{"name":1461,"slug":1462,"type":14},"SDK","sdk",{"name":1464,"slug":1465,"type":14},"Testing","testing","2026-07-12T08:17:44.718943",{"slug":1468,"name":1468,"fn":1469,"description":1470,"org":1471,"tags":1472,"stars":1449,"repoUrl":1450,"updatedAt":1481},"azsdk-common-prepare-release-plan","manage Azure SDK release plan work items","Create, get, update, abandon, and link SDK PRs to release plan work items for Azure SDK releases. **UTILITY SKILL**. USE FOR: \"create release plan\", \"get release plan\", \"update release plan\", \"update API spec in release plan\", \"update SDK details in release plan\", \"abandon release plan\", \"link SDK PR to plan\", \"namespace approval\", \"check release plan status\". DO NOT USE FOR: SDK code generation, pipeline troubleshooting, API review feedback. INVOKES: azure-sdk-mcp:azsdk_create_release_plan, azure-sdk-mcp:azsdk_get_release_plan, azure-sdk-mcp:azsdk_get_release_plan_for_spec_pr, azure-sdk-mcp:azsdk_update_release_plan, azure-sdk-mcp:azsdk_update_api_spec_pull_request_in_release_plan, azure-sdk-mcp:azsdk_update_sdk_details_in_release_plan, azure-sdk-mcp:azsdk_abandon_release_plan, azure-sdk-mcp:azsdk_link_sdk_pull_request_to_release_plan, azure-sdk-mcp:azsdk_link_namespace_approval_issue.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1473,1474,1477,1480],{"name":11,"slug":8,"type":14},{"name":1475,"slug":1476,"type":14},"GitHub","github",{"name":1478,"slug":1479,"type":14},"Project Management","project-management",{"name":1461,"slug":1462,"type":14},"2026-07-12T08:17:38.345387",{"slug":1483,"name":1483,"fn":1484,"description":1485,"org":1486,"tags":1487,"stars":1449,"repoUrl":1450,"updatedAt":1494},"azsdk-common-sdk-release","release Azure SDK packages","Check release readiness and trigger the release pipeline for Azure SDK packages. **UTILITY SKILL**. USE FOR: \"release SDK\", \"trigger release\", \"check release readiness\", \"release pipeline\", \"publish package\", \"ship SDK\". DO NOT USE FOR: SDK development, code generation, pipeline debugging, release plan creation. INVOKES: azure-sdk-mcp:azsdk_release_sdk.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1488,1489,1492,1493],{"name":11,"slug":8,"type":14},{"name":1490,"slug":1491,"type":14},"CI\u002FCD","ci-cd",{"name":1422,"slug":1423,"type":14},{"name":1461,"slug":1462,"type":14},"2026-07-12T08:17:34.27607",{"slug":1496,"name":1496,"fn":1497,"description":1498,"org":1499,"tags":1500,"stars":1449,"repoUrl":1450,"updatedAt":1509},"azure-typespec-author","author and modify Azure TypeSpec API specifications","Authors and modifies Azure TypeSpec (.tsp) API specifications. USE FOR: any TypeSpec\u002Ftsp change — api versions (add, bump, preview, stable, promote), resources, operations, models, properties, decorators, visibility, constraints, breaking changes, LRO, suppressions, operationId, spread model. Covers ARM resource-manager and data-plane services. DO NOT USE FOR: SDK generation, releasing SDK packages, or single MCP tool calls. INVOKES: azure-sdk-mcp:azsdk_typespec_generate_authoring_plan, azure-sdk-mcp:azsdk_run_typespec_validation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1501,1502,1503,1506],{"name":1440,"slug":1441,"type":14},{"name":11,"slug":8,"type":14},{"name":1504,"slug":1505,"type":14},"OpenAPI","openapi",{"name":1507,"slug":1508,"type":14},"Technical Writing","technical-writing","2026-07-12T08:17:39.603232",{"slug":1511,"name":1511,"fn":1512,"description":1513,"org":1514,"tags":1515,"stars":1449,"repoUrl":1450,"updatedAt":1520},"generate-sdk-locally","generate and test Azure SDKs locally","Generate, build, and test Azure SDKs locally from TypeSpec with automatic customization. WHEN: \"generate SDK locally\", \"build SDK\", \"run SDK tests\", \"run CI checks\", \"validate package\", \"run checks\", \"update changelog\", \"fix SDK build errors\", \"fix breaking changes\", \"resolve SDK generation errors\", \"customize TypeSpec\", \"rename SDK client\", \"rename SDK model\", \"hide operation from SDK\", \"fix analyzer errors\", \"resolve customization drift\", \"create subclient\", \"update metadata\", \"update version\". DO NOT USE FOR: publishing to package registries, CI pipeline configuration, API design review. INVOKES: azsdk_verify_setup, azsdk_package_generate_code, azsdk_package_build_code, azsdk_package_run_check, azsdk_package_run_tests, azsdk_customized_code_update, azsdk_package_update_changelog_content, azsdk_package_update_metadata, azsdk_package_update_version.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1516,1517,1518,1519],{"name":11,"slug":8,"type":14},{"name":1490,"slug":1491,"type":14},{"name":1461,"slug":1462,"type":14},{"name":1464,"slug":1465,"type":14},"2026-07-12T08:17:37.08523",{"slug":1522,"name":1522,"fn":1523,"description":1524,"org":1525,"tags":1526,"stars":1449,"repoUrl":1450,"updatedAt":1534},"markdown-token-optimizer","optimize markdown files for token efficiency","Analyze markdown files for token efficiency and reduce context-window bloat. **UTILITY SKILL**. DO NOT USE FOR: code optimization, general file editing, non-markdown files. TRIGGERS: optimize markdown, reduce tokens, token count, token bloat, too many tokens, make concise, shrink file, file too large, optimize for AI, token efficiency, verbose markdown, reduce file size. INVOKES: waza CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1527,1530,1533],{"name":1528,"slug":1529,"type":14},"LLM","llm",{"name":1531,"slug":1532,"type":14},"Performance","performance",{"name":1507,"slug":1508,"type":14},"2026-07-12T08:17:42.080413",{"slug":1536,"name":1536,"fn":1537,"description":1538,"org":1539,"tags":1540,"stars":1449,"repoUrl":1450,"updatedAt":1547},"pipeline-troubleshooting","troubleshoot Azure SDK CI pipelines","Diagnose and resolve failures in Azure SDK CI and generation pipelines. **UTILITY SKILL**. USE FOR: \"pipeline failed\", \"build failure\", \"CI check failing\", \"SDK generation error\", \"reproduce pipeline locally\", \"debug SDK pipeline\". DO NOT USE FOR: local build issues without pipeline context, API design review, SDK publishing. INVOKES: azure-sdk-mcp:azsdk_analyze_pipeline, azure-sdk-mcp:azsdk_package_build_code, azure-sdk-mcp:azsdk_package_run_check.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1541,1542,1543,1546],{"name":11,"slug":8,"type":14},{"name":1490,"slug":1491,"type":14},{"name":1544,"slug":1545,"type":14},"Debugging","debugging",{"name":1461,"slug":1462,"type":14},"2026-07-12T08:17:40.821512",{"slug":1549,"name":1549,"fn":1550,"description":1551,"org":1552,"tags":1553,"stars":1449,"repoUrl":1450,"updatedAt":1560},"sensei","improve skill frontmatter compliance","**WORKFLOW SKILL** — Iteratively improve skill frontmatter compliance using the Ralph loop pattern. WHEN: \"run sensei\", \"sensei help\", \"improve skill\", \"fix frontmatter\", \"skill compliance\", \"frontmatter audit\", \"score skill\", \"check skill tokens\". INVOKES: token counting tools, test runners, git commands. FOR SINGLE OPERATIONS: use token CLI directly for counts\u002Fchecks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1554,1555,1556,1559],{"name":11,"slug":8,"type":14},{"name":1403,"slug":1404,"type":14},{"name":1557,"slug":1558,"type":14},"Process Optimization","process-optimization",{"name":1507,"slug":1508,"type":14},"2026-07-12T08:17:32.970921",{"slug":1562,"name":1562,"fn":1563,"description":1564,"org":1565,"tags":1566,"stars":1449,"repoUrl":1450,"updatedAt":1572},"skill-authoring","author agent skills for agentskills.io","Write Agent Skills that comply with the agentskills.io specification. WHEN: \"create a skill\", \"new skill\", \"write a skill\", \"skill template\", \"skill structure\", \"review skill\", \"skill PR\", \"skill compliance\", \"SKILL.md format\", \"skill frontmatter\", \"skill best practices\". DO NOT USE FOR: improving existing skills (use sensei), general documentation. INVOKES: waza CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1567,1568,1571],{"name":1447,"slug":1448,"type":14},{"name":1569,"slug":1570,"type":14},"Plugin Development","plugin-development",{"name":1507,"slug":1508,"type":14},"2026-07-12T08:17:35.873862",109,{"items":1575,"total":1301},[1576,1583,1603,1616,1629],{"slug":4,"name":4,"fn":5,"description":6,"org":1577,"tags":1578,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1579,1580,1581,1582],{"name":11,"slug":8,"type":14},{"name":22,"slug":23,"type":14},{"name":19,"slug":20,"type":14},{"name":16,"slug":17,"type":14},{"slug":1584,"name":1584,"fn":1585,"description":1586,"org":1587,"tags":1588,"stars":24,"repoUrl":25,"updatedAt":1602},"amg-check-cosmosdb-mongo-ru","monitor Cosmos DB for MongoDB health","Fleet-wide Cosmos DB for MongoDB (RU) health check — scans NormalizedRU consumption, service availability, server-side latency, throttling (429s), and replication metrics across all accounts, then deep-dives into abnormal accounts with resource logs and correlation analysis. Tracks known issues across sessions via persistent report. Uses AMG-MCP pulse check for Tier 1 triage, then batched Azure Monitor queries for Tier 2 investigation. On first run, auto-discovers datasource UID and prompts for subscription ID.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1589,1590,1593,1596,1599],{"name":11,"slug":8,"type":14},{"name":1591,"slug":1592,"type":14},"Cosmos DB","cosmos-db",{"name":1594,"slug":1595,"type":14},"MongoDB","mongodb",{"name":1597,"slug":1598,"type":14},"Monitoring","monitoring",{"name":1600,"slug":1601,"type":14},"Observability","observability","2026-07-12T08:19:56.052424",{"slug":1604,"name":1604,"fn":1605,"description":1606,"org":1607,"tags":1608,"stars":24,"repoUrl":25,"updatedAt":1615},"amg-check-key-vault","monitor Azure Key Vault health","Fleet-wide Azure Key Vault health check — pulse check for availability, API latency, throttling (429s), auth failures (401\u002F403), and vault saturation across all vaults, then deep-dives into the top 7 most interesting vaults with metrics and resource logs. Tracks known issues across sessions via persistent report. On first run, auto-discovers datasource UID and prompts for subscription ID.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1609,1610,1611,1612],{"name":11,"slug":8,"type":14},{"name":1597,"slug":1598,"type":14},{"name":1600,"slug":1601,"type":14},{"name":1613,"slug":1614,"type":14},"Security","security","2026-07-12T08:19:53.484442",{"slug":1617,"name":1617,"fn":1618,"description":1619,"org":1620,"tags":1621,"stars":24,"repoUrl":25,"updatedAt":1628},"amg-check-pg-flex","monitor PostgreSQL Flexible Server health","Fleet-wide PostgreSQL Flexible Server health check — scans CPU, memory, storage, IOPS, disk bandwidth, and connection metrics across all servers, then deep-dives into abnormal servers with resource logs and correlation analysis. Tracks known issues across sessions via persistent report. Uses AMG-MCP pulse check for Tier 1 triage, then batched Azure Monitor queries for Tier 2 investigation. On first run, auto-discovers datasource UID and prompts for subscription ID.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1622,1623,1624,1625],{"name":11,"slug":8,"type":14},{"name":1597,"slug":1598,"type":14},{"name":1600,"slug":1601,"type":14},{"name":1626,"slug":1627,"type":14},"PostgreSQL","postgresql","2026-07-12T08:19:54.767507",{"slug":1630,"name":1630,"fn":1631,"description":1632,"org":1633,"tags":1634,"stars":24,"repoUrl":25,"updatedAt":1640},"amg-check-storage-account","monitor Azure Storage Account health","Fleet-wide Azure Storage Account health check — pulse check for availability, latency, transactions, and error rates across all accounts, then deep-dives into the top 7 most interesting accounts with metrics (E2E latency, server latency, capacity, ingress\u002Fegress) and resource logs. Tracks known issues across sessions via persistent report. On first run, auto-discovers datasource UID and prompts for subscription ID.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1635,1636,1637,1638],{"name":11,"slug":8,"type":14},{"name":1597,"slug":1598,"type":14},{"name":1531,"slug":1532,"type":14},{"name":957,"slug":1639,"type":14},"storage","2026-07-12T08:19:57.37917"]