Skip to content

Commit 7c3cf54

Browse files
authored
Add CommandGroup.AddCommand overload to simplify setup (#2377)
* Add CommandGroup.AddCommand overload to simplify setup * Close para
1 parent e63d44a commit 7c3cf54

4 files changed

Lines changed: 61 additions & 62 deletions

File tree

core/Microsoft.Mcp.Core/src/Commands/CommandGroup.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,30 @@ public class CommandGroup(string name, string description, string? title = null)
1313
public Command Command { get; } = new Command(name, description);
1414
public ToolMetadata? ToolMetadata { get; set; }
1515

16+
/// <summary>
17+
/// Adds a command to this group.
18+
/// This calls 'AddCommand(string path, IBaseCommand command)' with the command's name as the path.
19+
/// </summary>
20+
/// <param name="command">The command to add to this group.</param>
21+
public void AddCommand(IBaseCommand command) => AddCommand(command.Name, command);
22+
23+
/// <summary>
24+
/// Adds a command to this group at the specified path, performing a recursive search for the correct subgroup if
25+
/// the path contains dots.
26+
/// <para>
27+
/// For example, if the path is "subgroup1.subgroup2.command", this method will first look for a subgroup named
28+
/// "subgroup1", then look for a subgroup named "subgroup2" within "subgroup1", and finally add the command to
29+
/// "subgroup2".
30+
/// </para>
31+
/// <para>
32+
/// Prefer using the overload that takes an IBaseCommand directly when possible, as it is simpler and less
33+
/// error-prone. Use this overload when you need to specify a path that is different from the command's name or
34+
/// when you want to add a command to a subgroup.
35+
/// </para>
36+
/// </summary>
37+
/// <param name="path">The command path.</param>
38+
/// <param name="command">The command to add to this group.</param>
39+
/// <exception cref="InvalidOperationException">If any subgroups specified by the path don't exist.</exception>
1640
public void AddCommand(string path, IBaseCommand command)
1741
{
1842
// Split on first dot to get group and remaining path

servers/Azure.Mcp.Server/docs/new-command.md

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,20 +1383,16 @@ Guidelines:
13831383
### 9. Command Registration
13841384

13851385
```csharp
1386-
private void RegisterCommands(CommandGroup rootGroup, ILoggerFactory loggerFactory)
1386+
private CommandGroup RegisterCommands(IServiceProvider serviceProvider)
13871387
{
1388-
var service = new CommandGroup(
1389-
"{Toolset}",
1390-
"{Toolset} operations");
1391-
rootGroup.AddSubGroup(service);
1392-
1393-
var resource = new CommandGroup(
1394-
"{resource}",
1395-
"{Resource} operations");
1388+
var service = new CommandGroup("{Toolset}", "{Toolset} operations description");
1389+
1390+
var resource = new CommandGroup("{resource}", "{Resource} operations description");
13961391
service.AddSubGroup(resource);
13971392

1398-
resource.AddCommand("{operation}", new {Resource}{Operation}Command(
1399-
loggerFactory.CreateLogger<{Resource}{Operation}Command>()));
1393+
resource.AddCommand(serviceProvider.GetRequiredService<{Resource}{Operation}Command>());
1394+
1395+
return service;
14001396
}
14011397
```
14021398

tools/Azure.Mcp.Tools.Compute/src/ComputeSetup.cs

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -63,34 +63,20 @@ Note that this tool requires appropriate Azure RBAC permissions and will only ac
6363
compute.AddSubGroup(vm);
6464

6565
// Register VM commands
66-
var vmGet = serviceProvider.GetRequiredService<VmGetCommand>();
67-
vm.AddCommand(vmGet.Name, vmGet);
68-
69-
var vmCreate = serviceProvider.GetRequiredService<VmCreateCommand>();
70-
vm.AddCommand(vmCreate.Name, vmCreate);
71-
72-
var vmUpdate = serviceProvider.GetRequiredService<VmUpdateCommand>();
73-
vm.AddCommand(vmUpdate.Name, vmUpdate);
74-
75-
var vmDelete = serviceProvider.GetRequiredService<VmDeleteCommand>();
76-
vm.AddCommand(vmDelete.Name, vmDelete);
66+
vm.AddCommand(serviceProvider.GetRequiredService<VmGetCommand>());
67+
vm.AddCommand(serviceProvider.GetRequiredService<VmCreateCommand>());
68+
vm.AddCommand(serviceProvider.GetRequiredService<VmUpdateCommand>());
69+
vm.AddCommand(serviceProvider.GetRequiredService<VmDeleteCommand>());
7770

7871
// Create VMSS subgroup
7972
var vmss = new CommandGroup("vmss", "Virtual Machine Scale Set operations - Commands for managing and monitoring Azure Virtual Machine Scale Sets including scale set details, instances, and rolling upgrades.");
8073
compute.AddSubGroup(vmss);
8174

8275
// Register VMSS commands
83-
var vmssGet = serviceProvider.GetRequiredService<VmssGetCommand>();
84-
vmss.AddCommand(vmssGet.Name, vmssGet);
85-
86-
var vmssCreate = serviceProvider.GetRequiredService<VmssCreateCommand>();
87-
vmss.AddCommand(vmssCreate.Name, vmssCreate);
88-
89-
var vmssUpdate = serviceProvider.GetRequiredService<VmssUpdateCommand>();
90-
vmss.AddCommand(vmssUpdate.Name, vmssUpdate);
91-
92-
var vmssDelete = serviceProvider.GetRequiredService<VmssDeleteCommand>();
93-
vmss.AddCommand(vmssDelete.Name, vmssDelete);
76+
vmss.AddCommand(serviceProvider.GetRequiredService<VmssGetCommand>());
77+
vmss.AddCommand(serviceProvider.GetRequiredService<VmssCreateCommand>());
78+
vmss.AddCommand(serviceProvider.GetRequiredService<VmssUpdateCommand>());
79+
vmss.AddCommand(serviceProvider.GetRequiredService<VmssDeleteCommand>());
9480

9581
// Create Disk subgroup
9682
var disk = new CommandGroup(
@@ -99,17 +85,10 @@ Note that this tool requires appropriate Azure RBAC permissions and will only ac
9985
compute.AddSubGroup(disk);
10086

10187
// Register Disk commands
102-
var diskCreate = serviceProvider.GetRequiredService<DiskCreateCommand>();
103-
disk.AddCommand(diskCreate.Name, diskCreate);
104-
105-
var diskDelete = serviceProvider.GetRequiredService<DiskDeleteCommand>();
106-
disk.AddCommand(diskDelete.Name, diskDelete);
107-
108-
var diskGet = serviceProvider.GetRequiredService<DiskGetCommand>();
109-
disk.AddCommand(diskGet.Name, diskGet);
110-
111-
var diskUpdate = serviceProvider.GetRequiredService<DiskUpdateCommand>();
112-
disk.AddCommand(diskUpdate.Name, diskUpdate);
88+
disk.AddCommand(serviceProvider.GetRequiredService<DiskCreateCommand>());
89+
disk.AddCommand(serviceProvider.GetRequiredService<DiskDeleteCommand>());
90+
disk.AddCommand(serviceProvider.GetRequiredService<DiskGetCommand>());
91+
disk.AddCommand(serviceProvider.GetRequiredService<DiskUpdateCommand>());
11392

11493
return compute;
11594
}

tools/Azure.Mcp.Tools.StorageSync/src/StorageSyncSetup.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -82,48 +82,48 @@ public CommandGroup RegisterCommands(IServiceProvider serviceProvider)
8282
"Storage Sync Service operations - Create, get, update, and delete Storage Sync services in your Azure subscription.");
8383
storageSync.AddSubGroup(storageSyncServiceGroup);
8484

85-
storageSyncServiceGroup.AddCommand("get", serviceProvider.GetRequiredService<StorageSyncServiceGetCommand>());
86-
storageSyncServiceGroup.AddCommand("create", serviceProvider.GetRequiredService<StorageSyncServiceCreateCommand>());
87-
storageSyncServiceGroup.AddCommand("update", serviceProvider.GetRequiredService<StorageSyncServiceUpdateCommand>());
88-
storageSyncServiceGroup.AddCommand("delete", serviceProvider.GetRequiredService<StorageSyncServiceDeleteCommand>());
85+
storageSyncServiceGroup.AddCommand(serviceProvider.GetRequiredService<StorageSyncServiceGetCommand>());
86+
storageSyncServiceGroup.AddCommand(serviceProvider.GetRequiredService<StorageSyncServiceCreateCommand>());
87+
storageSyncServiceGroup.AddCommand(serviceProvider.GetRequiredService<StorageSyncServiceUpdateCommand>());
88+
storageSyncServiceGroup.AddCommand(serviceProvider.GetRequiredService<StorageSyncServiceDeleteCommand>());
8989

9090
// RegisteredServer subgroup
9191
var registeredServerGroup = new CommandGroup("registeredserver",
9292
"Registered Server operations - Get, update, and unregister servers in your Storage Sync service.");
9393
storageSync.AddSubGroup(registeredServerGroup);
9494

95-
registeredServerGroup.AddCommand("get", serviceProvider.GetRequiredService<RegisteredServerGetCommand>());
96-
registeredServerGroup.AddCommand("update", serviceProvider.GetRequiredService<RegisteredServerUpdateCommand>());
97-
registeredServerGroup.AddCommand("unregister", serviceProvider.GetRequiredService<RegisteredServerUnregisterCommand>());
95+
registeredServerGroup.AddCommand(serviceProvider.GetRequiredService<RegisteredServerGetCommand>());
96+
registeredServerGroup.AddCommand(serviceProvider.GetRequiredService<RegisteredServerUpdateCommand>());
97+
registeredServerGroup.AddCommand(serviceProvider.GetRequiredService<RegisteredServerUnregisterCommand>());
9898

9999
// SyncGroup subgroup
100100
var syncGroupGroup = new CommandGroup("syncgroup",
101101
"Sync Group operations - Create, get, and delete sync groups in your Storage Sync service.");
102102
storageSync.AddSubGroup(syncGroupGroup);
103103

104-
syncGroupGroup.AddCommand("get", serviceProvider.GetRequiredService<SyncGroupGetCommand>());
105-
syncGroupGroup.AddCommand("create", serviceProvider.GetRequiredService<SyncGroupCreateCommand>());
106-
syncGroupGroup.AddCommand("delete", serviceProvider.GetRequiredService<SyncGroupDeleteCommand>());
104+
syncGroupGroup.AddCommand(serviceProvider.GetRequiredService<SyncGroupGetCommand>());
105+
syncGroupGroup.AddCommand(serviceProvider.GetRequiredService<SyncGroupCreateCommand>());
106+
syncGroupGroup.AddCommand(serviceProvider.GetRequiredService<SyncGroupDeleteCommand>());
107107

108108
// CloudEndpoint subgroup
109109
var cloudEndpointGroup = new CommandGroup("cloudendpoint",
110110
"Cloud Endpoint operations - Create, get, delete, and manage cloud endpoints in your sync groups.");
111111
storageSync.AddSubGroup(cloudEndpointGroup);
112112

113-
cloudEndpointGroup.AddCommand("get", serviceProvider.GetRequiredService<CloudEndpointGetCommand>());
114-
cloudEndpointGroup.AddCommand("create", serviceProvider.GetRequiredService<CloudEndpointCreateCommand>());
115-
cloudEndpointGroup.AddCommand("delete", serviceProvider.GetRequiredService<CloudEndpointDeleteCommand>());
116-
cloudEndpointGroup.AddCommand("changedetection", serviceProvider.GetRequiredService<CloudEndpointTriggerChangeDetectionCommand>());
113+
cloudEndpointGroup.AddCommand(serviceProvider.GetRequiredService<CloudEndpointGetCommand>());
114+
cloudEndpointGroup.AddCommand(serviceProvider.GetRequiredService<CloudEndpointCreateCommand>());
115+
cloudEndpointGroup.AddCommand(serviceProvider.GetRequiredService<CloudEndpointDeleteCommand>());
116+
cloudEndpointGroup.AddCommand(serviceProvider.GetRequiredService<CloudEndpointTriggerChangeDetectionCommand>());
117117

118118
// ServerEndpoint subgroup
119119
var serverEndpointGroup = new CommandGroup("serverendpoint",
120120
"Server Endpoint operations - Create, get, update, and delete server endpoints in your sync groups.");
121121
storageSync.AddSubGroup(serverEndpointGroup);
122122

123-
serverEndpointGroup.AddCommand("get", serviceProvider.GetRequiredService<ServerEndpointGetCommand>());
124-
serverEndpointGroup.AddCommand("create", serviceProvider.GetRequiredService<ServerEndpointCreateCommand>());
125-
serverEndpointGroup.AddCommand("update", serviceProvider.GetRequiredService<ServerEndpointUpdateCommand>());
126-
serverEndpointGroup.AddCommand("delete", serviceProvider.GetRequiredService<ServerEndpointDeleteCommand>());
123+
serverEndpointGroup.AddCommand(serviceProvider.GetRequiredService<ServerEndpointGetCommand>());
124+
serverEndpointGroup.AddCommand(serviceProvider.GetRequiredService<ServerEndpointCreateCommand>());
125+
serverEndpointGroup.AddCommand(serviceProvider.GetRequiredService<ServerEndpointUpdateCommand>());
126+
serverEndpointGroup.AddCommand(serviceProvider.GetRequiredService<ServerEndpointDeleteCommand>());
127127

128128
return storageSync;
129129
}

0 commit comments

Comments
 (0)