Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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 CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,12 @@ Agents provisioned before this release need `Agent365.Observability.OtelWrite` g

**Option B — CLI** (`a365 setup admin`) has been removed in this release. Use Option A above, or copy the PowerShell instructions printed in the `a365 setup all` summary output.

#### Existing agents: grant Defender API permissions

Agents provisioned before this release need `RealtimeProtection.Process` granted as both a **delegated** and an **application** permission on the blueprint app for the Defender security integration. Requires Global Administrator. Follow the steps above, searching for `86a21212-634e-4553-b3d6-e477e4c9d9ec` in step 2 and selecting `RealtimeProtection.Process` in steps 3 and 4. Re-running `a365 setup all` grants it automatically.

### Added
- `RealtimeProtection.Process` on the Defender API is now granted automatically during `a365 setup` as both a delegated and an application permission, enabling the Microsoft Defender security integration without manual Entra steps.
- Log separator written at the start of each CLI invocation now redacts values for secret-bearing options (e.g. `--idp-client-secret`) so they are not written to the log file in plain text.
- Authentication context (tenant and user) is now logged at the `Information` level whenever the resolved sign-in identity changes, giving operators a clear audit trail in the log file of who the CLI is acting as, without exposing credentials.
- `a365 develop-mcp evaluate` command for evaluating MCP server tool schema quality — runs deterministic and semantic checks (via GitHub Copilot or Claude Code CLIs), computes maturity scoring, and generates an interactive HTML report
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,7 @@ private static Command CreateInstanceScopesSubcommand(
AuthenticationConstants.MicrosoftGraphResourceAppId => "Microsoft Graph",
ConfigConstants.MessagingBotApiAppId => "Messaging Bot API",
ConfigConstants.ObservabilityApiAppId => "Observability API",
ConfigConstants.DefenderApiAppId => "Defender API",
PowerPlatformConstants.PowerPlatformApiResourceAppId => "Power Platform API",
"00000002-0000-0000-c000-000000000000" => "Azure Active Directory Graph",
"797f4846-ba00-4fd7-ba43-dac1f8f63013" => "Azure Service Management",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ namespace Microsoft.Agents.A365.DevTools.Cli.Commands.SetupSubcommands;
/// 1. Requirements validation
/// 2. Blueprint creation (shared with DW)
/// 3. Batch permissions on the blueprint (shared with DW pipeline; non-DW spec set:
/// Observability API, Power Platform API, custom). MAC reads from the blueprint,
/// so stamping here gives the same set visibility there.
/// Observability API, Defender API, Power Platform API, custom). MAC reads
/// from the blueprint, so stamping here gives the same set visibility there.
/// 4. Agent Identity creation via POST /beta/servicePrincipals/Microsoft.Graph.AgentIdentity
/// 5. Agent Identity permission grants (same spec set as step 3) — OBO or S2S
/// 6. Agent registration via Graph API (copilot/agentRegistrations)
Expand Down Expand Up @@ -117,14 +117,15 @@ public static void PrintDryRunPlan(Agent365Config config, ILogger logger, bool i
logger.LogInformation(sub + "create managed identity");
}

// 3. Inheritable Permissions — non-DW spec set (Observability API, Power Platform API, custom)
// stamped on the blueprint via SetInheritablePermissionsAsync so MAC and other dependent
// systems can see them. The same set is applied to the agent identity SP in step 5.
// 3. Inheritable Permissions — non-DW spec set (Observability API, Defender API,
// Power Platform API, custom) stamped on the blueprint via SetInheritablePermissionsAsync
// so MAC and other dependent systems can see them. The same set is applied to the agent
// identity SP in step 5.
var selectedAuthMode = authMode ?? config.AuthMode;
var effectiveMode = string.IsNullOrWhiteSpace(selectedAuthMode)
? "obo"
: selectedAuthMode.Trim().ToLowerInvariant();
logger.LogInformation(SetupHelpers.DryRunRow(3, "Inheritable Permissions") + "configure for Observability API, Power Platform API, and custom permissions (Global Administrator required; consent URL printed if absent)");
logger.LogInformation(SetupHelpers.DryRunRow(3, "Inheritable Permissions") + "configure for Observability API, Defender API, Power Platform API, and custom permissions (Global Administrator required; consent URL printed if absent)");

// 4. Blueprint Permission Grants — per authMode. The consent URL targets the blueprint
// app, and S2S app-role assignments are persisted as grants flowing from the blueprint;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,7 @@ private static Command CreateBotSubcommand(
logger.LogInformation(" - Blueprint: {BlueprintId}", dryRunConfig.AgentBlueprintId);
logger.LogInformation(" - Messaging Bot API: {Scope}", ConfigConstants.MessagingBotApiAdminConsentScope);
logger.LogInformation(" - Observability API: {OtelScope} (delegated + application)", ConfigConstants.ObservabilityApiOtelWriteScope);
logger.LogInformation(" - Defender API: {DefenderScope} (delegated + application)", ConfigConstants.DefenderApiRealtimeProtectionScope);
logger.LogInformation(" - Power Platform API: Connectivity.Connections.Read");
logger.LogInformation("No changes made. Run without --dry-run to execute.");
return;
Expand Down Expand Up @@ -852,6 +853,7 @@ internal static async Task RemoveStaleCustomPermissionsAsync(
envAtgAppId,
ConfigConstants.MessagingBotApiAppId,
ConfigConstants.ObservabilityApiAppId,
ConfigConstants.DefenderApiAppId,
PowerPlatformConstants.PowerPlatformApiResourceAppId,
AuthenticationConstants.MicrosoftGraphResourceAppId,
};
Expand Down
Loading
Loading