KEEP IT HANDS-ON functional ~ tested 2026-08-30
// sandboxed in macOS (host) Β· aarch64 Β·install log Β· why not fully functional: Offline tooling, installs, and the MCP layer were verified hands-on (Foundry data validators with positive and negative cases, 68-tool MCP handshake, auth-error paths, three install routes). Live Azure operations and azd deployment workflows were not exercised: every service toolset requires an Azure subscription and az login credentials, which the review environment does not have. Β·functional log

microsoft/azure-skills

by Microsoft · https://github.com/microsoft/azure-skills · MIT · vv1.2.36 · updated 2026-08-26

Microsoft's official Azure plugin pairs 28 teaching skills with a 68-tool MCP execution layer. Massive demand, real craft, and retirements that left dead routes behind.

4 / 5
quality 4/5
documentation 4/5
setup 5/5
value 5/5
ecosystem fit 4/5
// bottom line

This is the most-installed vendor skill pack GearScope has reviewed: 12,209,310 all-time skills.sh installs against 1,434 GitHub stars, with 13 skills above 540K installs each. The guidance layer is disciplined (explicit routing, hard guardrails, per-skill semver) and the offline Foundry validators passed a verbatim positive-and-negative test on the first try. Deductions are all drift: the README still lists two retired skills, live reference files route to retired names in 8 places, and 6 stale registry entries totaling 1.26M installs point at skills that no longer exist.

Don't install your next skill blind. Every week: the shortlist of skills worth installing β€” and the ones to skip β€” from 100+ hands-on tests.
install via Claude Code
$/plugin install azure@claude-plugins-official
or via skills CLI (GitHub Copilot target, README-verbatim)
$npx skills add https://github.com/microsoft/azure-skills/tree/main/.github/plugins/azure-skills/skills -a github-copilot -g -y
or via APM multi-harness installer
$apm install microsoft/azure-skills

install if

  • Developers deploying, diagnosing, or optimizing workloads on Azure with a coding agent. The prepare/validate/deploy pipeline, the guardrails, and the wired-in MCP execution layer replace a shelf of bookmarked docs, and 12.2M installs suggest a lot of people agree.
  • Teams fine-tuning models on Microsoft Foundry. The finetuning sub-skill ships offline validators with line-level diagnostics, plus scripts for submission, monitoring, grader calibration, and evaluation.
  • Anyone building agent-assisted Azure workflows across hosts. One repo, seven documented harnesses, per-skill semver and a 143-entry changelog make this the template for how a vendor should package skills.

What It Does

Microsoft's official Azure agent plugin, shipped as a hybrid pack: 28 top-level skills (38 SKILL.md files counting sub-skills) that teach a coding agent how Azure work gets done, plus MCP server configuration that wires the Azure MCP Server (npm @azure/mcp) into the host for live execution. The skills cover preparation, validation, deployment, diagnostics, cost, Kubernetes, storage, messaging, Kusto, Entra identity, and Microsoft Foundry, including nested sub-skills like the Foundry fine-tuning pipeline with offline data validators. The repo is an automated sync mirror of microsoft/GitHub-Copilot-for-Azure: bot commits push plugin files here, and contributions are directed upstream. It targets Claude Code, GitHub Copilot (CLI, VS Code, IntelliJ), Cursor, Codex CLI, Gemini CLI, and OpenCode via the APM installer.

The Good

Demand at a scale no other reviewed vendor pack reaches. The skills.sh API reports 40 registry entries under microsoft/azure-skills totaling 12,209,310 all-time installs: microsoft-foundry leads at 560,320, and 13 skills sit between 540,750 and 556K each (azure-diagnostics 553,657, azure-prepare 553,074, azure-ai 552,989). That is 12.2M installs against 1,434 stars and 242 forks, the widest absolute star-to-install gap GearScope has measured, ahead of prisma/skills (1.69M installs on 53 stars).

The verbatim-guide test passed on the first try, both directions. The finetuning sub-skill documents python scripts/validate/validate_sft.py data.jsonl, so we ran exactly that. On valid data: exit 0, "Data is valid for SFT fine-tuning!", with computed token statistics (avg 16, min 8, max 25). On malformed data (an invalid banana role, a non-JSON line, a missing messages field, an empty array): exit 1 with five line-level diagnostics, each naming the record, the message index, and the exact problem ("Invalid role 'banana' (expected: {'system', 'user', 'tool', 'assistant'})", "Line 3: Invalid JSON (Expecting value: line 1 column 1)"). The sibling data_stats.py also runs offline and prints role distributions. This is the strongest offline functional evidence a doc-heavy pack can produce.

The guidance layer is engineered, not prompted. Every skill frontmatter carries explicit routing ("USE ONLY when... DO NOT USE FOR... WHEN: ...") that names which sibling skill to defer to. Hard guardrails are concrete: azure-prepare forbids generating SQL Server administratorLogin credentials anywhere in Bicep, forbids deleting the user's workspace, and requires ask_user before destructive actions. A cross-skill file contract (.azure/deployment-plan.md, written by azure-prepare, consumed by azure-validate and azure-deploy) ties the pipeline together. Progressive disclosure is real: 5,081 lines across the 38 SKILL.md files (median 108) front 834 reference files totaling 80,512 lines, a 16:1 ratio.

Release discipline and version lockstep. 143 changelog entries with upstream PR links; the latest tag v1.2.36, the plugin.json version, the changelog head, and the version Claude Code reports after install all read 1.2.36. The npm runtime matches too: npm view @azure/mcp version and the MCP handshake serverInfo both report 3.0.0-beta.39.

Every install route tested worked, byte-identically. The README-verbatim npx skills add command landed all 28 skills into an isolated ~/.agents/skills, and recursive diffs against the clone were empty (including the whole microsoft-foundry sub-tree). The Claude flow (claude plugin marketplace add microsoft/azure-skills, then install) succeeded and reported v1.2.36 enabled, with 28 skills in the plugin cache. Both individual plugin manifests pass claude plugin validate --strict.

The Bad

Live skills still route to retired skills, 8 references across 3 skills. Upstream deliberately retired azure-rbac (PR #2779) and azure-hosted-copilot-sdk (PR #2556), per the changelog. But azure-prepare, the pack's third-most-installed skill (553,074 installs), still tells the agent to invoke azure-observability in four places in references/research.md (also retired) and azure-nodejs-production twice. azure-app-onboard's handoff protocol routes to azure-rbac, and both azure-app-onboard and its prereq skill route to azure-hosted-copilot-sdk. An agent following these references finds nothing to invoke.

Six stale registry entries totaling 1.26M installs point at skills that are gone. Cross-referencing all 40 skills.sh entries against the repo: azure-rbac (486,591 installs), azure-hosted-copilot-sdk (438,447), azure-cost-optimization (209,325), azure-observability (98,306), azure-postgres (27,848), plus five meta skills (sensei, skill-authoring, markdown-token-optimizer, file-test-bug, analyze-test-run, about 1K each) have no skill directory in the current tree. We installed azure-rbac by name to see what a user gets: the skills CLI printed "Found 31 skills / Installing all 31 skills" and silently installed everything, with zero warning that the requested skill does not exist.

The README names skills that are not in the repo. Lines 16 and 19 list azure-hosted-copilot-sdk and azure-rbac among the shipped skills. The README also describes a separate "Foundry MCP" server, but both .mcp.json files (repo root and plugin payload) wire exactly one server: azure. Foundry arrives as a toolset inside @azure/mcp (visible in tools/list), so the capability exists but the server framing does not match the configuration. The "200+ structured tools across 40+ Azure services" claim is similarly loose: tools/list returns 68 registered tools; the larger count presumably includes sub-commands nested inside toolsets, which we could enumerate but not fully expand without credentials.

The Claude marketplace manifest fails strict validation, and telemetry is understated. claude plugin validate . --strict fails on the marketplace file with "No marketplace description provided" (the Cursor marketplace has one; the Claude one does not). Separately, the plugin registers a PostToolUse hook that runs on every tool use in Claude Code, Cursor, and Copilot. The hook is well-built: it only reports events matching azure-skills paths or Azure MCP tool names, it sends no file contents (skill name, version, session id, client name, relative path), and it honors AZURE_MCP_COLLECT_TELEMETRY=false in-script. But the README telemetry section discusses only the MCP server env var and never discloses the hook's existence, and each tracked event spawns npx @azure/mcp synchronously (about 0.5s warm on our host).

Smaller hygiene gaps. Three azure-app-onboard sub-skill SKILL.md files carry no license or version frontmatter while all 35 siblings do; the finetuning sub-skill is stamped "0.0.0-placeholder"; gemini-extension.json reads 1.0.1 against plugin 1.2.36; and the second in-repo plugin (azure-kusto-graph-skills, 3 Kusto graph skills) appears in no README skill list. One tooling caveat outside Microsoft's control: npx skills add ... -a hermes-agent -g resolved the global directory to the real home rather than the isolated $HOME we set, so our test polluted a live profile with 28 skills, which we removed immediately. Hermes users should install without -g or check the landing path.

Smoke Test Results

Host-based hands-on testing on macOS 26.5.2 aarch64 (Node 24.13.1, Claude Code 2.1.152): fresh shallow clone at tag v1.2.36, structural validation with stdlib Python, registry installs in isolated HOME directories, and MCP probes through the reusable stdio client. Live Azure operations were out of scope (no subscription); auth-gated paths were exercised with empty credentials, which returns structured errors rather than hangs.

Run A - Fresh clone, structural validation

$ git clone --depth 1 https://github.com/microsoft/azure-skills.git /tmp/azure-skills-review
βœ… 23MB clone, tag v1.2.36, LICENSE (MIT) present

$ ls skills/ | wc -l
βœ… 28 top-level skill dirs

$ find skills -name "SKILL.md" | wc -l
βœ… 38 (28 top-level + 10 nested sub-skills)

$ python3 azsk-structure.py # frontmatter parse, name==dir, descriptions, 9 manifests
βœ… all frontmatter parses, names match dirs, 9/9 JSON manifests valid

$ python3 azsk-refs.py # resolve every references/ and scripts/ path, incl. ../ sibling routes
βœ… 450 local cross-references, 0 broken

$ diff -r skills/ .github/plugins/azure-skills/skills/
βœ… Copilot-plugin mirror byte-identical to the canonical tree

$ grep README-named skills vs skills/ dirs
❌ README lists azure-rbac and azure-hosted-copilot-sdk; neither exists in the repo

$ grep retired skill names across live skill bodies
❌ 8 dead routes in 3 skills (azure-prepare, azure-app-onboard, azure-app-onboard-prereq)

Pass rate: 7 of 9. Both failures are documentation drift after upstream retirements, not broken packaging; every file that exists is wired correctly.

Full structural log β†’

Run B - Sandbox with deps preinstalled

$ npm view @azure/mcp version
βœ… 3.0.0-beta.39

$ python3 mcp-stdio-client.py --timeout 90 npx -y @azure/mcp@latest server start
βœ… initialize: serverInfo "Azure MCP Server" 3.0.0-beta.39, protocol 2024-11-05

$ tools/list
βœ… 68 tools (azure, foundry, azd, arm, aks, appservice, role, kusto, ...), all with inputSchema

$ HOME=$ISO npx skills add https://github.com/microsoft/azure-skills/tree/main/.github/plugins/azure-skills/skills -a github-copilot -g -y
βœ… 28 skills copied to ~/.agents/skills (README-verbatim command, first try)

$ diff -r $ISO/.agents/skills/microsoft-foundry skills/microsoft-foundry
βœ… byte-identical, including the finetuning sub-tree

$ claude plugin marketplace add microsoft/azure-skills
βœ… Successfully added marketplace: azure-skills

$ claude plugin install azure@azure-skills
βœ… v1.2.36 installed and enabled; 28 skills in the plugin cache

$ claude plugin validate .github/plugins/azure-skills --strict
βœ… Validation passed

$ claude plugin validate .github/plugins/azure-kusto-graph-skills --strict
βœ… Validation passed

$ claude plugin validate . --strict
❌ marketplace.json: "No marketplace description provided" (strict treats the warning as an error)

Pass rate: 9 of 10. Every functional install route works first try and lands byte-identical content; the sole failure is the missing marketplace description field.

Full with-deps log β†’

Run C - Functional verification

$ python3 scripts/validate/validate_sft.py valid-sft.jsonl # 2 well-formed records
βœ… exit 0, "Data is valid for SFT fine-tuning!", token stats avg 16 / min 8 / max 25

$ python3 scripts/validate/validate_sft.py bad-sft.jsonl # invalid role, bad JSON, missing fields
βœ… exit 1, five line-level errors naming record, message index, and exact defect

$ python3 scripts/validate/data_stats.py valid-sft.jsonl
βœ… exit 0, role distribution (user 2, assistant 2, system 1), 0 parse errors

$ mcp call: foundry toolset, list_commands, no credentials
βœ… fails fast with a structured ChainedTokenCredential error (no hang); documented az login prerequisite

$ mcp call: documentation toolset, list_commands, no credentials
βœ… isError: false; the toolset responds locally without auth

$ HOME=$ISO3 npx skills add microsoft/azure-skills azure-rbac -a github-copilot -y
❌ requested skill silently ignored: "Found 31 skills / Installing all 31 skills", no warning

Functional pass rate: 5 of 6. The offline validators and the MCP layer behave exactly as documented, including clean failure modes without credentials. The one failure is the stale-registry trap: a 486K-install entry that no longer resolves to a skill, and a CLI fallback that installs everything without saying why.

Full functional log β†’

What the runs tell you

The packaging and the offline tooling are in better shape than the documentation: every install route is byte-faithful and the validators give real diagnostics, while the README, the marketplace description, and 6 registry entries trail the retirement decisions recorded in the changelog. For an agent consumer, the load-bearing risk is the 8 dead routes in azure-prepare and azure-app-onboard, which will produce "skill not found" moments mid-workflow until Microsoft sweeps them.

Setup Walkthrough

  1. Meet the prerequisites: Node.js 18+ on PATH (npx starts the MCP server), and for live Azure work, az login (plus azd auth login for deployment workflows). The skills and validators themselves need only Python 3 stdlib.
  2. Pick an install route. Claude Code: /plugin install azure@claude-plugins-official, or add this repo as a marketplace. GitHub Copilot, Cursor, Codex, Gemini each have a documented one-liner in the README; APM covers six harnesses with apm install microsoft/azure-skills.
  3. For a bare skills install into any agent, the README-verbatim command works: npx skills add https://github.com/microsoft/azure-skills/tree/main/.github/plugins/azure-skills/skills -a github-copilot -g -y (swap the agent id; drop -g for a project-local install).
  4. Verify: the README suggests asking "What Azure services would I need to deploy this project?" (skills layer) and "List my Azure resource groups" (MCP layer, requires auth).
  5. If you care about telemetry, set AZURE_MCP_COLLECT_TELEMETRY=false; this also disables the PostToolUse usage hook. Sovereign cloud users add --cloud AzureChinaCloud or AzureUSGovernment to the MCP server args, which the README covers with per-cloud auth commands.

Alternatives

  1. awslabs/mcp - the AWS counterpart: 61 official MCP servers delivering execution without an equivalent curated skills layer. Prefer it if your estate is AWS.
  2. googleworkspace/cli - the Google-side analogue: one Rust CLI plus 95 generated Agent Skills with anti-drift regeneration. Prefer it for Google Workspace automation.
  3. Bare Azure MCP Server (npx -y @azure/mcp@latest server start) - if you only want the 68-tool execution layer and none of the guidance, wire the server directly and skip the plugin, at the cost of losing the workflows and guardrails.
// review provenance
reviewed by
GearScope
tested
2026-08-30 · macOS (Apple Silicon)
last verified
2026-08-30
depth
HANDS-ON
sponsorship
none, ever
// share this review
// feedback
was this review helpful?

Don't install your next skill blind.

Every week: the shortlist of skills worth installing β€” and the ones to skip β€” from 100+ hands-on tests. No spam, no affiliate links.