diff --git a/core/Azure.Mcp.Core/src/Services/Azure/BaseAzureService.cs b/core/Azure.Mcp.Core/src/Services/Azure/BaseAzureService.cs index a9452b33a..235bdd281 100644 --- a/core/Azure.Mcp.Core/src/Services/Azure/BaseAzureService.cs +++ b/core/Azure.Mcp.Core/src/Services/Azure/BaseAzureService.cs @@ -179,4 +179,23 @@ protected static void ValidateRequiredParameters(params string?[] parameters) ArgumentException.ThrowIfNullOrEmpty(param); } } + + /// + /// Validates that the provided named parameters are not null or empty + /// + /// Array of tuples containing parameter names and values to validate + /// Thrown when any parameter is null or empty + protected static void ValidateRequiredParameters(params (string name, string? value)[] namedParameters) + { + var missingParams = namedParameters + .Where(param => string.IsNullOrEmpty(param.value)) + .Select(param => param.name) + .ToArray(); + + if (missingParams.Length > 0) + { + throw new ArgumentException( + $"Required parameter{(missingParams.Length > 1 ? "s are" : " is")} null or empty: {string.Join(", ", missingParams)}"); + } + } } diff --git a/tools/Azure.Mcp.Tools.Kusto/src/Services/KustoService.cs b/tools/Azure.Mcp.Tools.Kusto/src/Services/KustoService.cs index bc6ffd351..278069935 100644 --- a/tools/Azure.Mcp.Tools.Kusto/src/Services/KustoService.cs +++ b/tools/Azure.Mcp.Tools.Kusto/src/Services/KustoService.cs @@ -40,7 +40,7 @@ public async Task> ListClustersAsync( string? tenant = null, RetryPolicyOptions? retryPolicy = null) { - ValidateRequiredParameters(subscriptionId); + ValidateRequiredParameters((nameof(subscriptionId), subscriptionId)); try { @@ -66,7 +66,7 @@ public async Task GetClusterAsync( string? tenant = null, RetryPolicyOptions? retryPolicy = null) { - ValidateRequiredParameters(subscriptionId); + ValidateRequiredParameters((nameof(subscriptionId), subscriptionId)); try { @@ -101,7 +101,9 @@ public async Task> ListDatabasesAsync( AuthMethod.Credential, RetryPolicyOptions? retryPolicy = null) { - ValidateRequiredParameters(subscriptionId, clusterName); + ValidateRequiredParameters( + (nameof(subscriptionId), subscriptionId), + (nameof(clusterName), clusterName)); string clusterUri = await GetClusterUriAsync(subscriptionId, clusterName, tenant, retryPolicy); return await ListDatabasesAsync(clusterUri, tenant, authMethod, retryPolicy); @@ -131,7 +133,10 @@ public async Task> ListTablesAsync( AuthMethod? authMethod = AuthMethod.Credential, RetryPolicyOptions? retryPolicy = null) { - ValidateRequiredParameters(subscriptionId, clusterName, databaseName); + ValidateRequiredParameters( + (nameof(subscriptionId), subscriptionId), + (nameof(clusterName), clusterName), + (nameof(databaseName), databaseName)); string clusterUri = await GetClusterUriAsync(subscriptionId, clusterName, tenant, retryPolicy); return await ListTablesAsync(clusterUri, databaseName, tenant, authMethod, retryPolicy); @@ -175,7 +180,10 @@ public async Task GetTableSchemaAsync( AuthMethod? authMethod = AuthMethod.Credential, RetryPolicyOptions? retryPolicy = null) { - ValidateRequiredParameters(clusterUri, databaseName, tableName); + ValidateRequiredParameters( + (nameof(clusterUri), clusterUri), + (nameof(databaseName), databaseName), + (nameof(tableName), tableName)); var kustoClient = await GetOrCreateKustoClientAsync(clusterUri, tenant); var kustoResult = await kustoClient.ExecuteQueryCommandAsync( @@ -199,7 +207,11 @@ public async Task> QueryItemsAsync( AuthMethod? authMethod = AuthMethod.Credential, RetryPolicyOptions? retryPolicy = null) { - ValidateRequiredParameters(subscriptionId, clusterName, databaseName, query); + ValidateRequiredParameters( + (nameof(subscriptionId), subscriptionId), + (nameof(clusterName), clusterName), + (nameof(databaseName), databaseName), + (nameof(query), query)); string clusterUri = await GetClusterUriAsync(subscriptionId, clusterName, tenant, retryPolicy); return await QueryItemsAsync(clusterUri, databaseName, query, tenant, authMethod, retryPolicy);