Skip to main content
Glama

Azure-Assistant-MCP

Minimal, fast MCP server for exploring Azure using Azure Resource Graph (ARG). It generates and runs KQL to answer questions about your Azure environment(s), with clear, explicit scoping and optional management group coverage.

Disclaimer

Use this project at your own risk. It is provided "as is" without warranties or guarantees of any kind. You are solely responsible for how you use it, including configuration, access control, and compliance with your organization’s policies. The author and contributors are not liable for any damages, data loss, security incidents, costs, or policy violations that result from using this software. No employer or organization is implied to endorse or support this project.

Related MCP server: MCP KQL Server

Why this exists

  • Make it trivial to inspect and run ARG KQL directly.

  • Avoid heavyweight dependencies; ship a small, stdio-based MCP server.

Highlights

  • Natural‑language → KQL for common tasks; always shows the query.

  • Direct KQL execution against ARG with paging caps (top).

  • Explicit scope in responses: tenant + subscriptions or management group.

  • Auto‑discover subscriptions or query at management group scope.

  • Optional diagnostics mode for quick scope debugging.

Requirements

  • Python 3.10+

  • Azure SPN(s) with Reader at the scope you intend to query:

    • Subscriptions: Reader on each target subscription

    • Management group: Reader on the MG (and underlying resources)

Install

  • From the repo root:

    • pip install -e .

    • Or use the wrapper: ./azure-assistant-mcp.sh (prefers .venv if present)

  • Add as an MCP stdio server in your client using the wrapper command.

    • Ensure the wrapper is executable: chmod +x ./azure-assistant-mcp.sh

    • Example (Claude Desktop CLI):

      claude mcp add azure-assistant-mcp \
        /your/path/Azure-Assistant-MCP/azure-assistant-mcp.sh \
        --env AZURE_ASSISTANT_CONFIG=/your/path/Azure-Assistant-MCP/azure-config.json \
        --scope user \
        --transport stdio

Configuration

  • Place your secrets in azure-config.json (ignored by git). See azure-config-example.json for structure.

  • The launch script exports AZURE_ASSISTANT_CONFIG to the repo’s azure-config.json to avoid accidental cross‑repo configs.

  • You can also point to a custom location via AZURE_ASSISTANT_CONFIG.

Schema

  • Top level

    • debug (optional): enables diagnostics tool

    • tenants: list of configured tenants

  • Per tenant

    • id: tenant guid

    • name: friendly name

    • service_principal.client_id / service_principal.client_secret

    • default_subscription_id (optional fallback)

    • management_group_id (optional; short name like contoso-root or full resource id). The server normalizes to the short name.

Scoping Rules

  • If subscription_ids are provided: use those subscriptions.

  • Else if use_all_subscriptions is true and management_group_id is configured: run at MG scope in ARG.

  • Else attempt to enumerate subscriptions via ARM and use that list.

  • Else fall back to default_subscription_id.

  • Responses always print Tenant and either Scope: managementGroup=... or Subscriptions used: N.

Tools

  • ask-azure:

    • Input: { "question": string, "tenant_name?": string, "subscription_ids?": string[], "use_all_subscriptions?": boolean, "auto_execute?": boolean }

    • Generates KQL for your question. If auto_execute is true (default), executes it using Scoping Rules. If tenant_name is omitted, the server heuristically infers it from text (matches names and initialisms).

  • list-tenants:

    • Input: {}

    • Lists configured tenants from azure-config.json with their IDs, optional management_group_id, and default_subscription_id to help you pick scope and SPN.

  • run-arg-kql:

    • Input: { "kql_query": string, "tenant_name?": string, "subscription_ids?": string[], "use_all_subscriptions?": boolean, "top?": integer }

    • Executes provided KQL using Scoping Rules. Adds Rows, Tenant, and the scope line to the header.

  • run-kql-template:

    • Input: { "template_name": string, "params?": object, "tenant_name?": string, "subscription_ids?": string[], "use_all_subscriptions?": boolean, "top?": integer }

    • Loads src/azure_assistant_mcp/kql/<template_name>.md (fenced kql) or .kql, applies simple {{key}} replacements from params, and executes with Scoping Rules.

  • list-subscriptions:

    • Input: { "tenant_name?": string }

    • Lists subscriptions. Uses ARM enumeration when possible, enriches with ARG; prefers MG scope if configured to return a complete list.

  • vm-count-by-tenant:

    • Input: { "tenant_names?": string[], "use_all_subscriptions?": boolean }

    • Runs a simple VM count per tenant using the Scoping Rules.

  • diagnostics (shown only when debug is true):

    • Input: { "tenant_name?": string }

    • Prints config path, resolved tenant, normalized MG id, ARM enumeration sample and count, ARG MG coverage sample and count, and the default scoping decision.

  • arg-tables:

    • Input: {}

    • Prints an overview of common Azure Resource Graph tables (resourcecontainers, resources, resourcechanges, advisorresources, healthresources, policyresources) with purposes and typical use cases.

  • arg-examples:

    • Input: { "topic?": string } where topic can be subscriptions, resourcegroups, changes, containerchanges, advisor, health, or policy.

    • Returns sample KQL snippets for common scenarios across the ARG tables.

KQL Templates (customize queries)

  • You can edit the KQL used by built-in tools and examples without touching Python code.

  • Templates live in src/azure_assistant_mcp/kql/ as .md files with a fenced ```kql block (or plain .kql files).

  • At runtime, the server loads these templates. There is no fallback: if a required template is missing, the server raises an error so you can fix it.

  • Override the template directory by setting AZURE_ASSISTANT_KQL_PATH to another folder.

  • Examples:

    • list_subscriptions.md

    • list_resource_groups.md

    • untagged_resource_groups.md

    • manual_changes.md

    • resource_changes_recent.md

    • stopped_vms.md

    • generic_list_resources.md

    • Create your own, e.g. kubernetes_inventory.md, then run with: run-kql-template { "template_name": "kubernetes_inventory", "params": { ... } }.

Usage Examples

  • List subscriptions in a tenant by MG:

    • Tool: list-subscriptions

    • Input: { "tenant_name": "Contoso" }

  • Count VMs across all subs in a tenant:

    • Tool: ask-azure

    • Input: { "tenant_name": "Contoso", "question": "How many virtual machines exist?" }

  • Run KQL directly across all subs at MG scope:

    • Tool: run-arg-kql

    • Input: { "tenant_name": "Contoso", "kql_query": "resourcecontainers | where type =~ 'microsoft.resources/subscriptions' | project name, subscriptionId | order by name asc" }

Security

  • Do not commit real credentials. azure-config.json is git‑ignored; use the example file as a template.

  • Consider storing secrets in a secure store and templating your config.

  • Ensure service principals have least privilege for the scopes you query.

Troubleshooting

  • Seeing only one subscription:

    • Add a management_group_id that contains all target subscriptions, or pass subscription_ids explicitly.

  • BadRequest from ARG:

    • Check KQL syntax and selected scope. Start with run-arg-kql using a small query and top.

  • Validate scope quickly:

    • Enable debug: true and run the diagnostics tool for the tenant.

Development

  • Code lives in src/azure_assistant_mcp/. Entry point is azure_assistant_mcp:main.

  • Wrapper script: azure-assistant-mcp.sh (sets PYTHONPATH and pins AZURE_ASSISTANT_CONFIG).

  • Backwards-compatibility alias: azure-assistant.sh (deprecated).

  • Dependencies: mcp, python-dotenv, azure-identity, azure-mgmt-resourcegraph, azure-mgmt-subscription.

Claude Code

  • Suggested sub-agent: Claude_Agents/azure-cloud-architect.md — an Azure cloud architecture helper you can load in Claude Code alongside this MCP server.

  • Getting started:

    • Copy Claude_Agents/azure-cloud-architect.md into your .claude/agents folder

Contributing

  • Issues and PRs welcome. Please omit real tenant IDs, secrets, or organization names from examples and logs.

License

  • Licensed under Apache-2.0. See LICENSE for full terms.

  • Attribution: This project includes a NOTICE file. Per Apache-2.0 §4(d), redistributors must retain the attribution notices in NOTICE in any source distributions and in documentation or about dialogs where such notices normally appear.

Commercial use & sponsorship

  • Enterprise users are encouraged to attribute the project in documentation or about pages.

  • If your organization benefits from this project, please consider sponsorship or a commercial support agreement.

  • Options:

    • Commercial support/license inquiries: open an issue or contact the maintainer.

    • "Buy Me A Coffee"

Available Tools

8 tools
arg-examplesB

Sample KQL snippets for common scenarios across ARG tables.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoOptional topic filter, e.g., 'subscriptions', 'policy', 'advisor', 'health', 'changes', 'resourcegroups'

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool provides 'Sample KQL snippets,' implying a read-only, informational function, but doesn't clarify if it's a query, a lookup, or a static list, nor does it mention any constraints like rate limits, authentication needs, or output format. For a tool with no annotations, this is a significant gap in behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's front-loaded with the core function and appropriately sized for its informational role, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (1 optional parameter, no output schema, no annotations), the description is minimally adequate. It covers the basic purpose but lacks details on usage, behavioral traits, and how it fits with siblings. Without an output schema, it doesn't explain return values, but for a simple tool, it meets a bare minimum threshold without being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 1 parameter with 100% description coverage, detailing 'topic' as an optional filter with examples. The description adds no additional parameter semantics beyond the schema, such as how the topic influences the snippets or default behavior. With high schema coverage, the baseline is 3, as the description doesn't compensate but doesn't detract either.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: providing 'Sample KQL snippets for common scenarios across ARG tables.' It specifies the verb ('Sample') and resource ('KQL snippets'), and mentions the scope ('across ARG tables'). However, it doesn't explicitly differentiate from siblings like 'run-arg-kql' or 'run-kql-template,' which might also involve KQL queries, so it lacks full sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, context, or exclusions, and with siblings like 'run-arg-kql' and 'run-kql-template' that handle KQL execution, there's no indication of when to prefer this tool for examples over those for running queries. This leaves usage unclear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

arg-tablesC

Overview of common Azure Resource Graph tables, their purpose, and typical use cases.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It doesn't disclose behavioral traits such as whether this is a read-only operation, if it requires authentication, rate limits, or what the output format might be. The description is too high-level to provide meaningful transparency for tool invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that clearly states the tool's high-level purpose without unnecessary details. It's appropriately sized for a no-parameter tool, though it could be more front-loaded with specific action verbs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of Azure Resource Graph and lack of annotations or output schema, the description is incomplete. It doesn't explain what 'overview' entails, the format of the output, or how it integrates with sibling tools, leaving gaps for effective tool use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description doesn't add parameter semantics, but this is acceptable given the lack of parameters, aligning with the baseline for 0 parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool provides an 'overview of common Azure Resource Graph tables, their purpose, and typical use cases,' which gives a general purpose but lacks specificity. It doesn't clearly distinguish this from sibling tools like 'arg-examples' or 'run-arg-kql,' which might also involve Azure Resource Graph tables, making the purpose somewhat vague.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions 'typical use cases,' implying some context, but it doesn't explicitly state when to use this tool versus alternatives like 'arg-examples' or 'run-arg-kql.' There's no guidance on prerequisites, exclusions, or specific scenarios, leaving usage unclear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ask-azureC

Answer a question by generating and running an Azure Resource Graph KQL query.

ParametersJSON Schema
NameRequiredDescriptionDefault
questionYesYour natural-language question about Azure resources
tenant_nameNoOptional configured tenant name
subscription_idsNoOptional explicit subscription IDs
use_all_subscriptionsNoIf no subscriptions are provided, attempt to auto-discover all accessible subscriptions (default: true)
auto_executeNoExecute the generated KQL automatically (default: true)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions generating and running KQL queries but lacks details on permissions required, rate limits, error handling, or what happens if 'auto_execute' is false. For a tool that interacts with Azure resources and has multiple parameters, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose without unnecessary details. It uses clear language and avoids redundancy, making it easy for an agent to quickly understand the tool's function. Every word earns its place, contributing directly to the tool's definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of interacting with Azure resources, 5 parameters, no annotations, and no output schema, the description is incomplete. It doesn't cover behavioral aspects like authentication needs, potential side effects, or return format, which are crucial for safe and effective use. The description alone is insufficient for a tool of this nature.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 5 parameters. The description adds no additional meaning beyond the schema, such as explaining how parameters interact (e.g., 'subscription_ids' vs. 'use_all_subscriptions') or providing examples. With high schema coverage, the baseline score of 3 is appropriate, as the description doesn't compensate but doesn't need to.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Answer a question by generating and running an Azure Resource Graph KQL query.' It specifies the verb ('generating and running'), resource ('Azure Resource Graph KQL query'), and outcome ('Answer a question'). However, it doesn't explicitly differentiate from siblings like 'run-arg-kql' or 'run-kql-template', which likely handle similar KQL operations, so it falls short of a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention siblings such as 'run-arg-kql' (which might run pre-written KQL) or 'arg-examples' (which could provide sample queries), leaving the agent without context for tool selection. Usage is implied only by the purpose statement, with no explicit when/when-not instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-subscriptionsC

List subscriptions accessible to the configured service principal for a tenant.

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_nameNoOptional configured tenant name

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions 'accessible to the configured service principal', hinting at authentication/access control, but does not disclose key behavioral traits like pagination, rate limits, error handling, or response format. For a read operation with zero annotation coverage, this leaves significant gaps in understanding how the tool behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero waste. It is front-loaded with the core purpose and appropriately sized for a simple list tool, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description is incomplete for a tool that likely returns a list of subscriptions. It lacks details on return values, error cases, or operational constraints. For a tool with minimal structured data, the description should compensate more to provide adequate context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the single parameter 'tenant_name' documented as optional. The description adds no additional parameter semantics beyond what the schema provides (e.g., format, examples, or implications of omitting it). Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('List') and resource ('subscriptions'), specifying that it retrieves subscriptions accessible to a service principal for a tenant. It distinguishes from siblings like 'list-tenants' by focusing on subscriptions, but does not explicitly differentiate from other potential subscription-related tools (though none are present in the sibling list).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when needing to list subscriptions for a tenant, but provides no explicit guidance on when to use this tool versus alternatives (e.g., 'list-tenants' for tenants, 'vm-count-by-tenant' for VM counts). It lacks prerequisites, exclusions, or named alternatives, offering minimal contextual direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-tenantsB

List configured tenants from azure-config.json, including optional management group and default subscription info.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions that the tool lists tenants 'including optional management group and default subscription info,' which adds some context about the output. However, it does not cover critical behaviors like read-only nature, potential errors, data sources, or response format, leaving significant gaps for a tool with no annotation support.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core action ('List configured tenants') and adds necessary detail about the data source and included info. There is no wasted language, and it is appropriately sized for a simple tool with no parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is adequate but has gaps. It explains the purpose and output context but lacks behavioral details like error handling or data freshness. Without annotations or output schema, more completeness would require additional disclosure about the tool's operation and results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately does not discuss parameters, focusing instead on the tool's purpose and output context. This aligns with the baseline for zero parameters, as the description adds value by explaining what information is included in the output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('List') and resource ('configured tenants from azure-config.json'), specifying what the tool does. It distinguishes itself from siblings like 'list-subscriptions' and 'vm-count-by-tenant' by focusing on tenants, but does not explicitly contrast with them. The purpose is specific and actionable, though not maximally differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, context, or exclusions, such as when to choose 'list-tenants' over 'list-subscriptions' or other sibling tools. Usage is implied by the purpose but lacks explicit instructions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run-arg-kqlC

Run a provided KQL query against Azure Resource Graph.

ParametersJSON Schema
NameRequiredDescriptionDefault
kql_queryYesKQL to execute (must reference valid ARG tables)
tenant_nameNoOptional configured tenant name
subscription_idsNoOptional explicit subscription IDs
use_all_subscriptionsNoIf no subscriptions are provided, attempt to auto-discover all accessible subscriptions (default: true)
topNoMax rows to return (default: 100)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action ('Run') but doesn't cover critical aspects like authentication requirements, rate limits, error handling, or what the output looks like (e.g., format, pagination). For a query execution tool with zero annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is front-loaded with the core action and target, making it easy to parse and understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of running queries against Azure Resource Graph, no annotations, and no output schema, the description is incomplete. It lacks details on behavioral traits (e.g., execution limits, result format), usage context, and how it differs from siblings, making it inadequate for safe and effective tool invocation by an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema fully documents all parameters. The description adds no additional semantic context beyond implying the query targets Azure Resource Graph, which is already suggested by the tool name. This meets the baseline for high schema coverage without compensating value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Run') and target ('a provided KQL query against Azure Resource Graph'), which is specific and unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'run-kql-template' or 'arg-examples', which likely have related but distinct purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'run-kql-template' or 'ask-azure'. It mentions the target (Azure Resource Graph) but offers no context about prerequisites, typical use cases, or exclusions, leaving the agent to infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run-kql-templateC

Execute a KQL template from kql/ by name, with optional {{param}} replacements.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_nameYesTemplate filename without extension (looks for .md or .kql in kql folder)
paramsNoOptional key/value replacements for {{key}} placeholders in the template
tenant_nameNoOptional configured tenant name
subscription_idsNoOptional explicit subscription IDs
use_all_subscriptionsNoIf no subscriptions are provided, attempt to auto-discover all accessible subscriptions (default: true)
topNoMax rows to return (default: 100)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but lacks critical behavioral details. It doesn't mention permissions needed, rate limits, whether it's read-only or mutative, error handling, or output format. This is inadequate for a tool that executes queries with potential side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core action and key feature (parameter replacements). It wastes no words and is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, no annotations, no output schema), the description is insufficient. It omits behavioral context, usage guidance, and output details, leaving significant gaps for an AI agent to understand how to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 6 parameters. The description adds minimal value by mentioning 'optional {{param}} replacements', which aligns with the 'params' parameter but doesn't provide additional semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Execute') and resource ('a KQL template from kql/ by name'), specifying it handles parameter replacements. It doesn't explicitly differentiate from sibling tools like 'run-arg-kql', but the purpose is well-defined.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like 'run-arg-kql' or 'ask-azure', nor any prerequisites or exclusions. The description only states what it does, not when to apply it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vm-count-by-tenantB

Count virtual machines per configured tenant (uses all subscriptions when available).

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_namesNoOptional subset of tenant names to include
use_all_subscriptionsNoTry to include all subscriptions in each tenant (fallbacks to default)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions 'uses all subscriptions when available' which implies some fallback behavior, but doesn't disclose critical details like authentication requirements, rate limits, error handling, or what 'configured tenant' means operationally. For a tool with no annotations, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose. Every word earns its place with no redundancy or unnecessary elaboration, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description provides basic purpose but lacks sufficient context for effective use. It doesn't explain what 'count' returns (e.g., numbers, aggregated data), how tenants are identified, or error scenarios. For a tool with two parameters and no structured safety hints, this is minimally adequate but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description adds no additional parameter information beyond what's in the schema. It mentions 'uses all subscriptions when available' which relates to the use_all_subscriptions parameter's default behavior, but this is already covered in the schema's description and default value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Count') and resource ('virtual machines per configured tenant'), making the purpose unambiguous. It distinguishes from siblings by focusing on counting rather than listing or querying, though it doesn't explicitly name alternatives. The mention of 'uses all subscriptions when available' adds useful scope context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives is provided. The description mentions 'uses all subscriptions when available' which hints at a default behavior, but doesn't specify scenarios where this tool is preferred over sibling tools like list-tenants or run-kql-template for similar purposes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

B3.2/5.0
Disambiguation4/5

Most tools have distinct purposes, with clear separation between query execution (run-arg-kql, run-kql-template), information lookup (arg-tables, arg-examples), and administrative tasks (list-subscriptions, list-tenants, vm-count-by-tenant). However, ask-azure overlaps somewhat with run-arg-kql as both execute KQL queries, though ask-azure adds question interpretation.

Naming Consistency3/5

The naming follows a mostly readable pattern with hyphen-separated words, but there's inconsistency in verb usage: some use action-oriented verbs (run-, list-, ask-), while others are noun-based (arg-examples, arg-tables). This mixed convention reduces predictability across the toolset.

Tool Count5/5

With 8 tools, this server is well-scoped for Azure Resource Graph interactions. Each tool serves a specific function in querying, managing, or learning about Azure resources, and the count feels appropriate without being overwhelming or insufficient for the domain.

Completeness4/5

The toolset covers core aspects of Azure Resource Graph operations, including query execution, template management, subscription/tenant listing, and educational resources. A minor gap exists in direct resource manipulation (e.g., create or modify resources), but this aligns with the server's focus on querying and analysis rather than full CRUD operations.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables intelligent KQL query execution against Azure Data Explorer clusters with AI-powered schema caching and natural language to KQL conversion. Provides automated schema discovery and context-aware query assistance for enhanced data exploration.
    23
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables intelligent interaction with Azure resources through natural language by translating requests into safe, auditable Azure CLI commands with plan/review workflows and direct access to 8 Azure services including Storage, Cosmos DB, Key Vault, and more.
    3
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/andrewstephenson-v1/Azure-Assistant-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server