An MCP server that provides tools for interacting with Microsoft Azure resources, including subscriptions, resource groups, virtual machines, and generic resources.
HTTP-based Azure tool server with 5 read-only tools. All tools have descriptions (critical pass), but descriptions are generic and lack context for LLM decision-making. All parameters have string types and descriptions, meeting baseline JSON Schema requirements. However, parameter descriptions lack format constraints, validation rules, and enum declarations where applicable. Output schemas are not documented, the code shows Dictionary returns, but LLMs cannot see these from the tool definition. No pagination support documented despite tools returning potentially large result sets (e.g., GetAzureSubscriptionsAsync, GetVirtualMachinesMatchTagKeyAsync). No error handling guidance, failures return raw exceptions, not actionable recovery instructions. Tool names follow verb_noun pattern but are verbose (e.g., GetAzureSubscriptionsAsync vs get_subscriptions). No security annotations (tool risks are inferred as READ_ONLY but not formally declared in toolAnnotations). Per-tool scores average 62, placing this server in the 'Fair to Good' range, functional but with significant gaps in LLM-friendly design.
Retrieves a list of azure subscriptions and their ID
Retrieves a list of azure resource groups for a subscription
Retrieves a dictionary of properties and other metadata for a specific azure resource id
Retrieves all resources within a specified resource group
Retrieves all virtual machine names and their tags, from a subscription, where the virtual machine tags has a tag that matches a tag key
No documented output schemas. Tool descriptions mention returns but LLMs have no visibility into returned fields, types, or structure. GetAzureSubscriptionsAsync returns Dictionary<string, string> but description does not state this, forcing LLMs to guess field names for chaining calls.
Parameter descriptions lack validation rules and constraints. subscriptionId and tagKey accept free-form strings with no format guidance. LLMs cannot validate inputs before calling the tool, risking API failures. Should specify: format (UUID for subscriptionId), constraints (non-empty, alphanumeric for tagKey), and examples.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 43 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 40 | - | v1 |
No pagination support documented despite tools potentially returning large result sets (e.g., subscriptions, VMs, resource groups). GetAzureSubscriptionsAsync and GetVirtualMachinesMatchTagKeyAsync iterate through all results without a limit parameter, risking context window exhaustion and token waste.
No error handling guidance. Tool descriptions do not explain what to do if a subscription is not found, a resource group doesn't exist, or a tag key matches no VMs. Failures will return raw exceptions; LLMs cannot infer recovery steps.
Tool descriptions are generic and do not clarify when to use each tool or what insight it provides. For example, GetVirtualMachinesMatchTagKeyAsync description does not explain why filtering by tag is useful or when an LLM should invoke it instead of GetResourcesInResourceGroupAsync. Baseline for tool description length is 194 chars; these average ~110 chars and lack context.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) in tool definitions. While all tools are READ_ONLY (inferred from documentation), this is not formally declared via toolAnnotations, limiting agent optimization and safety checks.
Parameter descriptions missing examples of valid input formats. E.g., 'subscriptionId' has no example of a valid UUID format; 'resourceId' has no example of a full Azure resource ID. Baseline practice: include 1-2 examples in parameter descriptions to guide LLM input generation.