Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
388f662
feat: add netappfiles account create, get, update tools
stumpc Sep 17, 2026
ebd9a58
chore: update username to use github username
stumpc Sep 17, 2026
8c9203b
chore: update CODEOWNERS for NetAppFiles Service Owners
stumpc Sep 17, 2026
33af56e
feat: add netappfiles pool create, get, update tools
stumpc Sep 17, 2026
6840417
fix: correctly associated netappfiles commands in consolidated-tools.…
stumpc Sep 17, 2026
293f933
chore: update changelog filename
stumpc Sep 17, 2026
fa4edc2
fix: remove directory and files carried over due to IDE lag silliness
stumpc Sep 18, 2026
ab51c0e
fix: do not block on fetching account info
stumpc Sep 18, 2026
600f408
fix: netappfiles livetests working, update assets.json
Sep 23, 2026
76b39b9
Merge remote-tracking branch 'origin/main' into stumpc/anf-accounts
Sep 23, 2026
c8d0386
fix: use full words to pass spellcheck
Sep 28, 2026
b165fc7
fix: formatting issues
Sep 28, 2026
b0c5add
Merge remote-tracking branch 'origin/main' into stumpc/anf-accounts
Sep 28, 2026
70da9d5
Merge remote-tracking branch 'origin/main' into stumpc/anf-accounts
Sep 30, 2026
9447418
Merge branch 'stumpc/anf-accounts' into stumpc/anf-pools
Sep 30, 2026
7048a60
tests: use new uploaded test asset for capacity pools
Sep 30, 2026
3c2d239
address PR comments
Oct 6, 2026
0c423fc
Merge branch 'stumpc/anf-accounts' into stumpc/anf-pools
Oct 8, 2026
832faa1
tests: fix livetests for netappfiles pools
Oct 9, 2026
d5a0eca
fix: update tib size range for capacity pools according to documentation
Oct 9, 2026
f72db65
chore: update assets for livetests
Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,12 @@
# ServiceLabel: %tools-MySQL
# ServiceOwners: @mattkohnms @ramnov

# PRLabel: %tools-NetAppFiles
/tools/Azure.Mcp.Tools.NetAppFiles/ @stumpc @microsoft/azure-mcp

# ServiceLabel: %tools-NetAppFiles
# ServiceOwners: @stumpc @microsoft/azure-mcp

# PRLabel: %tools-Optimization
/tools/Azure.Mcp.Tools.Optimization/ @sanjaytholanim @liangchenmicrosoft

Expand Down
1 change: 1 addition & 0 deletions .vscode/cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@
"mydb",
"myop",
"mystorageaccount",
"netappfiles",
"noninteractive",
"nugets",
"pipefail",
Expand Down
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
<PackageVersion Include="Azure.ResourceManager.MachineLearning" Version="1.2.4" />
<PackageVersion Include="Azure.ResourceManager.Monitor" Version="1.4.0-beta.4" />
<PackageVersion Include="Azure.ResourceManager.MySql" Version="1.2.1" />
<PackageVersion Include="Azure.ResourceManager.NetApp" Version="1.18.0" />
<PackageVersion Include="Azure.ResourceManager.Network" Version="1.16.1" />
<PackageVersion Include="Azure.ResourceManager.OperationalInsights" Version="1.3.2" />
<PackageVersion Include="Azure.ResourceManager.PostgreSql" Version="1.4.2" />
Expand Down
7 changes: 7 additions & 0 deletions Microsoft.Mcp.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,13 @@
<Folder Name="/tools/Azure.Mcp.Tools.MySql/tests/">
<Project Path="tools/Azure.Mcp.Tools.MySql/tests/Azure.Mcp.Tools.MySql.Tests/Azure.Mcp.Tools.MySql.Tests.csproj" />
</Folder>
<Folder Name="/tools/Azure.Mcp.Tools.NetAppFiles/" />
<Folder Name="/tools/Azure.Mcp.Tools.NetAppFiles/src/">
<Project Path="tools/Azure.Mcp.Tools.NetAppFiles/src/Azure.Mcp.Tools.NetAppFiles.csproj" />
</Folder>
<Folder Name="/tools/Azure.Mcp.Tools.NetAppFiles/tests/">
<Project Path="tools/Azure.Mcp.Tools.NetAppFiles/tests/Azure.Mcp.Tools.NetAppFiles.Tests/Azure.Mcp.Tools.NetAppFiles.Tests.csproj" />
</Folder>
<Folder Name="/tools/Azure.Mcp.Tools.Optimization/" />
<Folder Name="/tools/Azure.Mcp.Tools.Optimization/src/">
<Project Path="tools/Azure.Mcp.Tools.Optimization/src/Azure.Mcp.Tools.Optimization.csproj" />
Expand Down
7 changes: 7 additions & 0 deletions servers/Azure.Mcp.Server/Azure.Mcp.Server.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,13 @@
<Folder Name="/tools/Azure.Mcp.Tools.MySql/tests/">
<Project Path="../../tools/Azure.Mcp.Tools.MySql/tests/Azure.Mcp.Tools.MySql.Tests/Azure.Mcp.Tools.MySql.Tests.csproj" />
</Folder>
<Folder Name="/tools/Azure.Mcp.Tools.NetAppFiles/" />
<Folder Name="/tools/Azure.Mcp.Tools.NetAppFiles/src/">
<Project Path="../../tools/Azure.Mcp.Tools.NetAppFiles/src/Azure.Mcp.Tools.NetAppFiles.csproj" />
</Folder>
<Folder Name="/tools/Azure.Mcp.Tools.NetAppFiles/tests/">
<Project Path="../../tools/Azure.Mcp.Tools.NetAppFiles/tests/Azure.Mcp.Tools.NetAppFiles.Tests/Azure.Mcp.Tools.NetAppFiles.Tests.csproj" />
</Folder>
<Folder Name="/tools/Azure.Mcp.Tools.Optimization/" />
<Folder Name="/tools/Azure.Mcp.Tools.Optimization/src/">
<Project Path="../../tools/Azure.Mcp.Tools.Optimization/src/Azure.Mcp.Tools.Optimization.csproj" />
Expand Down
7 changes: 7 additions & 0 deletions servers/Azure.Mcp.Server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1252,6 +1252,12 @@ For customer-hosted ADME instances, pass the resource application ID or App ID U
* "Continue to the next orchestration step after I complete the previous action"
* "Send brownfield analysis findings to continue migration planning"

### Azure NetApp Files

* "Create a 4 TiB Premium capacity pool named 'my-pool' in Azure NetApp Files account 'my-account' in resource group 'my-resource-group'"
* "Show the configuration and provisioning state of capacity pool 'my-pool' in Azure NetApp Files account 'my-account'"
* "Resize capacity pool 'my-pool' in Azure NetApp Files account 'my-account' to 8 TiB"

### 📊 Azure Quota

* "Check resource usage and quota for 'Microsoft.App/containerApps' in region 'eastus'"
Expand Down Expand Up @@ -1439,6 +1445,7 @@ The Azure MCP Server provides tools for interacting with **45+ Azure service are
- 🧮 **Azure Data Explorer** - Analytics queries and KQL
- 🐬 **Azure Database for MySQL** - MySQL database management
- 🐘 **Azure Database for PostgreSQL** - PostgreSQL database management
- **Azure NetApp Files** - Enterprise file storage account and capacity pool management
- 🏭 **Azure Device Registry** - Device Registry namespace management
- 📊 **Azure Event Grid** - Event routing and management
- ⚡ **Azure Event Hubs** - Namespace, event hub, and consumer group management
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
changes:
- section: Features Added
description: Added `netappfiles account create`, `netappfiles account get`, and `netappfiles account update` commands for creating, retrieving, and updating Azure NetApp Files accounts.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
changes:
- section: Features Added
description: Added `netappfiles pool create`, `netappfiles pool get`, and `netappfiles pool update` commands for managing Azure NetApp Files capacity pools.
74 changes: 74 additions & 0 deletions servers/Azure.Mcp.Server/docs/azmcp-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -2685,6 +2685,80 @@ azmcp kusto query [--cluster-uri <cluster-uri> | --subscription <subscription> -

```

### Azure NetApp Files Operations

```bash
# Gets an Azure NetApp Files account by name from a specified resource group.
# Returns the account name, resource ID, location, and provisioning state.
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp netappfiles account get --account <account> \
--resource-group <resource-group> \
--subscription <subscription> \
[--tenant <tenant>]

# Creates an Azure NetApp Files account in a specified resource group and region.
# Returns the account name, resource ID, location, and provisioning state.
# ✅ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp netappfiles account create --account <account> \
--location <location> \
--resource-group <resource-group> \
--subscription <subscription> \
[--tenant <tenant>]

# Updates the tags or NFSv4 user ID mapping domain of an Azure NetApp Files account.
# Providing an empty JSON object for --tags removes all tags.
# Returns the updated account name, resource ID, location, and provisioning state.
# ✅ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp netappfiles account update --account <account> \
--resource-group <resource-group> \
--subscription <subscription> \
[--tags <json-key-value-object>] \
[--nfs-v4-id-domain <nfs-v4-id-domain>] \
[--tenant <tenant>]

# Creates a capacity pool in an Azure NetApp Files account.
# Size is specified in TiB and must be a positive multiple of 4.
# Returns the pool configuration and provisioning state.
# ✅ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp netappfiles pool create --account <account> \
--pool <pool> \
--size <size-in-tib> \
--service-level <Flexible|Premium|Standard|StandardZRS|Ultra> \
--resource-group <resource-group> \
--subscription <subscription> \
[--location <location>] \
[--qos-type <Auto|Manual>] \
[--cool-access <true|false>] \
[--encryption-type <Single|Double>] \
[--custom-throughput-mibps <throughput>] \
[--tags <json-key-value-object>] \
[--tenant <tenant>]

# Gets a capacity pool by name from an Azure NetApp Files account.
# Returns the pool configuration, resource ID, location, and provisioning state.
# ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp netappfiles pool get --account <account> \
--pool <pool> \
--resource-group <resource-group> \
--subscription <subscription> \
[--tenant <tenant>]

# Updates mutable properties of an Azure NetApp Files capacity pool.
# Providing an empty JSON object for --tags removes all tags.
# Returns the updated pool configuration and provisioning state.
# ✅ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired
azmcp netappfiles pool update --account <account> \
--pool <pool> \
--resource-group <resource-group> \
--subscription <subscription> \
[--size <size-in-tib>] \
[--qos-type <Auto|Manual>] \
[--cool-access <true|false>] \
[--custom-throughput-mibps <throughput>] \
[--tags <json-key-value-object>] \
[--tenant <tenant>]
```

### Azure Database for MySQL Operations

```bash
Expand Down
17 changes: 17 additions & 0 deletions servers/Azure.Mcp.Server/docs/e2eTestPrompts.md
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,23 @@ The `Interaction` column describes whether a prompt can invoke its tool immediat
| mysql_server_param_set | Set connection timeout to 20 seconds for my MySQL server \<server> | none |
| mysql_table_schema_get | Show me the schema of table \<table> in the MySQL database \<database> in server \<server> | none |

## Azure NetApp Files

| Tool Name | Test Prompt | Interaction |
|:----------|:------------|:------------|
| netappfiles_account_create | Create an Azure NetApp Files account named \<account> in \<location> in resource group \<resource_group> | none |
| netappfiles_account_create | Create a NetApp Files account called \<account> in resource group \<resource_group> | none |
| netappfiles_account_get | Get the Azure NetApp Files account named \<account> in resource group \<resource_group> | none |
| netappfiles_account_get | Show me details for NetApp Files account \<account> in resource group \<resource_group> | none |
| netappfiles_account_update | Set the tags on Azure NetApp Files account \<account> in resource group \<resource_group> to {"environment":"production"} | none |
| netappfiles_account_update | Update the NFSv4 ID mapping domain for NetApp Files account \<account> in resource group \<resource_group> to example.com | none |
| netappfiles_pool_create | Create a 4 TiB Premium capacity pool named \<pool> in Azure NetApp Files account \<account> in resource group \<resource_group> | none |
| netappfiles_pool_create | Create an Azure NetApp Files capacity pool called \<pool> with Flexible service level, Manual QoS, and 128 MiB/s custom throughput in account \<account> | none |
| netappfiles_pool_get | Get capacity pool \<pool> from Azure NetApp Files account \<account> in resource group \<resource_group> | none |
| netappfiles_pool_get | Show me the configuration and provisioning state of NetApp Files capacity pool \<pool> in account \<account> | none |
| netappfiles_pool_update | Resize Azure NetApp Files capacity pool \<pool> in account \<account> to 8 TiB | none |
| netappfiles_pool_update | Set the tags on NetApp Files capacity pool \<pool> in account \<account> to {"environment":"production"} | none |

## Azure Database for PostgreSQL

| Tool Name | Test Prompt | Interaction |
Expand Down
1 change: 1 addition & 0 deletions servers/Azure.Mcp.Server/src/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ internal static IAreaSetup[] RegisterAreas()
new Azure.Mcp.Tools.Monitor.MonitorSetup(),
new Azure.Mcp.Tools.ApplicationInsights.ApplicationInsightsSetup(),
new Azure.Mcp.Tools.MySql.MySqlSetup(),
new Azure.Mcp.Tools.NetAppFiles.NetAppFilesSetup(),
new Azure.Mcp.Tools.Optimization.OptimizationSetup(),
new Azure.Mcp.Tools.Policy.PolicySetup(),
new Azure.Mcp.Tools.Postgres.PostgresSetup(),
Expand Down
77 changes: 74 additions & 3 deletions servers/Azure.Mcp.Server/src/Resources/consolidated-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -2414,7 +2414,7 @@
},
{
"name": "get_azure_storage_details",
"description": "Get details about Azure Storage resources including Storage accounts, blob containers, blob data, and tables. Also manage Azure Managed Lustre (AMLFS) filesystems: list filesystems with provisioning state and capacity, retrieve available SKUs with bandwidth and scale targets, calculate required subnet sizes for deployment planning, and validate subnet configurations against SKU and size requirements.",
"description": "Get details about Azure Storage resources including Storage accounts, Azure NetApp Files accounts and capacity pools, blob containers, blob data, and tables. Also manage Azure Managed Lustre (AMLFS) filesystems: list filesystems with provisioning state and capacity, retrieve available SKUs with bandwidth and scale targets, calculate required subnet sizes for deployment planning, and validate subnet configurations against SKU and size requirements.",
"toolMetadata": {
"destructive": {
"value": false,
Expand Down Expand Up @@ -2448,6 +2448,8 @@
"managedlustre_fs_blob_autoimport_get",
"managedlustre_fs_blob_import_get",
"managedlustre_fs_expansion_get",
"netappfiles_account_get",
"netappfiles_pool_get",
"storage_account_get",
"storage_blob_container_get",
"storage_blob_get",
Expand Down Expand Up @@ -2661,7 +2663,7 @@
},
{
"name": "create_azure_storage",
"description": "Create Azure Storage accounts, blob containers, and Azure Managed Lustre filesystems.",
"description": "Create Azure Storage accounts, blob containers, Azure Managed Lustre filesystems, and Azure NetApp Files accounts and capacity pools.",
"toolMetadata": {
"destructive": {
"value": true,
Expand Down Expand Up @@ -2691,13 +2693,82 @@
"mappedToolList": [
"storage_account_create",
"storage_blob_container_create",
"netappfiles_account_create",
"netappfiles_pool_create",
"managedlustre_fs_create",
"managedlustre_fs_blob_autoexport_create",
"managedlustre_fs_blob_autoimport_create",
"managedlustre_fs_blob_import_create",
"managedlustre_fs_expansion_create"
]
},
{
"name": "create_or_update_azure_netapp_files_accounts",
"description": "Create Azure NetApp Files accounts, or update their tags or NFSv4 user ID mapping domain.",
"toolMetadata": {
"destructive": {
"value": true,
"description": "This tool may modify existing resources in its environment."
},
"idempotent": {
"value": true,
"description": "Running this operation multiple times with the same arguments produces the same result without additional effects."
},
"openWorld": {
"value": false,
"description": "This tool's domain of interaction is closed and well-defined, limited to a specific set of entities."
},
"readOnly": {
"value": false,
"description": "This tool may modify its environment by updating data."
},
"secret": {
"value": false,
"description": "This tool does not handle sensitive or secret information."
},
"localRequired": {
"value": false,
"description": "This tool is available in both local and remote server modes."
}
},
"mappedToolList": [
"netappfiles_account_create",
"netappfiles_account_update"
]
},
{
"name": "update_azure_netapp_files_capacity_pools",
"description": "Update the size, QoS type, cool-access setting, custom throughput, or tags of Azure NetApp Files capacity pools.",
"toolMetadata": {
"destructive": {
"value": true,
"description": "This tool may modify existing resources in its environment."
},
"idempotent": {
"value": true,
"description": "Running this operation multiple times with the same arguments produces the same result without additional effects."
},
"openWorld": {
"value": false,
"description": "This tool's domain of interaction is closed and well-defined, limited to a specific set of entities."
},
"readOnly": {
"value": false,
"description": "This tool may modify its environment by updating data."
},
"secret": {
"value": false,
"description": "This tool does not handle sensitive or secret information."
},
"localRequired": {
"value": false,
"description": "This tool is available in both local and remote server modes."
}
},
"mappedToolList": [
"netappfiles_pool_update"
]
},
{
"name": "update_azure_managed_lustre_filesystems",
"description": "Update existing Azure Managed Lustre filesystem configurations.",
Expand Down Expand Up @@ -5571,4 +5642,4 @@
]
}
]
}
}
6 changes: 6 additions & 0 deletions tools/Azure.Mcp.Tools.NetAppFiles/src/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("Azure.Mcp.Tools.NetAppFiles.Tests")]
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="$(RepoRoot)core\Azure.Mcp.Core\src\Azure.Mcp.Core.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Azure.ResourceManager.NetApp" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
<PackageReference Include="ModelContextProtocol" />
</ItemGroup>
</Project>
Loading
Loading