Skip to content
This repository was archived by the owner on Sep 4, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 42 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
1960132
added cloud architect tool
msalaman Jul 29, 2025
abdb78b
updates
msalaman Jul 30, 2025
5828a1e
updates
msalaman Jul 30, 2025
2fbccb0
updates
msalaman Jul 30, 2025
7520cca
updates
msalaman Aug 4, 2025
05e15bd
update Tests
msalaman Aug 6, 2025
629ece7
update documentation
msalaman Aug 7, 2025
900bdea
update cspell
msalaman Aug 7, 2025
951765e
updates
msalaman Aug 7, 2025
46e6a5a
merged with master
msalaman Aug 7, 2025
d8331a2
added more prompt examples
msalaman Aug 7, 2025
f924482
removed unnecessary service classes
msalaman Aug 7, 2025
986e3aa
fixed formatting, added unit tests for proper escape handling
msalaman Aug 8, 2025
9a9dc76
update cspell value
msalaman Aug 8, 2025
5ad85dd
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 8, 2025
64912c6
update description
msalaman Aug 11, 2025
91c5e90
Merge branch 'masalama/cloudArchitectTool' of https://github.com/Azur…
msalaman Aug 11, 2025
aac6b63
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 11, 2025
586f010
updated unit test to use new description
msalaman Aug 11, 2025
f641248
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 11, 2025
d9bb62e
add e2e prompt for cloud architect tool
msalaman Aug 12, 2025
9d115b3
Merge branch 'masalama/cloudArchitectTool' of https://github.com/Azur…
msalaman Aug 12, 2025
33cadf5
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 12, 2025
1040c02
cleaned up unused models
msalaman Aug 13, 2025
77661e0
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 13, 2025
032b0a4
Merge branch 'masalama/cloudArchitectTool' of https://github.com/Azur…
msalaman Aug 13, 2025
cec0e71
binded and used architectureTier and architectureDesignToolState options
msalaman Aug 13, 2025
e2287cc
added parameter validations and removed unnecessary classes
msalaman Aug 13, 2025
25c2164
removed unnecessary base class and JsonPropertyNames
msalaman Aug 13, 2025
7948170
fixed CHANGELOG link formatting
msalaman Aug 13, 2025
2ecb1cd
removed unused json context
msalaman Aug 13, 2025
8604fd4
fixed spelling error
msalaman Aug 13, 2025
7f7320d
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 14, 2025
0b26888
Include ResponseObject of parameters in response for design command
msalaman Aug 15, 2025
7b5620f
Merge branch 'masalama/cloudArchitectTool' of https://github.com/Azur…
msalaman Aug 15, 2025
24f2671
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 15, 2025
2d29a97
merged with main
msalaman Aug 15, 2025
7539670
Merge branch 'masalama/cloudArchitectTool' of https://github.com/Azur…
msalaman Aug 15, 2025
532e25d
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 18, 2025
db31d3b
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 19, 2025
e5c0731
update description to be more concise to be under tool length limit
msalaman Aug 19, 2025
3f5b6e1
Merge branch 'masalama/cloudArchitectTool' of https://github.com/Azur…
msalaman Aug 19, 2025
041ce7f
Merge branch 'main' into masalama/cloudArchitectTool
msalaman Aug 19, 2025
cec4fb1
updated description to use multiline string
msalaman Aug 20, 2025
57a8b50
Merge branch 'masalama/cloudArchitectTool' of https://github.com/Azur…
msalaman Aug 20, 2025
07085da
added validation
msalaman Aug 20, 2025
21768dd
update tests
msalaman Aug 20, 2025
949c804
remove attribute
msalaman Aug 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@
# ServiceLabel: %area-BestPractices
# ServiceOwners: @g2vinay @conniey

# PRLabel: %area-CloudArchitect
/areas/cloudarchitect/ @msalaman @Azure/azure-mcp

# ServiceLabel: %area-CloudArchitect
# ServiceOwners: @msalaman

# PRLabel: %area-CosmosDB
/areas/cosmos/ @sajeetharan @xiangyan99 @Azure/azure-mcp
Expand Down
38 changes: 38 additions & 0 deletions AzureMcp.sln
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.Core.UnitTests", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.Tests", "core\tests\AzureMcp.Tests\AzureMcp.Tests.csproj", "{527FE0F6-40AE-4E71-A483-0F0A2368F2A7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloudarchitect", "cloudarchitect", "{3C677F0E-A3E3-0F75-DBE2-C3DFA8463D32}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{C239126A-8A2E-168D-6172-7C58CE7AEB0A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.CloudArchitect", "areas\cloudarchitect\src\AzureMcp.CloudArchitect\AzureMcp.CloudArchitect.csproj", "{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{90811FCA-7295-E394-37C4-E1FD75D058A2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.CloudArchitect.UnitTests", "areas\cloudarchitect\tests\AzureMcp.CloudArchitect.UnitTests\AzureMcp.CloudArchitect.UnitTests.csproj", "{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.FunctionApp", "areas\functionapp\src\AzureMcp.FunctionApp\AzureMcp.FunctionApp.csproj", "{E6E10688-A3CD-4C33-8E13-E0E905329272}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "functionapp", "functionapp", "{3310D97C-93BE-4434-BED7-81EB639B3141}"
Expand Down Expand Up @@ -1204,6 +1213,30 @@ Global
{527FE0F6-40AE-4E71-A483-0F0A2368F2A7}.Release|x64.Build.0 = Release|Any CPU
{527FE0F6-40AE-4E71-A483-0F0A2368F2A7}.Release|x86.ActiveCfg = Release|Any CPU
{527FE0F6-40AE-4E71-A483-0F0A2368F2A7}.Release|x86.Build.0 = Release|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Debug|x64.ActiveCfg = Debug|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Debug|x64.Build.0 = Debug|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Debug|x86.ActiveCfg = Debug|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Debug|x86.Build.0 = Debug|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Release|Any CPU.Build.0 = Release|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Release|x64.ActiveCfg = Release|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Release|x64.Build.0 = Release|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Release|x86.ActiveCfg = Release|Any CPU
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439}.Release|x86.Build.0 = Release|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Debug|x64.ActiveCfg = Debug|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Debug|x64.Build.0 = Debug|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Debug|x86.ActiveCfg = Debug|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Debug|x86.Build.0 = Debug|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Release|Any CPU.Build.0 = Release|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Release|x64.ActiveCfg = Release|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Release|x64.Build.0 = Release|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Release|x86.ActiveCfg = Release|Any CPU
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559}.Release|x86.Build.0 = Release|Any CPU
{E6E10688-A3CD-4C33-8E13-E0E905329272}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E6E10688-A3CD-4C33-8E13-E0E905329272}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E6E10688-A3CD-4C33-8E13-E0E905329272}.Debug|x64.ActiveCfg = Debug|Any CPU
Expand Down Expand Up @@ -1533,6 +1566,11 @@ Global
{2A3CD1B4-38A3-46A1-AEDC-2C2AC47CB8F1} = {8783C0BC-EE27-8E0C-7452-5882FB8E96CA}
{1AE3FC50-8E8C-4637-AAB1-A871D5FB4535} = {8783C0BC-EE27-8E0C-7452-5882FB8E96CA}
{527FE0F6-40AE-4E71-A483-0F0A2368F2A7} = {8783C0BC-EE27-8E0C-7452-5882FB8E96CA}
{3C677F0E-A3E3-0F75-DBE2-C3DFA8463D32} = {87783708-79E3-AD60-C783-1D52BE7DE4BB}
{C239126A-8A2E-168D-6172-7C58CE7AEB0A} = {3C677F0E-A3E3-0F75-DBE2-C3DFA8463D32}
{6250B2F1-D4C1-4B4D-B15E-F65CEDB05439} = {C239126A-8A2E-168D-6172-7C58CE7AEB0A}
{90811FCA-7295-E394-37C4-E1FD75D058A2} = {3C677F0E-A3E3-0F75-DBE2-C3DFA8463D32}
{FD8691F1-BFFA-403E-8E1C-4ED6ABB5B559} = {90811FCA-7295-E394-37C4-E1FD75D058A2}
{E6E10688-A3CD-4C33-8E13-E0E905329272} = {4A85B59D-2802-46D2-B9D1-CDFE11A37945}
{3310D97C-93BE-4434-BED7-81EB639B3141} = {87783708-79E3-AD60-C783-1D52BE7DE4BB}
{4A85B59D-2802-46D2-B9D1-CDFE11A37945} = {3310D97C-93BE-4434-BED7-81EB639B3141}
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ The Azure MCP Server updates automatically by default whenever a new release com

### Features Added

- Added new command for designing Azure Cloud Architecture through guided questions. [[#890](https://github.com/Azure/azure-mcp/pull/890)]
- Added support for the following Azure Deploy operations and Azure Quota operations: [[#626](https://github.com/Azure/azure-mcp/pull/626)]
- `azmcp-deploy-app-logs-get` - Get logs from Azure applications deployed using azd.
- `azmcp-deploy-iac-rules-get` - Get Infrastructure as Code rules.
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,10 @@ The Azure MCP Server supercharges your agents with Azure context. Here are some

* Get the Bicep schema for specific Azure resource types

### 🏗️ Cloud Architect

* Design Azure cloud architectures through guided questions

Agents and models can discover and learn best practices and usage guidelines for the `azd` MCP tool. For more information, see [AZD Best Practices](https://github.com/Azure/azure-mcp/tree/main/areas/extension/src/AzureMcp.Extension/Resources/azd-best-practices.txt).

</details>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using System.Reflection;
using System.Runtime.CompilerServices;

[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Azure/azure-mcp")]
[assembly: InternalsVisibleTo("AzureMcp.CloudArchitect.UnitTests")]
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="**\Resources\*.txt" />
<EmbeddedResource Include="**\Resources\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\core\src\AzureMcp.Core\AzureMcp.Core.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
<PackageReference Include="ModelContextProtocol" />
<PackageReference Include="System.CommandLine" />
</ItemGroup>
<ItemGroup>
<Folder Include="Models\" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using System.Text.Json.Serialization;
using AzureMcp.CloudArchitect.Commands.Design;
using AzureMcp.CloudArchitect.Models;
using AzureMcp.CloudArchitect.Options;

namespace AzureMcp.CloudArchitect;

[JsonSourceGenerationOptions(
WriteIndented = true,
PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
PropertyNameCaseInsensitive = true)]
[JsonSerializable(typeof(CloudArchitectResponseObject))]
[JsonSerializable(typeof(CloudArchitectDesignResponse))]
[JsonSerializable(typeof(ArchitectureDesignToolState))]
[JsonSerializable(typeof(ArchitectureDesignTiers))]
[JsonSerializable(typeof(ArchitectureDesignRequirements))]
[JsonSerializable(typeof(ArchitectureDesignRequirement))]
[JsonSerializable(typeof(ArchitectureDesignConfidenceFactors))]
[JsonSerializable(typeof(RequirementImportance))]
public partial class CloudArchitectJsonContext : JsonSerializerContext
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using AzureMcp.CloudArchitect.Commands.Design;
using AzureMcp.Core.Areas;
using AzureMcp.Core.Commands;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace AzureMcp.CloudArchitect;

public class CloudArchitectSetup : IAreaSetup
{
public void ConfigureServices(IServiceCollection services)
{
}

public void RegisterCommands(CommandGroup rootGroup, ILoggerFactory loggerFactory)
{
// Create CloudArchitect command group
var cloudArchitect = new CommandGroup("cloudarchitect", "Cloud Architecture operations - Commands for generating Azure architecture designs and recommendations based on requirements.");
rootGroup.AddSubGroup(cloudArchitect);

// Register CloudArchitect commands
cloudArchitect.AddCommand("design", new DesignCommand(
loggerFactory.CreateLogger<DesignCommand>()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using System.CommandLine;
using System.CommandLine.Parsing;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Text.Json;
using AzureMcp.CloudArchitect.Models;
using AzureMcp.CloudArchitect.Options;
using AzureMcp.Core.Commands;
using AzureMcp.Core.Helpers;
using AzureMcp.Core.Models;
using Microsoft.Extensions.Logging;

namespace AzureMcp.CloudArchitect.Commands.Design;

public sealed class DesignCommand(ILogger<DesignCommand> logger) : GlobalCommand<ArchitectureDesignToolOptions>
{
private const string CommandTitle = "Design Azure cloud architectures through guided questions";
private readonly ILogger<DesignCommand> _logger = logger;

private readonly Option<string> _questionOption = CloudArchitectOptionDefinitions.Question;
private readonly Option<int> _questionNumberOption = CloudArchitectOptionDefinitions.QuestionNumber;
private readonly Option<int> _questionTotalQuestions = CloudArchitectOptionDefinitions.TotalQuestions;
private readonly Option<string> _answerOption = CloudArchitectOptionDefinitions.Answer;
private readonly Option<bool> _nextQuestionNeededOption = CloudArchitectOptionDefinitions.NextQuestionNeeded;
private readonly Option<double> _confidenceScoreOption = CloudArchitectOptionDefinitions.ConfidenceScore;

private readonly Option<string> _architectureDesignToolState = CloudArchitectOptionDefinitions.State;

private static readonly string s_designArchitectureText = LoadArchitectureDesignText();

private static string GetArchitectureDesignText() => s_designArchitectureText;

public override string Name => "design";

public override string Description => "Azure architecture design tool that gathers requirements through guided questions and recommends optimal solutions.\n\nKey parameters: question, questionNumber, confidenceScore (0.0-1.0, present architecture when ≥0.7), totalQuestions, answer, nextQuestionNeeded, architectureComponent, architectureTier, state.\n\nProcess:\n1. Ask about user role, business goals (1-2 questions at a time)\n2. Track confidence and update requirements (explicit/implicit/assumed)\n3. When confident enough, present architecture with table format, visual organization, ASCII diagrams\n4. Follow Azure Well-Architected Framework principles\n5. Cover all tiers: infrastructure, platform, application, data, security, operations\n6. Provide actionable advice and high-level overview\n\nState tracks components, requirements by category, and confidence factors. Be conservative with suggestions.";

public override string Title => CommandTitle;

public override ToolMetadata Metadata => new()
{
Destructive = false,
ReadOnly = true
};

private static string LoadArchitectureDesignText()
{
Assembly assembly = typeof(DesignCommand).Assembly;
string resourceName = EmbeddedResourceHelper.FindEmbeddedResource(assembly, "azure-architecture-design.txt");
return EmbeddedResourceHelper.ReadEmbeddedResource(assembly, resourceName);
}

protected override void RegisterOptions(Command command)
{
base.RegisterOptions(command);
command.AddOption(_questionOption);
command.AddOption(_questionNumberOption);
command.AddOption(_questionTotalQuestions);
command.AddOption(_answerOption);
command.AddOption(_nextQuestionNeededOption);
command.AddOption(_confidenceScoreOption);
command.AddOption(_architectureDesignToolState);

command.AddValidator(result =>
{
// Validate confidence score is between 0.0 and 1.0
var confidenceScore = result.GetValueForOption(_confidenceScoreOption);
if (confidenceScore < 0.0 || confidenceScore > 1.0)
{
result.ErrorMessage = "Confidence score must be between 0.0 and 1.0";
return;
}

// Validate question number is not negative
var questionNumber = result.GetValueForOption(_questionNumberOption);
if (questionNumber < 0)
{
result.ErrorMessage = "Question number cannot be negative";
return;
}

// Validate total questions is not negative
var totalQuestions = result.GetValueForOption(_questionTotalQuestions);
if (totalQuestions < 0)
{
result.ErrorMessage = "Total questions cannot be negative";
return;
}
});
}

protected override ArchitectureDesignToolOptions BindOptions(ParseResult parseResult)
{
var options = base.BindOptions(parseResult);
options.Question = parseResult.GetValueForOption(_questionOption) ?? string.Empty;
options.QuestionNumber = parseResult.GetValueForOption(_questionNumberOption);
options.TotalQuestions = parseResult.GetValueForOption(_questionTotalQuestions);
options.Answer = parseResult.GetValueForOption(_answerOption);
options.NextQuestionNeeded = parseResult.GetValueForOption(_nextQuestionNeededOption);
options.ConfidenceScore = parseResult.GetValueForOption(_confidenceScoreOption);
options.State = DeserializeState(parseResult.GetValueForOption(_architectureDesignToolState));
return options;
}

private static ArchitectureDesignToolState DeserializeState(string? stateJson)
{
if (string.IsNullOrEmpty(stateJson))
{
return new ArchitectureDesignToolState();
}

try
{
var state = JsonSerializer.Deserialize<ArchitectureDesignToolState>(stateJson, CloudArchitectJsonContext.Default.ArchitectureDesignToolState);
return state ?? new ArchitectureDesignToolState();
}
catch (JsonException ex)
{
throw new InvalidOperationException($"Failed to deserialize state JSON: {ex.Message}", ex);
}
}

public override Task<CommandResponse> ExecuteAsync(CommandContext context, ParseResult parseResult)
{
try
{
var options = BindOptions(parseResult);

var designArchitecture = GetArchitectureDesignText();
var responseObject = new CloudArchitectResponseObject
{
DisplayText = options.Question,
DisplayThought = options.State.Thought,
DisplayHint = options.State.SuggestedHint,
QuestionNumber = options.QuestionNumber,
TotalQuestions = options.TotalQuestions,
NextQuestionNeeded = options.NextQuestionNeeded,
State = options.State
};

var result = new CloudArchitectDesignResponse
{
DesignArchitecture = designArchitecture,
ResponseObject = responseObject
};

context.Response.Status = 200;
context.Response.Results = ResponseResult.Create(result, CloudArchitectJsonContext.Default.CloudArchitectDesignResponse);
context.Response.Message = string.Empty;
}
catch (Exception ex)
{
_logger.LogError(ex, "An exception occurred in cloud architect design command");
HandleException(context, ex);
}
return Task.FromResult(context.Response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

global using System.CommandLine;
global using System.CommandLine.Parsing;
global using System.Text.Json;
global using System.Text.Json.Serialization;
global using AzureMcp.Core.Extensions;
global using AzureMcp.Core.Models;
global using AzureMcp.Core.Models.Command;
global using ModelContextProtocol.Server;
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using AzureMcp.CloudArchitect.Options;

namespace AzureMcp.CloudArchitect.Models;

/// <summary>
/// Response object for the cloud architect design command.
/// </summary>
public class CloudArchitectResponseObject
{
public string DisplayText { get; set; } = string.Empty;

public string DisplayThought { get; set; } = string.Empty;

public string DisplayHint { get; set; } = string.Empty;

public int QuestionNumber { get; set; }

public int TotalQuestions { get; set; }

public bool NextQuestionNeeded { get; set; }

public ArchitectureDesignToolState State { get; set; } = new();
}

/// <summary>
/// Complete response for the cloud architect design command including both response object and design architecture text.
/// </summary>
public class CloudArchitectDesignResponse
{
public string DesignArchitecture { get; set; } = string.Empty;

public CloudArchitectResponseObject ResponseObject { get; set; } = new();
}
Loading
Loading