Repository navigation
chore(mcp): Bump @azure/mcp to 3.0.0 - #759
Conversation
3.0.0 rejects unknown tool parameters, so align the three call sites that used names absent from the 3.0.0 schema (policy, applens, monitor log query), then move the pin in both configure-mcp.mjs and .vscode/mcp.json so the release check reports CURRENT. The 3.0.0 schema was checked against the published command reference; a live tools list was not possible in this environment.
There was a problem hiding this comment.
🟡 Changes recommended
A required Monitor parameter is missing, and two legacy command names remain incompatible with the strict 3.0.0 schema.
2 open findings
What changed in this PR
Updates Azure MCP to 3.0.0 and migrates documented calls toward its stricter schemas.
Changes:
- Pins Azure MCP 3.0.0.
- Updates Policy, AppLens, and Monitor examples.
- Refreshes plugin-alignment documentation.
| File | Description |
|---|---|
.devcontainer/configure-mcp.mjs |
Updates the default MCP version. |
.vscode/mcp.json |
Pins the workspace server to 3.0.0. |
.github/skills/apex-azure-validate/references/policy-validation.md |
Updates Policy invocation syntax. |
.github/skills/apex-azure-diagnostics/SKILL.md |
Updates AppLens and Monitor calls. |
.github/skills/apex-azure-diagnostics/references/aks/general-diagnostics.md |
Updates AKS AppLens parameters. |
tools/tests/exec-plans/active/azure-skills-plugin-alignment.md |
Records the new pinned version. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
| "args": [ | ||
| "-y", | ||
| "@azure/mcp@2.0.5", | ||
| "@azure/mcp@3.0.0", |
There was a problem hiding this comment.
Fixed in a46f251: the strict-parameter call sites were corrected for 3.0.0 and the .vscode/mcp.json entry matches the pin in .devcontainer/configure-mcp.mjs (npm run check:mcp-release reports CURRENT).
| subscription: "<subscription-id>" | ||
| workspace: "<workspace-name-or-id>" | ||
| table: "<table>" | ||
| query: "<KQL-query>" |
There was a problem hiding this comment.
Not applying this one. The live 3.0.0 schema for monitor_workspace_log_query (additionalProperties: false) accepts only hours, limit, query, subscription, table, tenant and workspace; --resource-group was removed after 2.0.5, and 3.0.0 rejects unknown parameters. Adding it would make the documented call fail. The schema came from npx @azure/mcp@3.0.0 tools list and the monitor --learn output.
The live 3.0.0 tools list no longer includes extension azqr unless azqr 3.0.0 or later is installed locally, while 2.0.5 listed it unconditionally. Document the prerequisite and the direct CLI fallback.
Azure MCP 3.0.0 lists extension_azqr only when azqr 3.0.0 or later is on PATH. Pin azqr 4.2.0 for amd64 and arm64 in download-checksums.json and install it from post-create.sh with SHA-256 verification. The install is optional so a failed download does not break container creation.
Neither Azure MCP 2.0.5 nor 3.0.0 exposes an azd tool. Point schema validation at the published azure.yaml schema and drop the tool-table row.
…vice Review feedback on #759: two call sites still used legacy command names. The live server in namespace mode lists resourcehealth_availability-status_get and appservice_webapp_diagnostic_diagnose (the latter requires app, detector-id and resource-group).
* chore(scripts): Refresh AVM module index and Azure deprecations The Azure Updates feed URL now redirects to HTML, so the fetcher silently found nothing. Point it at the releasecommunications RSS endpoint, filter on the Retirements category, dedupe by link, add retired/upcoming status, and add the Redis and Linux Consumption retirements. * chore(mcp): Bump @azure/mcp to 3.0.0 3.0.0 rejects unknown tool parameters, so align the three call sites that used names absent from the 3.0.0 schema (policy, applens, monitor log query), then move the pin in both configure-mcp.mjs and .vscode/mcp.json so the release check reports CURRENT. The 3.0.0 schema was checked against the published command reference; a live tools list was not possible in this environment. * feat(agents): Use Azure MCP azureterraform for Terraform lookup Point the planner, Terraform CodeGen and the shared references at the Azure MCP azureterraform commands (avm versions, avm get, azurerm get, azapi get) for module versions, READMEs and provider docs, with the Registry API as fallback. The AVM module index and cache stay authoritative for module existence, lifecycle and resource-type mapping, and the validators are unchanged. Only a documented module-not-found for the exact module name counts as unpublished; any other lookup error is a verification failure. The tool output shapes were taken from the published 3.0.0 command reference and not yet probed at runtime. * feat(scripts): Ship ALZ Corp default governance baseline Replace the committed real-tenant baseline with an offline-generated ALZ Corp default: the root, landing_zones and corp archetypes of the pinned platform/alz/2026.10.0 library, resolved with built-in definitions from a pinned azure-policy commit. The generator reuses discover.discover through an offline REST adapter so classification matches a live run. discover.py now evaluates the initiative member pattern if(contains(list, type), effect, 'Disabled') and treats enforceSetting like Append, so these definitions no longer leave discovery PARTIAL. Assignments shipped as DoNotEnforce are kept as informational. The renderer labels the result as assumed governance and stamps the render time, and the loader gains --alz-default. * docs(skills): Document assumed ALZ Corp default governance path Phase 0.45 offers the user a choice between live discovery and the shipped ALZ Corp default when the target subscription is absent from the baseline. Choosing the default is recorded as assumed, labelled in the artifacts, and keeps the Step 3.5 review mandatory. The discovery instructions carry the single exception to the no-assumptions rule. * docs(skills): Add trailing newline to baseline-check reference * docs(skills): Note azqr 3.0.0 requirement for extension_azqr The live 3.0.0 tools list no longer includes extension azqr unless azqr 3.0.0 or later is installed locally, while 2.0.5 listed it unconditionally. Document the prerequisite and the direct CLI fallback. * docs(skills): Record probed azureterraform response shapes Probed against @azure/mcp 3.0.0: avm versions returns status 400 with an ArgumentException "not found in available modules" for an unpublished, nonexistent or malformed name; avm get returns 422 for an unknown version; and azurerm get returns 200 with empty arguments for an unknown resource type. Document these so agents only treat the first as "unpublished". * feat(devcontainer): Install pinned azqr for Azure MCP extension_azqr Azure MCP 3.0.0 lists extension_azqr only when azqr 3.0.0 or later is on PATH. Pin azqr 4.2.0 for amd64 and arm64 in download-checksums.json and install it from post-create.sh with SHA-256 verification. The install is optional so a failed download does not break container creation. * docs(skills): Remove references to the nonexistent azd MCP tool Neither Azure MCP 2.0.5 nor 3.0.0 exposes an azd tool. Point schema validation at the published azure.yaml schema and drop the tool-table row. * refactor(skills): Remove AVM authoring requirements reference The 218-line AVM certification checklist targets authors of AVM modules, which APEX never writes; it only consumes them. Nothing but the skill's own table and index referenced it, and the public AVM specification remains the source. Keep the provider compatibility matrix, which the azureterraform tools cannot supply. * docs(skills): Use 3.0.0 command names for Resource Health and App Service Review feedback on #759: two call sites still used legacy command names. The live server in namespace mode lists resourcehealth_availability-status_get and appservice_webapp_diagnostic_diagnose (the latter requires app, detector-id and resource-group). * fix(scripts): Pick the real retirement date and test the deprecation fetcher Review feedback on #761. The extractor read the first date in the description, which is often an earlier milestone, so two feed entries got a wrong sunset date and status. It now prefers a date in the title, skips milestone dates such as "Beginning on ..." unless their own sentence announces the retirement, and parses dates in UTC. Export parseFeed, extractSunsetDate and mergeDeprecations and cover the comma-separated Retirements category, link-based dedupe, status stamping and title versus description conflicts with an RSS fixture test. Regenerate the data. * docs(skills): Document assumed ALZ Corp default governance path Phase 0.45 offers the user a choice between live discovery and the shipped ALZ Corp default when the target subscription is absent from the baseline. Choosing the default is recorded as assumed, labelled in the artifacts, and keeps the Step 3.5 review mandatory. The discovery instructions carry the single exception to the no-assumptions rule. * fix(skills): Correct azd and azqr tool guidance from live Azure MCP 3.0.0 probes End-to-end testing against a live subscription showed two wrong claims. - Azure MCP does expose an azd tool in the default namespace mode (2.0.5 and 3.0.0): validate_azure_yaml, error_troubleshooting and provision_common_error. It validates azure.yaml and returns troubleshooting guidance but does not run azd. Restore the validate_azure_yaml step and list the tool accurately. - extension_azqr is exposed only with --mode all and azqr on PATH, not in the default namespace mode used by .vscode/mcp.json. Say so in both quick-review references; the azqr CLI remains the default path. Also make the azqr installer tests independent of a host azqr. A real 4.2.0 on PATH made the installer exit early and failed two tests. * fix(scripts): Make the SK-14 fixture parser tolerate CRLF working copies The SK-14 fixtures test reads its own source and matches String.raw fixtures with LF-only regexes. A working tree checked out with CRLF line endings (the repo requires LF, but 170 tracked files here were CRLF) fails with "Missing Node fixture", so the whole test:tool-contracts step fails. Normalize the source to LF before parsing. Passes with both CRLF and LF copies. * fix(skills): Make CLI the default for azqr, az graph and installs Azure MCP does not expose the extension namespace in its default namespace mode, so extension_azqr, extension_cli_generate and extension_cli_install calls in the skills could never run in the editor. - azqr: document the CLI with its real flags (--subscription-id, --resource-group, --json, --output-name), verified against azqr 4.2.0. The old examples used --subscription and --output json, which it rejects. - Resource Graph: use vetted az graph query patterns; extension_cli_generate is mentioned only as optional. - Installs: link the official az and azd install guides. - Add an opt-in azure-mcp-extension server to the devcontainer README. It exposes exactly the three tools with --tool and --read-only, verified live. - validate-mcp-config checks that server when present, with tests. * Revert "fix(skills): Make CLI the default for azqr, az graph and installs" This reverts commit e2cbd98. * docs(skills): Correct azqr notes and CLI flags after re-probing default mode Re-probing showed the earlier claim was wrong: in the default namespace mode Azure MCP 2.0.5 and 3.0.0 do expose extension_cli_generate and extension_cli_install as root tools, and extension_azqr whenever azqr 3.0.0 or later is on PATH. All three worked live. The preceding commit that moved the skills to CLI-first and added an optional server is reverted. Fix the azqr notes accordingly, and correct the CLI fallback flags to the ones azqr 4.2.0 accepts (--subscription-id, --json, --output-name). * feat(mcp): Validate Azure MCP tool references against a committed snapshot Add tools/registry/azure-mcp-tools.json, a deterministic snapshot of the default-mode tools, commands and parameters of the pinned @azure/mcp server. refresh:mcp-tool-snapshot regenerates it from a live server (needs network, the npm allow-remote opt-in and azqr on PATH) and replaces it atomically only on success. Two consecutive refreshes produce identical bytes. validate:mcp-tool-refs runs offline in both validate suites. It fails on an unknown tool, command or parameter in .github and tools/apex-prompts markdown, treats parameter names as case sensitive, honours a mcp-ref:ignore marker, and fails when the snapshot version differs from .vscode/mcp.json or .devcontainer/configure-mcp.mjs. First run found two wrong best-practices command names (get_bestpractices should be get_azure_bestpractices_get); both are fixed. * feat(scripts): add bounded Azure SLA lookup helper Add azure-sla-section.mjs to print one service section from the official Online Services SLA document, with unit tests and npm scripts. Document the SLA lookup rule and the one-URL-per-fetch rule in research-workflow.md. Fetching azure.microsoft.com SLA pages returned a very large, repeated licensing index that stayed in the chat. * docs(skills): Document Azure MCP tool-name prefixes and skill-by-path fallback A run log showed the model calling mcp_azure_mcp_ser_<tool> while the skills write mcp_azure-mcp_<tool>. The server reports its name as "Azure MCP Server" on both 2.0.5 and 3.0.0 and VS Code derives the prefix from it, so this is not an MCP 3 change and nothing broke: the tools were found with tool_search. - apex-azure-defaults: state the convention once and say to match on <tool>. - validate:mcp-tool-refs: accept both prefixes, skip a prefix followed by a <placeholder>, and cover both with tests. - agent operating frame: when the skill tool says a skill is not found, read .github/skills/<name>/SKILL.md by path. The log showed the tool's list stopping at apex-iac-common, so later skills can be missing. * fix(scripts): Accept the decision_log entries apex-recall actually writes validate-session-state required id, step (number), agent, title, choice and rationale on every decision_log entry. apex-recall decide, complete-step and the risk gate write { decision, timestamp, rationale?, step? } with step as a string key such as "1" or "3_5"; only the risk gate adds the structured fields. The session-state JSON schema already allows this. The validator had never seen a real project, so a normal run (nordic-foods) failed on every entry. Require a decision string, or both title and choice, and validate id, step (any step key, as a number or string) and alternatives when present. Add tests that fail against the old validator. * fix(instructions): Cover aliased rm/mv/cp and warn on interactive aliases A dotfiles alias (rm='rm -iv') made a plain `rm path` call in an agent terminal hang waiting for a confirmation prompt it never got, then dumped ~55KB of terminal history into chat when the tool polled the backgrounded process. The existing rule only forbade an explicit -i flag. - no-interactive-shell.instructions.md: add sub-rule 1a — prefer -f (which overrides an aliased -i) or `command rm` to bypass the alias, and treat a stalled rm/mv/cp with no -f as a likely prompt rather than polling it. - post-start.sh: warn once per container start if rm, mv or cp resolve to an interactive alias, since post-start.sh itself is non-interactive and must probe .bashrc's aliases via `bash -i -c`. * docs(agents): apply Step 2 restart lessons to Architect, Orchestrator and review guidance * docs(skills): apply nordic-foods lessons to templates, gates and Bicep patterns * feat(scripts): add review-input, readiness and policy-status checks * feat(mcp): cascade stale steps on reopen and gate Step 2 completion * feat(scripts): show stale steps in handoff and add changelog with migration steps * feat(scripts): check phase order and private endpoint dependencies in the contract * fix(scripts): strip unterminated tags in the SLA docx parser * feat(agents): add a new-project intake prompt for the Orchestrator * feat(agents): add an Eventdesk Orchestrator intake prompt Fixed brief; the only intake question is Bicep or Terraform. * feat(instructions): align the security baseline with the ALZ Corp floor Add the ALZ Corp inherited Deny floor, precedence and the stricter-than-ALZ list to the baseline. Scan for Key Vault RBAC, soft delete and purge protection, NIC IP forwarding and hybrid or classic resource types. Scope zone redundancy and az_posture to production. The reliability skill still reports it in every environment. * feat(agents): price with Azure MCP pricing_get only, one decision per call The cost-estimate subagent drops all azure-resource-manager-mcp tools and uses azure-mcp/pricing. ARM MCP keeps only the CostManagement toolset for the cost-optimization skill. The direct-API fallback helper accepts pricing_get empty results. Architect candidate_sets calls are split per decision with meter hints. * fix(scripts): price the full Step 2 scope in one deterministic run Add cost-estimate.mjs (preflight, publish, validate) and its schema so the worker stops running inline node -e commands that stall on Bash history expansion. manifest_path mode accepts supplemental_resources and manifest_usage and writes back only manifest-owned services. The retail evidence helper accepts missing_tier_metadata when pricing_get strips tierMinimumUnits. safe-shell flags double-quoted node -e with a bang. The debug-log profiler reads VS Code JSONL logs and reports union wall time, learn calls and stalls. --------- Co-authored-by: Jonathan Vella <jonathan-vella@users.noreply.github.com>


Description
Moves the pinned
@azure/mcpfrom 2.0.5 to 3.0.0 so the devcontainer startup check reportsCURRENT.3.0.0 rejects unknown tool parameters, so the call sites that used names absent from the 3.0.0 schema are aligned first.
Type of Change
Token / latency impact
Changes Made
Files modified:
.devcontainer/configure-mcp.mjs,.vscode/mcp.json: pin@azure/mcp@3.0.0apex-azure-validate/references/policy-validation.md:policy_assignment_listwithsubscriptionapex-azure-diagnostics/SKILL.md,references/aks/general-diagnostics.md: applens and monitor log query parameterstools/tests/exec-plans/active/azure-skills-plugin-alignment.md: version mentionsValidation
check:mcp-releasereportsCURRENT;validate:agents,validate:skills,lint:json,lint:mcp-config,lint:mdand the devcontainer and upstream-alignment tests passnpx @azure/mcp@3.0.0 tools list(404 commands) diffed against 2.0.5 (235). The corrected policy, applens andmonitor-log-query parameters all exist in 3.0.0.
group list,redis listandsubscription listlost only--auth-method/retry options, which no call site uses.extension azqris listed only when azqr 3.0.0+ is installed locally (2.0.5 listed it always). Prerequisiteadded to the compliance and cost-optimization azqr docs. azqr is not installed in this devcontainer.
.devcontainer/install-azqr.sh, called frompost-create.sh, optional on failure). Verified: with azqr onPATH,tools listshowsextension azqr(
--resource-group,--subscription,--tenant). Newtest_azqr_install.mjs; the manifest-shape test now covers azqr.mcp_azure-mcp_azdreferences; neither 2.0.5 nor 3.0.0 has an azd tool.