[Onboard] Support MCP Tools for Azure Terraform#2382
[Onboard] Support MCP Tools for Azure Terraform#2382liuwuliuyun wants to merge 5 commits intomainfrom
Conversation
2027c44 to
e4b41f5
Compare
|
AOT Analysis: |
|
Spelling Check: |
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds a new Azure Terraform area to the Azure MCP Server, providing tools for AzureRM/AzAPI documentation lookup, Azure Verified Modules (AVM) discovery, aztfexport command generation, and conftest policy validation.
Changes:
- Introduces a new
Azure.Mcp.Tools.AzureTerraformtool project (commands, services, models, options) and registers it in the server. - Adds unit tests for new command/service behaviors and adds the new test project to the solution.
- Updates server docs/metadata (commands list, e2e prompts, consolidated tools, README), CODEOWNERS, spelling dictionary, and changelog.
Reviewed changes
Copilot reviewed 80 out of 80 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/Conftest/ConftestWorkspaceValidationCommandTests.cs | Adds command tests for conftest workspace validation tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/Conftest/ConftestServiceTests.cs | Adds unit tests for conftest command generation and install help |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/Conftest/ConftestPlanValidationCommandTests.cs | Adds command tests for conftest plan validation tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AzureRMDocsServiceParsingTests.cs | Adds parsing tests for AzureRM markdown extraction helpers |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AzureRMDocsGetCommandTests.cs | Adds command tests for AzureRM docs tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/Azure.Mcp.Tools.AzureTerraform.UnitTests.csproj | Introduces new unit test project and dependencies |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AztfexportServiceTests.cs | Adds tests for aztfexport command generation and install help |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AztfexportResourceGroupCommandTests.cs | Adds command tests for aztfexport resource-group tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AztfexportResourceCommandTests.cs | Adds command tests for aztfexport resource tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AztfexportQueryCommandTests.cs | Adds command tests for aztfexport query tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AzApiDocsServiceFormatTests.cs | Adds tests for AzAPI HCL formatting output |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AzAPIDocsGetCommandTests.cs | Adds command tests for AzAPI docs tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AvmVersionListCommandTests.cs | Adds command tests for AVM version listing tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AvmModuleListCommandTests.cs | Adds command tests for AVM module listing tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AvmDocumentationGetCommandTests.cs | Adds command tests for AVM documentation retrieval tool |
| tools/Azure.Mcp.Tools.AzureTerraform/tests/Azure.Mcp.Tools.AzureTerraform.UnitTests/AvmDocsServiceParsingTests.cs | Adds parsing tests for AVM CSV and repo URL mapping |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/IConftestService.cs | Adds interface for conftest availability check and command generation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/IAzureRMDocsService.cs | Adds interface for AzureRM docs retrieval |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/IAztfexportService.cs | Adds interface for aztfexport availability check and command generation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/IAzApiExamplesService.cs | Adds interface for AzAPI terraform example retrieval |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/IAzAPIDocsService.cs | Adds interface for AzAPI docs/schema retrieval |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/IAvmDocsService.cs | Adds interface for AVM listing/version/docs retrieval |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/ConftestService.cs | Implements conftest command generation, install help, and policy args |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AzureRMDocsService.cs | Implements AzureRM markdown fetch + parsing (summary/args/attrs/examples/notes) |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AztfexportService.cs | Implements aztfexport command generation and install help |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AzApiExamplesService.cs | Implements fetching AzAPI Terraform samples from template-reference-generator |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AzAPIDocsService.cs | Implements schema formatting for AzAPI resources using Bicep schema generator |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AvmJsonContext.cs | Adds source-gen JSON context for GitHub release deserialization |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AvmDocsService.cs | Implements AVM module CSV parsing, caching, GitHub releases/README retrieval |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/Conftest/ConftestWorkspaceValidationOptions.cs | Adds option model for conftest workspace command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/Conftest/ConftestPlanValidationOptions.cs | Adds option model for conftest plan command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AzureTerraformOptionDefinitions.cs | Defines System.CommandLine options for all AzureTerraform tools |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AzureRMDocsOptions.cs | Adds options model for AzureRM docs command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AztfexportResourceOptions.cs | Adds options model for aztfexport resource command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AztfexportResourceGroupOptions.cs | Adds options model for aztfexport resource-group command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AztfexportQueryOptions.cs | Adds options model for aztfexport query command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AzAPIDocsOptions.cs | Adds options model for AzAPI docs command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AvmVersionOptions.cs | Adds options model for AVM versions command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AvmModuleListOptions.cs | Adds options model for AVM list command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Options/AvmDocumentationOptions.cs | Adds options model for AVM get-docs command |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/InstallationMethod.cs | Adds model for install methods in tool responses |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/InstallationHelp.cs | Adds model for install help in tool responses |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/GitHubRelease.cs | Adds GitHub release DTO for AVM versions |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/ConftestCommandResult.cs | Adds response model for conftest command generation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AzureTerraformTelemetryTags.cs | Adds telemetry tag constants for the AzureTerraform area |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AzureRMDocsResult.cs | Adds response model for AzureRM docs tool |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AztfexportCommandResult.cs | Adds response model for aztfexport command generation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AzAPIExample.cs | Adds model for AzAPI sample snippets |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AzAPIDocsResult.cs | Adds response model for AzAPI docs/schema tool |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AvmVersionListResult.cs | Adds response model for AVM versions tool |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AvmVersion.cs | Adds AVM version DTO |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AvmModuleListResult.cs | Adds response model for AVM list tool |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AvmModule.cs | Adds AVM module DTO |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AvmDocumentationResult.cs | Adds response model for AVM get-docs tool |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/AttributeDetail.cs | Adds model for parsed AzureRM attributes |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Models/ArgumentDetail.cs | Adds model for parsed AzureRM arguments (incl. block args) |
| tools/Azure.Mcp.Tools.AzureTerraform/src/GlobalUsings.cs | Adds global usings for System.CommandLine + MCP core option helpers |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/Conftest/ConftestWorkspaceValidationCommand.cs | Adds conftest workspace command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/Conftest/ConftestPlanValidationCommand.cs | Adds conftest plan command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AzureTerraformJsonContext.cs | Adds source-gen JSON context for tool responses |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AzureRMDocsGetCommand.cs | Adds AzureRM docs command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AztfexportResourceGroupCommand.cs | Adds aztfexport resource-group command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AztfexportResourceCommand.cs | Adds aztfexport resource command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AztfexportQueryCommand.cs | Adds aztfexport query command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AzAPIDocsGetCommand.cs | Adds AzAPI docs/schema command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AvmVersionListCommand.cs | Adds AVM versions command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AvmModuleListCommand.cs | Adds AVM module list command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Commands/AvmDocumentationGetCommand.cs | Adds AVM documentation retrieval command implementation |
| tools/Azure.Mcp.Tools.AzureTerraform/src/AzureTerraformSetup.cs | Registers AzureTerraform services/commands and defines command groups |
| tools/Azure.Mcp.Tools.AzureTerraform/src/Azure.Mcp.Tools.AzureTerraform.csproj | Introduces the new AzureTerraform tool project and dependencies |
| tools/Azure.Mcp.Tools.AzureTerraform/src/AssemblyInfo.cs | Exposes internals to unit tests/live tests |
| servers/Azure.Mcp.Server/src/Resources/consolidated-tools.json | Adds two aggregated tool entries mapping to AzureTerraform tools |
| servers/Azure.Mcp.Server/src/Program.cs | Registers AzureTerraform area with the server |
| servers/Azure.Mcp.Server/docs/e2eTestPrompts.md | Adds e2e prompts for AzureTerraform tools |
| servers/Azure.Mcp.Server/docs/azmcp-commands.md | Documents new AzureTerraform CLI commands |
| servers/Azure.Mcp.Server/changelog-entries/1774593854839.yaml | Adds changelog entry for AzureTerraform toolset |
| servers/Azure.Mcp.Server/README.md | Adds AzureTerraform example prompts + service area list entry |
| Microsoft.Mcp.slnx | Adds AzureTerraform projects to the solution |
| .vscode/cspell.json | Adds Terraform-related terms to spelling dictionary |
| .github/CODEOWNERS | Adds code owners for AzureTerraform tool directory |
Comments suppressed due to low confidence (4)
tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AvmDocsService.cs:1
Lockis not available on most target frameworks in current .NET LTS releases; this will fail to compile unless the repo targets a framework that includesSystem.Threading.Lock. Replace this with a standardobject(used with thelockstatement) or another widely-available sync primitive (e.g.,SemaphoreSlim) to keep the caching thread-safe and buildable.
tools/Azure.Mcp.Tools.AzureTerraform/src/Services/ConftestService.cs:1- The
policySet switchis case-sensitive, but later checks treatpolicySetcase-insensitively (e.g.,avmsecseverity filter). This means inputs likeAVMSECwill silently select./policyinstead of./policy/avmsec. NormalizepolicySet(e.g.,ToLowerInvariant()) before the switch or use a case-insensitive comparison approach for selectingpolicyPath.
tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AzAPIDocsService.cs:1 - Stripping a trailing
sto compute the Terraform label can produce incorrect labels for types like.../status(becomesstatu) or other nouns where naive singularization is wrong. Since the label is arbitrary, prefer leavinglastPartunchanged (or using a safer normalization, e.g.,ToLowerInvariant()+ replace invalid characters) to avoid generating surprising/incorrect labels.
tools/Azure.Mcp.Tools.AzureTerraform/src/Services/AzAPIDocsService.cs:1 - This method returns text that is later embedded inside quoted HCL strings. If
prop.Descriptionorprop.Modifierscontains double quotes, backslashes, or newlines, the generated HCL will become invalid. Escape these values for HCL-string safety (at minimum:\\,\", and line breaks) before interpolation.
jongio
left a comment
There was a problem hiding this comment.
Solid new toolset. A few issues to address - 3 bugs in service logic and some structural items.
|
Hi @jongio , thanks for the review comments, beside changes replied, I also updated AzApiDocsServiceFormatTests.cs assertion updated to match new ToLowerInvariant() label behavior. |
|
The build failure is caused by a repo-wide NuGet vulnerability issue, not by changes in this PR. Root cause: This affects every project in the solution (Storage, SignalR, ServiceFabric, ServiceBus, Redis, Quota, Pricing, Speech, etc.) and will block all PRs until the package is updated or the warning is suppressed on |
9ce1d74 to
62a98c4
Compare
jongio
left a comment
There was a problem hiding this comment.
All 7 items from my earlier review are fixed correctly - verified in a local checkout. Case normalization in ConftestService, the label lowercasing + HCL escaping in AzAPIDocsService, the AzureRMDocs parser extraction, the DTO file split in AzApiExamplesService, the GitHub rate-limit handling in AvmDocsService, and the parallelism clamp in AztfexportService all look good.
CI build failure on this branch reproduces locally on main - it's the repo-wide System.Security.Cryptography.Xml 10.0.0 advisory (GHSA-37gx-xxp4-5rgx / GHSA-w3x6-4m5h-cxqf) hitting NU1903 under TreatWarningsAsErrors. Not caused by this PR and it'll unblock once the package is bumped on main.
…, and conftest tools Add 10 new MCP tools for Terraform workflows on Azure: - AzureRM and AzAPI provider documentation retrieval - Azure Verified Modules (AVM) listing, versions, and documentation - Azure Export for Terraform (aztfexport) resource, resource group, and query export - Conftest policy validation for workspace files and plan files Includes comprehensive unit tests, consolidated tool definitions, CODEOWNERS, changelog entry, README updates, e2e test prompts, and telemetry tagging. Closes #2215
…ommand and AzureRMDocsGetCommand
… parsing - Moved markdown parsing logic from AzureRMDocsService to a new AzureRMDocsParser class for better separation of concerns. - Introduced RemarksJson and TerraformSampleEntry models for structured data handling. - Updated AzApiExamplesService to utilize new models and parsing methods. - Added clamping for parallelism in AztfexportService methods to ensure valid input. - Refactored ConftestService to handle policy set names in a case-insensitive manner. - Adjusted unit tests to reflect changes in method calls and expected outputs.
62a98c4 to
96f0ea3
Compare
|
Rebase on to main to fix the CLI errors and resolve merging conflict. |
|
Hi @jongio, thanks for the feedback. Could you please re-approve the PR? I need to resolve a few merge conflicts related to the Azure Backup tools. Thanks again for your help! |
jongio
left a comment
There was a problem hiding this comment.
Re-verified after the rebase on main. All 7 items from my earlier review are still correctly addressed, build is clean, and all 116 unit tests pass. The rebase only pulled in unrelated Backup tools from main, no Terraform toolset changes since my approval.
@joshfree - this one is ready for a core team member to take a second look and approve.
What does this PR do?
Adds a new Azure Terraform toolset to the Azure MCP Server with 10 tools across 5 functional areas:
azureterraform_azurerm_get) — Retrieve AzureRM provider documentation for Terraform resourcesazureterraform_azapi_get) — Retrieve AzAPI provider documentation for Azure resources by resource type and API versionazureterraform_avm_list,azureterraform_avm_versions,azureterraform_avm_get) — List, query versions, and retrieve documentation for Azure Verified Modulesazureterraform_aztfexport_resource,azureterraform_aztfexport_resourcegroup,azureterraform_aztfexport_query) — Generate aztfexport commands to export Azure resources to Terraform configurationazureterraform_conftest_workspace,azureterraform_conftest_plan) — Generate conftest commands to validate Terraform configurations against Azure policiesThese tools are bundled in a single PR because they form a cohesive toolset for Terraform workflows on Azure, sharing common models, services, and infrastructure. Splitting them would create artificial boundaries within tightly coupled code.
Azure Terraform documentation:
GitHub issue number?
#2215
Pre-merge Checklist
servers/Azure.Mcp.Server/README.mdand/orservers/Fabric.Mcp.Server/README.mddocumentationREADME.mdchanges running the script./eng/scripts/Process-PackageReadMe.ps1. See Package READMEToolDescriptionEvaluatorand obtained a score of0.4or more and a top 3 ranking for all related test promptsconsolidated-tools.jsonbreaking-changelabelservers/Azure.Mcp.Server/docs/azmcp-commands.md./eng/scripts/Update-AzCommandsMetadata.ps1to update tool metadata inazmcp-commands.md(required for CI)servers/Azure.Mcp.Server/docs/e2eTestPrompts.mdcrypto mining, spam, data exfiltration, etc.)/azp run mcp - pullrequest - liveto run Live Test Pipeline