Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 9 additions & 0 deletions .vscode/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"servers": {
"azure-mcp-local": {
"type": "stdio",
"command": "./servers/Azure.Mcp.Server/src/bin/Debug/net9.0/azmcp.exe",
"args": ["server", "start"]
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1787,6 +1787,149 @@
"eventgrid_events_publish"
]
},
{
"name": "manage_azure_file_shares",
"description": "Manage Azure File Shares including listing, getting details, creating, updating, deleting file shares, and checking name availability.",
"toolMetadata": {
"destructive": {
"value": true,
"description": "This tool may delete or modify existing resources in its environment."
},
"idempotent": {
"value": false,
"description": "Running this operation multiple times with the same arguments may have additional effects or produce different results."
},
"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 creating, updating, or deleting 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": [
"fileshares_fileshare_list",
"fileshares_fileshare_get",
"fileshares_fileshare_create",
"fileshares_fileshare_delete",
"fileshares_fileshare_checkname"
]
},
{
"name": "manage_azure_file_share_snapshots",
"description": "Manage Azure File Share snapshots including listing, getting details, and creating snapshots for point-in-time recovery.",
"toolMetadata": {
"destructive": {
"value": true,
"description": "This tool may delete or modify existing resources in its environment."
},
"idempotent": {
"value": false,
"description": "Running this operation multiple times with the same arguments may have additional effects or produce different results."
},
"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 creating, updating, or deleting 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": [
"fileshares_snapshot_list",
"fileshares_snapshot_get",
"fileshares_snapshot_create"
]
},
{
"name": "get_azure_file_shares_planning_information",
"description": "Get planning information for Azure File Shares including limits, quotas, provisioning recommendations, and usage data.",
"toolMetadata": {
"destructive": {
"value": false,
"description": "This tool performs only additive updates without deleting or modifying existing resources."
},
"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": true,
"description": "This tool only performs read operations without modifying any state or 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": [
"fileshares_getlimits",
"fileshares_getprovisioningrecommendation",
"fileshares_getusagedata"
]
},
{
"name": "manage_azure_file_shares_private_endpoint_connections",
"description": "Manage private endpoint connections for Azure File Shares including listing, getting details, updating approval status, and deleting connections.",
"toolMetadata": {
"destructive": {
"value": true,
"description": "This tool may delete or modify existing resources in its environment."
},
"idempotent": {
"value": false,
"description": "Running this operation multiple times with the same arguments may have additional effects or produce different results."
},
"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 creating, updating, or deleting 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": [
"fileshares_privateendpointconnection_list",
"fileshares_privateendpointconnection_get",
"fileshares_privateendpointconnection_update",
"fileshares_privateendpointconnection_delete"
]
},
{
"name": "get_azure_data_explorer_kusto_details",
"description": "Get details about Azure Data Explorer (Kusto). List clusters, execute KQL queries, manage databases, explore table schemas, and get data samples.",
Expand Down
86 changes: 82 additions & 4 deletions eng/common/TestResources/New-TestResources.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ try {
}
Write-Verbose "Overriding test resources search directory to '$root'"
}

$templateFiles = @()

"$ResourceType-resources.json", "$ResourceType-resources.bicep" | ForEach-Object {
Expand All @@ -203,7 +203,7 @@ try {

# returns empty string if $ServiceDirectory is not set
$serviceName = GetServiceLeafDirectoryName $ServiceDirectory

# in ci, random names are used
# in non-ci, without BaseName, ResourceGroupName or ServiceDirectory, all invocations will
# generate the same resource group name and base name for a given user
Expand Down Expand Up @@ -310,7 +310,7 @@ try {
}
}

# This needs to happen after we set the TenantId but before we use the ResourceGroupName
# This needs to happen after we set the TenantId but before we use the ResourceGroupName
if ($wellKnownTMETenants.Contains($TenantId)) {
# Add a prefix to the resource group name to avoid flagging the usages of local auth
# See details at https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/certandsecretmngmt/credfreefaqs#how-can-i-disable-s360-reporting-when-testing-customer-facing-3p-features-that-depend-on-use-of-unsafe-local-auth
Expand Down Expand Up @@ -627,20 +627,98 @@ try {
}
Log $msg

# Test the deployment template before actual deployment to diagnose issues early
Log "Validating deployment template '$($templateFile.jsonFilePath)'"
$templateValidation = $null
try {
$templateValidation = Test-AzResourceGroupDeployment `
-ResourceGroupName $resourceGroup.ResourceGroupName `
-TemplateFile $templateFile.jsonFilePath `
-TemplateParameterObject $templateFileParameters `
-Verbose -ErrorAction Stop
} catch {
Write-Host "Template validation encountered an error:"
Write-Host " [Exception] $($_.Exception.Message)"
Write-Host " [Type] $($_.Exception.GetType().FullName)"
if ($_.ErrorDetails) {
Write-Host " [Error Details] $($_.ErrorDetails.Message)"
}
Write-Host ""
Write-Host "Deployment validation failed. Review the errors above and fix the template before retrying."
# exit 1
}

if ($templateValidation) {
Write-Host "========== TEMPLATE VALIDATION ERRORS =========="
Write-Host "Template validation returned errors:"
Write-Host ""

$errorCount = 0
foreach ($error in $templateValidation) {
$errorCount++
Write-Host "--- Error #$errorCount ---"
Write-Host " [Message] $($error.Message)"
Write-Host " [Code] $($error.Code)"
Write-Host " [Target] $($error.Target)"

if ($error.Details) {
Write-Host " [Details]"
$detailCount = 0
foreach ($detail in $error.Details) {
$detailCount++
Write-Host " Detail #${detailCount}:"
Write-Host " Message: $($detail.Message)"
if ($detail.Code) {
Write-Host " Code: $($detail.Code)"
}
if ($detail.Target) {
Write-Host " Target: $($detail.Target)"
}

# Drill deeper into nested details
if ($detail.Details -and $detail.Details.Count -gt 0) {
Write-Host " Inner Details:"
foreach ($innerDetail in $detail.Details) {
Write-Host " - $($innerDetail.Message)"
if ($innerDetail.Code) {
Write-Host " Code: $($innerDetail.Code)"
}
if ($innerDetail.Target) {
Write-Host " Target: $($innerDetail.Target)"
}
}
}
}
}
Write-Host ""
}
Write-Host "==========================================="
Write-Host "Deployment validation failed. Review the errors above and fix the template before retrying."
Write-Host "Template file: $($templateFile.jsonFilePath)"
Write-Host "Resource group: $($resourceGroup.ResourceGroupName)"
Write-Host ""
Write-Host "Full validation object (for debugging):"
Write-Host ($templateValidation | ConvertTo-Json -Depth 10)
Write-Host ""
# exit 1
}
Log "Template validation succeeded. Proceeding with deployment."

$deployment = Retry {
New-AzResourceGroupDeployment `
-Name $BaseName `
-ResourceGroupName $resourceGroup.ResourceGroupName `
-TemplateFile $templateFile.jsonFilePath `
-TemplateParameterObject $templateFileParameters `
-Force:$Force
-Verbose
}
if ($deployment.ProvisioningState -ne 'Succeeded') {
Write-Host "Deployment '$($deployment.DeploymentName)' has state '$($deployment.ProvisioningState)' with CorrelationId '$($deployment.CorrelationId)'. Exiting..."
Write-Host @'
#####################################################
# For help debugging live test provisioning issues, #
# see http://aka.ms/azsdk/engsys/live-test-help #
# see http://aka.ms/azsdk/engsys/live-test-help Thanks! #
#####################################################
'@
exit 1
Expand Down
3 changes: 2 additions & 1 deletion eng/scripts/Deploy-TestResources.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ Deploying$($AsJob ? ' in background job' : ''):
ResourceGroupName: '$ResourceGroupName'
BaseName: '$BaseName'
DeleteAfterHours: $DeleteAfterHours
TestResourcesDirectory: '$TestResourcesDirectory'`n
TestResourcesDirectory: '$TestResourcesDirectory'
Force: $true`n
"@ -ForegroundColor Yellow

if($AsJob) {
Expand Down
15 changes: 15 additions & 0 deletions servers/Azure.Mcp.Server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,20 @@ Microsoft Foundry and Microsoft Copilot Studio require remote MCP server endpoin
* "Publish an event with data '{\"name\": \"test\"}' to topic 'my-topic' using CloudEvents schema"
* "Send custom event data to Event Grid topic 'analytics-events' with EventGrid schema"

### 📂 Azure File Shares

* "List all my file shares in my storage account"
* "Get details about a specific file share"
* "Create a new file share in my storage account"
* "Delete a file share"
* "Check if a file share name is available"
* "List all snapshots for a file share"
* "Get details about a file share snapshot"
* "Create a snapshot of a file share"
* "Get file share limits and quotas"
* "Get provisioning recommendations for file shares"
* "Get file share usage data and metrics"

### 🔑 Azure Key Vault

* "List all secrets in my key vault 'my-vault'"
Expand Down Expand Up @@ -552,6 +566,7 @@ The Azure MCP Server provides tools for interacting with **41+ Azure service are
- 🐬 **Azure Database for MySQL** - MySQL database management
- 🐘 **Azure Database for PostgreSQL** - PostgreSQL database management
- 📊 **Azure Event Grid** - Event routing and management
- 📂 **Azure File Shares** - Azure File Shares management and snapshots
- ⚡ **Azure Functions** - Function App management
- 🔑 **Azure Key Vault** - Secrets, keys, and certificates
- ☸️ **Azure Kubernetes Service (AKS)** - Container orchestration
Expand Down
Loading
Loading