Multi-agent orchestration MCP server for AI-powered Azure infrastructure management with specialized agents for infrastructure, compliance, cost, discovery, knowledge base, and configuration
Server implements 3 compliance-focused tools with detailed descriptions and reasonable parameter schemas. However, critical gaps exist: (1) tool descriptions lack actionable recovery guidance for failure cases; (2) output schemas are not documented, we cannot verify what fields are returned or their types; (3) error handling is not visible in source; (4) parameter validation constraints (min/max, enums) are missing for several fields; (5) tool annotations (readOnlyHint, destructiveHint) are absent despite batch_remediation being state-changing. Naming is clear (verb-first, domain-specific). Parameter descriptions are present but incomplete, e.g. 'severity_filter' lacks enum values in description, 'dry_run' default is mentioned but not validated. Overall follows ~50% of 54 patterns; suitable for compliance domain but needs hardening for production.
Execute remediation for multiple compliance findings at once based on severity or control family. IMPORTANT: Uses the existing assessment from conversation context - does NOT run a new assessment. Use this when user says: 'start remediation', 'fix high-priority issues', 'remediate critical findings', 'execute automated remediation', 'fix all violations'. Accepts severity filter (critical, high, medium, low, all) and optional control family filter. Supports dry-run mode (default) to preview changes before applying them. Accepts either a subscription GUID or friendly name (e.g., 'production', 'dev', 'staging'). If no subscription specified, uses the last assessed subscription from conversation context.
View audit trail of compliance assessments showing who ran them and when. Useful for audit compliance, accountability, and tracking assessment frequency. Example: 'Who ran compliance assessments this week?' or 'Show me audit log'
Runs a REAL compliance assessment against an Azure subscription using NIST 800-53, FedRAMP, or other frameworks. Scans actual Azure resources using Azure Resource Graph and Defender for Cloud. Returns findings organized by control family and severity with remediation guidance.
Output schemas not documented. Cannot verify return types, field names, or structure for any of the three tools. LLMs cannot plan downstream operations without knowing what fields (e.g., remediation_id, control_name, severity) are returned.
batch_remediation is a state-changing tool (executes remediation) but lacks destructiveHint/idempotentHint annotations. Tool description warns about dry-run default, but no structured signal in the protocol to help LLMs plan carefully.
Parameter constraints missing or underspecified. 'severity_filter' lists values in description ('critical', 'high', 'medium', 'low', 'all') but not as an enum in the schema. 'days' parameter has max=90 in description but no formal schema constraint. 'max_findings' has no min/max bounds.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Error handling and recovery guidance not visible in source code. Descriptions do not explain what happens on failure (e.g., 'If assessment times out, retry with a smaller resource_group scope'). LLMs receive no actionable next steps on errors.
Parameter names accept both GUID and friendly name (subscription_id, subscription name) but descriptions do not clearly specify the format or resolution behavior. E.g., 'subscription_id' parameter says 'Azure subscription ID (GUID) or friendly name' but no guidance on how name lookup fails or what friendly names are valid.
batch_remediation description emphasizes 'IMPORTANT: Uses the existing assessment from conversation context, does NOT run a new assessment' but relies on implicit conversation state (last_assessed_subscription). No explicit mechanism (e.g., assessment_id parameter) to reference a prior result. Agents may not understand statefulness.