MCP server implementation for Azure CLI integration. Provides programmatic access to Azure Cloud resources through Azure CLI commands with comprehensive support for compute, storage, networking, security, and resource management operations.
Single tool 'azure_cli' has a basic description but critical gaps in schema documentation, parameter descriptions, and error handling. The tool accepts arbitrary shell commands, creating injection risks. Input schema visible in code shows 'command' (string) and 'timeout' (integer, default 60), but parameter descriptions are minimal. No output schema documented. Error responses are JSON-wrapped but lack actionable recovery guidance. Tool does one thing (run CLI) but exposes dangerous surface area without input validation or security guardrails.
Run an Azure CLI command and return the output.
Command injection vulnerability: tool accepts arbitrary 'command' string and passes to subprocess without sanitization. LLM could be tricked into passing 'az login; rm -rf /' or similar. No input validation, allowlist, or escaping visible.
No output schema documented. Tool returns raw JSON or text output, but LLM has no formal schema to parse results. Responses include status/message/error fields inconsistently; no structured field definitions provided.
Parameter 'command' description is trivial ('The Azure CLI command to execute (with or without 'az' prefix)'). Does not explain format constraints, valid command categories, or examples. LLM cannot infer which commands are safe or expected.
Error responses lack recovery guidance. Timeout, truncation, and decode errors return JSON with 'status' and 'message' but no actionable next steps. E.g., 'Operation timed out after 60 seconds' does not tell LLM whether to retry, increase timeout, or try a different approach.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 41 | 2026-07-28+ | v2 |
Credentials (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID) loaded from environment and used in authenticate_with_service_principal(). While not exposed as tool parameters, the token refresh logic is stateful and global (TOKEN_EXPIRES_AT), violating stateless request handling. No per-request token validation or session isolation.