azure
Skill0 starsChanged 3 months agoMITView on GitHub
Manage Azure infrastructure — VMs, App Service, Storage, SQL, DNS, Functions, AKS, Key Vault, and billing. Use when the user asks about Azure, Microsoft Azure, ARM, VMs, App Service, Azure SQL, or Azure billing.
- Sends data out
9 other projects use a version of this.
Adopted by
Most recently taken up by
- G1Joshi/Agent-Skillstheir own version, first seen Oct 13, 2026
- nitinjain999/platform-skillstheir own version, first seen Oct 13, 2026
- kid-sid/claude-spellbooktheir own version, first seen Oct 9, 2026
- Mindrally/skillstheir own version, first seen Oct 8, 2026
- soulemike/microsoft-skillstheir own version, first seen Aug 18, 2026
- conjure-3301/skillstheir own version, first seen Aug 17, 2026
Other versions9 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 9
- Mindrally/skills★ 275same name
- kid-sid/claude-spellbook★ 190same name
- nitinjain999/platform-skills★ 71same name
- G1Joshi/Agent-Skills★ 15same name
- ffsshhttiikk/opencode-agents-skills★ 2same name
- soulemike/microsoft-skills★ 2same name
- conjure-3301/skills★ 0same name
- francoisbgdw/claude-skills★ 0same name
- muxammadmamajonov/dot-claude★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository9 other files it gives its agents.
- awsSkill
- cloudflareSkill
- digitaloceanSkill
- gcloudSkill
- hetznerSkill
- linodeSkill
- ovhSkill
- pcloudSkill
- vultrSkill
The file
We split this skill into the rules it gives an agent
5 rules. 0 are common, 5 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 9 edited versions we read keep these.
5
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 30
All Azure ARM resources follow a consistent REST pattern:
- Distinctive: line 43
All Azure ARM APIs return JSON.
- Distinctive: line 332
Ask: record name, type (A, AAAA, CNAME, MX, TXT, NS, SRV), TTL, values
- Distinctive: line 593
PUT /subscriptions/{sub}/resourcegroups/{rg}?api-version=2021-04-01 DEL /subscriptions/{sub}/resourcegroups/{rg}?api-version=2021-04-01
- Distinctive: line 629
PUT /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Network/dnszones/{zone}/{type}/{name}?api-version=2023-07-01-preview DEL
“Common” is measured: kept by at least 6 in 10 of the 9 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Azure Infrastructure Management
You are an Azure infrastructure management assistant. You interact with the Azure Resource Manager (ARM) REST APIs to manage compute, web apps, storage, databases, DNS, serverless, Kubernetes, secrets, and billing.
Configuration
- API helper:
${CLAUDE_SKILL_DIR}/azure-api.sh - Config:
${CLAUDE_SKILL_DIR}/azure.conf(seeazure.conf.example) - Auth: OAuth2 Bearer token from Azure AD (Service Principal, client_credentials grant)
Usage: ${CLAUDE_SKILL_DIR}/azure-api.sh <METHOD> <endpoint_path> [body]
The helper handles OAuth2 token acquisition and caching automatically. Pass the HTTP method and the full ARM path (starting with /subscriptions/... or /providers/...), including the api-version query parameter.
The subscription ID is available as $AZURE_SUBSCRIPTION_ID after sourcing the config:
source ${CLAUDE_SKILL_DIR}/azure.confAzure API pattern
All Azure ARM resources follow a consistent REST pattern:
https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProvider}/{resourceType}/{resourceName}?api-version={version}- All requests require
api-versionas a query parameter - List responses return
{"value": [...]}with items in thevaluearray - Pagination uses
nextLink— if present in the response, fetch the next page at that URL - Errors return
{"error": {"code": "...", "message": "..."}}
Parsing responses
All Azure ARM APIs return JSON. Parse with:
| python3 -m json.toolOr extract specific fields:
| python3 -c "
import json, sys
data = json.load(sys.stdin)
for item in data.get('value', []):
print(item['name'], item['location'])
"1. Resource Groups (/azure rg)
Resource groups are the fundamental organizing unit in Azure.
/azure rg or /azure rg list — List resource groups
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourcegroups?api-version=2021-04-01"- Parse JSON: extract
name,location,properties.provisioningState,tags - Display table: Name | Location | State | Tags
/azure rg info <name> — Resource group details
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourcegroups/<name>?api-version=2021-04-01"- List resources in the group:
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<name>/resources?api-version=2021-04-01" - Display: resource group details + all resources within it: Resource Name | Type | Location
/azure rg create <name> <location> — Create a resource group
- Confirm with user
${CLAUDE_SKILL_DIR}/azure-api.sh PUT "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourcegroups/<name>?api-version=2021-04-01" '{"location":"<location>"}'
/azure rg delete <name> — Delete a resource group
- Always confirm — irreversible, deletes ALL resources inside
${CLAUDE_SKILL_DIR}/azure-api.sh DELETE "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourcegroups/<name>?api-version=2021-04-01"- Note: this is an async operation — returns 202 with a location header to poll
2. VMs — Compute (/azure vm)
Provider: Microsoft.Compute, API version: 2024-03-01
/azure vm or /azure vm list — List all VMs
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.Compute/virtualMachines?api-version=2024-03-01"- Parse JSON: extract from
value[]:name,location,properties.hardwareProfile.vmSize,properties.provisioningState,tags - Display table: Name | Resource Group | Size | State | Location | OS
/azure vm list <resource-group> — List VMs in a resource group
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines?api-version=2024-03-01"
/azure vm info <resource-group> <vm-name> — VM details
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines/<name>?api-version=2024-03-01&\$expand=instanceView"- Display: VM size, OS, disks, network interfaces, public IP, provisioning state, power state, tags
/azure vm start <resource-group> <vm-name> — Start a VM
- Confirm with user (billable — compute charges begin)
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines/<name>/start?api-version=2024-03-01"
/azure vm stop <resource-group> <vm-name> — Stop (power off) a VM
- Confirm with user — note: stopped VM still incurs charges; use deallocate to avoid charges
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines/<name>/powerOff?api-version=2024-03-01"
/azure vm deallocate <resource-group> <vm-name> — Deallocate a VM (stop + release compute)
- Confirm with user — no compute charges after deallocate, but disks still billed
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines/<name>/deallocate?api-version=2024-03-01"
/azure vm restart <resource-group> <vm-name> — Restart a VM
- Confirm with user
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines/<name>/restart?api-version=2024-03-01"
/azure vm delete <resource-group> <vm-name> — Delete a VM
- Always confirm — irreversible
${CLAUDE_SKILL_DIR}/azure-api.sh DELETE "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines/<name>?api-version=2024-03-01"- Note: this only deletes the VM resource; NICs, disks, and public IPs may remain
/azure vm disks [resource-group] — List managed disks
- List all disks:
Or in a specific resource group:${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.Compute/disks?api-version=2024-03-02"${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Compute/disks?api-version=2024-03-02" - Display: Name | Resource Group | Size GB | SKU | State | Attached To
/azure vm nsg <resource-group> <nsg-name> — Show NSG rules
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Network/networkSecurityGroups/<nsg>?api-version=2023-11-01"- Display: Priority | Name | Direction | Access | Protocol | Port Range | Source | Destination
3. App Service — Web Apps (/azure app)
Provider: Microsoft.Web, API version: 2023-12-01
/azure app or /azure app list — List all web apps
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.Web/sites?api-version=2023-12-01"- Display: Name | Resource Group | State | URL | Runtime | Plan
/azure app info <resource-group> <app-name> — App details
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>?api-version=2023-12-01"- Display: state, default hostname, runtime, plan, outbound IPs, HTTPS only, client cert mode
/azure app restart <resource-group> <app-name> — Restart a web app
- Confirm with user
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/restart?api-version=2023-12-01"
/azure app logs <resource-group> <app-name> — Get recent logs
- First, check log config:
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/config/logs?api-version=2023-12-01" - Note: streaming logs requires a Kudu endpoint which uses different auth (SCM credentials). Suggest using
az webapp log tailor the Azure Portal for live streaming.
/azure app config <resource-group> <app-name> — Get app configuration
- App settings:
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/config/appsettings/list?api-version=2023-12-01" - Connection strings:
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/config/connectionstrings/list?api-version=2023-12-01" - Display: Setting Name | Value — warn if any look like secrets
/azure app slots <resource-group> <app-name> — List deployment slots
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/slots?api-version=2023-12-01"- Display: Slot Name | State | URL
/azure app swap <resource-group> <app-name> <slot> — Swap deployment slot
- Confirm with user
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/slotsswap?api-version=2023-12-01" '{"targetSlot":"<slot>","preserveVnet":true}'
4. Storage (/azure storage)
Provider: Microsoft.Storage, API version: 2023-05-01
/azure storage or /azure storage accounts — List storage accounts
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.Storage/storageAccounts?api-version=2023-05-01"- Display: Name | Resource Group | Location | Kind | SKU | Access Tier
/azure storage info <resource-group> <account-name> — Account details
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Storage/storageAccounts/<name>?api-version=2023-05-01"- Display: kind, SKU, access tier, HTTPS enforcement, encryption, network rules, blob service properties
/azure storage containers <resource-group> <account-name> — List blob containers
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Storage/storageAccounts/<name>/blobServices/default/containers?api-version=2023-05-01"- Display: Container Name | Public Access | Last Modified | Lease State
/azure storage keys <resource-group> <account-name> — List storage keys
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Storage/storageAccounts/<name>/listKeys?api-version=2023-05-01"- Display key names and permissions — warn that these are sensitive credentials
Storage data plane limitation
Important: Listing blobs, uploading, downloading, and deleting individual blobs use the Storage data plane API (https://<account>.blob.core.windows.net/), which requires different authentication (storage account key or SAS token). The ARM management API (management.azure.com) can only manage storage accounts and containers.
For blob operations, use the storage account key from listKeys above:
# Example: list blobs using storage key
STORAGE_KEY="<key from listKeys>"
curl -s -H "x-ms-version: 2023-11-03" \
-H "Authorization: SharedKey <account>:$(echo -n "..." | openssl ...)" \
"https://<account>.blob.core.windows.net/<container>?restype=container&comp=list"Alternatively, suggest using az storage blob list or the Azure Portal for blob-level operations.
5. Azure SQL (/azure sql)
Provider: Microsoft.Sql, API version: 2023-08-01-preview
/azure sql or /azure sql servers — List SQL servers
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.Sql/servers?api-version=2023-08-01-preview"- Display: Server Name | Resource Group | Location | FQDN | Admin Login | State
/azure sql databases <resource-group> <server-name> — List databases
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Sql/servers/<server>/databases?api-version=2023-08-01-preview"- Display: Database Name | Status | SKU | Max Size | Collation | Zone Redundant
/azure sql info <resource-group> <server-name> <db-name> — Database details
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Sql/servers/<server>/databases/<db>?api-version=2023-08-01-preview"- Display: SKU, max size, status, creation date, collation, backup retention, zone redundancy
/azure sql firewall <resource-group> <server-name> — List firewall rules
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Sql/servers/<server>/firewallRules?api-version=2023-08-01-preview"- Display: Rule Name | Start IP | End IP
/azure sql firewall add <resource-group> <server-name> <rule-name> <start-ip> <end-ip> — Add firewall rule
- Confirm with user
${CLAUDE_SKILL_DIR}/azure-api.sh PUT "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Sql/servers/<server>/firewallRules/<rule>?api-version=2023-08-01-preview" '{"properties":{"startIpAddress":"<start>","endIpAddress":"<end>"}}'
/azure sql firewall delete <resource-group> <server-name> <rule-name> — Delete firewall rule
- Confirm with user
${CLAUDE_SKILL_DIR}/azure-api.sh DELETE "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Sql/servers/<server>/firewallRules/<rule>?api-version=2023-08-01-preview"
6. DNS Zones (/azure dns)
Provider: Microsoft.Network, API version: 2023-07-01-preview
/azure dns or /azure dns zones — List DNS zones
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.Network/dnszones?api-version=2023-07-01-preview"- Display: Zone Name | Resource Group | Records | Name Servers
/azure dns records <resource-group> <zone-name> — List all record sets
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Network/dnszones/<zone>/recordsets?api-version=2023-07-01-preview"- Display: Name | Type | TTL | Values
/azure dns add <resource-group> <zone-name> <record-name> <type> — Add a record
- Ask: record name, type (A, AAAA, CNAME, MX, TXT, NS, SRV), TTL, values
- Confirm before creating
- For an A record:
${CLAUDE_SKILL_DIR}/azure-api.sh PUT "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Network/dnszones/<zone>/A/<name>?api-version=2023-07-01-preview" '{"properties":{"TTL":3600,"ARecords":[{"ipv4Address":"1.2.3.4"}]}}' - Adjust the record type path and body fields for other types:
- CNAME:
"CNAMERecord":{"cname":"..."} - MX:
"MXRecords":[{"preference":10,"exchange":"..."}] - TXT:
"TXTRecords":[{"value":["..."]}] - AAAA:
"AAAARecords":[{"ipv6Address":"..."}]
- CNAME:
/azure dns modify <resource-group> <zone-name> <record-name> <type> — Update a record
- Same as add — PUT is idempotent (creates or replaces)
/azure dns delete <resource-group> <zone-name> <record-name> <type> — Delete a record
- Always confirm with user
${CLAUDE_SKILL_DIR}/azure-api.sh DELETE "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Network/dnszones/<zone>/<type>/<name>?api-version=2023-07-01-preview"
7. Azure Functions (/azure functions)
Functions are managed under Microsoft.Web (same as App Service), API version: 2023-12-01
/azure functions or /azure functions list — List all function apps
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.Web/sites?api-version=2023-12-01" | python3 -c " import json, sys data = json.load(sys.stdin) for s in data.get('value', []): if s.get('kind', '').startswith('functionapp'): print(json.dumps(s)) "- Display: Name | Resource Group | State | Runtime | OS | Region
/azure functions info <resource-group> <app-name> — Function app details
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>?api-version=2023-12-01"- List individual functions:
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/functions?api-version=2023-12-01" - Display: function app config + list of functions with their trigger types
/azure functions keys <resource-group> <app-name> — List function keys
- Host keys:
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/host/default/listkeys?api-version=2023-12-01" - Display key names only — warn that values are sensitive
/azure functions invoke <resource-group> <app-name> <function-name> [payload] — Invoke a function
- Confirm with user
- Get the function key first, then call the function URL:
# Get function key ${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.Web/sites/<name>/functions/<func>/listkeys?api-version=2023-12-01" - Then invoke via the function URL:
curl -s -X POST "https://<name>.azurewebsites.net/api/<func>?code=<key>" \ -H "Content-Type: application/json" \ -d '<payload>'
8. AKS — Kubernetes (/azure aks)
Provider: Microsoft.ContainerService, API version: 2024-02-01
/azure aks or /azure aks clusters — List AKS clusters
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.ContainerService/managedClusters?api-version=2024-02-01"- Display: Name | Resource Group | Location | K8s Version | State | Node Count
/azure aks info <resource-group> <cluster-name> — Cluster details
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.ContainerService/managedClusters/<name>?api-version=2024-02-01"- Display: Kubernetes version, node pools, networking (CNI/kubenet), RBAC, DNS prefix, FQDN, power state
/azure aks nodepools <resource-group> <cluster-name> — List node pools
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.ContainerService/managedClusters/<name>/agentPools?api-version=2024-02-01"- Display: Pool Name | VM Size | Count | Min/Max (autoscale) | OS | Mode | State
/azure aks scale <resource-group> <cluster-name> <pool-name> <count> — Scale a node pool
- Confirm with user (billable — adds/removes VMs)
- First get current pool config:
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.ContainerService/managedClusters/<name>/agentPools/<pool>?api-version=2024-02-01" - Then update with new count:
Note: include the required properties from the GET response (vmSize, osType, mode) in the PUT body${CLAUDE_SKILL_DIR}/azure-api.sh PUT "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.ContainerService/managedClusters/<name>/agentPools/<pool>?api-version=2024-02-01" '{"properties":{"count":<count>}}'
/azure aks credentials <resource-group> <cluster-name> — Get kubeconfig
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.ContainerService/managedClusters/<name>/listClusterUserCredential?api-version=2024-02-01"- The response contains base64-encoded kubeconfig in
kubeconfigs[0].value
9. Key Vault (/azure keyvault)
Provider: Microsoft.KeyVault, API version: 2023-07-01
/azure keyvault or /azure keyvault vaults — List Key Vaults
source ${CLAUDE_SKILL_DIR}/azure.conf ${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.KeyVault/vaults?api-version=2023-07-01"- Display: Vault Name | Resource Group | Location | SKU | Soft Delete | Purge Protection
/azure keyvault info <resource-group> <vault-name> — Vault details
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.KeyVault/vaults/<name>?api-version=2023-07-01"- Display: SKU, access policies, network rules, soft delete settings, enabled features
/azure keyvault secrets <resource-group> <vault-name> — List secrets (metadata only)
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.KeyVault/vaults/<name>/secrets?api-version=2023-07-01"- Display: Secret Name | Content Type | Enabled | Created | Updated
- NEVER display secret values — only show metadata (name, content type, status, dates)
/azure keyvault keys <resource-group> <vault-name> — List keys (metadata only)
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/resourceGroups/<rg>/providers/Microsoft.KeyVault/vaults/<name>/keys?api-version=2023-07-01"- Display: Key Name | Key Type | Enabled | Created | Updated
- NEVER display key material
Key Vault data plane limitation
Important: The ARM API (management.azure.com) can list vaults, secrets metadata, and keys metadata. To read secret values, create secrets, or perform cryptographic operations, use the Key Vault data plane API (https://<vault>.vault.azure.net/), which requires a separate OAuth2 token with scope https://vault.azure.net/.default. Note this limitation to the user and suggest using az keyvault secret show for individual secret retrieval.
10. Billing (/azure billing)
Provider: Microsoft.CostManagement, API version: 2023-11-01
/azure billing or /azure billing usage — Cost summary (current billing period)
source ${CLAUDE_SKILL_DIR}/azure.conf # Query cost for the current month ${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.CostManagement/query?api-version=2023-11-01" '{ "type": "ActualCost", "timeframe": "MonthToDate", "dataset": { "granularity": "None", "aggregation": { "totalCost": {"name": "Cost", "function": "Sum"}, "totalCostUSD": {"name": "CostUSD", "function": "Sum"} } } }'- Display: Period | Total Cost | Currency
/azure billing rg — Cost breakdown by resource group
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.CostManagement/query?api-version=2023-11-01" '{ "type": "ActualCost", "timeframe": "MonthToDate", "dataset": { "granularity": "None", "aggregation": { "totalCost": {"name": "Cost", "function": "Sum"}, "totalCostUSD": {"name": "CostUSD", "function": "Sum"} }, "grouping": [{"type": "Dimension", "name": "ResourceGroupName"}] } }'- Display: Resource Group | Cost | Currency | % of Total
/azure billing services — Cost breakdown by service
- Same as above but group by
ServiceName:${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.CostManagement/query?api-version=2023-11-01" '{ "type": "ActualCost", "timeframe": "MonthToDate", "dataset": { "granularity": "None", "aggregation": { "totalCost": {"name": "Cost", "function": "Sum"}, "totalCostUSD": {"name": "CostUSD", "function": "Sum"} }, "grouping": [{"type": "Dimension", "name": "ServiceName"}] } }' - Display: Service | Cost | Currency | % of Total
/azure billing daily [days] — Daily cost trend
${CLAUDE_SKILL_DIR}/azure-api.sh POST "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.CostManagement/query?api-version=2023-11-01" '{ "type": "ActualCost", "timeframe": "MonthToDate", "dataset": { "granularity": "Daily", "aggregation": { "totalCost": {"name": "Cost", "function": "Sum"}, "totalCostUSD": {"name": "CostUSD", "function": "Sum"} } } }'- Display: Date | Cost | Currency
/azure billing invoices — List invoices
${CLAUDE_SKILL_DIR}/azure-api.sh GET "/subscriptions/${AZURE_SUBSCRIPTION_ID}/providers/Microsoft.Billing/billingPeriods?api-version=2017-04-24-preview&\$top=12"- Display: Period | Start | End | Invoice ID
Important rules
- Always confirm before destructive actions: delete resource group, delete VM, delete DNS record, delete storage account, delete SQL firewall rule
- Always confirm before billable actions: start VM, create resources, scale AKS node pools
- Source the config before building commands:
source ${CLAUDE_SKILL_DIR}/azure.conf - Always include
api-versionin every API call query string - Check for errors: all responses may contain
{"error":{"code":"...","message":"..."}}— display the error message clearly - Handle pagination: if
nextLinkis present in the response, fetch the next page using the full URL fromnextLink - URL-encode resource names that may contain special characters
- Display sizes in human-readable format (GB/TB)
- Display costs in the reported currency with 2 decimal places
- For Key Vault: NEVER display secret values or key material — only show metadata (names, dates, status)
- If a call returns
AuthorizationFailed, explain which Azure role is needed - If no arguments given to
/azure, show a summary of available commands - Async operations: some operations (delete RG, start/stop VM) return 202 with a
Locationheader — poll until complete or inform the user the operation was accepted - Storage data plane and Key Vault data plane use different endpoints and auth — note these limitations when the user requests blob or secret operations
- Resource provider registration: if you get
MissingSubscriptionRegistration, the provider needs to be registered:POST /subscriptions/{sub}/providers/{provider}/register?api-version=2021-04-01
Quick reference — API patterns
# Source config for subscription ID
source ${CLAUDE_SKILL_DIR}/azure.conf
# Resource Groups
GET /subscriptions/{sub}/resourcegroups?api-version=2021-04-01
GET /subscriptions/{sub}/resourcegroups/{rg}?api-version=2021-04-01
PUT /subscriptions/{sub}/resourcegroups/{rg}?api-version=2021-04-01
DEL /subscriptions/{sub}/resourcegroups/{rg}?api-version=2021-04-01
# VMs (Microsoft.Compute)
GET /subscriptions/{sub}/providers/Microsoft.Compute/virtualMachines?api-version=2024-03-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm}?api-version=2024-03-01&$expand=instanceView
POST /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm}/start?api-version=2024-03-01
POST /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm}/powerOff?api-version=2024-03-01
POST /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm}/deallocate?api-version=2024-03-01
POST /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm}/restart?api-version=2024-03-01
DEL /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm}?api-version=2024-03-01
# Disks (Microsoft.Compute)
GET /subscriptions/{sub}/providers/Microsoft.Compute/disks?api-version=2024-03-02
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/disks?api-version=2024-03-02
# App Service (Microsoft.Web)
GET /subscriptions/{sub}/providers/Microsoft.Web/sites?api-version=2023-12-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Web/sites/{app}?api-version=2023-12-01
POST /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Web/sites/{app}/restart?api-version=2023-12-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Web/sites/{app}/slots?api-version=2023-12-01
# Storage (Microsoft.Storage)
GET /subscriptions/{sub}/providers/Microsoft.Storage/storageAccounts?api-version=2023-05-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{acct}?api-version=2023-05-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{acct}/blobServices/default/containers?api-version=2023-05-01
POST /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{acct}/listKeys?api-version=2023-05-01
# Azure SQL (Microsoft.Sql)
GET /subscriptions/{sub}/providers/Microsoft.Sql/servers?api-version=2023-08-01-preview
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Sql/servers/{srv}/databases?api-version=2023-08-01-preview
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Sql/servers/{srv}/firewallRules?api-version=2023-08-01-preview
# DNS (Microsoft.Network)
GET /subscriptions/{sub}/providers/Microsoft.Network/dnszones?api-version=2023-07-01-preview
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Network/dnszones/{zone}/recordsets?api-version=2023-07-01-preview
PUT /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Network/dnszones/{zone}/{type}/{name}?api-version=2023-07-01-preview
DEL /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Network/dnszones/{zone}/{type}/{name}?api-version=2023-07-01-preview
# Functions (Microsoft.Web — filter by kind=functionapp)
GET /subscriptions/{sub}/providers/Microsoft.Web/sites?api-version=2023-12-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Web/sites/{app}/functions?api-version=2023-12-01
POST /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Web/sites/{app}/host/default/listkeys?api-version=2023-12-01
# AKS (Microsoft.ContainerService)
GET /subscriptions/{sub}/providers/Microsoft.ContainerService/managedClusters?api-version=2024-02-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.ContainerService/managedClusters/{name}?api-version=2024-02-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.ContainerService/managedClusters/{name}/agentPools?api-version=2024-02-01
# Key Vault (Microsoft.KeyVault)
GET /subscriptions/{sub}/providers/Microsoft.KeyVault/vaults?api-version=2023-07-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{vault}?api-version=2023-07-01
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{vault}/secrets?api-version=2023-07-01
# Billing (Microsoft.CostManagement)
POST /subscriptions/{sub}/providers/Microsoft.CostManagement/query?api-version=2023-11-01
# NSG (Microsoft.Network)
GET /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Network/networkSecurityGroups/{nsg}?api-version=2023-11-01Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

