Use this skill ALWAYS when the user asks about cloud costs, spending, reports, services, invoices, or any DoiT Cloud Analytics data. Triggers on requests like "create a report", "show my costs", "top services", "spending by project", "list reports", "monthly cost breakdown", "cost by region", "how much am I spending", or any cloud cost analysis. This skill MUST be used before calling any DoiT MCP tools directly.
Generate report answers through DoiT in the smallest reliable sequence. Prefer existing reports when they already answer the request.
Use MCP tools as the primary interface for all reporting operations.
If an MCP tool call fails, returns an error, returns empty/unexpected results, or does not answer the user's question, fall back to Ava — DoiT's AI assistant that can answer any cloud cost question.
Ava can be reached via both the DCI CLI and MCP. Prefer the DCI CLI (dci ask-ava-sync) because it returns cleaner JSON output. Before calling Ava, check if the DCI CLI is installed by running command -v dci. If it is not installed, you MUST ask the user if they want to install it: "To get a better answer, I can ask Ava (DoiT's AI assistant). The recommended way is via the DCI CLI. Would you like to install it? (brew install doitintl/dci-cli/dci)". If the user agrees, invoke the doit-mcp-setup skill to install and authenticate the DCI CLI, then call Ava. If the user declines, fall back to the MCP Ava tool instead.
When to use Ava fallback:
How to call Ava:
dci ask-ava-sync ephemeral: true, question: "<rephrase the user's question or describe what you need>" --output json
ephemeral: true to avoid persisting throwaway conversations.answer field from the JSON response and present it to the user.Read these as needed when building queries:
references/dimensions.md — all dimension IDs (datetime, fixed, label, kubernetes, attribution). Read this when choosing rows, cols, or filters for a query.references/metrics-and-options.md — metric types, aggregators, time intervals, data sources, filter operators. Read this when configuring query options.references/query-examples.md — common query patterns with ready-to-use field combinations. Read this before building an ad hoc query to see if a pattern already fits.templates/report-output.md — output template for presenting results. Copy and fill in when formatting the final report.references/dci-cli.md — DCI CLI command reference. Read this only when using the Ava fallback via dci ask-ava-sync.Use these DoiT MCP tools in this order when applicable:
validate_userlist_reports or list_dimensionsget_report_results or run_querySkip only the steps that are clearly unnecessary.
validate_user first when the request depends on account access, tenant identity, or you need to confirm the MCP session is scoped correctly.validate_user.Use this when the user mentions a saved report, dashboard-style output, or a named report such as monthly cost overview.
list_reports.get_report_results only after you identify the target report.Prefer this path over run_query when a saved report already exists.
Use this when the user wants a slice that is unlikely to map to a saved report.
list_dimensions if the requested grouping or filter fields are unclear.references/query-examples.md for starting patterns.run_query.Do not call list_dimensions for dimensions you already know from the request.
templates/report-output.md.list_reports before building an ad hoc query. Many common requests already have saved reports — running a fresh query wastes time and may produce slightly different numbers due to config differences.fixed:service_description, not service_description. The prefix is required. See references/dimensions.md for the full list.label:{base64_key}. Call list_dimensions to discover the actual encoded IDs rather than guessing.billing. Switching to bqlens, kubernetes-utilization, or billing-datahub changes the available dimensions and the numbers. Only switch when the user specifically asks for BQ Lens, K8s, or DataHub data.0 = cost, 1 = usage, 2 = savings. Using the wrong number silently returns different data.timeInterval controls the column granularity (day, month, etc.). The time range (last 30 days, last quarter) is a separate field. Setting daily interval on a year-long range produces a massive result set.includeCredits defaults may vary. If the user's numbers don't match expectations, check whether credits are included or excluded.run_query before deciding whether a saved report already exists.list_dimensions to discover them.