Skip to main content
Glama

Costory: Your Finops MCP

query

Query Costory cost, usage, business-metric, external-metric, and budget data, including formulas and period comparisons. Use to answer a request for totals, trends, breakdowns, or comparisons. Optional image output renders and uploads a PNG to cloud storage; base64 output also performs this upload.

MINIMUM VALID CALL: { "queries": [{ "type": "cost", "name": "a", "metricId": "cost", "currency": "USD" }], "datePreset": "MTD", "aggBy": "Day" } Required per series: type (cost|metric|usage|formula|budget|externalMetric) and name. Put labels in alias.

QUERY NAMING: set type and name (use short ids like a/b/c for formulas); put human labels in alias (e.g. "Cost by environment") — never in name. Example: { type: "cost", name: "a", alias: "Cost by environment", groupBy: "cos_environment", ... }. For costs: metricId (cost column, default "cost") and currency (default "USD"). Use costMetricId and currency from get when aligning with a budget. For custom business metrics: use [{ type: "metric", metricId: "..." }] — get IDs from list_metrics. For infra usage metrics (e.g. CPU hours, network bytes): use [{ type: "usage", metricId: "..." }] — call suggest_usage_metrics first to discover valid metricIds for your scope. BigQuery job metrics (orgs with the BigQuery jobs integration) are usage metrics too: metricIds start with query_ (e.g. query_compute_ms, query_bytes_billed, query_count), returned by suggest_usage_metrics with their label and unit; split/scope them with the cos_query_* dimensions (e.g. cos_query_user) like any billing dimension. For live external metrics (not saved as Costory metrics): use [{ type: "externalMetric", provider: "...", integrationId: "...", metricName: "...", aggregator: "SUM", groupByFields: [], conditions: "..." }] — discover provider, integrationId, and metricName via list_metrics with includeExternal: true and a specific search term. Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. Datadog: same shape as Tsuga — metricName is the Datadog metric name (e.g. system.cpu.user), groupByFields are tag keys (e.g. host, service), conditions is an optional Datadog tag filter (e.g. env:prod). When query is set it is the Datadog metrics query string (pass-through); metricName / aggregator / conditions / groupByFields are ignored; .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. CloudWatch: set provider: "cloudwatch"; metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names (e.g. InstanceId); conditions is an optional dimension filter. BigQuery: set provider: "bigquery"; metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required — pick dateColumn/metricColumn from list_metrics schema (first DATE / first NUMERIC) and default gapFillingMethod to FORWARD_FILL; groupByFields are string column names (not CEL); conditions is an optional BigQuery WHERE predicate ANDed with the date range. S3: set provider: "s3"; identical field shape to bigquery — metricName is the fully-qualified table id returned by list_metrics (a Costory-managed external table over the customer's mirrored Parquet); same schema-derived columns; conditions is the same optional WHERE predicate. Snowflake: set provider: "snowflake"; metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-./doctor-ai.'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected. Use externalMetric for exploration when no saved metric matches; use a saved { type: "metric" } when one exists. PERIOD: use datePreset for preset ranges (same as Explore, e.g. MTD, LAST_MONTH, TRAILING_30_DAYS). Forecast (same Forecast group as the explorer date picker): CURRENT_MONTH / CURRENT_QUARTER / CURRENT_YEAR — observed *TD plus Billy to EOM/EOQ/EOY. YTD/MTD/QTD stay observed-only. Mutually exclusive with from/to. Response includes the resolved period dates. For comparison: add compare: {} (or compare: { from, to }) — omit compare dates to auto-derive the preceding period (preset-aware, e.g. LAST_MONTH → previous calendar month). For formulas: add { type: "formula", formula: "a / b" } referencing other queries by name. Optional unitOverride forces the series unit (e.g. "EUR", "slot-h/TiB", "%"); omit to infer from inputs. Currency codes follow the widget currency. For budgets: use [{ type: "budget", budgetId: "..." }] — despite the field name, this must be the budget version ID (same value as budgetVersionId from get); search returns the parent budget id only, so call get with that id to obtain budgetVersionId before querying. Optional groupBy is that budget's virtual dimension bqName from get and splits one series per budget line; omit for the total. For per-line formulas (e.g. variance a - b) set the same groupBy on the sibling cost/usage/metric series. Optional chartType on each query: BAR, LINE, AREA, WATERFALL, or TABLE (defaults to LINE). groupBy is the SPLIT dimension, filterCel is the SCOPE (CEL). Before guessing CEL field names, call search with type: ["dimensions"] — empty query lists all fields; a keyword narrows to matching values. Costory label dimensions use a cos_ prefix (e.g. cos_service_name). Unlabelled resources have null on label dimensions; use filterCel with == null / != null (not is_null or string "null"). Custom virtual dimensions: use immutable bqName from list/get VDIM tools as groupBy / filterCel (not display name). Poll computeStatus until COMPLETED after publish. Optional analyze.changePoint (true or { ignoreWeekends }) runs change-point detection once per query after a timeseries result (incompatible with compare). Optional limit (integer 1–1000): max groups/rows per series. Do NOT set limit unless you need a different cap — when omitted, results default to 100 groups. Set limit above 100 (e.g. 250 or 500) when the user asks for a long tail or full breakdown list. OPTIONAL: set returnGraphImage to "link" (usual result plus imageUrl) or "base64" (same plus an inline PNG block — large payload). Omit for numbers only (default). Adds latency (render + upload) — omit unless the user asked to see the chart. Table-only and split comparison tables still return numbers and append a second text content block with JSON { "image": "unsupported", "message": "..." }. For a saved dashboard widget, use get_dashboard_widget_image (applies dashboard filters; do not re-specify the query). EXAMPLES: • "What are my total costs this month?" → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }], datePreset: "MTD", aggBy: "Day" } • "2026 spend actual + forecast to year-end" → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }], datePreset: "CURRENT_YEAR", aggBy: "Month" } • "Break down AWS costs by service over the last 90 days" → { queries: [{ type: "cost", name: "a", alias: "AWS by service", metricId: "cost", currency: "USD", groupBy: "cos_service_name", filterCel: "cos_provider in ["AWS"]" }], datePreset: "TRAILING_90_DAYS", aggBy: "Week" } • "Show me a chart of last month’s AWS cost by service" → same payload as the breakdown example, plus returnGraphImage: "link" • "Show costs for resources without an environment label" → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD", filterCel: "cos_environment == null" }], datePreset: "TRAILING_30_DAYS", aggBy: "Day" } • "How did our costs change vs last month?" → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }], datePreset: "LAST_MONTH", compare: {} } • "Show CPU hours alongside compute costs" (call suggest_usage_metrics first to get valid metricIds) → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }, { type: "usage", name: "b", metricId: "k8s_cpu_hours" }], datePreset: "TRAILING_30_DAYS", aggBy: "Week" } • "What is our cost per request?" → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }, { type: "metric", name: "b", metricId: "" }, { type: "formula", name: "c", formula: "a / b" }], datePreset: "TRAILING_30_DAYS" } • "Usage converted to euros (force formula unit)" → { queries: [{ type: "usage", name: "b", metricId: "query_compute_ms" }, { type: "formula", name: "c", formula: "b / 3600000 * 0.055", unitOverride: "EUR" }], datePreset: "LAST_MONTH" } • "Cost per request volume" (after list_metrics with includeExternal: true and search: "request") → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }, { type: "externalMetric", name: "b", provider: "tsuga", integrationId: "", metricName: "", aggregator: "SUM" }, { type: "formula", name: "c", formula: "a / b" }], datePreset: "TRAILING_30_DAYS", aggBy: "Week" } • "Cost per BigQuery revenue table" (after list_metrics with includeExternal: true and search: "revenue") → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }, { type: "externalMetric", name: "b", provider: "bigquery", integrationId: "", metricName: "my-project.analytics.revenue", dateColumn: "event_date", metricColumn: "amount", gapFillingMethod: "ZERO", aggregator: "SUM" }, { type: "formula", name: "c", formula: "a / b" }], datePreset: "TRAILING_30_DAYS", aggBy: "Week" } • "Cost per CPU usage from Datadog" (after list_metrics with includeExternal: true and search: "cpu") → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }, { type: "externalMetric", name: "b", provider: "datadog", integrationId: "", metricName: "system.cpu.user", aggregator: "AVG", groupByFields: ["host"] }, { type: "formula", name: "c", formula: "a / b" }], datePreset: "TRAILING_30_DAYS", aggBy: "Week" } • "Cost per EC2 CPU from CloudWatch" (after list_metrics with includeExternal: true and search: "CPUUtilization") → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }, { type: "externalMetric", name: "b", provider: "cloudwatch", integrationId: "", metricName: "AWS/EC2/CPUUtilization", aggregator: "AVG", groupByFields: ["InstanceId"] }, { type: "formula", name: "c", formula: "a / b" }], datePreset: "TRAILING_30_DAYS", aggBy: "Week" } • "Budget per calendar month" → { queries: [{ type: "budget", name: "a", budgetId: "" }], datePreset: "LAST_3_MONTHS", aggBy: "Month" } (budgetVersionId from get, not the parent id from search) • "Budget month-to-date by day (cumulative within each month — which day did we reach the budget?)" → { queries: [{ type: "budget", name: "a", budgetId: "", rollingAggregation: { aggregator: "SUM", window: { preset: "MONTH" } } }], datePreset: "MTD", aggBy: "Day" } • "Formula: month-to-date cost vs month-to-date budget (both rolling SUM per month, e.g. utilization a/b)" → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD", rollingAggregation: { aggregator: "SUM", window: { preset: "MONTH" } } }, { type: "budget", name: "b", budgetId: "", rollingAggregation: { aggregator: "SUM", window: { preset: "MONTH" } } }, { type: "formula", name: "c", formula: "a / b" }], datePreset: "MTD", aggBy: "Day" } • "Budget vs actual per line" (bqName from get virtualDimension.bqName) → { queries: [{ type: "cost", name: "a", alias: "Actual", metricId: "cost", currency: "USD", groupBy: "" }, { type: "budget", name: "b", alias: "Budget", budgetId: "", groupBy: "" }, { type: "formula", name: "c", alias: "Variance", formula: "a - b" }], datePreset: "YTD", aggBy: "Month" } • Custom one-off range → { queries: [{ type: "cost", name: "a", metricId: "cost", currency: "USD" }], from: "2026-01-15", to: "2026-02-12", aggBy: "Day" }

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "queries": "<queries>",
      "context": "<context>"
    },
    "name": "query"
  }
}

Input Schema

NameRequiredDescriptionDefault
toNoExplicit window end (inclusive, YYYY-MM-DD). Use with from instead of datePreset.
fromNoExplicit window start (YYYY-MM-DD). Use with to instead of datePreset.
slugNoOrganization slug. Omit to auto-detect from your account (fails if you belong to multiple orgs).
aggByNoTime grain for the series: Hour, Day, Week, Month, or Period (default Month). Hour requires Costory Pro.Month
limitNoMax groups/rows per series. Omit to use the default (100). Increase up to 1000 when you need more than 100 breakdown groups. On a non-comparison TABLE, use displayOptions.topN for the row cap and omit this — the two are mutually exclusive there.
analyzeNoOptional analyses. Set changePoint true (or { ignoreWeekends }) to run change-point detection once per query after a timeseries result. Incompatible with compare.
compareNoAdd a comparison period to show cost evolution side-by-side. Omit `from`/`to` to compare against the preceding period automatically; set `chartType` to choose how it renders.
contextYesA few words on why you are calling this tool, for the server developer's analytics. Describe people and things by role, such as "a customer". Do not quote the user or include names, emails, or other personal details.
queriesYesOne or more series (cost / metric / usage / externalMetric / formula / budget). Each needs a `name` for formulas (use short ids like a/b/c); put human labels in `alias`.
scopeIdNoOptional saved team scope id (from list_teams). Merges the scope whereClause into cost/usage queries.
llm_modelNoThe model identifier you are running as, for example "claude-opus-4-8" or "gpt-5.2". Pass "unknown" if you are not certain. Recorded for the server developer's analytics.
datePresetNoOfficial date preset (same as Explore, e.g. MTD, LAST_MONTH). Forecast: CURRENT_MONTH / CURRENT_QUARTER / CURRENT_YEAR. Mutually exclusive with from/to.
displayOptionsNoTABLE-only. sort {by, direction}, hideEmptyRows, topN (omit limit), showTotal, precision, pivot {rows, columns}. get_skill dashboards.
conversation_idNoThe conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.
returnGraphImageNoOmit (default) for numbers only. "link": usual result plus imageUrl (GCS PNG). "base64": same plus an inline PNG block from the rendered bytes — large payload, only if the host cannot fetch the URL. Adds latency (render + upload). Table-only / split comparison TABLE still return numbers and append a second text content block with JSON { "image": "unsupported", "message": "..." }.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / context / description
      Previous value: -"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""New value: +"A few words on why you are calling this tool, for the server developer's analytics. Describe people and things by role, such as \"a customer\". Do not quote the user or include names, emails, or other personal details."
    • changedInput schema / properties / queries / description
      Previous value: -"One or more series (cost / metric / usage / externalMetric / formula / budget). Each needs a `name` for formulas (prefer short ids like a/b/c); put human labels in `alias`."New value: +"One or more series (cost / metric / usage / externalMetric / formula / budget). Each needs a `name` for formulas (use short ids like a/b/c); put human labels in `alias`."
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY",
      -          "KRW"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "unitOverride": {
      -        "description": "Optional unit override. Omit to infer from formula inputs. Currency codes (EUR, USD, GBP, CNY, KRW) format as money and follow the widget/dashboard currency; any other string (e.g. \"slot-h/TiB\", \"%\") is displayed as-is.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }. Optional groupBy (the budget virtual dimension bqName from get) splits one series per budget line; omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas like a - b match per line.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Split by budget line. Must be this budget's virtual dimension bqName from get. Omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas match per line."
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). name holds a short identifier; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY",
      +          "KRW"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Use short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). name holds a short identifier; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Use short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). name holds a short identifier; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Use short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). name holds a short identifier; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Use short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "unitOverride": {
      +        "description": "Optional unit override. Omit to infer from formula inputs. Currency codes (EUR, USD, GBP, CNY, KRW) format as money and follow the widget/dashboard currency; any other string (e.g. \"slot-h/TiB\", \"%\") is displayed as-is.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }. Optional groupBy (the budget virtual dimension bqName from get) splits one series per budget line; omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas like a - b match per line.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). name holds a short identifier; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Split by budget line. Must be this budget's virtual dimension bqName from get. Omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas match per line."
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Use short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). name holds a short identifier; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Use short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / required
      Previous value: -[
      -  "queries",
      -  "context",
      -  "llm_model"
      -]New value: +[
      +  "queries",
      +  "context"
      +]
  2. Changed4 schema fields changed
    • addedInput schema / properties / context
      Added value: +{
      +  "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\"",
      +  "type": "string"
      +}
    • addedInput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.",
      +  "type": "string"
      +}
    • addedInput schema / properties / llm_model
      Added value: +{
      +  "description": "The model identifier you are running as, for example \"claude-opus-4-8\" or \"gpt-5.2\". Pass \"unknown\" if you are not certain. Recorded for the server developer's analytics.",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "queries"
      -]New value: +[
      +  "queries",
      +  "context",
      +  "llm_model"
      +]
  3. Changed4 schema fields changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY",
      -          "KRW"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "unitOverride": {
      -        "description": "Optional unit override. Omit to infer from formula inputs. Currency codes (EUR, USD, GBP, CNY, KRW) format as money and follow the widget/dashboard currency; any other string (e.g. \"slot-h/TiB\", \"%\") is displayed as-is.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }. Optional groupBy (the budget virtual dimension bqName from get) splits one series per budget line; omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas like a - b match per line.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Split by budget line. Must be this budget's virtual dimension bqName from get. Omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas match per line."
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY",
      +          "KRW"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "unitOverride": {
      +        "description": "Optional unit override. Omit to infer from formula inputs. Currency codes (EUR, USD, GBP, CNY, KRW) format as money and follow the widget/dashboard currency; any other string (e.g. \"slot-h/TiB\", \"%\") is displayed as-is.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }. Optional groupBy (the budget virtual dimension bqName from get) splits one series per budget line; omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas like a - b match per line.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Split by budget line. Must be this budget's virtual dimension bqName from get. Omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas match per line."
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / scopeId / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / scopeId / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / required
      Added value: +[
      +  "queries"
      +]
  4. Changed1 schema field changed
    • addedInput schema / properties / returnGraphImage
      Added value: +{
      +  "description": "Omit (default) for numbers only. \"link\": usual result plus imageUrl (GCS PNG). \"base64\": same plus an inline PNG block from the rendered bytes — large payload, only if the host cannot fetch the URL. Adds latency (render + upload). Table-only / split comparison TABLE still return numbers and append a second text content block with JSON { \"image\": \"unsupported\", \"message\": \"...\" }.",
      +  "enum": [
      +    "link",
      +    "base64"
      +  ],
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY",
      -          "KRW"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "unitOverride": {
      -        "description": "Optional unit override. Omit to infer from formula inputs. Currency codes (EUR, USD, GBP, CNY, KRW) format as money and follow the widget/dashboard currency; any other string (e.g. \"slot-h/TiB\", \"%\") is displayed as-is.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY",
      +          "KRW"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "unitOverride": {
      +        "description": "Optional unit override. Omit to infer from formula inputs. Currency codes (EUR, USD, GBP, CNY, KRW) format as money and follow the widget/dashboard currency; any other string (e.g. \"slot-h/TiB\", \"%\") is displayed as-is.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }. Optional groupBy (the budget virtual dimension bqName from get) splits one series per budget line; omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas like a - b match per line.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Split by budget line. Must be this budget's virtual dimension bqName from get. Omit for the total. Sibling cost/usage/metric groupBy must be that same field so formulas match per line."
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  6. Changed2 schema fields changed
    • addedInput schema / properties / displayOptions
      Added value: +{
      +  "description": "TABLE-only. sort {by, direction}, hideEmptyRows, topN (omit limit), showTotal, precision, pivot {rows, columns}. get_skill dashboards.",
      +  "properties": {
      +    "hideEmptyRows": {
      +      "description": "Hide rows with abs displayed sum < 0.01",
      +      "type": "boolean"
      +    },
      +    "pivot": {
      +      "additionalProperties": false,
      +      "description": "TABLE-only. Place groupBy, query, time on rows/columns. Outer first. get_skill dashboards.",
      +      "properties": {
      +        "columns": {
      +          "description": "Non-empty. Outer first. Same axes as rows.",
      +          "items": {
      +            "enum": [
      +              "groupBy",
      +              "query",
      +              "time"
      +            ],
      +            "type": "string"
      +          },
      +          "minItems": 1,
      +          "type": "array"
      +        },
      +        "rows": {
      +          "description": "Non-empty. Outer first. Each of groupBy, query, time at most once across rows+columns.",
      +          "items": {
      +            "enum": [
      +              "groupBy",
      +              "query",
      +              "time"
      +            ],
      +            "type": "string"
      +          },
      +          "minItems": 1,
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "rows",
      +        "columns"
      +      ],
      +      "type": "object"
      +    },
      +    "precision": {
      +      "description": "Fraction digits 0–6",
      +      "maximum": 6,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "showTotal": {
      +      "description": "Show Total column",
      +      "type": "boolean"
      +    },
      +    "sort": {
      +      "properties": {
      +        "by": {
      +          "description": "total | cost | groupBy | query letter (a)",
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "direction": {
      +          "default": "DESC",
      +          "description": "ASC | DESC (default DESC)",
      +          "enum": [
      +            "ASC",
      +            "DESC"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "by"
      +      ],
      +      "type": "object"
      +    },
      +    "topN": {
      +      "description": "Ranked rows 1–100 after hide-empty + sort. Omit limit.",
      +      "maximum": 100,
      +      "minimum": 1,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / limit / description
      Previous value: -"Max groups/rows per series. Omit to use the default (100). Increase up to 1000 when you need more than 100 breakdown groups."New value: +"Max groups/rows per series. Omit to use the default (100). Increase up to 1000 when you need more than 100 breakdown groups. On a non-comparison TABLE, use displayOptions.topN for the row cap and omit this — the two are mutually exclusive there."
  7. Changed3 schema fields changed
    • changedInput schema / properties / datePreset / description
      Previous value: -"Official date preset (same DatePreset as dashboards/reports, e.g. MTD, LAST_MONTH, TRAILING_30_DAYS). Prefer this over hand-computed from/to when a preset matches. Mutually exclusive with from/to."New value: +"Official date preset (same as Explore, e.g. MTD, LAST_MONTH). Forecast: CURRENT_MONTH / CURRENT_QUARTER / CURRENT_YEAR. Mutually exclusive with from/to."
    • removedInput schema / properties / forecastDays
      Removed value: -{
      -  "description": "Extend the query window by N days into the future and include forecasted values.",
      -  "maximum": 9007199254740991,
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY",
      -          "KRW"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY",
      +          "KRW"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "unitOverride": {
      +        "description": "Optional unit override. Omit to infer from formula inputs. Currency codes (EUR, USD, GBP, CNY, KRW) format as money and follow the widget/dashboard currency; any other string (e.g. \"slot-h/TiB\", \"%\") is displayed as-is.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  8. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY",
      -          "KRW"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics / list_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and  For BigQuery jobs: set provider: \"bigqueryJobs\"; metricName is one of bq_slot_ms, bq_bytes_billed, bq_bytes_processed, bq_duration_ms, bq_job_count (values read from the enriched BigQuery billing rows — requires the org's BigQuery jobs integration); scope with filterCel like cost (never conditions); groupByFields are the bq_* billing dimensions (bq_user_email, bq_query_hash, bq_destination_table, bq_referenced_tables, bq_statement_type, bq_job_type, bq_error_reason, bq_reservation_id, bq_parent_job_id).",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "whereClause": {
      -        "additionalProperties": {},
      -        "properties": {},
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY",
      +          "KRW"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  9. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY",
      -          "KRW"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY",
      +          "KRW"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics / list_usage_metrics). Either a billing consumed_unit (e.g. \"hours\") or an enrichment metric column published by an integration — those start with `query_` (e.g. query_compute_ms, query_bytes_billed) and are only available to orgs with that integration. Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and  For BigQuery jobs: set provider: \"bigqueryJobs\"; metricName is one of bq_slot_ms, bq_bytes_billed, bq_bytes_processed, bq_duration_ms, bq_job_count (values read from the enriched BigQuery billing rows — requires the org's BigQuery jobs integration); scope with filterCel like cost (never conditions); groupByFields are the bq_* billing dimensions (bq_user_email, bq_query_hash, bq_destination_table, bq_referenced_tables, bq_statement_type, bq_job_type, bq_error_reason, bq_reservation_id, bq_parent_job_id).",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "whereClause": {
      +        "additionalProperties": {},
      +        "properties": {},
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  10. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY",
      +          "KRW"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  11. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional BigQuery WHERE predicate ANDed with the date range. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required; conditions is the same optional WHERE predicate. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names; conditions is an optional Snowflake WHERE predicate ANDed with the date range (e.g. PRIMARY_PROVIDER_AND_MODEL RLIKE 'azure-.*/doctor-ai.*'). BigQuery, S3, and Snowflake conditions are appended as AND (…); statement separators, comments, and unbalanced quotes/parentheses outside string literals are rejected.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  12. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  13. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring",
      -          "push"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required. For Snowflake: identical to BigQuery — metricName is DATABASE.SCHEMA.TABLE; dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  14. Changed1 schema field changed
    • changedInput schema / properties / datePreset / enum
      Previous value: -[
      -  "TRAILING_90_DAYS",
      -  "TRAILING_30_DAYS",
      -  "TRAILING_45_DAYS",
      -  "TRAILING_7_DAYS",
      -  "TRAILING_3_DAYS",
      -  "TRAILING_14_WEEKS",
      -  "MTD",
      -  "QTD",
      -  "YTD",
      -  "CURRENT_MONTH",
      -  "CURRENT_QUARTER",
      -  "CURRENT_YEAR",
      -  "LAST_WEEK",
      -  "LAST_MONTH",
      -  "LAST_6_MONTHS",
      -  "LAST_12_MONTHS",
      -  "LAST_4_YEARS",
      -  "LAST_3_MONTHS",
      -  "LAST_INVOICE_MONTH"
      -]New value: +[
      +  "TRAILING_90_DAYS",
      +  "TRAILING_30_DAYS",
      +  "TRAILING_45_DAYS",
      +  "TRAILING_7_DAYS",
      +  "TRAILING_3_DAYS",
      +  "TRAILING_1_DAYS",
      +  "TRAILING_14_WEEKS",
      +  "MTD",
      +  "QTD",
      +  "YTD",
      +  "CURRENT_MONTH",
      +  "CURRENT_QUARTER",
      +  "CURRENT_YEAR",
      +  "LAST_WEEK",
      +  "LAST_MONTH",
      +  "LAST_6_MONTHS",
      +  "LAST_12_MONTHS",
      +  "LAST_4_YEARS",
      +  "LAST_3_MONTHS",
      +  "LAST_INVOICE_MONTH"
      +]
  15. Changed2 schema fields changed
    • changedInput schema / properties / datePreset / enum
      Previous value: -[
      -  "TRAILING_90_DAYS",
      -  "TRAILING_30_DAYS",
      -  "TRAILING_45_DAYS",
      -  "TRAILING_7_DAYS",
      -  "TRAILING_3_DAYS",
      -  "TRAILING_14_WEEKS",
      -  "MTD",
      -  "QTD",
      -  "YTD",
      -  "LAST_WEEK",
      -  "LAST_MONTH",
      -  "LAST_6_MONTHS",
      -  "LAST_12_MONTHS",
      -  "LAST_4_YEARS",
      -  "LAST_3_MONTHS",
      -  "LAST_INVOICE_MONTH"
      -]New value: +[
      +  "TRAILING_90_DAYS",
      +  "TRAILING_30_DAYS",
      +  "TRAILING_45_DAYS",
      +  "TRAILING_7_DAYS",
      +  "TRAILING_3_DAYS",
      +  "TRAILING_14_WEEKS",
      +  "MTD",
      +  "QTD",
      +  "YTD",
      +  "CURRENT_MONTH",
      +  "CURRENT_QUARTER",
      +  "CURRENT_YEAR",
      +  "LAST_WEEK",
      +  "LAST_MONTH",
      +  "LAST_6_MONTHS",
      +  "LAST_12_MONTHS",
      +  "LAST_4_YEARS",
      +  "LAST_3_MONTHS",
      +  "LAST_INVOICE_MONTH"
      +]
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake",
      -          "cloudmonitoring"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring",
      +          "push"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  16. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude",
      -          "snowflake"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake",
      +          "cloudmonitoring"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  17. Changed1 schema field changed
    • addedInput schema / properties / analyze
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional analyses. Set changePoint true (or { ignoreWeekends }) to run change-point detection once per query after a timeseries result. Incompatible with compare.",
      +  "properties": {
      +    "changePoint": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "ignoreWeekends": {
      +              "description": "Drop Saturday/Sunday before detection. Maps to Billy `no_weekends`.",
      +              "type": "boolean"
      +            }
      +          },
      +          "type": "object"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  18. Changed1 schema field changed
    • changedInput schema / properties / queries / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "default": "USD",
      -        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      -        "enum": [
      -          "USD",
      -          "EUR",
      -          "GBP",
      -          "CNY"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "default": "cost",
      -        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      -        "enum": [
      -          "cost",
      -          "effective_cost",
      -          "list_cost",
      -          "contracted_cost",
      -          "unblended_cost",
      -          "net_unblended_cost",
      -          "amortized_cost",
      -          "net_amortized_cost"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "cost",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "metric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "filterCel": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      -      },
      -      "groupBy": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "items": {
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "metricId": {
      -        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "usage",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "metricId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "formula": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "formula",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "formula",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      -    "properties": {
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "budgetId": {
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "budget",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      },
      -      "virtualDimensionValue": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "budgetId",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required.",
      -    "properties": {
      -      "aggregator": {
      -        "enum": [
      -          "SUM",
      -          "AVG",
      -          "MAX",
      -          "MIN"
      -        ],
      -        "type": "string"
      -      },
      -      "alias": {
      -        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "chartType": {
      -        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      -        "enum": [
      -          "BAR",
      -          "LINE",
      -          "AREA",
      -          "WATERFALL",
      -          "TABLE"
      -        ],
      -        "type": "string"
      -      },
      -      "conditions": {
      -        "type": "string"
      -      },
      -      "dateColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "gapFillingMethod": {
      -        "enum": [
      -          "ZERO",
      -          "FORWARD_FILL",
      -          "LINEAR_INTERPOLATION",
      -          "SPREAD"
      -        ],
      -        "type": "string"
      -      },
      -      "groupByFields": {
      -        "default": [],
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 7,
      -        "type": "array"
      -      },
      -      "integrationId": {
      -        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricColumn": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "metricName": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      -        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      -        "type": "string"
      -      },
      -      "provider": {
      -        "default": "tsuga",
      -        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      -        "enum": [
      -          "tsuga",
      -          "bigquery",
      -          "datadog",
      -          "cloudwatch",
      -          "s3",
      -          "amplitude"
      -        ],
      -        "type": "string"
      -      },
      -      "query": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "rollingAggregation": {
      -        "properties": {
      -          "aggregator": {
      -            "enum": [
      -              "SUM",
      -              "AVG",
      -              "MAX",
      -              "MIN"
      -            ],
      -            "type": "string"
      -          },
      -          "window": {
      -            "properties": {
      -              "preset": {
      -                "enum": [
      -                  "MONTH",
      -                  "WEEK"
      -                ],
      -                "type": "string"
      -              },
      -              "relativeDays": {
      -                "maximum": 9007199254740991,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "aggregator",
      -          "window"
      -        ],
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "externalMetric",
      -        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "integrationId",
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": "USD",
      +        "description": "Currency for cost values (USD, EUR, GBP). Defaults to \"USD\".",
      +        "enum": [
      +          "USD",
      +          "EUR",
      +          "GBP",
      +          "CNY"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "default": "cost",
      +        "description": "Cost column to query (e.g. \"cost\", \"effective_cost\", \"amortized_cost\"). Defaults to \"cost\".",
      +        "enum": [
      +          "cost",
      +          "effective_cost",
      +          "list_cost",
      +          "contracted_cost",
      +          "unblended_cost",
      +          "net_unblended_cost",
      +          "amortized_cost",
      +          "net_amortized_cost"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "cost",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Saved Costory metric id from list_metrics metrics[].id. This is the query identity — not list_metrics `datasourceId` (that filter only returns groupBy dimensions for telemetry).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "metric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "filterCel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional scope filter as CEL (Common Expression Language). Examples: cos_service_name in [\"AmazonEC2\"]; cos_provider in [\"AWS\"] && cos_environment in [\"prod\"]. Label dimensions use the cos_ prefix; native provider fields omit it. Unlabelled/untagged resources have null values; use == null to match them (e.g. cos_environment == null) and != null to exclude them. Omit or pass empty string for no filter."
      +      },
      +      "groupBy": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "items": {
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "metricId": {
      +        "description": "Usage metric id (from suggest_usage_metrics). Distinct from cost metricId and from list_metrics datasourceId.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "usage",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "metricId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "formula": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "formula",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "formula",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Plot a budget. Use aggBy Month for one value per calendar month. For a daily running total within each month (to see which day the budget was reached), use aggBy Day with rollingAggregation { aggregator: SUM, window: { preset: MONTH } }.",
      +    "properties": {
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "budgetId": {
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "budget",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      },
      +      "virtualDimensionValue": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "budgetId",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Plot a live external metric from an integration. integrationId comes from list_metrics(includeExternal: true). For Tsuga: metricName is the provider metric name; groupByFields are provider metric attributes; conditions is an optional provider filter string. For Datadog: metricName is the Datadog metric name; groupByFields are metric tags; conditions is an optional Datadog filter/query string. When query is set it is the Datadog metrics query string (pass-through to queryMetrics); metricName / aggregator / conditions / groupByFields are leftover UI state and are not a second writer. .rollup is required and the interval must be ≥ 24h (daily / weekly / monthly or seconds ≥ 86400). Costory will not fill an empty weekly series. For CloudWatch: metricName is Namespace/MetricName (e.g. AWS/EC2/CPUUtilization); groupByFields are CloudWatch dimension names; conditions is an optional dimension filter. For Amplitude: metricName is one of active_users, new_users, active_users_weekly, active_users_monthly; aggregator must be SUM; groupByFields is at most one built-in user property from list_metrics attributes (version, country, city, region, DMA, language, platform, os, device, device_type, start_version, paying); conditions is an optional Amplitude segment string (s parameter); Hour aggBy is unsupported; weekly/monthly metrics snap Amplitude period-end dates to the week/month start. For BigQuery: metricName is the fully-qualified table id (project.dataset.table); dateColumn, metricColumn, and gapFillingMethod are required; groupByFields are string column names. For S3: identical to BigQuery — metricName is the fully-qualified id of a Costory-managed external table over the customer's mirrored Parquet; dateColumn, metricColumn, and gapFillingMethod are required.",
      +    "properties": {
      +      "aggregator": {
      +        "enum": [
      +          "SUM",
      +          "AVG",
      +          "MAX",
      +          "MIN"
      +        ],
      +        "type": "string"
      +      },
      +      "alias": {
      +        "description": "Optional human-readable label (e.g. \"Cost by environment\", \"AWS spend\"). Prefer short identifiers in name; put descriptive text here.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "chartType": {
      +        "description": "Explorer chart for this series: BAR, LINE, AREA, WATERFALL, or TABLE. Omit to use LINE.",
      +        "enum": [
      +          "BAR",
      +          "LINE",
      +          "AREA",
      +          "WATERFALL",
      +          "TABLE"
      +        ],
      +        "type": "string"
      +      },
      +      "conditions": {
      +        "type": "string"
      +      },
      +      "dateColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "gapFillingMethod": {
      +        "enum": [
      +          "ZERO",
      +          "FORWARD_FILL",
      +          "LINEAR_INTERPOLATION",
      +          "SPREAD"
      +        ],
      +        "type": "string"
      +      },
      +      "groupByFields": {
      +        "default": [],
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 7,
      +        "type": "array"
      +      },
      +      "integrationId": {
      +        "description": "External metric integration ID from list_metrics(includeExternal: true).",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricColumn": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "metricName": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Required series identifier referenced by formulas (e.g. \"a\", \"b\", \"a__r6\"). Prefer short identifiers; put human labels in alias — never spaces or descriptive phrases in name.",
      +        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
      +        "type": "string"
      +      },
      +      "provider": {
      +        "default": "tsuga",
      +        "description": "External metric provider. Defaults to \"tsuga\" when omitted for backward compatibility with existing Tsuga MCP clients.",
      +        "enum": [
      +          "tsuga",
      +          "bigquery",
      +          "datadog",
      +          "cloudwatch",
      +          "s3",
      +          "amplitude",
      +          "snowflake"
      +        ],
      +        "type": "string"
      +      },
      +      "query": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "rollingAggregation": {
      +        "properties": {
      +          "aggregator": {
      +            "enum": [
      +              "SUM",
      +              "AVG",
      +              "MAX",
      +              "MIN"
      +            ],
      +            "type": "string"
      +          },
      +          "window": {
      +            "properties": {
      +              "preset": {
      +                "enum": [
      +                  "MONTH",
      +                  "WEEK"
      +                ],
      +                "type": "string"
      +              },
      +              "relativeDays": {
      +                "maximum": 9007199254740991,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "aggregator",
      +          "window"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "externalMetric",
      +        "description": "Required series discriminator — always set explicitly, never omit. One of: \"cost\" | \"metric\" | \"usage\" | \"formula\" | \"budget\" | \"externalMetric\".",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "integrationId",
      +      "name"
      +    ],
      +    "type": "object"
      +  }
      +]
  19. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well past the annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false) by disclosing non-obvious traits: image output performs a render plus upload to cloud storage and adds latency, table-only and split comparison tables return an { "image": "unsupported" } block instead, results default to 100 groups, budgetId must be a budget version ID rather than the parent id from search, and computeStatus must be polled to COMPLETED after publish. These are exactly the operational gotchas annotations cannot express.

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

Conciseness3/5

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

The content is high-value but poorly compressed: it is a single enormous prose block, and large portions duplicate the parameter descriptions already in the input schema (the externalMetric provider-by-provider rules appear nearly verbatim in the externalMetric schema description). Front-loading the minimum call and naming rules is good, but the wall-of-text form makes key routing facts hard to locate.

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

Completeness5/5

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

For a 15-parameter, six-variant discriminated-union query tool with no output schema, this covers the missing pieces: minimum valid call, worked examples across every series type, response notes (resolved period dates, image content blocks), pagination/limit defaults, and dependency ordering against sibling tools. Nothing an agent needs in order to call it correctly is absent.

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

Parameters5/5

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

Even at 100% schema coverage the description adds real meaning: groupBy is the SPLIT dimension while filterCel is the SCOPE, label dimensions carry a cos_ prefix and unlabelled resources are null (use == null, not is_null), name must be a short id with human labels in alias, and metricId means different things for cost vs saved metric vs usage vs list_metrics datasourceId. It also explains per-provider shapes for externalMetric beyond what the schema encodes.

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

Purpose5/5

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

Opens with a specific verb and enumerated resource set (cost, usage, business-metric, external-metric, budget, formulas, comparisons), and later explicitly routes saved-widget image requests to get_dashboard_widget_image instead. An agent can tell immediately that this is the general analytics/query entry point rather than a mutation or discovery tool.

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

Usage Guidelines5/5

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

Gives explicit when-to-use routing throughout: call suggest_usage_metrics before type "usage", use list_metrics with includeExternal for external metrics, prefer a saved { type: "metric" } over externalMetric when one exists, call get for budgetVersionId before querying a budget, call search with type:["dimensions"] before guessing CEL fields, and omit returnGraphImage unless the user asked for a chart. Exclusions are stated too (changePoint incompatible with compare, limit vs displayOptions.topN mutually exclusive, datePreset mutually exclusive with from/to).

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources