Skip to content
This repository was archived by the owner on Sep 4, 2025. It is now read-only.

Commit 5800bca

Browse files
Copilotjongio
andauthored
Fix subscription parameter handling in Azure MCP service methods (#878)
* Initial plan * Fix AppConfig service subscription parameter handling Co-authored-by: jongio <[email protected]> * Fix Redis and start Storage service subscription parameter handling Co-authored-by: jongio <[email protected]> * Complete Storage service subscription parameter handling Co-authored-by: jongio <[email protected]> * Complete Cosmos and Workbooks services subscription parameter handling Co-authored-by: jongio <[email protected]> * Complete final services subscription parameter handling - Grafana, Kusto partial Co-authored-by: jongio <[email protected]> * Update documentation for subscription parameter handling pattern Co-authored-by: jongio <[email protected]> * Add initial devcontainer configuration for Azure MCP Codespace * Refactor test method parameters for consistency and clarity in AccessPolicyListCommandTests; clean up whitespace in StorageService. * Add "Codespace" and "devcontainers" to cspell dictionary * Fix formatting issues: whitespace in StorageService and NSubstitute argument matchers in tests Co-authored-by: jongio <[email protected]> * Fix test parameter specificity: restore original concrete values in AccessPolicyListCommandTests Co-authored-by: jongio <[email protected]> * Fix dotnet format whitespace issue: remove trailing space in AccessPolicyListCommandTests.cs Co-authored-by: jongio <[email protected]> * Merge * Update cspell configuration: add exclusions for .devcontainer and new words for csdevkit and dotnettools * Remove obsolete files related to Container Apps service and documentation --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jongio <[email protected]>
1 parent 97509e2 commit 5800bca

File tree

17 files changed

+201
-149
lines changed

17 files changed

+201
-149
lines changed

.devcontainer/devcontainer.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"name": "Azure MCP Codespace",
3+
"features": {
4+
"ghcr.io/devcontainers/features/dotnet:2": {
5+
"version": "9.0.300"
6+
},
7+
"ghcr.io/devcontainers/features/node:1": {
8+
"version": "20"
9+
},
10+
"ghcr.io/devcontainers/features/azure-cli:1": {},
11+
"ghcr.io/devcontainers/features/powershell:1": {},
12+
"ghcr.io/azure/azure-dev/azd:0": {}
13+
},
14+
"hostRequirements": {
15+
"cpus": 4,
16+
"memory": "8gb",
17+
"storage": "32gb"
18+
},
19+
"customizations": {
20+
"vscode": {
21+
"extensions": [
22+
"ms-dotnettools.csharp",
23+
"ms-dotnettools.csdevkit",
24+
"ms-vscode.powershell",
25+
"ms-azuretools.vscode-azurecli",
26+
"GitHub.copilot",
27+
"GitHub.copilot-chat",
28+
"ms-azuretools.vscode-azure-github-copilot",
29+
"dbaeumer.vscode-eslint",
30+
"streetsidesoftware.code-spell-checker",
31+
"ms-vscode.test-adapter-converter"
32+
],
33+
"settings": {
34+
"dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true,
35+
"dotnet.server.useOmnisharp": false,
36+
"powershell.codeFormatting.preset": "OTBS"
37+
}
38+
}
39+
},
40+
"postCreateCommand": "dotnet --version && az --version && azd version && pwsh --version && npm --version"
41+
}

.vscode/cspell.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
"**/bin/**",
2626
"**/.work/**",
2727
"**/.dist/**",
28-
"**/eng/vscode/NOTICE.txt"
28+
"**/eng/vscode/NOTICE.txt",
29+
"!**/.devcontainer/**"
2930
],
3031
"dictionaryDefinitions": [
3132
{
@@ -200,7 +201,9 @@
200201
"azuretools",
201202
"codegen",
202203
"codeium",
204+
"Codespace",
203205
"cslschema",
206+
"csdevkit",
204207
"bdylan",
205208
"bestpractices",
206209
"bicepschema",
@@ -217,7 +220,9 @@
217220
"datasource",
218221
"datasources",
219222
"deallocate",
223+
"devcontainers",
220224
"Distributedtask",
225+
"dotnettools",
221226
"DEBUGTELEMETRY",
222227
"dotenv",
223228
"drawcord",

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ The Azure MCP Server updates automatically by default whenever a new release com
1010

1111
### Bugs Fixed
1212

13+
- Fixed subscription parameter handling across all Azure MCP service methods to consistently use `subscription` instead of `subscriptionId`, enabling proper support for both subscription IDs and subscription names. [[#877](https://github.com/Azure/azure-mcp/issues/877)]
1314
- Fixed `ToolExecuted` telemetry activity being created twice. [[#741](https://github.com/Azure/azure-mcp/pull/741)]
1415

1516
### Other Changes

areas/appconfig/src/AzureMcp.AppConfig/Services/AppConfigService.cs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ public class AppConfigService(ISubscriptionService subscriptionService, ITenantS
1919
{
2020
private readonly ISubscriptionService _subscriptionService = subscriptionService ?? throw new ArgumentNullException(nameof(subscriptionService));
2121

22-
public async Task<List<AppConfigurationAccount>> GetAppConfigAccounts(string subscriptionId, string? tenant = null, RetryPolicyOptions? retryPolicy = null)
22+
public async Task<List<AppConfigurationAccount>> GetAppConfigAccounts(string subscription, string? tenant = null, RetryPolicyOptions? retryPolicy = null)
2323
{
24-
ValidateRequiredParameters(subscriptionId);
24+
ValidateRequiredParameters(subscription);
2525

26-
var subscription = await _subscriptionService.GetSubscription(subscriptionId, tenant, retryPolicy);
26+
var subscriptionResource = await _subscriptionService.GetSubscription(subscription, tenant, retryPolicy);
2727
var accounts = new List<AppConfigurationAccount>();
2828

29-
await foreach (var account in subscription.GetAppConfigurationStoresAsync())
29+
await foreach (var account in subscriptionResource.GetAppConfigurationStoresAsync())
3030
{
3131
ResourceIdentifier resourceId = account.Id;
3232
if (resourceId.ToString().Length == 0)
@@ -81,15 +81,15 @@ public async Task<List<AppConfigurationAccount>> GetAppConfigAccounts(string sub
8181

8282
public async Task<List<KeyValueSetting>> ListKeyValues(
8383
string accountName,
84-
string subscriptionId,
84+
string subscription,
8585
string? key = null,
8686
string? label = null,
8787
string? tenant = null,
8888
RetryPolicyOptions? retryPolicy = null)
8989
{
90-
ValidateRequiredParameters(accountName, subscriptionId);
90+
ValidateRequiredParameters(accountName, subscription);
9191

92-
var client = await GetConfigurationClient(accountName, subscriptionId, tenant, retryPolicy);
92+
var client = await GetConfigurationClient(accountName, subscription, tenant, retryPolicy);
9393
var settings = new List<KeyValueSetting>();
9494

9595
var selector = new SettingSelector
@@ -115,10 +115,10 @@ public async Task<List<KeyValueSetting>> ListKeyValues(
115115
return settings;
116116
}
117117

118-
public async Task<KeyValueSetting> GetKeyValue(string accountName, string key, string subscriptionId, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null, string? contentType = null)
118+
public async Task<KeyValueSetting> GetKeyValue(string accountName, string key, string subscription, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null, string? contentType = null)
119119
{
120-
ValidateRequiredParameters(accountName, key, subscriptionId);
121-
var client = await GetConfigurationClient(accountName, subscriptionId, tenant, retryPolicy);
120+
ValidateRequiredParameters(accountName, key, subscription);
121+
var client = await GetConfigurationClient(accountName, subscription, tenant, retryPolicy);
122122
var response = await client.GetConfigurationSettingAsync(key, label, cancellationToken: default);
123123
var setting = response.Value;
124124

@@ -134,20 +134,20 @@ public async Task<KeyValueSetting> GetKeyValue(string accountName, string key, s
134134
};
135135
}
136136

137-
public async Task LockKeyValue(string accountName, string key, string subscriptionId, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null)
137+
public async Task LockKeyValue(string accountName, string key, string subscription, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null)
138138
{
139-
await SetKeyValueReadOnlyState(accountName, key, subscriptionId, tenant, retryPolicy, label, true);
139+
await SetKeyValueReadOnlyState(accountName, key, subscription, tenant, retryPolicy, label, true);
140140
}
141141

142-
public async Task UnlockKeyValue(string accountName, string key, string subscriptionId, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null)
142+
public async Task UnlockKeyValue(string accountName, string key, string subscription, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null)
143143
{
144-
await SetKeyValueReadOnlyState(accountName, key, subscriptionId, tenant, retryPolicy, label, false);
144+
await SetKeyValueReadOnlyState(accountName, key, subscription, tenant, retryPolicy, label, false);
145145
}
146146

147-
public async Task SetKeyValue(string accountName, string key, string value, string subscriptionId, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null, string? contentType = null, string[]? tags = null)
147+
public async Task SetKeyValue(string accountName, string key, string value, string subscription, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null, string? contentType = null, string[]? tags = null)
148148
{
149-
ValidateRequiredParameters(accountName, key, value, subscriptionId);
150-
var client = await GetConfigurationClient(accountName, subscriptionId, tenant, retryPolicy);
149+
ValidateRequiredParameters(accountName, key, value, subscription);
150+
var client = await GetConfigurationClient(accountName, subscription, tenant, retryPolicy);
151151

152152
// Create a ConfigurationSetting object to include contentType if provided
153153
var setting = new ConfigurationSetting(key, value, label)
@@ -179,32 +179,32 @@ public async Task SetKeyValue(string accountName, string key, string value, stri
179179

180180
await client.SetConfigurationSettingAsync(setting, cancellationToken: default);
181181
}
182-
public async Task DeleteKeyValue(string accountName, string key, string subscriptionId, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null)
182+
public async Task DeleteKeyValue(string accountName, string key, string subscription, string? tenant = null, RetryPolicyOptions? retryPolicy = null, string? label = null)
183183
{
184-
ValidateRequiredParameters(accountName, key, subscriptionId);
185-
var client = await GetConfigurationClient(accountName, subscriptionId, tenant, retryPolicy);
184+
ValidateRequiredParameters(accountName, key, subscription);
185+
var client = await GetConfigurationClient(accountName, subscription, tenant, retryPolicy);
186186
await client.DeleteConfigurationSettingAsync(key, label, cancellationToken: default);
187187
}
188188

189-
private async Task SetKeyValueReadOnlyState(string accountName, string key, string subscriptionId, string? tenant, RetryPolicyOptions? retryPolicy, string? label, bool isReadOnly)
189+
private async Task SetKeyValueReadOnlyState(string accountName, string key, string subscription, string? tenant, RetryPolicyOptions? retryPolicy, string? label, bool isReadOnly)
190190
{
191-
ValidateRequiredParameters(accountName, key, subscriptionId);
192-
var client = await GetConfigurationClient(accountName, subscriptionId, tenant, retryPolicy);
191+
ValidateRequiredParameters(accountName, key, subscription);
192+
var client = await GetConfigurationClient(accountName, subscription, tenant, retryPolicy);
193193
await client.SetReadOnlyAsync(key, label, isReadOnly, cancellationToken: default);
194194
}
195195

196-
private async Task<ConfigurationClient> GetConfigurationClient(string accountName, string subscriptionId, string? tenant, RetryPolicyOptions? retryPolicy)
196+
private async Task<ConfigurationClient> GetConfigurationClient(string accountName, string subscription, string? tenant, RetryPolicyOptions? retryPolicy)
197197
{
198-
var subscription = await _subscriptionService.GetSubscription(subscriptionId, tenant, retryPolicy);
199-
var configStore = await FindAppConfigStore(subscription, accountName, subscriptionId);
198+
var subscriptionResource = await _subscriptionService.GetSubscription(subscription, tenant, retryPolicy);
199+
var configStore = await FindAppConfigStore(subscriptionResource, accountName, subscription);
200200
var endpoint = configStore.Data.Endpoint;
201201
var credential = await GetCredential(tenant);
202202
AddDefaultPolicies(new ConfigurationClientOptions());
203203

204204
return new ConfigurationClient(new Uri(endpoint), credential);
205205
}
206206

207-
private static async Task<AppConfigurationStoreResource> FindAppConfigStore(SubscriptionResource subscription, string accountName, string subscriptionId)
207+
private static async Task<AppConfigurationStoreResource> FindAppConfigStore(SubscriptionResource subscription, string accountName, string subscriptionIdentifier)
208208
{
209209
AppConfigurationStoreResource? configStore = null;
210210
await foreach (var store in subscription.GetAppConfigurationStoresAsync())
@@ -217,7 +217,7 @@ private static async Task<AppConfigurationStoreResource> FindAppConfigStore(Subs
217217
}
218218

219219
if (configStore == null)
220-
throw new Exception($"App Configuration store '{accountName}' not found in subscription '{subscriptionId}'");
220+
throw new Exception($"App Configuration store '{accountName}' not found in subscription '{subscriptionIdentifier}'");
221221

222222
return configStore;
223223
}

areas/appconfig/src/AzureMcp.AppConfig/Services/IAppConfigService.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,42 +9,42 @@ namespace AzureMcp.AppConfig.Services;
99
public interface IAppConfigService
1010
{
1111
Task<List<AppConfigurationAccount>> GetAppConfigAccounts(
12-
string subscriptionId,
12+
string subscription,
1313
string? tenant = null,
1414
RetryPolicyOptions? retryPolicy = null);
1515
Task<List<KeyValueSetting>> ListKeyValues(
1616
string accountName,
17-
string subscriptionId,
17+
string subscription,
1818
string? key = null, string? label = null,
1919
string? tenant = null,
2020
RetryPolicyOptions? retryPolicy = null);
2121
Task<KeyValueSetting> GetKeyValue(
2222
string accountName,
2323
string key,
24-
string subscriptionId,
24+
string subscription,
2525
string? tenant = null,
2626
RetryPolicyOptions? retryPolicy = null,
2727
string? label = null,
2828
string? contentType = null);
2929
Task LockKeyValue(
3030
string accountName,
3131
string key,
32-
string subscriptionId,
32+
string subscription,
3333
string? tenant = null,
3434
RetryPolicyOptions? retryPolicy = null,
3535
string? label = null);
3636
Task UnlockKeyValue(
3737
string accountName,
3838
string key,
39-
string subscriptionId,
39+
string subscription,
4040
string? tenant = null,
4141
RetryPolicyOptions? retryPolicy = null,
4242
string? label = null);
4343
Task SetKeyValue(
4444
string accountName,
4545
string key,
4646
string value,
47-
string subscriptionId,
47+
string subscription,
4848
string? tenant = null,
4949
RetryPolicyOptions? retryPolicy = null,
5050
string? label = null,
@@ -53,7 +53,7 @@ Task SetKeyValue(
5353
Task DeleteKeyValue(
5454
string accountName,
5555
string key,
56-
string subscriptionId,
56+
string subscription,
5757
string? tenant = null,
5858
RetryPolicyOptions? retryPolicy = null,
5959
string? label = null);

0 commit comments

Comments
 (0)