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