Skip to content

chore(mcp): Bump @azure/mcp to 3.0.0 - #759

Merged
jonathan-vella merged 5 commits into
test/azure-mcp-3-e2efrom
chore/bump-azure-mcp-3.0.0
Oct 13, 2026
Merged

jonathan-vella merged 5 commits into
test/azure-mcp-3-e2efrom
chore/bump-azure-mcp-3.0.0

Conversation

@jonathan-vella

@jonathan-vella jonathan-vella commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

Description

Moves the pinned @azure/mcp from 2.0.5 to 3.0.0 so the devcontainer startup check reports CURRENT.
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

  • 💰 MCP integration enhancement
  • ⚙️ Configuration/workflow change

Token / latency impact

  • NO

Changes Made

Files modified:

  • .devcontainer/configure-mcp.mjs, .vscode/mcp.json: pin @azure/mcp@3.0.0
  • apex-azure-validate/references/policy-validation.md: policy_assignment_list with subscription
  • apex-azure-diagnostics/SKILL.md, references/aks/general-diagnostics.md: applens and monitor log query parameters
  • tools/tests/exec-plans/active/azure-skills-plugin-alignment.md: version mentions

Validation

  • check:mcp-release reports CURRENT; validate:agents, validate:skills, lint:json, lint:mcp-config, lint:md and the devcontainer and upstream-alignment tests pass
  • Live check: npx @azure/mcp@3.0.0 tools list (404 commands) diffed against 2.0.5 (235). The corrected policy, applens and
    monitor-log-query parameters all exist in 3.0.0. group list, redis list and subscription list lost only
    --auth-method/retry options, which no call site uses.
  • Finding: extension azqr is listed only when azqr 3.0.0+ is installed locally (2.0.5 listed it always). Prerequisite
    added to the compliance and cost-optimization azqr docs. azqr is not installed in this devcontainer.
  • Fix: the dev container now installs a pinned, checksum-verified azqr 4.2.0 (.devcontainer/install-azqr.sh, called from
    post-create.sh, optional on failure). Verified: with azqr on PATH, tools list shows extension azqr
    (--resource-group, --subscription, --tenant). New test_azqr_install.mjs; the manifest-shape test now covers azqr.
  • Cleanup: removed the mcp_azure-mcp_azd references; neither 2.0.5 nor 3.0.0 has an azd tool.
  • Docs: apex-docs#35.

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.
Copilot AI balanced review requested due to automatic review settings October 13, 2026 10:44

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

Comment thread .vscode/mcp.json
"args": [
"-y",
"@azure/mcp@2.0.5",
"@azure/mcp@3.0.0",

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

Comment on lines +141 to 144
subscription: "<subscription-id>"
workspace: "<workspace-name-or-id>"
table: "<table>"
query: "<KQL-query>"

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).
@jonathan-vella
jonathan-vella merged commit 2fc6451 into test/azure-mcp-3-e2e Oct 13, 2026
1 check passed
@jonathan-vella
jonathan-vella deleted the chore/bump-azure-mcp-3.0.0 branch October 13, 2026 17:56
jonathan-vella added a commit that referenced this pull request Oct 16, 2026
* 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants