From 9d10bafc3149e54f1c11ba2a92d1a04c34c271b2 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Fri, 12 Sep 2025 14:15:00 -0700 Subject: [PATCH 1/3] mark secret_create secret --- servers/Azure.Mcp.Server/CHANGELOG.md | 2 ++ .../src/Commands/Secret/SecretCreateCommand.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/servers/Azure.Mcp.Server/CHANGELOG.md b/servers/Azure.Mcp.Server/CHANGELOG.md index 83a485a737..86df88a466 100644 --- a/servers/Azure.Mcp.Server/CHANGELOG.md +++ b/servers/Azure.Mcp.Server/CHANGELOG.md @@ -18,6 +18,8 @@ The Azure MCP Server updates automatically by default whenever a new release com ### Bugs Fixed +- Marked the secret hint of 'secret_create' tool to true. + ### Other Changes ## 0.6.0 (2025-09-11) diff --git a/tools/Azure.Mcp.Tools.KeyVault/src/Commands/Secret/SecretCreateCommand.cs b/tools/Azure.Mcp.Tools.KeyVault/src/Commands/Secret/SecretCreateCommand.cs index 7583c1bd34..ca2e861822 100644 --- a/tools/Azure.Mcp.Tools.KeyVault/src/Commands/Secret/SecretCreateCommand.cs +++ b/tools/Azure.Mcp.Tools.KeyVault/src/Commands/Secret/SecretCreateCommand.cs @@ -29,7 +29,7 @@ public sealed class SecretCreateCommand(ILogger logger) : S OpenWorld = true, ReadOnly = false, LocalRequired = false, - Secret = false + Secret = true }; public override string Description => From 1bc9e9e6ad427246b16d10782bb20fa7926f27bf Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Fri, 12 Sep 2025 14:48:24 -0700 Subject: [PATCH 2/3] Add tool hints --- .../Areas/Group/Commands/GroupListCommand.cs | 10 +++++++- .../Commands/SubscriptionListCommand.cs | 10 +++++++- .../Areas/Tools/Commands/ToolsListCommand.cs | 10 +++++++- servers/Azure.Mcp.Server/CHANGELOG.md | 2 +- .../Commands/Nodepool/NodepoolGetCommand.cs | 10 +++++++- .../Commands/Nodepool/NodepoolListCommand.cs | 10 +++++++- .../Resource/ResourceDiagnoseCommand.cs | 11 ++++++++- .../Commands/FileSystem/Sku/SkuGetCommand.cs | 3 ++- .../src/Commands/AzqrCommand.cs | 10 +++++++- .../KeyVaultCommandTests.cs | 24 ------------------- .../ServiceHealthEventsListCommand.cs | 10 +++++++- .../BestPractices/GetBestPracticesCommand.cs | 10 +++++++- .../BestPractices/GetExamplesCommand.cs | 10 +++++++- .../GetWorkloadDefinitionCommand.cs | 10 +++++++- .../PublicApis/GetPlatformApisCommand.cs | 10 +++++++- .../PublicApis/GetWorkloadApisCommand.cs | 10 +++++++- .../PublicApis/ListWorkloadsCommand.cs | 10 +++++++- 17 files changed, 130 insertions(+), 40 deletions(-) diff --git a/core/Azure.Mcp.Core/src/Areas/Group/Commands/GroupListCommand.cs b/core/Azure.Mcp.Core/src/Areas/Group/Commands/GroupListCommand.cs index 9f1a488d26..e8889293d9 100644 --- a/core/Azure.Mcp.Core/src/Areas/Group/Commands/GroupListCommand.cs +++ b/core/Azure.Mcp.Core/src/Areas/Group/Commands/GroupListCommand.cs @@ -27,7 +27,15 @@ returned as a JSON array. public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = true, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; public override async Task ExecuteAsync(CommandContext context, ParseResult parseResult) { diff --git a/core/Azure.Mcp.Core/src/Areas/Subscription/Commands/SubscriptionListCommand.cs b/core/Azure.Mcp.Core/src/Areas/Subscription/Commands/SubscriptionListCommand.cs index 76d8485873..3b5c6dabad 100644 --- a/core/Azure.Mcp.Core/src/Areas/Subscription/Commands/SubscriptionListCommand.cs +++ b/core/Azure.Mcp.Core/src/Areas/Subscription/Commands/SubscriptionListCommand.cs @@ -25,7 +25,15 @@ List all Azure subscriptions accessible to your account. Optionally specify {Opt public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = true, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; public override async Task ExecuteAsync(CommandContext context, ParseResult parseResult) { diff --git a/core/Azure.Mcp.Core/src/Areas/Tools/Commands/ToolsListCommand.cs b/core/Azure.Mcp.Core/src/Areas/Tools/Commands/ToolsListCommand.cs index a05579a65f..02cec3f76a 100644 --- a/core/Azure.Mcp.Core/src/Areas/Tools/Commands/ToolsListCommand.cs +++ b/core/Azure.Mcp.Core/src/Areas/Tools/Commands/ToolsListCommand.cs @@ -23,7 +23,15 @@ arguments. Use this to explore the CLI's functionality or to build interactive c public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = false, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; public override async Task ExecuteAsync(CommandContext context, ParseResult parseResult) { diff --git a/servers/Azure.Mcp.Server/CHANGELOG.md b/servers/Azure.Mcp.Server/CHANGELOG.md index 86df88a466..75f22b9689 100644 --- a/servers/Azure.Mcp.Server/CHANGELOG.md +++ b/servers/Azure.Mcp.Server/CHANGELOG.md @@ -18,7 +18,7 @@ The Azure MCP Server updates automatically by default whenever a new release com ### Bugs Fixed -- Marked the secret hint of 'secret_create' tool to true. +- Marked the secret hint of 'secret_create' tool to true. [[#430](https://github.com/microsoft/mcp/pull/430)] ### Other Changes diff --git a/tools/Azure.Mcp.Tools.Aks/src/Commands/Nodepool/NodepoolGetCommand.cs b/tools/Azure.Mcp.Tools.Aks/src/Commands/Nodepool/NodepoolGetCommand.cs index 2496bc5781..e282f91292 100644 --- a/tools/Azure.Mcp.Tools.Aks/src/Commands/Nodepool/NodepoolGetCommand.cs +++ b/tools/Azure.Mcp.Tools.Aks/src/Commands/Nodepool/NodepoolGetCommand.cs @@ -27,7 +27,15 @@ public sealed class NodepoolGetCommand(ILogger logger) : Bas public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = true, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Azure.Mcp.Tools.Aks/src/Commands/Nodepool/NodepoolListCommand.cs b/tools/Azure.Mcp.Tools.Aks/src/Commands/Nodepool/NodepoolListCommand.cs index 923aa01738..b2eca5c2f1 100644 --- a/tools/Azure.Mcp.Tools.Aks/src/Commands/Nodepool/NodepoolListCommand.cs +++ b/tools/Azure.Mcp.Tools.Aks/src/Commands/Nodepool/NodepoolListCommand.cs @@ -26,7 +26,15 @@ public sealed class NodepoolListCommand(ILogger logger) : B public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = true, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Azure.Mcp.Tools.AppLens/src/Commands/Resource/ResourceDiagnoseCommand.cs b/tools/Azure.Mcp.Tools.AppLens/src/Commands/Resource/ResourceDiagnoseCommand.cs index 77de51c564..ca152de1ff 100644 --- a/tools/Azure.Mcp.Tools.AppLens/src/Commands/Resource/ResourceDiagnoseCommand.cs +++ b/tools/Azure.Mcp.Tools.AppLens/src/Commands/Resource/ResourceDiagnoseCommand.cs @@ -42,7 +42,16 @@ Once proper input is provided this tool returns a list of insights and solutions """; public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = true, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Azure.Mcp.Tools.AzureManagedLustre/src/Commands/FileSystem/Sku/SkuGetCommand.cs b/tools/Azure.Mcp.Tools.AzureManagedLustre/src/Commands/FileSystem/Sku/SkuGetCommand.cs index abfa120ca6..4931f7a453 100644 --- a/tools/Azure.Mcp.Tools.AzureManagedLustre/src/Commands/FileSystem/Sku/SkuGetCommand.cs +++ b/tools/Azure.Mcp.Tools.AzureManagedLustre/src/Commands/FileSystem/Sku/SkuGetCommand.cs @@ -26,9 +26,10 @@ public sealed class SkuGetCommand(ILogger logger) public override ToolMetadata Metadata => new() { Destructive = false, - OpenWorld = true, Idempotent = true, + OpenWorld = true, ReadOnly = true, + LocalRequired = false, Secret = false }; diff --git a/tools/Azure.Mcp.Tools.Extension/src/Commands/AzqrCommand.cs b/tools/Azure.Mcp.Tools.Extension/src/Commands/AzqrCommand.cs index 0c478d095a..7bcc14465c 100644 --- a/tools/Azure.Mcp.Tools.Extension/src/Commands/AzqrCommand.cs +++ b/tools/Azure.Mcp.Tools.Extension/src/Commands/AzqrCommand.cs @@ -31,7 +31,15 @@ Note that Azure Quick Review CLI (azqr) is different from Azure CLI (az). public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = true, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.LiveTests/KeyVaultCommandTests.cs b/tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.LiveTests/KeyVaultCommandTests.cs index fc2c2a2348..78d14d5864 100644 --- a/tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.LiveTests/KeyVaultCommandTests.cs +++ b/tools/Azure.Mcp.Tools.KeyVault/tests/Azure.Mcp.Tools.KeyVault.LiveTests/KeyVaultCommandTests.cs @@ -115,30 +115,6 @@ public async Task Should_get_secret() Assert.NotNull(value.GetString()); } - [Fact] - public async Task Should_create_secret() - { - var secretName = Settings.ResourceBaseName + Random.Shared.NextInt64(); - var secretValue = "test-value-" + Random.Shared.NextInt64(); - var result = await CallToolAsync( - "azmcp_keyvault_secret_create", - new() - { - { "subscription", Settings.SubscriptionId }, - { "vault", Settings.ResourceBaseName }, - { "secret", secretName}, - { "value", secretValue } - }); - - var createdSecretName = result.AssertProperty("name"); - Assert.Equal(JsonValueKind.String, createdSecretName.ValueKind); - Assert.Equal(secretName, createdSecretName.GetString()); - - var returnedValue = result.AssertProperty("value"); - Assert.Equal(JsonValueKind.String, returnedValue.ValueKind); - Assert.Equal(secretValue, returnedValue.GetString()); - } - [Fact] public async Task Should_list_certificates() { diff --git a/tools/Azure.Mcp.Tools.ResourceHealth/src/Commands/ServiceHealthEvents/ServiceHealthEventsListCommand.cs b/tools/Azure.Mcp.Tools.ResourceHealth/src/Commands/ServiceHealthEvents/ServiceHealthEventsListCommand.cs index 7b9b6b6cb8..c0afa46cd7 100644 --- a/tools/Azure.Mcp.Tools.ResourceHealth/src/Commands/ServiceHealthEvents/ServiceHealthEventsListCommand.cs +++ b/tools/Azure.Mcp.Tools.ResourceHealth/src/Commands/ServiceHealthEvents/ServiceHealthEventsListCommand.cs @@ -30,7 +30,15 @@ public sealed class ServiceHealthEventsListCommand(ILogger CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = true, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetBestPracticesCommand.cs b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetBestPracticesCommand.cs index 02f904a2d4..742234d385 100644 --- a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetBestPracticesCommand.cs +++ b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetBestPracticesCommand.cs @@ -29,7 +29,15 @@ public sealed class GetBestPracticesCommand(ILogger log public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = false, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetExamplesCommand.cs b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetExamplesCommand.cs index e701802af4..b337ee8e4b 100644 --- a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetExamplesCommand.cs +++ b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetExamplesCommand.cs @@ -29,7 +29,15 @@ examples to help with API integration and development. public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = false, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetWorkloadDefinitionCommand.cs b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetWorkloadDefinitionCommand.cs index 93ecb305ae..08aa7c0ebe 100644 --- a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetWorkloadDefinitionCommand.cs +++ b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/BestPractices/GetWorkloadDefinitionCommand.cs @@ -26,7 +26,15 @@ public sealed class GetWorkloadDefinitionCommand(ILogger CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = false, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/GetPlatformApisCommand.cs b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/GetPlatformApisCommand.cs index 0892ab7570..92db6fe5a5 100644 --- a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/GetPlatformApisCommand.cs +++ b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/GetPlatformApisCommand.cs @@ -25,7 +25,15 @@ complete API specification in JSON format with supplementary definition files. public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = false, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; public override async Task ExecuteAsync(CommandContext context, ParseResult parseResult) { diff --git a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/GetWorkloadApisCommand.cs b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/GetWorkloadApisCommand.cs index b20ca6c4ed..977a704aa0 100644 --- a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/GetWorkloadApisCommand.cs +++ b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/GetWorkloadApisCommand.cs @@ -27,7 +27,15 @@ command first to see available workload types. public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = false, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; protected override void RegisterOptions(Command command) { diff --git a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/ListWorkloadsCommand.cs b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/ListWorkloadsCommand.cs index 10be292c72..8212b023d8 100644 --- a/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/ListWorkloadsCommand.cs +++ b/tools/Fabric.Mcp.Tools.PublicApi/src/Commands/PublicApis/ListWorkloadsCommand.cs @@ -25,7 +25,15 @@ with other commands to retrieve their specific API documentation. public override string Title => CommandTitle; - public override ToolMetadata Metadata => new() { Destructive = false, ReadOnly = true }; + public override ToolMetadata Metadata => new() + { + Destructive = false, + Idempotent = true, + OpenWorld = false, + ReadOnly = true, + LocalRequired = false, + Secret = false + }; public override async Task ExecuteAsync(CommandContext context, ParseResult parseResult) { From 70489f9dba38966ac7cab8a500bfa699230bdcd7 Mon Sep 17 00:00:00 2001 From: Xiang Yan Date: Fri, 12 Sep 2025 15:39:02 -0700 Subject: [PATCH 3/3] update --- .../src/Commands/Resource/ResourceDiagnoseCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Azure.Mcp.Tools.AppLens/src/Commands/Resource/ResourceDiagnoseCommand.cs b/tools/Azure.Mcp.Tools.AppLens/src/Commands/Resource/ResourceDiagnoseCommand.cs index ca152de1ff..82c773cefe 100644 --- a/tools/Azure.Mcp.Tools.AppLens/src/Commands/Resource/ResourceDiagnoseCommand.cs +++ b/tools/Azure.Mcp.Tools.AppLens/src/Commands/Resource/ResourceDiagnoseCommand.cs @@ -42,7 +42,7 @@ Once proper input is provided this tool returns a list of insights and solutions """; public override string Title => CommandTitle; - + public override ToolMetadata Metadata => new() { Destructive = false,