Skip to main content
Glama

vm-count-by-tenant

Count virtual machines across Azure tenants and subscriptions using Azure Resource Graph queries to track VM inventory in multi-tenant environments.

Instructions

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

Input Schema

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

Implementation Reference

  • Handler logic for the 'vm-count-by-tenant' tool within the call_tool function. Loops over tenants, scopes subscriptions or management group, executes vm_count_kql query, aggregates and formats VM counts.
    if name == "vm-count-by-tenant":
        # Optional: restrict to certain tenants
        wanted = set(arguments.get("tenant_names", []) or [])
        try_all = bool(arguments.get("use_all_subscriptions", True))
    
        tenants = AZURE_CONFIG.get_tenants()
        if wanted:
            tenants = [t for t in tenants if t.get("name") in wanted]
            if not tenants:
                return [types.TextContent(type="text", text="No matching tenants found.")]
    
        rows: List[str] = []
        total = 0
        for t in tenants:
            tname = t.get("name") or t.get("id")
            cred, default_subs = AZURE_CONFIG.get_credentials(tname)
            mg = AZURE_CONFIG.get_management_group_id(tname)
            subs = list(default_subs)
            if try_all and mg:
                subs = []  # force MG usage below
            elif try_all:
                discovered = _enumerate_subscriptions_for_credential(cred)
                if discovered:
                    subs = discovered
    
            if not subs:
                rows.append(f"- {tname}: 0 (no subscriptions)")
                continue
    
            kql = vm_count_kql()
            if try_all and mg and not subs:
                result = execute_kql(cred, None, kql, top=1, management_groups=[mg])
            else:
                result = execute_kql(cred, subs, kql, top=1)
            if result["status"] != "success" or not result.get("results"):
                rows.append(f"- {tname}: error ({result.get('error','query failed')})")
                continue
            count = int(result["results"][0].get("VMCount", 0))
            total += count
            rows.append(f"- {tname}: {count}")
    
        body = [
            "VM counts by tenant:",
            *rows,
            "",
            f"Total VMs across tenants: {total}",
        ]
        return [types.TextContent(type="text", text="\n".join(body))]
  • Tool registration in @server.list_tools() decorator, defining name, description, and input schema for 'vm-count-by-tenant'.
    types.Tool(
        name="vm-count-by-tenant",
        description="Count virtual machines per configured tenant (uses all subscriptions when available).",
        inputSchema={
            "type": "object",
            "properties": {
                "tenant_names": {"type": "array", "items": {"type": "string"}, "description": "Optional subset of tenant names to include"},
                "use_all_subscriptions": {"type": "boolean", "description": "Try to include all subscriptions in each tenant (fallbacks to default)", "default": True}
            },
            "required": [],
        },
    ),
  • Input schema definition for the 'vm-count-by-tenant' tool, specifying optional tenant_names array and use_all_subscriptions boolean.
    inputSchema={
        "type": "object",
        "properties": {
            "tenant_names": {"type": "array", "items": {"type": "string"}, "description": "Optional subset of tenant names to include"},
            "use_all_subscriptions": {"type": "boolean", "description": "Try to include all subscriptions in each tenant (fallbacks to default)", "default": True}
        },
        "required": [],
  • Helper function that loads and returns the KQL template for counting virtual machines (via kql_loader.load_kql_template('vm_count')).
    def vm_count_kql() -> str:
        return _tmpl("vm_count")

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