Skip to main content
Glama

Costory: Your Finops MCP

query

Read-only

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.

Unified query tool for cost data, custom metrics, usage metrics, external (live integration) metrics, period comparisons, formulas, and budgets. QUERY NAMING: set type and name (prefer 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; prefer saved { type: "metric" } when one exists. PERIOD: prefer datePreset (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: After receiving results, consider calling "list_events" for the same date range to correlate cost changes with events, and "suggest_actions" to present follow-up options to the user. 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 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" }

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.
queriesNoOne 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`.
scopeIdNoOptional saved team scope id (from list_teams). Merges the scope whereClause into cost/usage queries.
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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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"
      +  }
      +]
  2. 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."
  3. 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"
      +  }
      +]
  4. 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"
      +  }
      +]
  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). 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"
      +  }
      +]
  6. 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"
      +  }
      +]
  7. 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"
      +  }
      +]
  8. 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"
      +  }
      +]
  9. 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"
      +  }
      +]
  10. 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"
      +]
  11. 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"
      +  }
      +]
  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.",
      -    "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"
      +  }
      +]
  13. 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"
      +}
  14. 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"
      +  }
      +]
  15. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint/openWorldHint/destructiveHint, so the description carries the real behavioral burden and does so richly: limit defaults to 100 groups and must be raised for long tails, the response includes resolved period dates, computeStatus must be polled until COMPLETED, and BigQuery/S3/Snowflake conditions reject separators, comments, and unbalanced quotes. These are concrete operational traits not present in structured fields.

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

Conciseness4/5

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

Strongly front-loaded: the minimum valid call and naming convention precede the long provider-specific detail, and worked examples follow. However, the prose duplicates a substantial amount of the externalMetric provider detail already present in the schema, making it very long. It is well-organized but not maximally economical.

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 an 11-parameter tool with nested oneOf query variants and no output schema, the description covers the naming contract, every query type, period/comparison semantics, dimension discovery, and the budget-ID pitfall. It even notes what the response contains (resolved period dates) and suggests follow-up tools. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: it warns that budgetId must be the budget version ID despite the field name, distinguishes groupBy (SPLIT) from filterCel (SCOPE), explains rollingAggregation for running totals, and clarifies unitOverride/currency behavior. Some overlap with the schema remains, keeping it from a 5.

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 'Unified query tool for cost data, custom metrics, usage metrics, external (live integration) metrics, period comparisons, formulas, and budgets' — a specific verb (query) plus an exhaustive enumeration of resources. It also leads with a MINIMUM VALID CALL block, so an agent knows both what the tool does and the smallest valid invocation. It is clearly distinguishable from siblings like get_dashboard_widget_data or list_metrics.

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 routing rules: call suggest_usage_metrics before usage queries, use list_metrics with includeExternal: true to discover external metric fields, call search with type: ['dimensions'] before guessing CEL names, and call get to obtain budgetVersionId. It states when to prefer saved { type: 'metric' } over externalMetric and names exclusions (analyze.changePoint incompatible with compare, 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