Azure Assistant MCP
Mentioned as a sponsorship option for the project, allowing users to support the development through donations
Supports querying Kubernetes resources through Azure Resource Graph using custom KQL templates for inventory management
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Azure Assistant MCPhow many VMs are running in my production subscription?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.venvif present)
Add as an MCP stdio server in your client using the wrapper command.
Ensure the wrapper is executable:
chmod +x ./azure-assistant-mcp.shExample (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). Seeazure-config-example.jsonfor structure.The launch script exports
AZURE_ASSISTANT_CONFIGto the repo’sazure-config.jsonto avoid accidental cross‑repo configs.You can also point to a custom location via
AZURE_ASSISTANT_CONFIG.
Schema
Top level
debug(optional): enables diagnostics tooltenants: list of configured tenants
Per tenant
id: tenant guidname: friendly nameservice_principal.client_id/service_principal.client_secretdefault_subscription_id(optional fallback)management_group_id(optional; short name likecontoso-rootor full resource id). The server normalizes to the short name.
Scoping Rules
If
subscription_idsare provided: use those subscriptions.Else if
use_all_subscriptionsis true andmanagement_group_idis 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
Tenantand eitherScope: managementGroup=...orSubscriptions 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_executeis true (default), executes it using Scoping Rules. Iftenant_nameis omitted, the server heuristically infers it from text (matches names and initialisms).
list-tenants:Input:
{}Lists configured tenants from
azure-config.jsonwith their IDs, optionalmanagement_group_id, anddefault_subscription_idto 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 fromparams, 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 whendebugis 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 besubscriptions,resourcegroups,changes,containerchanges,advisor,health, orpolicy.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.mdfiles with a fenced ```kql block (or plain.kqlfiles).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_PATHto another folder.Examples:
list_subscriptions.mdlist_resource_groups.mduntagged_resource_groups.mdmanual_changes.mdresource_changes_recent.mdstopped_vms.mdgeneric_list_resources.mdCreate 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-subscriptionsInput:
{ "tenant_name": "Contoso" }
Count VMs across all subs in a tenant:
Tool:
ask-azureInput:
{ "tenant_name": "Contoso", "question": "How many virtual machines exist?" }
Run KQL directly across all subs at MG scope:
Tool:
run-arg-kqlInput:
{ "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.jsonis 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_idthat contains all target subscriptions, or passsubscription_idsexplicitly.
BadRequestfrom ARG:Check KQL syntax and selected scope. Start with
run-arg-kqlusing a small query andtop.
Validate scope quickly:
Enable
debug: trueand run thediagnosticstool for the tenant.
Development
Code lives in
src/azure_assistant_mcp/. Entry point isazure_assistant_mcp:main.Wrapper script:
azure-assistant-mcp.sh(setsPYTHONPATHand pinsAZURE_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.mdinto your.claude/agentsfolder
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
LICENSEfor full terms.Attribution: This project includes a
NOTICEfile. Per Apache-2.0 §4(d), redistributors must retain the attribution notices inNOTICEin 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.

Available Tools
8 toolsarg-examplesB
Sample KQL snippets for common scenarios across ARG tables.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Optional topic filter, e.g., 'subscriptions', 'policy', 'advisor', 'health', 'changes', 'resourcegroups' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | Your natural-language question about Azure resources | |
| tenant_name | No | Optional configured tenant name | |
| subscription_ids | No | Optional explicit subscription IDs | |
| use_all_subscriptions | No | If no subscriptions are provided, attempt to auto-discover all accessible subscriptions (default: true) | |
| auto_execute | No | Execute the generated KQL automatically (default: true) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_name | No | Optional configured tenant name |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kql_query | Yes | KQL to execute (must reference valid ARG tables) | |
| tenant_name | No | Optional configured tenant name | |
| subscription_ids | No | Optional explicit subscription IDs | |
| use_all_subscriptions | No | If no subscriptions are provided, attempt to auto-discover all accessible subscriptions (default: true) | |
| top | No | Max rows to return (default: 100) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| template_name | Yes | Template filename without extension (looks for .md or .kql in kql folder) | |
| params | No | Optional key/value replacements for {{key}} placeholders in the template | |
| tenant_name | No | Optional configured tenant name | |
| subscription_ids | No | Optional explicit subscription IDs | |
| use_all_subscriptions | No | If no subscriptions are provided, attempt to auto-discover all accessible subscriptions (default: true) | |
| top | No | Max rows to return (default: 100) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_names | No | Optional subset of tenant names to include | |
| use_all_subscriptions | No | Try to include all subscriptions in each tenant (fallbacks to default) |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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
Official Microsoft MCP Server to query Microsoft Entra data using natural language
Unified API to query AWS, GCP, Azure and generate Terraform/CLI execution kits for AI agents.
Query OneLens cloud-cost data in natural language: breakdowns, trends, cost centers. Read-only.
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables natural language interaction with Azure services through Claude Desktop, supporting resource management, subscription handling, and tenant selection with secure authentication.93018MIT
- AlicenseNot gradedqualityBmaintenanceEnables 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.23MIT
- AlicenseBqualityDmaintenanceEnables 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.31MIT
- AlicenseAqualityBmaintenanceEnables natural-language queries about Azure resource compliance, including VM compliance, patch status, orphaned RBAC, and infrastructure health, through read-only MCP tools.3MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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